1 # Copyright 2016 Cisco Systems, Inc. All rights reserved.
3 # Licensed under the Apache License, Version 2.0 (the "License"); you may
4 # not use this file except in compliance with the License. You may obtain
5 # a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 # License for the specific language governing permissions and limitations
16 from attrdict import AttrDict
21 def config_load(file_name, from_cfg=None, whitelist_keys=None):
22 """Load a yaml file into a config dict, merge with from_cfg if not None
23 The config file content taking precedence in case of duplicate
26 with open(file_name) as fileobj:
27 cfg = AttrDict(yaml.safe_load(fileobj))
29 raise Exception("Configuration file at '{}' was not found. Please use correct path "
30 "and verify it is visible to container if you run nfvbench in container."
34 if not whitelist_keys:
36 _validate_config(cfg, from_cfg, whitelist_keys)
42 def config_loads(cfg_text, from_cfg=None, whitelist_keys=None):
43 """Same as config_load but load from a string
46 cfg = AttrDict(yaml.safe_load(cfg_text))
50 except ValueError as e:
51 # In case of wrong path or file not readable or string not well formatted
52 LOG.error("String %s is not well formatted. Please verify your yaml/json string. "
53 "If string is a file path, file was not found. Please use correct path and "
54 "verify it is visible to container if you run nfvbench in container.", cfg_text)
57 if not whitelist_keys:
59 _validate_config(cfg, from_cfg, whitelist_keys)
64 def _validate_config(subset, superset, whitelist_keys):
65 def get_err_config(subset, superset):
67 for k, v in subset.items():
68 if k not in whitelist_keys:
71 elif v is not None and superset[k] is not None:
72 if not isinstance(v, type(superset[k])):
75 if isinstance(v, dict):
76 res = get_err_config(v, superset[k])
78 result.update({k: res})
83 err_cfg = get_err_config(subset, superset)
85 err_msg = 'The provided configuration has unknown options or values with invalid type: '\
88 raise Exception(err_msg)