diff options
author | stark, steven <steven.stark@att.com> | 2020-10-15 12:34:35 -0700 |
---|---|---|
committer | stark, steven <steven.stark@att.com> | 2020-10-15 12:39:49 -0700 |
commit | a0984e365a7c610e9cb91cf73e5d09db2be6df6a (patch) | |
tree | 67b8aaaffb37b56105569f2233672db9e5720cbd | |
parent | 82f201fb65094aad55b3e46634bad39713387c6e (diff) |
[VVP] VVP onap-client enhancements
Adding capability for custom auth plugin (defaults to basic auth).
During updates to VNF models, resource and policy objects are deletd and recreated.
Issue-ID: VVP-477
Signed-off-by: stark, steven <steven.stark@att.com>
Change-Id: Iba743176167c2b1df185666b08cbd79c6a559c9e
25 files changed, 450 insertions, 303 deletions
diff --git a/onap-client/onap_client/aai/catalog/business_catalog.py b/onap-client/onap_client/aai/catalog/business_catalog.py index 51c2409..9105ba7 100644 --- a/onap-client/onap_client/aai/catalog/business_catalog.py +++ b/onap-client/onap_client/aai/catalog/business_catalog.py @@ -64,7 +64,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_OWNING_ENTITIES": { "verb": "GET", @@ -81,7 +81,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_CUSTOMER": { "verb": "GET", @@ -99,7 +99,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_CUSTOMERS": { "verb": "GET", @@ -116,7 +116,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_PLATFORM": { "verb": "GET", @@ -134,7 +134,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_PLATFORMS": { "verb": "GET", @@ -151,7 +151,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_PROJECT": { "verb": "GET", @@ -169,7 +169,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_PROJECTS": { "verb": "GET", @@ -186,7 +186,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_LINES_OF_BUSINESS": { "verb": "GET", @@ -203,7 +203,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "CREATE_CUSTOMER": { "verb": "PUT", @@ -223,7 +223,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_CUSTOMER_SUBSCRIPTIONS": { "verb": "GET", @@ -241,7 +241,7 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_SERVICE_INSTANCES": { "verb": "GET", @@ -259,6 +259,6 @@ class BusinessClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/aai/catalog/cloud_infrastructure_catalog.py b/onap-client/onap_client/aai/catalog/cloud_infrastructure_catalog.py index d22ab0e..e71f767 100644 --- a/onap-client/onap_client/aai/catalog/cloud_infrastructure_catalog.py +++ b/onap-client/onap_client/aai/catalog/cloud_infrastructure_catalog.py @@ -63,7 +63,7 @@ class CloudInfrastructureClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_CLOUD_REGION": { "verb": "GET", @@ -81,7 +81,7 @@ class CloudInfrastructureClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_CLOUD_REGION_TENANTS": { "verb": "GET", @@ -99,7 +99,7 @@ class CloudInfrastructureClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_ESR_LIST": { "verb": "GET", @@ -117,7 +117,7 @@ class CloudInfrastructureClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, "GET_VOLUME_GROUPS": { "verb": "GET", @@ -135,6 +135,6 @@ class CloudInfrastructureClient(AAIClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/aai/client.py b/onap-client/onap_client/aai/client.py index c4ab03b..2f48e62 100644 --- a/onap-client/onap_client/aai/client.py +++ b/onap-client/onap_client/aai/client.py @@ -37,7 +37,9 @@ import uuid from functools import partial +from frozendict import frozendict from onap_client.client.clients import Client +from onap_client.auth import auth_handler class AAIClient(Client): @@ -63,6 +65,24 @@ class AAIClient(Client): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.aai.AAI_USERNAME, self.config.aai.AAI_PASSWORD,), + "auth": self.auth, }, } + + @property + def aai_username(self): + """Username to authenticate to AAI""" + return self.config.aai.AAI_USERNAME + + @property + def aai_password(self): + """Password to authenticate to AAI""" + return self.config.aai.AAI_PASSWORD + + @property + def auth(self): + return auth_handler( + frozendict(self.config.aai.AUTH_PLUGIN) if self.config.aai.AUTH_PLUGIN else None, + self.aai_username, + self.aai_password, + ) diff --git a/onap-client/onap_client/auth.py b/onap-client/onap_client/auth.py new file mode 100644 index 0000000..ccd1819 --- /dev/null +++ b/onap-client/onap_client/auth.py @@ -0,0 +1,70 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2020 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software 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. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# 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. +# +# ============LICENSE_END============================================ +from importlib import import_module +from requests.auth import HTTPBasicAuth, AuthBase +from inspect import getmembers, isclass +from functools import lru_cache + +from onap_client.exceptions import AuthClassNotFound, AuthModuleNotDefined + + +@lru_cache() +def auth_handler(auth_plugin_config, username, password): + if not auth_plugin_config: + return HTTPBasicAuth(username, password) + + if not auth_plugin_config.get("AUTH_MODULE"): + raise AuthModuleNotDefined("Property AUTH_MODULE was not defined in configuration file.") + + auth_module = import_module(auth_plugin_config.get("AUTH_MODULE")) + + auth_class = get_auth_class(auth_module) + + return auth_class(username, password, **auth_plugin_config) + + +def get_auth_class(auth_module): + """ + Returns first Class definition in auth_module that inherits from AuthBase. + """ + for name, obj in getmembers( + auth_module, + lambda x: isclass(x) and issubclass(x, AuthBase) and x != AuthBase + ): + return obj + + raise AuthClassNotFound("No auth class found in module: {}".format(auth_module)) diff --git a/onap-client/onap_client/client/request.py b/onap-client/onap_client/client/request.py index 84c8280..6563fb8 100644 --- a/onap-client/onap_client/client/request.py +++ b/onap-client/onap_client/client/request.py @@ -156,9 +156,6 @@ class APICatalogRequestObject: self.resolve_uri() def resolve_files(self): - # TODO - # is there a better way to figure out waht params are needed? - # right now its hardcoded file_type = self.file_parameters.get("file_type", "application/zip") file_path = self.file_parameters.get("file_path") if not file_path: diff --git a/onap-client/onap_client/etc/payloads/sdc_add_user.jinja b/onap-client/onap_client/etc/payloads/sdc_add_user.jinja new file mode 100644 index 0000000..0fc8a89 --- /dev/null +++ b/onap-client/onap_client/etc/payloads/sdc_add_user.jinja @@ -0,0 +1,7 @@ +{ + "firstName": "{{first_name}}", + "lastName": "{{last_name}}", + "userId": "{{user_id}}", + "email": "{{email}}", + "role": "{{role}}" +}
\ No newline at end of file diff --git a/onap-client/onap_client/exceptions.py b/onap-client/onap_client/exceptions.py index fe7d5c0..3e55628 100644 --- a/onap-client/onap_client/exceptions.py +++ b/onap-client/onap_client/exceptions.py @@ -150,3 +150,11 @@ class ResourceCreationFailure(Exception): class ResourceDeleteFailure(Exception): pass + + +class AuthClassNotFound(Exception): + pass + + +class AuthModuleNotDefined(Exception): + pass diff --git a/onap-client/onap_client/lib.py b/onap-client/onap_client/lib.py index 31cfebb..c87c4df 100644 --- a/onap-client/onap_client/lib.py +++ b/onap-client/onap_client/lib.py @@ -36,6 +36,7 @@ # ============LICENSE_END============================================ import uuid + from datetime import datetime, timedelta from onap_client import exceptions diff --git a/onap-client/onap_client/sdc/catalog/license_model_catalog.py b/onap-client/onap_client/sdc/catalog/license_model_catalog.py index 0a90ebf..87a9346 100644 --- a/onap-client/onap_client/sdc/catalog/license_model_catalog.py +++ b/onap-client/onap_client/sdc/catalog/license_model_catalog.py @@ -70,10 +70,7 @@ class LicenseModelClient(SDCClient): "license_model_id": ("itemId",), "license_model_version_id": ("version", "id"), }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_KEY_GROUP": { "verb": "POST", @@ -99,10 +96,7 @@ class LicenseModelClient(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"key_group_id": ("value",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_ENTITLEMENT_POOL": { "verb": "POST", @@ -128,10 +122,7 @@ class LicenseModelClient(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"entitlement_pool_id": ("value",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_FEATURE_GROUP": { "verb": "POST", @@ -158,10 +149,7 @@ class LicenseModelClient(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"feature_group_id": ("value",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_LICENSE_AGREEMENT": { "verb": "POST", @@ -183,10 +171,7 @@ class LicenseModelClient(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"license_agreement_id": ("value",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "SUBMIT_LICENSE_MODEL": { "verb": "PUT", @@ -207,10 +192,7 @@ class LicenseModelClient(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_LICENSE_MODEL": { "verb": "GET", @@ -234,10 +216,7 @@ class LicenseModelClient(SDCClient): "license_model_id": ("id",), "description": ("description",), }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_LICENSE_MODEL_VERSION_ATTRIBUTE": { "verb": "GET", @@ -256,10 +235,7 @@ class LicenseModelClient(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_LICENSE_MODEL_VERSIONS": { "verb": "GET", @@ -278,10 +254,7 @@ class LicenseModelClient(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_LICENSE_MODELS": { "verb": "GET", @@ -300,9 +273,6 @@ class LicenseModelClient(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"results": ("results",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdc/catalog/service_catalog.py b/onap-client/onap_client/sdc/catalog/service_catalog.py index dad8456..33fb8be 100644 --- a/onap-client/onap_client/sdc/catalog/service_catalog.py +++ b/onap-client/onap_client/sdc/catalog/service_catalog.py @@ -83,10 +83,7 @@ class ServiceCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_service_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "CHECKOUT_CATALOG_SERVICE": { "verb": "POST", @@ -106,10 +103,7 @@ class ServiceCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_service_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_RESOURCE_INSTANCE": { "verb": "POST", @@ -138,10 +132,7 @@ class ServiceCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_instance_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "DELETE_RESOURCE_FROM_SERVICE": { "verb": "DELETE", @@ -160,10 +151,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "UPDATE_RESOURCE_VERSION": { "verb": "POST", @@ -186,10 +174,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "CHECKIN_SERVICE": { "verb": "POST", @@ -210,10 +195,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "REQUEST_SERVICE_CERTIFICATION": { "verb": "POST", @@ -234,10 +216,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "START_SERVICE_CERTIFICATION": { "verb": "POST", @@ -258,10 +237,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "FINISH_SERVICE_CERTIFICATION": { "verb": "POST", @@ -283,10 +259,7 @@ class ServiceCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_service_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "APPROVE_SERVICE_CERTIFICATION": { "verb": "POST", @@ -307,10 +280,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "DISTRIBUTE_SDC_SERVICE": { "verb": "POST", @@ -330,10 +300,7 @@ class ServiceCatalog(SDCClient): # "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_SERVICE_PROPERTY": { "verb": "POST", @@ -362,10 +329,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_SERVICE_INPUT": { "verb": "POST", @@ -392,10 +356,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "UPDATE_MODULE_DEPLOYMENT_PROPERTIES": { "verb": "POST", @@ -418,10 +379,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SDC_SERVICE": { "verb": "GET", @@ -440,10 +398,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SERVICES": { "verb": "GET", @@ -462,10 +417,7 @@ class ServiceCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"services": ("services",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SERVICE_DISTRIBUTION": { "verb": "GET", @@ -484,10 +436,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SERVICE_DISTRIBUTION_DETAILS": { "verb": "GET", @@ -506,10 +455,7 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SDC_CSAR": { "verb": "GET", @@ -528,9 +474,6 @@ class ServiceCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdc/catalog/vnf_catalog.py b/onap-client/onap_client/sdc/catalog/vnf_catalog.py index 71b20ca..b04b0f5 100644 --- a/onap-client/onap_client/sdc/catalog/vnf_catalog.py +++ b/onap-client/onap_client/sdc/catalog/vnf_catalog.py @@ -75,10 +75,7 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "CERTIFY_CATALOG_RESOURCE": { "verb": "POST", @@ -100,10 +97,7 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_RESOURCE_INPUT": { "verb": "POST", @@ -130,10 +124,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "UPDATE_CATALOG_RESOURCE": { "verb": "PUT", @@ -154,10 +145,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "CHECKOUT_CATALOG_RESOURCE": { "verb": "POST", @@ -176,10 +164,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_RESOURCE_PROPERTY": { "verb": "POST", @@ -208,10 +193,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_RESOURCE_PROPERTY_NON_VF": { "verb": "POST", @@ -240,10 +222,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_RESOURCE_POLICY": { "verb": "POST", @@ -263,10 +242,26 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, + "auth": self.auth, + }, + "DELETE_CATALOG_RESOURCE_POLICY": { + "verb": "DELETE", + "description": "Deletes policy resource to a VNF.", + "uri": partial( + "{endpoint}{service_path}/{catalog_resource_id}/policies/{policy_id}".format, + endpoint=self.config.sdc.SDC_BE_ENDPOINT, + service_path=self.config.sdc.SDC_CATALOG_RESOURCES_PATH, ), + "uri-parameters": ["catalog_resource_id", "policy_id"], + "success_code": 200, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "USER_ID": self.sdc_designer_user_id, + "X-TransactionId": str(uuid.uuid4()), + "X-FromAppId": self.config.application_id, + }, + "auth": self.auth, }, "ADD_CATALOG_POLICY_PROPERTY": { "verb": "PUT", @@ -293,10 +288,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_RESOURCE_GROUP": { "verb": "POST", @@ -316,10 +308,7 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_id": ("uniqueId",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_CATALOG_GROUP_PROPERTY": { "verb": "PUT", @@ -348,10 +337,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_GROUP_TO_INSTANCE": { "verb": "POST", @@ -372,10 +358,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_POLICY_TO_INSTANCE": { "verb": "POST", @@ -396,10 +379,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_RESOURCE_INSTANCE": { "verb": "POST", @@ -428,10 +408,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_RESOURCE_RELATIONSHIP": { "verb": "POST", @@ -461,10 +438,26 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, + "auth": self.auth, + }, + "DELETE_RESOURCE_FROM_VNF": { + "verb": "DELETE", + "description": "Delete a resource from a VNF.", + "uri": partial( + "{endpoint}{service_path}/{catalog_resource_id}/resourceInstance/{resource_id}".format, + endpoint=self.config.sdc.SDC_BE_ENDPOINT, + service_path=self.config.sdc.SDC_CATALOG_RESOURCES_PATH, ), + "uri-parameters": ["catalog_resource_id", "resource_id"], + "success_code": 200, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "USER_ID": self.sdc_designer_user_id, + "X-TransactionId": str(uuid.uuid4()), + "X-FromAppId": self.config.application_id, + }, + "auth": self.auth, }, "GET_CATALOG_RESOURCE": { "verb": "GET", @@ -484,10 +477,7 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"catalog_resource_name": ("name",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_CATALOG_RESOURCE_METADATA": { "verb": "GET", @@ -506,10 +496,7 @@ class VNFCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_RESOURCES": { "verb": "GET", @@ -528,9 +515,6 @@ class VNFCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"resources": ("resources",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdc/catalog/vsp_catalog.py b/onap-client/onap_client/sdc/catalog/vsp_catalog.py index f8ddb9b..19ca631 100644 --- a/onap-client/onap_client/sdc/catalog/vsp_catalog.py +++ b/onap-client/onap_client/sdc/catalog/vsp_catalog.py @@ -80,10 +80,7 @@ class VSPCatalog(SDCClient): "software_product_id": ("itemId",), "software_product_version_id": ("version", "id"), }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "UPDATE_SOFTWARE_PRODUCT": { "verb": "POST", @@ -106,10 +103,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "UPLOAD_HEAT_PACKAGE": { "verb": "POST", @@ -129,10 +123,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "VALIDATE_SOFTWARE_PRODUCT": { "verb": "PUT", @@ -151,10 +142,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "SUBMIT_SOFTWARE_PRODUCT": { "verb": "PUT", @@ -175,10 +163,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "PACKAGE_SOFTWARE_PRODUCT": { "verb": "PUT", @@ -199,10 +184,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SOFTWARE_PRODUCT": { "verb": "GET", @@ -222,10 +204,7 @@ class VSPCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"name": ("name",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SOFTWARE_PRODUCT_INFORMATION": { "verb": "GET", @@ -245,10 +224,7 @@ class VSPCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"name": ("name",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SOFTWARE_PRODUCT_VERSIONS": { "verb": "GET", @@ -271,10 +247,7 @@ class VSPCatalog(SDCClient): "software_product_version_id": ("id",), "description": ("description",), }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_SOFTWARE_PRODUCTS": { "verb": "GET", @@ -293,10 +266,7 @@ class VSPCatalog(SDCClient): "X-FromAppId": self.config.application_id, }, "return_data": {"results": ("results",)}, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "GET_VSP_PERMISSIONS": { "verb": "GET", @@ -315,10 +285,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "ADD_VSP_CONTRIBUTER": { "verb": "PUT", @@ -339,10 +306,7 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, "MODIFY_VSP_OWNER": { "verb": "PUT", @@ -363,9 +327,6 @@ class VSPCatalog(SDCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, - ), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdc/client.py b/onap-client/onap_client/sdc/client.py index 725cbeb..59c9b1b 100644 --- a/onap-client/onap_client/sdc/client.py +++ b/onap-client/onap_client/sdc/client.py @@ -35,9 +35,12 @@ # # ============LICENSE_END============================================ import uuid +from frozendict import frozendict from functools import partial + from onap_client.client.clients import Client +from onap_client.auth import auth_handler class SDCClient(Client): @@ -64,10 +67,7 @@ class SDCClient(Client): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - # "auth": ( - # self.sdc_designer_user_id, - # self.config.sdc.SDC_DESIGNER_PASSWORD, - # ), + "auth": self.auth, }, "GET_RESOURCE_CATEGORIES": { "verb": "GET", @@ -83,10 +83,25 @@ class SDCClient(Client): "Content-Type": "application/json", "USER_ID": self.sdc_designer_user_id, }, - "auth": ( - self.global_sdc_username, - self.global_sdc_password, + "auth": self.auth, + }, + "ADD_USER": { + "verb": "POST", + "description": "Add a user to SDC.", + "uri": partial( + "{endpoint}{service_path}".format, + endpoint=self.config.sdc.SDC_BE_ENDPOINT, + service_path=self.config.sdc.SDC_USER_PATH, ), + "payload": "{}/sdc_add_user.jinja".format(self.config.payload_directory), + "payload-parameters": ["first_name", "last_name", "user_id", "email", "role"], + "success_code": 201, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "USER_ID": self.sdc_ops_user_id, + }, + "auth": self.auth, }, } @@ -125,3 +140,11 @@ class SDCClient(Client): def sdc_governor_user_id(self): """Ops role User ID""" return self.config.sdc.SDC_GOVERNOR_USER_ID + + @property + def auth(self): + return auth_handler( + frozendict(self.config.sdc.AUTH_PLUGIN) if self.config.sdc.AUTH_PLUGIN else None, + self.global_sdc_username, + self.global_sdc_password, + ) diff --git a/onap-client/onap_client/sdc/vnf.py b/onap-client/onap_client/sdc/vnf.py index 4c42dbe..af5f71f 100644 --- a/onap-client/onap_client/sdc/vnf.py +++ b/onap-client/onap_client/sdc/vnf.py @@ -165,9 +165,14 @@ class VNF(Resource): for policy in policies: policy_name = policy.get("policy_name") policy_id = self.policy_exists(policy_name) - if not policy_id: - policy_id = self.add_policy_resource(policy_name) - self.associate_policy(policy_id, vm_type_instances) + if policy_id: + self.oc.sdc.vnf.delete_catalog_resource_policy( + policy_id=policy_id, + catalog_resource_id=self.catalog_resource_id + ) + + policy_id = self.add_policy_resource(policy_name) + self.associate_policy(policy_id, vm_type_instances) for k, v in policy.get("properties", {}).items(): self.add_policy_property(policy_id, k, v) @@ -198,7 +203,7 @@ class VNF(Resource): resource_name = "{}-{}".format(resource_name, resource_name_index) if self.resource_exists(resource_name): - continue + self.delete_resource(resource_name) catalog_resource_name = resource.get("catalog_resource_name") resource_id = resource.get("resource_id") @@ -285,6 +290,17 @@ class VNF(Resource): return False + def delete_resource(self, resource_name): + component_instances = self.tosca.get("componentInstances", []) + + for component in component_instances: + if component.get("name") == resource_name: + self.oc.sdc.vnf.delete_resource_from_vnf( + catalog_resource_id=self.catalog_resource_id, + resource_id=component.get("uniqueId") + ) + return + def policy_exists(self, policy_name): """Checking the tosca model for a VF to see if a resource has already been added diff --git a/onap-client/onap_client/sdnc/catalog/config_catalog.py b/onap-client/onap_client/sdnc/catalog/config_catalog.py index b3c5b1f..7bbf62a 100644 --- a/onap-client/onap_client/sdnc/catalog/config_catalog.py +++ b/onap-client/onap_client/sdnc/catalog/config_catalog.py @@ -63,7 +63,7 @@ class ConfigClient(SDNCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.sdnc.SDNC_USERNAME, self.config.sdnc.SDNC_PASSWORD,), + "auth": self.auth, }, "GET_SERVICE_INSTANCE": { "verb": "GET", @@ -81,7 +81,7 @@ class ConfigClient(SDNCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.sdnc.SDNC_USERNAME, self.config.sdnc.SDNC_PASSWORD,), + "auth": self.auth, }, "GET_VNF_INSTANCE": { "verb": "GET", @@ -99,6 +99,6 @@ class ConfigClient(SDNCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.sdnc.SDNC_USERNAME, self.config.sdnc.SDNC_PASSWORD,), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdnc/catalog/operations_catalog.py b/onap-client/onap_client/sdnc/catalog/operations_catalog.py index 79e6f29..4763c9b 100644 --- a/onap-client/onap_client/sdnc/catalog/operations_catalog.py +++ b/onap-client/onap_client/sdnc/catalog/operations_catalog.py @@ -64,7 +64,7 @@ class OperationsClient(SDNCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.sdnc.SDNC_USERNAME, self.config.sdnc.SDNC_PASSWORD,), + "auth": self.auth, }, "VNF_API_PRELOAD": { "verb": "POST", @@ -82,6 +82,6 @@ class OperationsClient(SDNCClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.sdnc.SDNC_USERNAME, self.config.sdnc.SDNC_PASSWORD,), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/sdnc/client.py b/onap-client/onap_client/sdnc/client.py index 1ebd04a..03b338e 100644 --- a/onap-client/onap_client/sdnc/client.py +++ b/onap-client/onap_client/sdnc/client.py @@ -34,7 +34,9 @@ # limitations under the License. # # ============LICENSE_END============================================ +from frozendict import frozendict from onap_client.client.clients import Client +from onap_client.auth import auth_handler class SDNCClient(Client): @@ -45,3 +47,21 @@ class SDNCClient(Client): @property def catalog_resources(self): return {} + + @property + def sdnc_username(self): + """Username to authenticate to SDNC""" + return self.config.sdnc.SDNC_USERNAME + + @property + def sdnc_password(self): + """Password to authenticate to SDNC""" + return self.config.sdnc.SDNC_PASSWORD + + @property + def auth(self): + return auth_handler( + frozendict(self.config.sdnc.AUTH_PLUGIN) if self.config.sdnc.AUTH_PLUGIN else None, + self.sdnc_username, + self.sdnc_password, + ) diff --git a/onap-client/onap_client/so/catalog/infra_catalog.py b/onap-client/onap_client/so/catalog/infra_catalog.py new file mode 100644 index 0000000..9245004 --- /dev/null +++ b/onap-client/onap_client/so/catalog/infra_catalog.py @@ -0,0 +1,91 @@ +# -*- coding: utf8 -*- +# ============LICENSE_START======================================================= +# org.onap.vvp/validation-scripts +# =================================================================== +# Copyright © 2020 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the "License"); +# you may not use this software 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. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the "License"); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# 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. +# +# ============LICENSE_END============================================ +import uuid +from functools import partial + +from onap_client.so.client import SOClient +from onap_client.util import utility +from onap_client.client.clients import get_client as Client + + +class ServiceInstantiationClient(SOClient): + @property + def namespace(self): + return "infra" + + @property + def catalog_resources(self): + return { + "GET_ACTIVE_REQUESTS": { + "verb": "GET", + "description": "Queries for the list of infraActiveRequests", + "uri": partial( + "{endpoint}/infraActiveRequests?size={size}&sort=startTime,DESC".format, + endpoint=self.config.so.SO_ENDPOINT, + ), + "uri-parameters": ["size"], + "success_code": 200, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "X-TransactionId": str(uuid.uuid4()), + "X-FromAppId": self.config.application_id, + }, + "auth": self.auth, + }, + } + + +@utility +def get_all_infra_requests(oc=None): + if not oc: + oc = Client() + + infra_data = oc.so.infra.get_active_requests(size="20").response_data + + total_elements = int(infra_data.get("page", {}).get("totalElements", 20)) + + return oc.so.infra.get_active_requests(size=total_elements).response_data + + +@utility +def get_recent_infra_requests(size, oc=None): + if not oc: + oc = Client() + + return oc.so.infra.get_active_requests(size=size).response_data + diff --git a/onap-client/onap_client/so/catalog/service_instantiation.py b/onap-client/onap_client/so/catalog/service_instantiation.py index 3874aef..e18aca1 100644 --- a/onap-client/onap_client/so/catalog/service_instantiation.py +++ b/onap-client/onap_client/so/catalog/service_instantiation.py @@ -81,7 +81,7 @@ class ServiceInstantiationClient(SOClient): # "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "DELETE_SERVICE_INSTANCE": { "verb": "DELETE", @@ -107,7 +107,7 @@ class ServiceInstantiationClient(SOClient): # "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "CREATE_VNF_INSTANCE": { "verb": "POST", @@ -147,7 +147,7 @@ class ServiceInstantiationClient(SOClient): # "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "DELETE_VNF_INSTANCE": { "verb": "DELETE", @@ -175,7 +175,7 @@ class ServiceInstantiationClient(SOClient): "Content-Type": "application/json", "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "CREATE_VOLUME_MODULE_INSTANCE": { "verb": "POST", @@ -218,7 +218,7 @@ class ServiceInstantiationClient(SOClient): "Content-Type": "application/json", "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "CREATE_MODULE_INSTANCE": { "verb": "POST", @@ -261,7 +261,7 @@ class ServiceInstantiationClient(SOClient): "Content-Type": "application/json", "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "DELETE_MODULE_INSTANCE": { "verb": "DELETE", @@ -289,7 +289,7 @@ class ServiceInstantiationClient(SOClient): "Content-Type": "application/json", "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "DELETE_VOLUME_MODULE_INSTANCE": { "verb": "DELETE", @@ -317,7 +317,7 @@ class ServiceInstantiationClient(SOClient): "Content-Type": "application/json", "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "GET_REQUEST_STATUS": { "verb": "GET", @@ -335,7 +335,7 @@ class ServiceInstantiationClient(SOClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "GET_SERVICE_MODEL": { "verb": "GET", @@ -352,7 +352,7 @@ class ServiceInstantiationClient(SOClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "GET_SERVICE_MODEL_DETAILS": { "verb": "GET", @@ -369,7 +369,7 @@ class ServiceInstantiationClient(SOClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, "GET_MODULE_CUSTOMIZATION": { "verb": "GET", @@ -386,6 +386,6 @@ class ServiceInstantiationClient(SOClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/so/client.py b/onap-client/onap_client/so/client.py index 3fa48ec..80e9443 100644 --- a/onap-client/onap_client/so/client.py +++ b/onap-client/onap_client/so/client.py @@ -35,7 +35,9 @@ # # ============LICENSE_END============================================ from functools import partial +from frozendict import frozendict from onap_client.client.clients import Client +from onap_client.auth import auth_handler class SOClient(Client): @@ -55,6 +57,24 @@ class SOClient(Client): service_path=self.config.so.SO_HEALTH_CHECK_PATH, ), "success_code": 200, - "auth": (self.config.so.SO_USERNAME, self.config.so.SO_PASSWORD), + "auth": self.auth, }, } + + @property + def so_username(self): + """Username to authenticate to SO""" + return self.config.so.SO_USERNAME + + @property + def so_password(self): + """Password to authenticate to SO""" + return self.config.so.SO_PASSWORD + + @property + def auth(self): + return auth_handler( + frozendict(self.config.so.AUTH_PLUGIN) if self.config.so.AUTH_PLUGIN else None, + self.so_username, + self.so_password, + ) diff --git a/onap-client/onap_client/util.py b/onap-client/onap_client/util.py index 2a9e3e7..c70d049 100644 --- a/onap-client/onap_client/util.py +++ b/onap-client/onap_client/util.py @@ -41,7 +41,6 @@ from prettytable import PrettyTable def utility_cli(onap_client, cli_arguments): functions = onap_client.utility_functions - if len(cli_arguments) == 0 or cli_arguments[0] == "--help": help(functions) else: @@ -68,7 +67,7 @@ def utility_cli(onap_client, cli_arguments): ) return - if cli_arguments[0] == "--help": + if len(cli_arguments) and cli_arguments[0] == "--help": help(functions) return diff --git a/onap-client/onap_client/vid/catalog/maintenance_catalog.py b/onap-client/onap_client/vid/catalog/maintenance_catalog.py index 32f12ea..3a16387 100644 --- a/onap-client/onap_client/vid/catalog/maintenance_catalog.py +++ b/onap-client/onap_client/vid/catalog/maintenance_catalog.py @@ -65,7 +65,7 @@ class MaintenanceClient(VIDClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, "CREATE_LINE_OF_BUSINESS": { "verb": "POST", @@ -84,7 +84,7 @@ class MaintenanceClient(VIDClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, "CREATE_PLATFORM": { "verb": "POST", @@ -103,7 +103,7 @@ class MaintenanceClient(VIDClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, "CREATE_PROJECT": { "verb": "POST", @@ -122,7 +122,7 @@ class MaintenanceClient(VIDClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, "GET_CATEGORY_PARAMETERS": { "verb": "GET", @@ -139,6 +139,6 @@ class MaintenanceClient(VIDClient): "X-TransactionId": str(uuid.uuid4()), "X-FromAppId": self.config.application_id, }, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, } diff --git a/onap-client/onap_client/vid/client.py b/onap-client/onap_client/vid/client.py index 109f5b3..97fafe6 100644 --- a/onap-client/onap_client/vid/client.py +++ b/onap-client/onap_client/vid/client.py @@ -35,7 +35,9 @@ # # ============LICENSE_END============================================ from functools import partial +from frozendict import frozendict from onap_client.client.clients import Client +from onap_client.auth import auth_handler class VIDClient(Client): @@ -55,6 +57,24 @@ class VIDClient(Client): service_path=self.config.vid.VID_HEALTH_CHECK_PATH, ), "success_code": 200, - "auth": (self.config.vid.VID_USERNAME, self.config.vid.VID_PASSWORD,), + "auth": self.auth, }, } + + @property + def vid_username(self): + """Username to authenticate to VID""" + return self.config.vid.VID_USERNAME + + @property + def vid_password(self): + """Password to authenticate to VID""" + return self.config.vid.VID_PASSWORD + + @property + def auth(self): + return auth_handler( + frozendict(self.config.vid.AUTH_PLUGIN) if self.config.vid.AUTH_PLUGIN else None, + self.vid_username, + self.vid_password, + ) diff --git a/onap-client/requirements.txt b/onap-client/requirements.txt index 150c8c4..94f928b 100644 --- a/onap-client/requirements.txt +++ b/onap-client/requirements.txt @@ -41,3 +41,4 @@ PTable simplejson prettytable importlib_resources +frozendict diff --git a/onap-client/setup.py b/onap-client/setup.py index a6db762..1f2cb0a 100644 --- a/onap-client/setup.py +++ b/onap-client/setup.py @@ -41,13 +41,9 @@ import os with open("README.md", "r") as fh: long_description = fh.read() -# datafiles = [("onap_client", ["etc/config.example.yaml"])] -# for file in os.listdir("etc/payloads"): -# datafiles.append(("onap_client/payloads", ["etc/payloads/{}".format(file)])) - setuptools.setup( name="onap-client", - version="1.1.0", + version="1.2.0", author="Steven Stark", author_email="steven.stark@att.com", description="Python API wrapper for ONAP applications", @@ -62,7 +58,6 @@ setuptools.setup( license='Apache License, Version 2.0', python_requires=">=3.6", scripts=["bin/onap-client"], - # data_files=datafiles, include_package_data=True, install_requires=[ "Jinja2>=2.10", @@ -71,6 +66,7 @@ setuptools.setup( "PTable>=0.9.2", "simplejson>=3.17.0", "prettytable>=0.7.2", - "importlib_resources", + "importlib_resources>=3.0.0", + "frozendict>=1.2", ] ) |