# Copyright 2019 Nokia # 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. import json import os import sys import inspect import imp import types import argparse from cmdatahandlers.api import configerror class ConfigManager(object): #This needs to be updated when new domain are introduced, a getter function #should be added to the domain config handler """ def __init__(self, schema, configjson): #validate according to schema try: self.configjson = configjson builder = pjo.ObjectBuilder(schema) ns = builder.build_classes() self.config = ns.Config(**configjson) self._load_config_handlers() except Exception as exp: raise configerror.ConfigError(str(exp)) """ def __init__(self, configjson): #validate according to schema self.configmap = {} try: self.configjson = configjson self._load_config_handlers() except Exception as exp: raise configerror.ConfigError(str(exp)) def get_config(self): return self.configjson def get_cloud_name(self): if 'cloud.name' not in self.configjson: raise configerror.ConfigError('Cloud name not defined') return self.configjson['cloud.name'] def get_cloud_description(self): if 'cloud.description' not in self.configjson: raise configerror.ConfigError('Cloud description not defined') return self.configjson['cloud.description'] def get_cloud_installation_date(self): if 'cloud.installation_date' not in self.configjson: raise configerror.ConfigError('Cloud installation date is not defined') return self.configjson['cloud.installation_date'] def get_cloud_installation_phase(self): if 'cloud.installation_phase' not in self.configjson: raise configerror.ConfigError('Cloud installation phase is not defined') return self.configjson['cloud.installation_phase'] def _load_config_handlers(self): myfolder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0])) dirn = os.path.dirname(myfolder) basen = os.path.basename(myfolder) for d in os.listdir(dirn): if d == basen: continue if not os.path.isdir(dirn + '/' + d): continue configmodule = dirn + '/' + d + '/config.py' if not os.path.isfile(configmodule): continue mod = imp.load_source(d, configmodule) config = mod.Config(self) domain = config.get_domain() self.configmap[domain] = config domhandlerfunc = 'get_' + domain + '_config_handler' setattr(self, domhandlerfunc, types.MethodType(self._get_domain_config_handler, domain)) #finalize initialization after objects are created #this is needed to handle inter-handler dependencies for domain, handler in self.configmap.iteritems(): handler.init() def _get_domain_config_handler(self, domain): if domain not in self.configmap: raise configerror.ConfigError('Invalid domain') return self.configmap[domain] def mask_sensitive_data(self): for handler in self.configmap.values(): try: handler.validate_root() except configerror.ConfigError: continue handler.mask_sensitive_data() if __name__ == '__main__': parser = argparse.ArgumentParser(description='Config Manager', prog=sys.argv[0]) parser.add_argument('--domain', required=True, dest='domain', metavar='DOMAIN', help='The configuration domain', type=str, action='store') parser.add_argument('--json', required=True, dest='jsonfile', metavar='JSONFILE', help='The json file containing the configuration', type=str, action='store') parser.add_argument('--api', required=True, dest='api', metavar='API', help='The API to call in the domain', type=str, action='store') parser.add_argument('--dump', required=False, dest='dump', help='Dump the configuration', action='store_true') args, unknownargs = parser.parse_known_args(sys.argv[1:]) print("args = %r" % args) print("unknownargs = %r" % unknownargs) f = open(args.jsonfile) data = json.load(f) f.close() manager = ConfigManager(data) #domain handler func funcname = 'get_'+args.domain+'_config_handler' objfunc = getattr(manager, funcname) obj = objfunc() print('Got handler for %s' % obj.get_domain()) domainfunc = getattr(obj, args.api) result = None if unknownargs: result = domainfunc(*unknownargs) else: result = domainfunc() print("result is %r" % result) if args.dump: import pprint pp = pprint.PrettyPrinter(indent=4) pp.pprint(data)