aboutsummaryrefslogtreecommitdiffstats
path: root/onap-client/onap_client/sdc
diff options
context:
space:
mode:
Diffstat (limited to 'onap-client/onap_client/sdc')
-rw-r--r--onap-client/onap_client/sdc/catalog/service_catalog.py18
-rw-r--r--onap-client/onap_client/sdc/catalog/vnf_catalog.py18
-rw-r--r--onap-client/onap_client/sdc/license_model.py2
-rw-r--r--onap-client/onap_client/sdc/service.py55
-rw-r--r--onap-client/onap_client/sdc/tests/test_service.py6
-rw-r--r--onap-client/onap_client/sdc/tests/test_vnf.py9
-rw-r--r--onap-client/onap_client/sdc/vnf.py78
-rw-r--r--onap-client/onap_client/sdc/vsp.py11
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)