From 3d3d3574f1012a7faa6cf86d55884cf0884decbf Mon Sep 17 00:00:00 2001 From: Abhishek Patil Date: Thu, 27 Jul 2023 16:32:17 +0530 Subject: ONAP SDK to add new PNF functionality Issue-ID: TEST-401 Change-Id: Ib603b9aaad43bb8c55ff5c2c23cd9a1a36475de9 Signed-off-by: Abhishek Patil --- src/onapsdk/aai/business/service.py | 45 ++++- src/onapsdk/so/instantiation.py | 16 +- src/onapsdk/so/templates/deletion_pnf.json.j2 | 6 - .../so/templates/instantiate_pnf_macro.json.j2 | 10 -- .../instantiate_pnf_macro_in_service.json.j2 | 109 +++++++++++++ .../templates/instantiate_pnf_macro_so_pnf.json.j2 | 10 -- ...rvice_macro_skip_pnf_registration_event.json.j2 | 181 +++++++++++++++++++++ 7 files changed, 342 insertions(+), 35 deletions(-) create mode 100644 src/onapsdk/so/templates/instantiate_pnf_macro_in_service.json.j2 create mode 100644 src/onapsdk/so/templates/instantiate_service_macro_skip_pnf_registration_event.json.j2 (limited to 'src/onapsdk') diff --git a/src/onapsdk/aai/business/service.py b/src/onapsdk/aai/business/service.py index fe3b34d..4351a26 100644 --- a/src/onapsdk/aai/business/service.py +++ b/src/onapsdk/aai/business/service.py @@ -18,7 +18,7 @@ from typing import Iterator, Type, Union, Iterable, Optional from onapsdk.exceptions import StatusError, ParameterError from onapsdk.sdc.service import Service from onapsdk.so.deletion import ServiceDeletionRequest -from onapsdk.so.instantiation import NetworkInstantiation, VnfInstantiation +from onapsdk.so.instantiation import NetworkInstantiation, VnfInstantiation, PnfInstantiation from onapsdk.utils.jinja import jinja_env from .instance import Instance @@ -417,6 +417,49 @@ class ServiceInstance(Instance): # pylint: disable=too-many-instance-attributes sdc_service=self.sdc_service ) + def add_pnf(self, # pylint: disable=too-many-arguments + pnf: "Pnf", + line_of_business: "LineOfBusiness", + platform: "Platform", + pnf_instance_name: str = None, + customer: "Customer" = None, + service_subscription: "ServiceSubscription" = None, + sdc_service: "SdcService" = None, + ) -> "PnfInstantiation": + """Add pnf into service instance. + + Instantiate PNF. + + Args: + pnf (Pnf): Pnf from service configuration to instantiate + line_of_business (LineOfBusiness): LineOfBusiness to use in instantiation request + platform (Platform): Platform to use in instantiation request + customer (Customer): Customer to use in instantiation request + service_subscription(ServiceSubscription): ServiceSubscription + pnf_instance_name (str): PNF instantiation name + sdc_service (SdcService): service model from sdc + + Raises: + StatusError: Service orchestration status is not "Active". + + Returns: + PnfInstantiation: PnfInstantiation request object + + """ + if not self.active: + raise StatusError('Service orchestration status must be "Active"') + + return PnfInstantiation.instantiate_macro( + self, + pnf, + line_of_business, + customer, + service_subscription, + platform, + pnf_instance_name, + sdc_service + ) + def add_network(self, # pylint: disable=too-many-arguments network: "Network", line_of_business: "LineOfBusiness", diff --git a/src/onapsdk/so/instantiation.py b/src/onapsdk/so/instantiation.py index a6781de..2ca25c2 100644 --- a/src/onapsdk/so/instantiation.py +++ b/src/onapsdk/so/instantiation.py @@ -789,8 +789,6 @@ class PnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a pnf_object: "Pnf", line_of_business: str, platform: str, - cloud_region: "CloudRegion", - tenant: "Tenant", sdc_service: "SdcService", pnf_instance_name: str = None, pnf_parameters: Iterable["InstantiationParameter"] = None, @@ -803,8 +801,7 @@ class PnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a pnf_object (Pnf): Pnf to instantiate line_of_business (LineOfBusiness): LineOfBusiness to use in instantiation request platform (Platform): Platform to use in instantiation request - cloud_region (CloudRegion): Cloud region to use in instantiation request. - tenant (Tenant): Tenant to use in instantiation request. + sdc_service(SdcService): service model to instantiate pnf_instance_name (str, optional): Pnf instance name. Defaults to None. pnf_parameters (Iterable[InstantiationParameter], optional): Instantiation parameters that are sent in the request. Defaults to None @@ -847,9 +844,6 @@ class PnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a instance_name=pnf_instance_name, pnf=pnf_object, service=sdc_service, - cloud_region=cloud_region or \ - next(aai_service_instance.service_subscription.cloud_regions), - tenant=tenant or next(aai_service_instance.service_subscription.tenants), project=project, owning_entity=owning_entity, line_of_business=line_of_business, @@ -989,7 +983,8 @@ class ServiceInstantiation(Instantiation): # pylint: disable=too-many-ancestors vnf_parameters: Iterable["VnfParameters"] = None, enable_multicloud: bool = False, so_service: "SoService" = None, - service_subscription: "ServiceSubscription" = None + service_subscription: "ServiceSubscription" = None, + skip_pnf_registration_event: "skip_event" = False ) -> "ServiceInstantiation": """Instantiate service using SO macro request. @@ -1012,6 +1007,8 @@ class ServiceInstantiation(Instantiation): # pylint: disable=too-many-ancestors so_service (SoService, optional): SO values to use in instantiation request service_subscription(ServiceSubscription, optional): Customer service subscription for the instantiated service. Required if so_service is not provided. + skip_pnf_registration_event(skip_event, optional) Required to skip + WaitForPnfReadyEvent. Raises: StatusError: if a service is not distributed. @@ -1035,6 +1032,9 @@ class ServiceInstantiation(Instantiation): # pylint: disable=too-many-ancestors msg = f"Service {sdc_service.name} is not distributed." raise StatusError(msg) + if skip_pnf_registration_event: + template_file = "instantiate_service_macro_skip_pnf_registration_event.json.j2" + response: dict = cls.send_message_json( "POST", f"Instantiate {sdc_service.name} service macro", diff --git a/src/onapsdk/so/templates/deletion_pnf.json.j2 b/src/onapsdk/so/templates/deletion_pnf.json.j2 index 852432a..4e8770d 100644 --- a/src/onapsdk/so/templates/deletion_pnf.json.j2 +++ b/src/onapsdk/so/templates/deletion_pnf.json.j2 @@ -16,12 +16,6 @@ "requestParameters": { "testApi": "GR_API", "aLaCarte": {{ a_la_carte | tojson }} - }, - {# the code below is needed to be refactored # - } - {# https: //gitlab.com/Orange-OpenSource/lfn/onap/python-onapsdk/-/issues/133 #} "cloudConfiguration": { "cloudOwner": "{{ pnf_instance.service_instance.service_subscription.cloud_region.cloud_owner }}", - "lcpCloudRegionId": "{{ pnf_instance.service_instance.service_subscription.cloud_region.cloud_region_id }}", - "tenantId": "{{ pnf_instance.service_instance.service_subscription.tenant.tenant_id }}" } } } \ No newline at end of file diff --git a/src/onapsdk/so/templates/instantiate_pnf_macro.json.j2 b/src/onapsdk/so/templates/instantiate_pnf_macro.json.j2 index 6abfe84..1f9b3a2 100755 --- a/src/onapsdk/so/templates/instantiate_pnf_macro.json.j2 +++ b/src/onapsdk/so/templates/instantiate_pnf_macro.json.j2 @@ -16,11 +16,6 @@ "modelCustomizationId": "{{ pnf.model_customization_id }}", "modelInstanceName": "{{ pnf.name }}" }, - "cloudConfiguration": { - "tenantId": "{{ tenant.tenant_id }}", - "cloudOwner": "{{ cloud_region.cloud_owner }}", - "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" - }, "platform": { "platformName": "{{ platform }}" }, @@ -53,11 +48,6 @@ "modelCustomizationId": "{{ pnf.model_customization_id }}", "modelInstanceName": "{{ pnf.name }}" }, - "cloudConfiguration": { - "tenantId": "{{ tenant.tenant_id }}", - "cloudOwner": "{{ cloud_region.cloud_owner }}", - "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" - }, "platform": { "platformName": "{{ platform }}" }, diff --git a/src/onapsdk/so/templates/instantiate_pnf_macro_in_service.json.j2 b/src/onapsdk/so/templates/instantiate_pnf_macro_in_service.json.j2 new file mode 100644 index 0000000..b38c985 --- /dev/null +++ b/src/onapsdk/so/templates/instantiate_pnf_macro_in_service.json.j2 @@ -0,0 +1,109 @@ +instantiate_service_macro_skip_pnf_registration_event.json.j2{ + "requestDetails": { + "requestInfo": { + "instanceName": "{{ service_instance.instance_name }}", + "source": "VID", + "suppressRollback": false, + "requestorId": "demo", + "productFamilyId": "1234" + }, + "modelInfo": { + "modelType": "pnf", + "modelInvariantId": "{{ pnf.model_invariant_id }}", + "modelVersionId": "{{ pnf.model_version_id }}", + "modelName": "{{ pnf.model_name }}", + "modelVersion": "{{ pnf.model_version }}", + "modelCustomizationId": "{{ pnf.model_customization_id }}", + "modelInstanceName": "{{ pnf.name }}" + }, + "platform": { + "platformName": "{{ platform }}" + }, + "lineOfBusiness": { + "lineOfBusinessName": "{{ line_of_business }}" + }, + "subscriberInfo": { + "globalSubscriberId": "{{ service_instance.service_subscription.customer.global_customer_id }}" + }, + "requestParameters": { + {% block subscriptionServiceType %} + "subscriptionServiceType": "{{ service.name }}", + {% endblock %} + "userParams": [ + { + "Homing_Solution": "none" + }, + { + "service": { + "instanceParams": [], + "resources": { + {% block pnfs %} + "pnfs": [ + { + "modelInfo": { + "modelName": "{{ pnf.model_name }}", + "modelVersionId": "{{ pnf.model_version_id }}", + "modelInvariantUuid": "{{ pnf.model_invariant_id }}", + "modelVersion": "{{ pnf.model_version }}", + "modelCustomizationId": "{{ pnf.model_customization_id }}", + "modelInstanceName": "{{ pnf.name }}" + }, + "pnfRegistrationFields": { + "modelNumber": "Simulated Device Melacon", + "oamV4IpAddress": "10.42.6.245", + "oamV6IpAddress": "0:0:0:0:0:ffff:a0a:011", + "serialNumber": "ORAN_SIM-172.30.1.6-400600927-Simulated Device Melacon", + "softwareVersion": "2.3.5", + "unitType": "ntsim_oran", + "vendorName": "Melacon" + }, + "platform": { + "platformName": "{{ platform }}" + }, + "lineOfBusiness": { + "lineOfBusinessName": "{{ line_of_business }}" + }, + "productFamilyId": "1234", + "instanceName": "{{ instance_name }}" + } + ] + {% endblock %} + }, + "modelInfo": { + "modelType": "pnf", + "modelInvariantId": "{{ pnf.model_invariant_id }}", + "modelVersionId": "{{ pnf.model_version_id }}", + "modelName": "{{ pnf.model_name }}", + "modelVersion": "{{ pnf.model_version }}", + "modelCustomizationId": "{{ pnf.model_customization_id }}", + "modelCustomizationName": "{{ pnf.name }}" + } + } + } + ], + "aLaCarte": false + }, + "project": { + "projectName": "{{ project }}" + }, + "owningEntity": { + "owningEntityId": "{{ owning_entity.owning_entity_id }}", + "owningEntityName": "{{ owning_entity.name }}" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "{{ service_instance.instance_id }}", + "modelInfo": { + "modelType": "service", + "modelInvariantId": "{{ service.unique_uuid }}", + "modelVersionId": "{{ service.identifier }}", + "modelName": "{{ service.name }}", + "modelVersion": "1.0" + } + } + } + ] + }, + "serviceInstanceId": "{{ service_instance.instance_id }}" +} diff --git a/src/onapsdk/so/templates/instantiate_pnf_macro_so_pnf.json.j2 b/src/onapsdk/so/templates/instantiate_pnf_macro_so_pnf.json.j2 index 5f1f22c..630d95e 100755 --- a/src/onapsdk/so/templates/instantiate_pnf_macro_so_pnf.json.j2 +++ b/src/onapsdk/so/templates/instantiate_pnf_macro_so_pnf.json.j2 @@ -16,11 +16,6 @@ "modelCustomizationId": "{{ pnf.model_customization_id }}", "modelInstanceName": "{{ pnf.name }}" }, - "cloudConfiguration": { - "tenantId": "{{ tenant.tenant_id }}", - "cloudOwner": "{{ cloud_region.cloud_owner }}", - "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" - }, "platform": { "platformName": "{{ platform }}" }, @@ -53,11 +48,6 @@ "modelCustomizationId": "{{ pnf.model_customization_id }}", "modelInstanceName": "{{ pnf.name }}" }, - "cloudConfiguration": { - "tenantId": "{{ tenant.tenant_id }}", - "cloudOwner": "{{ cloud_region.cloud_owner }}", - "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" - }, "platform": { "platformName": "{{ platform }}" }, diff --git a/src/onapsdk/so/templates/instantiate_service_macro_skip_pnf_registration_event.json.j2 b/src/onapsdk/so/templates/instantiate_service_macro_skip_pnf_registration_event.json.j2 new file mode 100644 index 0000000..caa0ab4 --- /dev/null +++ b/src/onapsdk/so/templates/instantiate_service_macro_skip_pnf_registration_event.json.j2 @@ -0,0 +1,181 @@ +{ + "requestDetails": { + "requestInfo": { + "suppressRollback": false, + {% if aai_service %} + "productFamilyId":"{{ aai_service.service_id }}", + {% else %} + "productFamilyId": "1234", + {% endif %} + "requestorId": "demo", + "instanceName": "{{ service_instance_name }}", + "source": "VID" + }, + "modelInfo": { + "modelType": "service", + "modelInvariantId": "{{ sdc_service.unique_uuid }}", + "modelVersionId": "{{ sdc_service.identifier }}", + "modelName": "{{ sdc_service.name }}", + "modelVersion": "1.0" + }, + {% if sdc_service.has_vnfs %} + "cloudConfiguration": { + "tenantId": "{{ tenant.tenant_id }}", + "cloudOwner": "{{ cloud_region.cloud_owner }}", + "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" + }, + {% endif %} + "subscriberInfo": { + "globalSubscriberId": "{{ customer.global_customer_id }}" + }, + "requestParameters": { + {% block subscriptionServiceType %} + "subscriptionServiceType": "{{ service_subscription.service_type }}", + {% endblock %} + "userParams": [ + { + "Homing_Solution": "none" + }, + {% if enable_multicloud %} + { + "name":"orchestrator", + "value":"multicloud" + }, + {% endif %} + { + "service": { + "instanceParams": [], + "instanceName": "{{ service_instance_name }}", + "resources": { + {% block pnfs %} + {% if sdc_service.pnfs %} + "pnfs":[ + {% for pnf in sdc_service.pnfs %} + { + "modelInfo":{ + "modelCustomizationName":"{{ pnf.name }}", + "modelCustomizationId":"{{ pnf.model_customization_id }}", + "modelInvariantId":"{{ sdc_service.unique_uuid }}", + "modelVersionId":"{{ sdc_service.identifier }}", + "modelName":"{{ sdc_service.name }}", + "modelType":"pnf", + "modelVersion":"1.0" + },"pnfRegistrationFields": { + "modelNumber": "Simulated Device Melacon", + "oamV4IpAddress": "10.42.6.245", + "oamV6IpAddress": "0:0:0:0:0:ffff:a0a:011", + "serialNumber": "ORAN_SIM-172.30.1.6-400600927-Simulated Device Melacon", + "softwareVersion": "2.3.5", + "unitType": "ntsim_oran", + "vendorName": "Melacon" + }, + "platform":{ + "platformName":"{{ platform }}" + }, + "lineOfBusiness":{ + "lineOfBusinessName":"{{ line_of_business }}" + }, + "productFamilyId":"{{ aai_service.service_id }}", + "instanceParams":[], + "instanceName":"{{ service_instance_name }}" + }{% if not loop.last %},{% endif %} + {% endfor %} + ] + {% if sdc_service.vnfs %},{% endif %} + {% endif %} + {% endblock %} + {% block vnfs %} + {% if sdc_service.vnfs %} + "vnfs": [ + {% for vnf in sdc_service.vnfs %} + { + "modelInfo": { + "modelName": "{{ vnf.model_name }}", + "modelVersionId": "{{ vnf.model_version_id }}", + "modelInvariantUuid": "{{ vnf.model_invariant_id }}", + "modelVersion": "{{ vnf.model_version }}", + "modelCustomizationId": "{{ vnf.model_customization_id }}", + "modelInstanceName": "{{ vnf.model_name }}" + }, + "cloudConfiguration": { + "tenantId": "{{ tenant.tenant_id }}", + "cloudOwner": "{{ cloud_region.cloud_owner }}", + "lcpCloudRegionId": "{{ cloud_region.cloud_region_id }}" + }, + "platform": { + "platformName": "{{ platform }}" + }, + "lineOfBusiness": { + "lineOfBusinessName": "{{ line_of_business }}" + }, + "productFamilyId": "1234", + "instanceName": "{{ vnf.model_name }}", + "instanceParams": [ + { + {% for vnf_parameter in vnf_parameters %} + {% if vnf_parameter.name == vnf.model_name %} + {% for parameter in vnf_parameter.vnf_parameters %} + "{{ parameter.name }}": "{{ parameter.value }}"{% if not loop.last %},{% endif %} + {% endfor %} + {% endif %} + {% endfor %} + } + ], + "vfModules": [ + {% for vf_module in vnf.vf_modules %} + { + "modelInfo": { + "modelName": "{{ vf_module.model_name }}", + "modelVersionId": "{{ vf_module.model_version_id }}", + "modelInvariantUuid": "{{ vf_module.model_invariant_uuid }}", + "modelVersion": "{{ vf_module.model_version }}", + "modelCustomizationId": "{{ vf_module.model_customization_id }}" + }, + "instanceName": "{{ service_instance_name }}_{{ vf_module.name }}", + "instanceParams": [ + { + {% for vnf_parameter in vnf_parameters %} + {% if vnf_parameter.name == vnf.model_name %} + {% set mylist = vf_module.name.split('..') %} + {% set item = mylist|length-2 %} + {% for vf_module_parameter in vnf_parameter.vfmodule_parameters %} + {% if vf_module_parameter.name == mylist[item] %} + {% for parameter in vf_module_parameter.vfmodule_parameters %} + "{{ parameter.name }}": "{{ parameter.value }}"{% if not loop.last %},{% endif %} + {% endfor %} + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} + } + ] + }{% if not loop.last %},{% endif %} + {% endfor %} + ] + }{% if not loop.last %},{% endif %} + {% endfor %} + ] + {% endif %} + {% endblock %} + }, + "modelInfo": { + "modelVersion": "1.0", + "modelVersionId": "{{ sdc_service.identifier }}", + "modelInvariantId": "{{ sdc_service.unique_uuid }}", + "modelName": "{{ sdc_service.name }}", + "modelType": "service" + } + } + } + ], + "aLaCarte": false + }, + "project": { + "projectName": "{{ project }}" + }, + "owningEntity": { + "owningEntityId": "{{ owning_entity.owning_entity_id }}", + "owningEntityName": "{{ owning_entity.name }}" + } + } +} -- cgit 1.2.3-korg