diff options
Diffstat (limited to 'onap-client/onap_client/sdc')
-rw-r--r-- | onap-client/onap_client/sdc/catalog/service_catalog.py | 18 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/catalog/vnf_catalog.py | 18 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/license_model.py | 2 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/service.py | 55 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/tests/test_service.py | 6 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/tests/test_vnf.py | 9 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/vnf.py | 78 | ||||
-rw-r--r-- | onap-client/onap_client/sdc/vsp.py | 11 |
8 files changed, 154 insertions, 43 deletions
diff --git a/onap-client/onap_client/sdc/catalog/service_catalog.py b/onap-client/onap_client/sdc/catalog/service_catalog.py index 8a3566c..32749ff 100644 --- a/onap-client/onap_client/sdc/catalog/service_catalog.py +++ b/onap-client/onap_client/sdc/catalog/service_catalog.py @@ -366,6 +366,24 @@ class ServiceCatalog(SDCClient): }, "auth": self.auth, }, + "GET_SERVICE_BY_NAME_VERSION": { + "verb": "GET", + "description": "Gets a Service in the SDC catalog", + "uri": partial( + "{endpoint}{service_path}/serviceName/{catalog_service_name}/serviceVersion/{catalog_service_version}".format, + endpoint=self.config.sdc.SDC_BE_ENDPOINT, + service_path=self.config.sdc.SDC_CATALOG_SERVICES_PATH, + ), + "uri-parameters": ["catalog_service_name", "catalog_service_version"], + "success_code": 200, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "USER_ID": self.sdc_designer_user_id, + "X-FromAppId": self.config.application_id, + }, + "auth": self.auth, + }, "GET_SDC_SERVICE": { "verb": "GET", "description": "Gets a service from the SDC Catalog", diff --git a/onap-client/onap_client/sdc/catalog/vnf_catalog.py b/onap-client/onap_client/sdc/catalog/vnf_catalog.py index fe1a251..8d0ad32 100644 --- a/onap-client/onap_client/sdc/catalog/vnf_catalog.py +++ b/onap-client/onap_client/sdc/catalog/vnf_catalog.py @@ -460,6 +460,24 @@ class VNFCatalog(SDCClient): "return_data": {"catalog_resource_name": ("name",)}, "auth": self.auth, }, + "GET_RESOURCE_BY_NAME_VERSION": { + "verb": "GET", + "description": "Gets a VNF in the SDC catalog", + "uri": partial( + "{endpoint}{service_path}/resourceName/{catalog_resource_name}/resourceVersion/{catalog_resource_version}".format, + endpoint=self.config.sdc.SDC_BE_ENDPOINT, + service_path=self.config.sdc.SDC_CATALOG_RESOURCES_PATH, + ), + "uri-parameters": ["catalog_resource_name", "catalog_resource_version"], + "success_code": 200, + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "USER_ID": self.sdc_designer_user_id, + "X-FromAppId": self.config.application_id, + }, + "auth": self.auth, + }, "GET_CATALOG_RESOURCE_METADATA": { "verb": "GET", "description": "Gets metadata for a VNF in the SDC catalog", diff --git a/onap-client/onap_client/sdc/license_model.py b/onap-client/onap_client/sdc/license_model.py index ed5ba80..ba71527 100644 --- a/onap-client/onap_client/sdc/license_model.py +++ b/onap-client/onap_client/sdc/license_model.py @@ -97,6 +97,8 @@ class LicenseModel(Resource): license_model = self.oc.sdc.license_model.get_license_model(**self.attributes) self.attributes["tosca"] = license_model.response_data + self.oc.cache("license_model", self.license_model_name, "tosca", self.tosca) + def _output(self): return self.tosca diff --git a/onap-client/onap_client/sdc/service.py b/onap-client/onap_client/sdc/service.py index c405e42..1bccb36 100644 --- a/onap-client/onap_client/sdc/service.py +++ b/onap-client/onap_client/sdc/service.py @@ -121,7 +121,7 @@ class Service(Resource): """Creates a service object in SDC""" service = None - existing = get_service_id(service_input.get("service_name"), oc=self.oc) + existing, __ = get_service_id(service_input.get("service_name"), oc=self.oc) if existing is None: service = create_service(service_input, oc=self.oc) elif service_input.get("allow_update"): @@ -144,13 +144,19 @@ class Service(Resource): resource_id = resource.get("resource_id") resource_properties = resource.get("properties") if not resource_id: - resource_id = get_vnf_id(catalog_resource_name, oc=self.oc) + cached_resource = self.oc.get_cached("vnf", catalog_resource_name, "tosca") + if not cached_resource: + resource_id, __ = get_vnf_id(catalog_resource_name, oc=self.oc) + else: + resource_id = cached_resource.get("uniqueId") + if not resource_id: raise exceptions.ResourceIDNotFoundException( "resource ID was not passed, and resource lookup by name was not found {}".format( resource_name ) ) + resource_origin = resource.get("origin_type") self.add_resource(resource_id, resource_name, origin_type=resource_origin) for k, v in resource_properties.items(): @@ -209,6 +215,8 @@ class Service(Resource): self._refresh() + self.oc.cache("service", self.service_name, "tosca", self.tosca) + def add_resource( self, catalog_resource_id, catalog_resource_name, origin_type="VF" ): @@ -380,27 +388,42 @@ def get_service(service_name, oc=None): if not oc: oc = Client() - return oc.sdc.service.get_sdc_service( - catalog_service_id=get_service_id(service_name, oc=oc) - ).response_data + catalog_service_id, catalog_service = get_service_id(service_name, oc=oc) + if not catalog_service: + return oc.sdc.service.get_sdc_service( + catalog_service_id=catalog_service_id + ).response_data + else: + return catalog_service @utility def get_service_id(service_name, oc=None): - """Queries SDC for the uniqueId of a service model""" if not oc: oc = Client() - response = oc.sdc.service.get_services() - results = response.response_data.get("services", []) - update_time = -1 - catalog_service = {} - for service in results: - if service.get("name") == service_name and service.get("lastUpdateDate") > update_time: - update_time = service.get("lastUpdateDate") - catalog_service = service - - return catalog_service.get("uniqueId") + response = oc.sdc.service.get_service_by_name_version( + catalog_service_name=service_name, + catalog_service_version="1.0", + raise_on_error=False, + attempts=1, + ) + if not response.success: + return None, None + + versions = response.response_data.get("allVersions") + catalog_service_id = "" + catalog_service = None + highest_version = 0 + for version, service_id in versions.items(): + if float(version) > highest_version: + highest_version = float(version) + catalog_service_id = service_id + + if highest_version == 1.0: + catalog_service = response.response_data + + return catalog_service_id, catalog_service def get_service_uuid(service_name, oc=None): diff --git a/onap-client/onap_client/sdc/tests/test_service.py b/onap-client/onap_client/sdc/tests/test_service.py index 77eadbd..ad79a44 100644 --- a/onap-client/onap_client/sdc/tests/test_service.py +++ b/onap-client/onap_client/sdc/tests/test_service.py @@ -102,6 +102,12 @@ def test_vnf_create(): "uniqueId": SERVICE_MODEL_ID, } ) + mockup_catalog_item( + oc.sdc.service.catalog_items["GET_SERVICE_BY_NAME_VERSION"], + override_uri_params={"catalog_service_name": SERVICE_NAME, "catalog_service_version": "1.0"}, + override_return_data={}, + status=404 + ) service = Service( instantiation_type="A-la-carte", diff --git a/onap-client/onap_client/sdc/tests/test_vnf.py b/onap-client/onap_client/sdc/tests/test_vnf.py index da3dd86..06fb750 100644 --- a/onap-client/onap_client/sdc/tests/test_vnf.py +++ b/onap-client/onap_client/sdc/tests/test_vnf.py @@ -65,6 +65,9 @@ def test_vnf_create(): {"name": "nf_role", "value": "dfankafd"}, ] }, + "allVersions": { + "1.0": CATALOG_RESOURCE_ID + }, "name": VNF_NAME, } mockup_catalog_item( @@ -108,6 +111,12 @@ def test_vnf_create(): override_uri_params={"catalog_resource_id": CATALOG_RESOURCE_ID}, ) mockup_catalog_item( + oc.sdc.vnf.catalog_items["GET_RESOURCE_BY_NAME_VERSION"], + override_return_data=return_data, + override_uri_params={"catalog_resource_name": VNF_NAME, "catalog_resource_version": "1.0"}, + status=404, + ) + mockup_catalog_item( oc.sdc.vnf.catalog_items["CERTIFY_CATALOG_RESOURCE"], override_return_data=return_data, override_uri_params={"catalog_resource_id": CATALOG_RESOURCE_ID}, diff --git a/onap-client/onap_client/sdc/vnf.py b/onap-client/onap_client/sdc/vnf.py index af5f71f..4f7e4d7 100644 --- a/onap-client/onap_client/sdc/vnf.py +++ b/onap-client/onap_client/sdc/vnf.py @@ -34,7 +34,6 @@ # limitations under the License. # # ============LICENSE_END============================================ - from onap_client.lib import generate_dummy_string from onap_client.resource import Resource from onap_client import exceptions @@ -126,11 +125,11 @@ class VNF(Resource): """Creates a vnf object in SDC""" vnf = None - existing = get_vnf_id(vnf_input.get("vnf_name"), oc=self.oc) - if not existing: + existing_vnf_id, __ = get_vnf_id(vnf_input.get("vnf_name"), oc=self.oc) + if not existing_vnf_id: vnf = create_vnf(vnf_input, oc=self.oc) elif vnf_input.get("allow_update"): - vnf = update_vnf(existing, vnf_input, oc=self.oc) + vnf = update_vnf(existing_vnf_id, vnf_input, oc=self.oc) else: raise exceptions.ResourceAlreadyExistsException( "VNF resource {} already exists".format(vnf_input.get("vnf_name")) @@ -191,6 +190,8 @@ class VNF(Resource): self.attributes["catalog_resource_name"] = vnf.catalog_resource_name self.attributes["tosca"] = vnf.response_data + self.oc.cache("vnf", self.vnf_name, "tosca", self.tosca) + def _add_instance_properties(self, instance_id, properties_dict): for k, v in properties_dict.items(): # updating vm_type properties @@ -211,7 +212,7 @@ class VNF(Resource): resource_relationship = resource.get("relationship", {}) if not resource_id: - resource_id = get_vnf_id(catalog_resource_name, oc=self.oc) + resource_id, __ = get_vnf_id(catalog_resource_name, oc=self.oc) if not resource_id: raise exceptions.ResourceIDNotFoundException( "resource ID was not passed, and resource lookup by name was not found {}".format( @@ -522,11 +523,13 @@ def update_vnf(catalog_resource_id, vnf_input, oc=None): if existing_vnf.get("lifecycleState") != "NOT_CERTIFIED_CHECKOUT": vnf = oc.sdc.vnf.checkout_catalog_resource(catalog_resource_id=catalog_resource_id).response_data else: - vnf = oc.sdc.vnf.get_catalog_resource_metadata(catalog_resource_id=catalog_resource_id).response_data.get("metadata", {}) + vnf = existing_vnf new_vnf_metadata = oc.sdc.vnf.get_catalog_resource_metadata(catalog_resource_id=vnf.get("uniqueId")).response_data.get("metadata", {}) - csar_version = vsp.get_vsp_version_id(vnf.get("csarUUID"), search_key="name", oc=oc) + csar_version = oc.get_cached("vsp", vnf_input.get("software_product_name"), "csar_version") + if not csar_version: + csar_version = vsp.get_vsp_version_id(vnf.get("csarUUID"), search_key="name", oc=oc) vnf["csarVersion"] = csar_version vnf["componentMetadata"] = new_vnf_metadata @@ -549,9 +552,14 @@ def create_vnf(vnf_input, oc=None): if not oc: oc = Client() - software_product_id = vsp.get_vsp_id(vnf_input.get("software_product_name"), oc=oc) - software_product_version_id = vsp.get_vsp_version_id(software_product_id, oc=oc) - vsp_model = vsp.get_vsp_model(software_product_id, software_product_version_id, oc=oc) + vsp_model = oc.get_cached("vsp", vnf_input.get("software_product_name"), "tosca") + if not vsp_model: + software_product_id = vsp.get_vsp_id(vnf_input.get("software_product_name"), oc=oc) + software_product_version_id = vsp.get_vsp_version_id(software_product_id, oc=oc) + vsp_model = vsp.get_vsp_model(software_product_id, software_product_version_id, oc=oc) + else: + software_product_id = vsp_model.get("id") + software_product_version_id = vsp_model.get("version") vsp_vendor = vsp_model.get("vendorName") vsp_category = vsp_model.get("category") @@ -571,7 +579,12 @@ def create_vnf(vnf_input, oc=None): break category["subcategories"] = vsp_sub_categories - vnf_input["contact_id"] = vsp.get_vsp_owner(software_product_id, oc=oc) + + owner = oc.get_cached("vsp", vnf_input.get("software_product_name"), "owner") + if not owner: + owner = vsp.get_vsp_owner(software_product_id, oc=oc) + + vnf_input["contact_id"] = owner vnf = oc.sdc.vnf.add_catalog_resource(**vnf_input, categories=[category]) @@ -664,9 +677,13 @@ def get_vnf(vnf_name, oc=None): if not oc: oc = Client() - return oc.sdc.vnf.get_catalog_resource( - catalog_resource_id=get_vnf_id(vnf_name, oc=oc) - ).response_data + catalog_resource_id, catalog_resource = get_vnf_id(vnf_name, oc=oc) + if not catalog_resource: + return oc.sdc.vnf.get_catalog_resource( + catalog_resource_id=catalog_resource_id + ).response_data + else: + return catalog_resource def get_resource_category(category_name, oc=None): @@ -681,16 +698,29 @@ def get_resource_category(category_name, oc=None): def get_vnf_id(vnf_name, oc=None): + """Returns the latest VNF id for a VNF Model. If there is only one version + of a VNF model, that will also be returned""" if not oc: oc = Client() - response = oc.sdc.vnf.get_resources() - results = response.response_data.get("resources", []) - catalog_resource = {} - update_time = -1 - for vnf in results: - if vnf.get("name") == vnf_name and vnf.get("lastUpdateDate") > update_time: - update_time = vnf.get("lastUpdateDate") - catalog_resource = vnf - - return catalog_resource.get("uniqueId") + response = oc.sdc.vnf.get_resource_by_name_version( + catalog_resource_name=vnf_name, + catalog_resource_version="1.0", + raise_on_error=False, + attempts=1, + ) + if not response.success: + return None, None + + versions = response.response_data.get("allVersions") + catalog_resource_id = "" + catalog_resource = None + highest_version = 0 + for version, vnf_id in versions.items(): + if float(version) > highest_version: + highest_version = float(version) + catalog_resource_id = vnf_id + + if highest_version == 1.0: + catalog_resource = response.response_data + return catalog_resource_id, catalog_resource diff --git a/onap-client/onap_client/sdc/vsp.py b/onap-client/onap_client/sdc/vsp.py index 3a8dcde..100fca0 100644 --- a/onap-client/onap_client/sdc/vsp.py +++ b/onap-client/onap_client/sdc/vsp.py @@ -124,6 +124,9 @@ class VSP(Resource): vsp = self.oc.sdc.vsp.get_software_product(**self.attributes) self.attributes["tosca"] = vsp.response_data + self.oc.cache("vsp", self.software_product_name, "tosca", self.tosca) + self.oc.cache("vsp", self.software_product_name, "owner", self.owner) + def _output(self): return self.tosca @@ -136,14 +139,16 @@ def update_vsp(existing_vsp, vsp_input, oc=None): existing_vsp_version_id = existing_vsp.get("version") if get_vsp_version_id(existing_vsp_id, search_key="status", oc=oc) == "Certified": - oc.sdc.vsp.update_software_product( + response_data = oc.sdc.vsp.update_software_product( software_product_id=existing_vsp_id, software_product_version_id=existing_vsp_version_id, description=vsp_input.get("update_message", "New VSP Version") - ) + ).response_data + oc.cache("vsp", existing_vsp.get("name"), "csar_version", response_data.get("name")) + existing_vsp_version_id = response_data.get("id") vsp_input["software_product_id"] = existing_vsp_id - vsp_input["software_product_version_id"] = get_vsp_version_id(existing_vsp_id, oc=oc) + vsp_input["software_product_version_id"] = existing_vsp_version_id oc.sdc.vsp.upload_heat_package(**vsp_input) oc.sdc.vsp.validate_software_product(**vsp_input) |