fuel-ccp/fuel_ccp/config/__init__.py

146 lines
4.1 KiB
Python

import logging
import jsonschema
import os
from fuel_ccp.config import _yaml
from fuel_ccp.config import builder
from fuel_ccp.config import cli
from fuel_ccp.config import files
from fuel_ccp.config import images
from fuel_ccp.config import kubernetes
from fuel_ccp.config import registry
from fuel_ccp.config import replicas
from fuel_ccp.config import repositories
from fuel_ccp.config import sources
from fuel_ccp.config import url
LOG = logging.getLogger(__name__)
_REAL_CONF = None
def setup_config(config_file):
yconf = get_config_defaults()
if config_file:
loaded_conf = _yaml.load_with_includes(config_file)
yconf._merge(loaded_conf)
validate_config(yconf)
global _REAL_CONF
_REAL_CONF = yconf
def find_config():
home = os.path.expanduser('~')
candidates = [
os.path.join(home, '.ccp.yaml'),
os.path.join(home, '.ccp/ccp.yaml'),
'/etc/ccp.yaml',
'/etc/ccp/ccp.yaml',
]
for candidate in candidates:
if os.path.exists(candidate):
return candidate
else:
return None
class _Wrapper(object):
def __getattr__(self, name):
return getattr(_REAL_CONF, name)
def __getitem__(self, name):
return _REAL_CONF[name]
CONF = _Wrapper()
CONFIG_MODULES = [
builder, cli, images, kubernetes, registry, replicas, repositories,
sources, url, files,
]
def get_config_defaults():
defaults = _yaml.AttrDict({
'debug': False,
'verbose_level': 1,
'log_file': None,
'default_log_levels': [
'glanceclient=INFO',
'keystoneauth=INFO',
'neutronclient=INFO',
'novaclient=INFO',
'requests=WARN',
'stevedore=INFO',
'urllib3=WARN'
]
})
for name in ['configs', 'nodes', 'roles', 'versions']:
defaults[name] = _yaml.AttrDict()
for module in CONFIG_MODULES:
defaults._merge(module.DEFAULTS)
return defaults
def get_config_schema():
schema = {
'$schema': 'http://json-schema.org/draft-04/schema#',
'additionalProperties': False,
'properties': {
'debug': {'type': 'boolean'},
'verbose_level': {'type': 'integer'},
'log_file': {'anyOf': [{'type': 'null'}, {'type': 'string'}]},
'default_log_levels': {'type': 'array',
'items': {'type': 'string'}}
},
}
for module in CONFIG_MODULES:
schema['properties'].update(module.SCHEMA)
# Don't validate all options used to be added from oslo.log and oslo.config
ignore_opts = ['debug', 'verbose', 'log_file']
for name in ignore_opts:
schema['properties'][name] = {}
# Also for now don't validate sections that used to be in deploy config
for name in ['configs', 'nodes', 'roles', 'versions']:
schema['properties'][name] = {'type': 'object'}
return schema
def validate_config(yconf=None):
if yconf is None:
yconf = _REAL_CONF
schema = get_config_schema()
jsonschema.validate(_yaml.UnwrapAttrDict(yconf), schema)
def load_component_defaults():
from fuel_ccp.common import utils
sections = ['versions', 'sources', 'configs', 'nodes', 'roles', 'replicas',
'url', 'files']
new_config = _yaml.AttrDict((k, _yaml.AttrDict()) for k in sections)
for path in utils.get_config_paths():
if not os.path.exists(path):
LOG.debug("\"%s\" not found, skipping", path)
continue
LOG.debug("Adding parameters from \"%s\"", path)
with open(path) as f:
data = _yaml.load(f)
for section in sections:
if section in data:
new_config[section]._merge(data[section])
global _REAL_CONF
new_config['configs']['namespace'] = _REAL_CONF.kubernetes.namespace
new_config['configs'][
'cluster_domain'] = _REAL_CONF.kubernetes.cluster_domain
new_config._merge(_REAL_CONF)
# FIXME workaround to not deep merge 'sources' config
for k, v in _REAL_CONF.sources._items():
new_config['sources'][k] = v
_REAL_CONF = new_config
def dump_yaml(stream):
_yaml.dump(_REAL_CONF, stream)