aboutsummaryrefslogtreecommitdiffstats
path: root/onap-client/onap_client/client/catalog.py
diff options
context:
space:
mode:
authorstark, steven <steven.stark@att.com>2021-01-04 11:40:12 -0800
committerstark, steven <steven.stark@att.com>2021-01-04 11:40:12 -0800
commit76144a9a772f50cb3ec80757d9f1c1ec119eee6a (patch)
tree72fdaa300f09c5aeaa7fc7eac0ab80b173e522ae /onap-client/onap_client/client/catalog.py
parente618989d37d8b786b5b0a9f2fa42bafa32475eed (diff)
[VVP] ONAP client performance improvement
First of multiple performance patches. Adding ability to cache data for use by the onap-client. Changing API call for SDC to get VF and Service models. Previously to find a service model, onap-client queried for all models and then searched by name. New api call to query by name, then find latest version. Issue-ID: VVP-503 Signed-off-by: stark, steven <steven.stark@att.com> Change-Id: I071cadbe52163f0b375bc81ac4a9fd640bd5ca4a
Diffstat (limited to 'onap-client/onap_client/client/catalog.py')
-rw-r--r--onap-client/onap_client/client/catalog.py104
1 files changed, 82 insertions, 22 deletions
diff --git a/onap-client/onap_client/client/catalog.py b/onap-client/onap_client/client/catalog.py
index 989d975..7c2eb0d 100644
--- a/onap-client/onap_client/client/catalog.py
+++ b/onap-client/onap_client/client/catalog.py
@@ -59,6 +59,7 @@ def get_modules():
class Catalog(ABC):
"""Abstract class for an ONAP client, automatically loads
child classes as attributes."""
+
class CallHandle:
"""Attached as an attribute for each catalog entry in a catalog.
Used to make a request to ONAP."""
@@ -66,37 +67,41 @@ class Catalog(ABC):
def __init__(self, catalog_resource, response_callback=None, verify=False):
self.resource = catalog_resource
self.verify_request = verify
- self.callback = response_callback if response_callback else self.empty_callback
+ self.callback = (
+ response_callback if response_callback else self.empty_callback
+ )
def empty_callback(self, *args, **kwargs):
pass
- def __call__(self, **kwargs):
+ def __call__(self, raise_on_error=True, attempts=3, **kwargs):
self.callback(message=f"Submitting request: {self.resource.description}")
- response_handler = make_request(self.resource, self.verify_request, **kwargs)
+ response_handler = make_request(
+ self.resource, attempts, self.verify_request, **kwargs
+ )
self.callback(response_handler=response_handler)
if not response_handler.success:
- self.callback(message=f"Request Failure: {self.resource.catalog_resource_name} {response_handler.response_data}")
- raise exceptions.RequestFailure(
- "Failed making request for catalog item {}: {}".format(
- self.resource.catalog_resource_name,
- response_handler.response_data
+ self.callback(
+ message=f"Failed making request for catalog item: {response_handler.status_code} {self.resource.catalog_resource_name} {response_handler.response_data}"
+ )
+ if raise_on_error:
+ raise exceptions.RequestFailure(
+ "Failed making request for catalog item {}: {}".format(
+ self.resource.catalog_resource_name,
+ response_handler.response_data,
+ )
)
+ else:
+ self.callback(
+ message=f"{response_handler.status_code} {self.resource.catalog_resource_name} Request was Successful"
)
- self.callback(message="Request was Successful")
-
return response_handler
- def __init__(
- self,
- config_file=None,
- history_buffer=[],
- **kwargs
- ):
+ def __init__(self, config_file=None, history_buffer=[], **kwargs):
"""Iterates through all child classes and attaches them as attributes, named
after the namespace property.
@@ -107,6 +112,7 @@ class Catalog(ABC):
if not config_file:
config_file = os.environ.get("OC_CONFIG") or "/etc/onap_client/config.yaml"
+ self._cache = CatalogCache()
self.catalog_items = {}
self.modules = get_modules()
self._config_overrides = kwargs
@@ -116,7 +122,9 @@ class Catalog(ABC):
self.add_to_history("Creating ONAP Client...")
for cls in self.__class__.__subclasses__():
- subclass = cls(config_file=config_file, history_buffer=self.history, **kwargs)
+ subclass = cls(
+ config_file=config_file, history_buffer=self.history, **kwargs
+ )
namespace = subclass.namespace
catalog_resources = subclass.catalog_resources
@@ -136,7 +144,11 @@ class Catalog(ABC):
callback = self.add_to_history
- setattr(self, item_name.lower(), self.CallHandle(resource, response_callback=callback, verify=verify))
+ setattr(
+ self,
+ item_name.lower(),
+ self.CallHandle(resource, response_callback=callback, verify=verify),
+ )
def add_to_history(self, message="", response_handler=None):
if response_handler:
@@ -163,10 +175,7 @@ class Catalog(ABC):
def add_message_to_history(self, message):
current_time = datetime.now()
- history_message = {
- "date": f"{current_time}",
- "message": message
- }
+ history_message = {"date": f"{current_time}", "message": message}
self.history.append(history_message)
@property
@@ -190,6 +199,12 @@ class Catalog(ABC):
utility_functions[func[0]] = func[1]
return utility_functions
+ def cache(self, *args, **kwargs):
+ self._cache.cache(*args, **kwargs)
+
+ def get_cached(self, *args, **kwargs):
+ return self._cache.get_cached(*args, **kwargs)
+
def set_config(self, config_file):
self.config = config.load_config(config_file, "onap_client")
verify = self.config.REQUESTS_VERIFY
@@ -204,10 +219,55 @@ class Catalog(ABC):
def override_check(self):
o = self._config_overrides.get(override_key)
return o if o else func(self)
+
return override_check
+
return decorator
+class CatalogCache:
+ """Basic helper dict to cache data from requests"""
+ def __init__(self):
+ self._cached_data = {
+ "service": {},
+ "vnf": {},
+ "license_model": {},
+ "vsp": {},
+ "other": {},
+ }
+
+ def cache(self, *items, cache=None):
+ if cache is None:
+ cache = self._cached_data
+
+ items = list(items)
+ item = items.pop(0)
+
+ if len(items) == 1:
+ cache[item] = items.pop(0)
+ return
+
+ if item not in cache:
+ cache[item] = {}
+
+ self.cache(*items, cache=cache[item])
+
+ def get_cached(self, *items, cache=None):
+ if not cache:
+ cache = self._cached_data
+
+ items = list(items)
+ item = items.pop(0)
+
+ if item not in cache:
+ return None
+
+ if not len(items):
+ return cache[item]
+
+ return self.get_cached(*items, cache=cache[item])
+
+
class APICatalogResource:
"""Class representation of a single catalog entry"""