From 35375724d9657de99adb8e530e1be21305555a40 Mon Sep 17 00:00:00 2001 From: "stark, steven" Date: Thu, 17 Sep 2020 13:04:35 -0700 Subject: [VVP] Updating onap-client Removing dependency on distutils moving etc/ to package resource Adding support for volume creation and delete Removing module level imports Adding delete capability to spec-engine Adding kwarg to pass Client instance to functions Issue-ID: VVP-469 Signed-off-by: stark, steven Change-Id: Ie00065f54411c8ff40ea20c35fe919ce15f65e6a --- onap-client/onap_client/client/catalog.py | 70 ++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) (limited to 'onap-client/onap_client/client/catalog.py') diff --git a/onap-client/onap_client/client/catalog.py b/onap-client/onap_client/client/catalog.py index a69c501..03f10ff 100644 --- a/onap-client/onap_client/client/catalog.py +++ b/onap-client/onap_client/client/catalog.py @@ -34,9 +34,25 @@ # limitations under the License. # # ============LICENSE_END============================================ +import onap_client +import pkgutil +import inspect +import sys +import os +import importlib from abc import ABC, abstractmethod from onap_client.lib import make_request +from onap_client import config + +CACHED_MODULES = {} + + +def get_modules(): + catalog = sys.modules[__name__] + if not catalog.CACHED_MODULES: + catalog.CACHED_MODULES = import_submodules(onap_client) + return catalog.CACHED_MODULES class Catalog(ABC): @@ -53,7 +69,7 @@ class Catalog(ABC): def __call__(self, **kwargs): return make_request(self.resource, **kwargs) - def __init__(self, **kwargs): + def __init__(self, config_file=None, **kwargs): """Iterates through all child classes and attaches them as attributes, named after the namespace property. @@ -61,10 +77,15 @@ class Catalog(ABC): catalog_resources property, they will be added as attributes to the child attribute as a CallHandle object. """ + if not config_file: + config_file = os.environ.get("OC_CONFIG") or "/etc/onap_client/config.yaml" + self.catalog_items = {} + self.modules = get_modules() + self._config_overrides = kwargs for cls in self.__class__.__subclasses__(): - subclass = cls(**kwargs) + subclass = cls(config_file=config_file, **kwargs) namespace = subclass.namespace catalog_resources = subclass.catalog_resources @@ -73,6 +94,8 @@ class Catalog(ABC): setattr(self, namespace, subclass) + self.set_config(config_file) + def load(self, item_name, resource_data): """Consume a catalog resource entry as an APICatalogResource, and set it as an attribute on this.class as a CallHandle object""" @@ -91,6 +114,33 @@ class Catalog(ABC): def catalog_resources(self): raise NotImplementedError + @property + def utility_functions(self): + utility_functions = {} + for module_name, module in self.modules.items(): + all_functions = inspect.getmembers(module, inspect.isfunction) + for func in all_functions: + function = func[1] + if hasattr(function, "utility_function"): + utility_functions[func[0]] = func[1] + return utility_functions + + def set_config(self, config_file): + self.config = config.load_config(config_file, "onap_client") + for attr_name, attr in self.__dict__.items(): + if isinstance(attr, Catalog): + attr.set_config(config_file) + for k, v in attr.catalog_resources.items(): + attr.load(k, v) + + def override(override_key): + def decorator(func): + def override_check(self): + o = self._config_overrides.get(override_key) + return o if o else func(self) + return override_check + return decorator + class APICatalogResource: """Class representation of a single catalog entry""" @@ -154,3 +204,19 @@ class APICatalogResource: @property def auth(self): return self.catalog_resource_data.get("auth", None) + + +def import_submodules(package, recursive=True): + """Import all the modules in onap-client, except for those starting + with tests*. This is needed so that the Client object can register child classes""" + if isinstance(package, str): + package = importlib.import_module(package) + results = {} + for loader, name, is_pkg in pkgutil.walk_packages(package.__path__): + full_name = package.__name__ + "." + name + if full_name.find("tests") == -1: + results[full_name] = importlib.import_module(full_name) + if recursive and is_pkg: + results.update(import_submodules(full_name)) + + return results -- cgit 1.2.3-korg