X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=nfvbench%2Fconfig.py;h=8e7712792226c9b931330372fa8bbde6ebdd183b;hb=87d88eab6fe50101abc607857f13af9273aef80a;hp=2a67b7ebc1f9ed75df9be1ac0da1ee5ae921985d;hpb=5d2becfd9d6398ce9dfd4c83618de42e272ec830;p=nfvbench.git diff --git a/nfvbench/config.py b/nfvbench/config.py index 2a67b7e..8e77127 100644 --- a/nfvbench/config.py +++ b/nfvbench/config.py @@ -16,55 +16,73 @@ from attrdict import AttrDict import yaml +from .log import LOG -def config_load(file_name, from_cfg=None): +def config_load(file_name, from_cfg=None, whitelist_keys=None): """Load a yaml file into a config dict, merge with from_cfg if not None The config file content taking precedence in case of duplicate """ try: - with open(file_name) as fileobj: + with open(file_name, encoding="utf-8") as fileobj: cfg = AttrDict(yaml.safe_load(fileobj)) except IOError: raise Exception("Configuration file at '{}' was not found. Please use correct path " "and verify it is visible to container if you run nfvbench in container." - .format(file_name)) + .format(file_name)) from IOError if from_cfg: + if not whitelist_keys: + whitelist_keys = [] + _validate_config(cfg, from_cfg, whitelist_keys) cfg = from_cfg + cfg return cfg -def config_loads(cfg_text, from_cfg=None): +def config_loads(cfg_text, from_cfg=None, whitelist_keys=None): """Same as config_load but load from a string """ try: - cfg = AttrDict(yaml.load(cfg_text)) + cfg = AttrDict(yaml.safe_load(cfg_text)) except TypeError: # empty string cfg = AttrDict() + except ValueError as e: + # In case of wrong path or file not readable or string not well formatted + LOG.error("String %s is not well formatted. Please verify your yaml/json string. " + "If string is a file path, file was not found. Please use correct path and " + "verify it is visible to container if you run nfvbench in container.", cfg_text) + raise Exception(e) from e if from_cfg: + if not whitelist_keys: + whitelist_keys = [] + _validate_config(cfg, from_cfg, whitelist_keys) return from_cfg + cfg return cfg -def get_err_config(subset, superset): - for k, v in subset.items(): - if k not in superset: - return {k: v} - if v is not None and superset[k] is not None: - if not isinstance(v, type(superset[k])): - return {k: v} - if isinstance(v, dict): - res = get_err_config(v, superset[k]) - if res: - return {k: res} - return None +def _validate_config(subset, superset, whitelist_keys): + def get_err_config(subset, superset): + result = {} + for k, v in list(subset.items()): + if k not in whitelist_keys: + if k not in superset: + result.update({k: v}) + elif v is not None and superset[k] is not None: + if not isinstance(v, type(superset[k])): + result.update({k: v}) + continue + if isinstance(v, dict): + res = get_err_config(v, superset[k]) + if res: + result.update({k: res}) + if not result: + return None + return result - -def test_config(): - cfg = config_load('a1.yaml') - cfg = config_load('a2.yaml', cfg) - cfg = config_loads('color: 500', cfg) - config_loads('') - config_loads('#') + err_cfg = get_err_config(subset, superset) + if err_cfg: + err_msg = 'The provided configuration has unknown options or values with invalid type: '\ + + str(err_cfg) + LOG.error(err_msg) + raise Exception(err_msg)