203 lines
7.0 KiB
Python
203 lines
7.0 KiB
Python
# Copyright (C) 2014 Catalyst IT Ltd
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from keystoneauth1 import loading as ka_loading
|
|
from oslo_cache import core as cache
|
|
from oslo_config import cfg
|
|
from oslo_log import log
|
|
from oslo_utils import uuidutils
|
|
|
|
from distil import version
|
|
|
|
CONF = cfg.CONF
|
|
|
|
DEFAULT_OPTIONS = (
|
|
cfg.IntOpt('port',
|
|
default=9999,
|
|
help='The port for the Distil API server',
|
|
),
|
|
cfg.StrOpt('host',
|
|
default='0.0.0.0',
|
|
help='The listen IP for the Distil API server',
|
|
),
|
|
cfg.ListOpt('public_api_routes',
|
|
default=['/', '/v2/products'],
|
|
help='The list of public API routes',
|
|
),
|
|
cfg.StrOpt('erp_driver',
|
|
default='odoo',
|
|
help='The ERP driver used for Distil',
|
|
),
|
|
)
|
|
|
|
COLLECTOR_OPTS = [
|
|
cfg.IntOpt('periodic_interval', default=3600,
|
|
help=('Interval of usage collection.')),
|
|
cfg.IntOpt('collect_window', default=1,
|
|
help=('Window of usage collection in hours.')),
|
|
cfg.StrOpt('collector_backend', default='ceilometer',
|
|
help=('Data collector.')),
|
|
cfg.IntOpt('max_windows_per_cycle', default=1,
|
|
help=('The maximum number of windows per collecting cycle.')),
|
|
cfg.StrOpt('meter_mappings_file', default='/etc/distil/meter_mappings.yml',
|
|
help=('The meter mappings configuration.')),
|
|
cfg.StrOpt('transformer_file', default='/etc/distil/transformer.yml',
|
|
help=('The transformer configuration.')),
|
|
cfg.ListOpt('include_domains', default=[],
|
|
help=('Only collect usages for included domains.')),
|
|
cfg.ListOpt('include_tenants', default=[],
|
|
help=('Only collect usages for included tenants.')),
|
|
cfg.ListOpt('ignore_tenants', default=[],
|
|
help=('Do not collect usages for ignored tenants.')),
|
|
cfg.ListOpt('trust_sources', default=[],
|
|
help=('The list of resources that handled by collector.')),
|
|
cfg.StrOpt('dawn_of_time', default='2014-04-01 00:00:00',
|
|
help=('The earlist starting time for new tenant.')),
|
|
cfg.StrOpt('partitioning_suffix',
|
|
help=('Collector partitioning group suffix. It is used when '
|
|
'running multiple collectors in favor of lock.')),
|
|
cfg.StrOpt('project_order', default='ascending',
|
|
choices=['ascending', 'descending', 'random'],
|
|
help=('The order of project IDs to do usage collection. '
|
|
'Default is ascending.'))
|
|
]
|
|
|
|
ODOO_OPTS = [
|
|
cfg.StrOpt('version', default='8.0',
|
|
help='Version of Odoo server.'),
|
|
cfg.StrOpt('hostname',
|
|
help='Host name of Odoo server.'),
|
|
cfg.IntOpt('port', default=443,
|
|
help='Port of Odoo server'),
|
|
cfg.StrOpt('protocol', default='jsonrpc+ssl',
|
|
help='Protocol to connect to Odoo server.'),
|
|
cfg.StrOpt('database',
|
|
help='Name of the Odoo database.'),
|
|
cfg.StrOpt('user',
|
|
help='Name of Odoo account to login.'),
|
|
cfg.StrOpt('password', secret=True,
|
|
help='Password of Odoo account to login.'),
|
|
cfg.StrOpt('region_mapping',
|
|
help='Region name mappings between Keystone and Odoo. For '
|
|
'example, '
|
|
'region_mapping=region1:RegionOne,region2:RegionTwo'),
|
|
cfg.ListOpt('extra_product_category_list',
|
|
default=[],
|
|
help='Additional product categories which should be easily '
|
|
'parsed. Such as new product category created in Odoo.'),
|
|
cfg.ListOpt('invisible_products', default=['reseller-margin-discount'],
|
|
help=("The product list which will be invisible to project "
|
|
"users. For example, as a cloud provider we would like "
|
|
"to hide the reseller margin for reseller's customer.")),
|
|
cfg.FloatOpt('tax_rate', default='0.15',
|
|
help='Tax rate for invoicing.'),
|
|
cfg.ListOpt('licensed_os_distro_list',
|
|
default=['windows',
|
|
'sql-server-standard-windows',
|
|
'sql-server-enterprise-windows'],
|
|
help='The os_distro list supported for microsoft product '
|
|
'family. e.g. in Odoo, the product name could be '
|
|
'c1.c1r2-windows or c1.c2r4-sql-server-standard-windows')
|
|
]
|
|
|
|
JSONFILE_OPTS = [
|
|
cfg.StrOpt('products_file_path',
|
|
default='/etc/distil/products.json',
|
|
help='Json file to contain the products and prices.'),
|
|
]
|
|
|
|
|
|
CLI_OPTS = [
|
|
cfg.StrOpt(
|
|
'collect-end-time',
|
|
help=('The end date of usage to collect before distil-collector is '
|
|
'stopped. If not provided, distil-collector will keep running. '
|
|
'Time format is %Y-%m-%dT%H:%M:%S')
|
|
),
|
|
]
|
|
|
|
AUTH_GROUP = 'keystone_authtoken'
|
|
ODOO_GROUP = 'odoo'
|
|
COLLECTOR_GROUP = 'collector'
|
|
JSONFILE_GROUP = 'jsonfile'
|
|
|
|
|
|
CONF.register_opts(DEFAULT_OPTIONS)
|
|
CONF.register_opts(ODOO_OPTS, group=ODOO_GROUP)
|
|
CONF.register_opts(JSONFILE_OPTS, group=JSONFILE_GROUP)
|
|
CONF.register_opts(COLLECTOR_OPTS, group=COLLECTOR_GROUP)
|
|
CONF.register_cli_opts(CLI_OPTS)
|
|
|
|
|
|
def list_opts():
|
|
return [
|
|
(ODOO_GROUP, ODOO_OPTS),
|
|
(COLLECTOR_GROUP, COLLECTOR_OPTS),
|
|
(None, DEFAULT_OPTIONS)
|
|
]
|
|
|
|
|
|
def _register_keystoneauth_opts(conf):
|
|
# Register keystone authentication related options.
|
|
from keystonemiddleware import auth_token # noqa
|
|
|
|
ka_loading.register_auth_conf_options(conf, AUTH_GROUP)
|
|
|
|
|
|
_register_keystoneauth_opts(CONF)
|
|
|
|
# This is simply a namespace for global config storage
|
|
main = None
|
|
rates_config = None
|
|
memcache = None
|
|
auth = None
|
|
collection = None
|
|
transformers = None
|
|
|
|
|
|
def setup_config(conf):
|
|
global main
|
|
main = conf['main']
|
|
global rates_config
|
|
rates_config = conf['rates_config']
|
|
|
|
# special case to avoid issues with older configs
|
|
try:
|
|
global memcache
|
|
memcache = conf['memcache']
|
|
except KeyError:
|
|
memcache = {'enabled': False}
|
|
|
|
global auth
|
|
auth = conf['auth']
|
|
global collection
|
|
collection = conf['collection']
|
|
global transformers
|
|
transformers = conf['transformers']
|
|
|
|
|
|
def parse_args(args=None, prog=None):
|
|
log.set_defaults()
|
|
log.register_options(CONF)
|
|
CONF(
|
|
args=args,
|
|
project='distil',
|
|
prog=prog,
|
|
version=version.version_info.version_string(),
|
|
)
|
|
|
|
ka_loading.load_auth_from_conf_options(CONF, AUTH_GROUP)
|
|
|
|
log.setup(CONF, prog)
|