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/so/module_instance.py | 245 ++++++++++++++++++++------ 1 file changed, 191 insertions(+), 54 deletions(-) (limited to 'onap-client/onap_client/so/module_instance.py') diff --git a/onap-client/onap_client/so/module_instance.py b/onap-client/onap_client/so/module_instance.py index 67da272..59aba64 100644 --- a/onap-client/onap_client/so/module_instance.py +++ b/onap-client/onap_client/so/module_instance.py @@ -34,11 +34,13 @@ # limitations under the License. # # ============LICENSE_END============================================ - import uuid from onap_client.resource import Resource from onap_client.client.clients import get_client as Client -from onap_client.exceptions import ServiceInstanceNotFound, VNFInstanceNotFound, ModuleInstanceNotFound +from onap_client.exceptions import ( + ModuleModelNameNotFound, + NoArtifactFoundInModel, +) from onap_client import so from onap_client import sdnc from onap_client.util import utility @@ -57,25 +59,21 @@ class ModuleInstance(Resource): "cloud_owner": {"type": str, "required": True}, "cloud_region": {"type": str, "required": True}, "api_type": {"type": str, "required": False, "default": "GR_API"}, + "volume_group_name": {"type": str, "required": False}, } def _create(self, instance_input): tenant_id = so.service_instance.get_tenant_id( instance_input.get("cloud_region"), instance_input.get("cloud_owner"), - instance_input.get("tenant_name") + instance_input.get("tenant_name"), + oc=self.oc ) instance_input["tenant_id"] = tenant_id - service_instance = so.vnf_instance.get_service_instance( - instance_input.get("service_instance_name") + service_instance = so.service_instance.get_service_instance( + instance_input.get("service_instance_name"), oc=self.oc ) - if not service_instance: - raise ServiceInstanceNotFound( - "No service instance found for {}".format( - instance_input.get("service_instance_name") - ) - ) service_instance_id = service_instance.get("service-instance-id") model_information = ( service_instance.get("service-data") @@ -87,15 +85,10 @@ class ModuleInstance(Resource): service_model_version = model_information["model-version"] service_model_name = model_information["model-name"] - vnf_instance = so.vnf_instance.get_vnf_instance( + vnf_instance = so.service_instance.get_vnf_instance( service_instance, instance_input.get("vnf_instance_name") ) - if not vnf_instance: - raise VNFInstanceNotFound( - "No vnf instance found for {}".format( - instance_input.get("vnf_instance_name") - ) - ) + vnf_model_information = vnf_instance.get("vnf-data").get("vnf-information") vnf_instance_id = vnf_model_information.get("vnf-id") vnf_model_name = vnf_model_information.get("onap-model-information").get( @@ -115,10 +108,10 @@ class ModuleInstance(Resource): ) vnf_model = so.vnf_instance.get_vnf_model_component( - service_model_name, vnf_model_name + service_model_name, vnf_model_name, oc=self.oc ) - module_model = so.vnf_instance.get_module_model( + module_model = get_module_model( vnf_model, instance_input.get("heat_template_name") ) model_invariant_id = module_model.get("invariantUUID") @@ -127,6 +120,8 @@ class ModuleInstance(Resource): model_name = module_model.get("groupName") model_version = module_model.get("version") + volume_group = module_uses_volume_group(module_model) and instance_input.get("volume_group_name") + instance_input["model_invariant_id"] = model_invariant_id instance_input["model_version_id"] = model_version_id instance_input["model_name"] = model_name @@ -144,11 +139,38 @@ class ModuleInstance(Resource): instance_input["vnf_model_version"] = vnf_model_version instance_input["vnf_model_customization_id"] = vnf_model_customization_id - return create_module_instance(instance_input) + return create_module_instance(instance_input, volume_group=volume_group, oc=self.oc) + + def _delete(self, instance_input): + if instance_input.get("volume_group_name"): + request = delete_volume_module_instance( + instance_input.get("service_instance_name"), + instance_input.get("vnf_instance_name"), + instance_input.get("volume_group_name"), + instance_input.get("api_type"), + oc=self.oc, + ) + request_id = request.get("requestReferences", {}).get( + "requestId" + ) + so.service_instance.poll_request(request_id, oc=self.oc) + + request = delete_module_instance( + instance_input.get("service_instance_name"), + instance_input.get("vnf_instance_name"), + instance_input.get("module_instance_name"), + instance_input.get("api_type"), + oc=self.oc, + ) + request_id = request.get("requestReferences", {}).get( + "requestId" + ) + so.service_instance.poll_request(request_id, oc=self.oc) -def create_module_instance(instance_input): - oc = Client() +def create_module_instance(instance_input, volume_group=False, oc=None): + if not oc: + oc = Client() preload = sdnc.preload.Preload( preload_path=instance_input.get("preload_path"), @@ -156,11 +178,24 @@ def create_module_instance(instance_input): service_instance_name=instance_input.get("service_instance_name"), module_instance_name=instance_input.get("module_instance_name"), heat_template_name=instance_input.get("heat_template_name"), - api_type=instance_input.get("api_type") + api_type=instance_input.get("api_type"), + oc=oc ) preload.create() headers = {"X-TransactionId": str(uuid.uuid4())} + + if volume_group: + volume_instance = oc.so.service_instantiation.create_volume_module_instance( + volume_module_instance_name=instance_input.get("volume_group_name"), + **instance_input, + **headers + ) + request_id = volume_instance.response_data.get("requestReferences", {}).get( + "requestId" + ) + so.service_instance.poll_request(request_id, oc=oc) + module_instance = oc.so.service_instantiation.create_module_instance( **instance_input, **headers ) @@ -169,41 +204,143 @@ def create_module_instance(instance_input): "requestId" ) - instance_input["request_info"] = so.service_instance.poll_request(request_id) + instance_input["request_info"] = so.service_instance.poll_request(request_id, oc=oc) return instance_input @utility -def delete_module_instance(service_instance_name, vnf_instance_name, module_instance_name, api_type="GR_API"): +def delete_module_instance(service_instance_name, vnf_instance_name, module_instance_name, api_type="GR_API", oc=None): + """Delete a Module Instance from SO""" + if not oc: + oc = Client() + + si = so.service_instance.get_service_instance(service_instance_name, oc=oc) + vnfi = so.service_instance.get_vnf_instance(si, vnf_instance_name) + modulei = so.service_instance.get_module_instance(vnfi, module_instance_name) + + si_id = si.get("service-instance-id") + vnfi_id = vnfi.get("vnf-id") + module_id = modulei.get("vf-module-id") + module_invariant_id = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-invariant-uuid") + module_version = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-version") + module_name = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-name") + tenant_id = modulei.get("vf-module-data").get("vf-module-request-input").get("tenant") + cloud_owner = modulei.get("vf-module-data").get("vf-module-request-input").get("cloud-owner") + cloud_region = modulei.get("vf-module-data").get("vf-module-request-input").get("aic-cloud-region") + + return oc.so.service_instantiation.delete_module_instance( + module_invariant_id=module_invariant_id, + module_name=module_name, + module_version=module_version, + cloud_region=cloud_region, + cloud_owner=cloud_owner, + tenant_id=tenant_id, + vnf_instance_id=vnfi_id, + service_instance_id=si_id, + vf_module_id=module_id, + api_type=api_type + ).response_data + + +@utility +def delete_volume_module_instance(service_instance_name, vnf_instance_name, volume_module_name, api_type="GR_API", oc=None): """Delete a Module Instance from SO""" - oc = Client() + if not oc: + oc = Client() + + si = so.service_instance.get_service_instance(service_instance_name, oc=oc) + vnfi = so.service_instance.get_vnf_instance(si, vnf_instance_name) + + vnf_model_information = vnfi.get("vnf-data").get("vnf-information") + service_model_information = ( + si.get("service-data") + .get("service-information") + .get("onap-model-information") + ) + service_model_name = service_model_information["model-name"] + vnf_model_name = vnf_model_information.get("onap-model-information").get( + "model-name" + ) - si = so.service_instance.get_service_instance(service_instance_name) si_id = si.get("service-instance-id") - for vnfi in si.get("service-data", {}).get("vnfs", {}).get("vnf", []): - vnfi_id = vnfi.get("vnf-id") - if vnfi.get("vnf-data", {}).get("vnf-request-input", {}).get("vnf-name") == vnf_instance_name: - for modulei in vnfi.get("vnf-data").get("vf-modules", {}).get("vf-module", []): - if modulei.get("vf-module-data", {}).get("vf-module-request-input", {}).get("vf-module-name") == module_instance_name: - module_id = modulei.get("vf-module-id") - module_invariant_id = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-invariant-uuid") - module_version = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-version") - module_name = modulei.get("vf-module-data").get("vf-module-topology").get("onap-model-information").get("model-name") - tenant_id = modulei.get("vf-module-data").get("vf-module-request-input").get("tenant") - cloud_owner = modulei.get("vf-module-data").get("vf-module-request-input").get("cloud-owner") - cloud_region = modulei.get("vf-module-data").get("vf-module-request-input").get("aic-cloud-region") - return oc.so.service_instantiation.delete_module_instance( - module_invariant_id=module_invariant_id, - module_name=module_name, - module_version=module_version, - cloud_region=cloud_region, - cloud_owner=cloud_owner, - tenant_id=tenant_id, - vnf_instance_id=vnfi_id, - service_instance_id=si_id, - vf_module_id=module_id, - api_type=api_type - ).response_data - - raise ModuleInstanceNotFound("Module Instance was not found: {} {} {}".format(service_instance_name, vnf_instance_name, module_instance_name)) + vnfi_id = vnfi.get("vnf-id") + + tenant_id = vnfi.get("vnf-data").get("vnf-request-input").get("tenant") + cloud_owner = vnfi.get("vnf-data").get("vnf-request-input").get("cloud-owner") + cloud_region = vnfi.get("vnf-data").get("vnf-request-input").get("aic-cloud-region") + + volume_group_instance = get_volume_group_instance(volume_module_name, cloud_owner, cloud_region, oc=oc) + volume_customization_id = volume_group_instance.get("model-customization-id") + vnf_component = so.vnf_instance.get_vnf_model_component( + service_model_name, vnf_model_name, oc=oc + ) + volume_group_component = get_volume_group_from_vnf_model(vnf_component, volume_customization_id) + + return oc.so.service_instantiation.delete_volume_module_instance( + volume_module_id=volume_group_instance.get("volume-group-id"), + module_invariant_id=volume_group_component.get("invariantUUID"), + module_name=volume_group_component.get("groupName"), + module_version=volume_group_component.get("version"), + cloud_region=cloud_region, + cloud_owner=cloud_owner, + tenant_id=tenant_id, + vnf_instance_id=vnfi_id, + service_instance_id=si_id, + api_type=api_type + ).response_data + + +def module_uses_volume_group(module_model): + for prop in module_model.get("properties"): + if prop.get("name", "") == "volume_group" and prop.get("value") == "true": + return True + return False + + +def get_volume_group_instance(volume_group_name, cloud_owner, cloud_region, oc=None): + if not oc: + oc = Client() + + volume_group_list = oc.aai.cloud_infrastructure.get_volume_groups( + cloud_owner=cloud_owner, + cloud_region=cloud_region + ).response_data + + for volume_group in volume_group_list.get("volume-group", []): + if volume_group.get("volume-group-name") == volume_group_name: + return volume_group + + return {} + + +def get_volume_group_from_vnf_model(vnf_component, volume_group_customization_id): + for group_instance in vnf_component.get("groupInstances", []): + if group_instance.get("customizationUUID") == volume_group_customization_id: + return group_instance + return {} + + +def get_module_model(vnf_model, heat_template_name): + artifact_uuid = None + deployment_artifacts = vnf_model.get("deploymentArtifacts", {}) + for artifact_name, artifact_data in deployment_artifacts.items(): + if artifact_data.get("artifactName") == heat_template_name: + artifact_uuid = artifact_data.get("artifactUUID") + + if not artifact_uuid: + raise NoArtifactFoundInModel( + "Heat Template {} was not found in service model".format(heat_template_name) + ) + + group_instances = vnf_model.get("groupInstances", []) + for instance in group_instances: + if artifact_uuid in instance.get("artifactsUuid", []): + # return instance.get("groupName") + return instance + + raise ModuleModelNameNotFound( + "Module Model Name for {} was not found in service model".format( + heat_template_name + ) + ) -- cgit 1.2.3-korg