From bb7533ad0175979f893724eed272148ff65f438c Mon Sep 17 00:00:00 2001 From: "peukerl@telekom.de" Date: Fri, 16 Jun 2023 09:05:05 +0200 Subject: pnf-functionalities added, parameters for service-instantiation added Issue-ID: INT-2250 Signed-off-by: peukerl@telekom.de Change-Id: I71d7ea0e05be0571a195c093a59fe3d08a138493 --- src/onapsdk/aai/business/pnf.py | 18 ++++++++----- src/onapsdk/so/deletion.py | 31 ++++++++++++++++++++++ src/onapsdk/so/instantiation.py | 28 +++++++++++++++++++ src/onapsdk/so/templates/deletion_pnf.json.j2 | 27 +++++++++++++++++++ .../templates/instantiate_pnf_macro_so_pnf.json.j2 | 13 ++++++++- .../so/templates/instantiate_service_macro.json.j2 | 10 ++++++- 6 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 src/onapsdk/so/templates/deletion_pnf.json.j2 (limited to 'src/onapsdk') diff --git a/src/onapsdk/aai/business/pnf.py b/src/onapsdk/aai/business/pnf.py index 9061ebf..9f5394f 100644 --- a/src/onapsdk/aai/business/pnf.py +++ b/src/onapsdk/aai/business/pnf.py @@ -16,6 +16,7 @@ from typing import Iterator, Optional, TYPE_CHECKING from onapsdk.exceptions import ResourceNotFound +from onapsdk.so.deletion import PnfDeletionRequest from .instance import Instance if TYPE_CHECKING: @@ -254,14 +255,17 @@ class PnfInstance(Instance): # pylint: disable=too-many-instance-attributes pnf_ipv4_address=api_response.get("pnf-ipv4-address"), pnf_ipv6_address=api_response.get("pnf-ipv6-address")) - def delete(self, a_la_carte: bool = True) -> None: - """Delete Pnf instance. + def delete(self, a_la_carte: bool = True) -> "PnfDeletionRequest": + """Create PNF deletion request. - PNF deletion it's just A&AI resource deletion. That's difference between another instances. - You don't have to wait for that task finish, because it's not async task. + Send request to delete PNF instance + + Args: + a_la_carte (boolean): deletion mode + + Returns: + PnfDeletionRequest: Deletion request """ self._logger.debug("Delete %s pnf", self.pnf_name) - self.send_message("DELETE", - f"Delete {self.pnf_name} PNF", - f"{self.url}?resource-version={self.resource_version}") + return PnfDeletionRequest.send_request(self, a_la_carte) diff --git a/src/onapsdk/so/deletion.py b/src/onapsdk/so/deletion.py index 35ff0ee..5b299f8 100644 --- a/src/onapsdk/so/deletion.py +++ b/src/onapsdk/so/deletion.py @@ -102,6 +102,37 @@ class VnfDeletionRequest(DeletionRequest): # pytest: disable=too-many-ancestors headers=headers_so_creator(OnapService.headers)) return cls(request_id=response["requestReferences"]["requestId"]) +class PnfDeletionRequest(DeletionRequest): # pytest: disable=too-many-ancestors + """PNF deletion class.""" + + @classmethod + def send_request(cls, + instance: "PnfInstance", + a_la_carte: bool = True) -> "PnfDeletionRequest": + """Send request to SO to delete PNF instance. + + Args: + instance (PnfInstance): PNF instance to delete + a_la_carte (boolean): deletion mode + + Returns: + PnfDeletionRequest: Deletion request object + + """ + cls._logger.debug("PNF %s deletion request", instance.pnf_id) + response = cls.send_message_json("DELETE", + f"Create {instance.pnf_id} PNF deletion request", + (f"{cls.base_url}/onap/so/infra/" + f"serviceInstantiation/{cls.api_version}/" + "serviceInstances/" + f"{instance.service_instance.instance_id}/" + f"pnfs/{instance.pnf_id}"), + data=jinja_env(). + get_template("deletion_pnf.json.j2"). + render(pnf_instance=instance, + a_la_carte=a_la_carte), + headers=headers_so_creator(OnapService.headers)) + return cls(request_id=response["requestReferences"]["requestId"]) class ServiceDeletionRequest(DeletionRequest): # pytest: disable=too-many-ancestors """Service deletion request class.""" diff --git a/src/onapsdk/so/instantiation.py b/src/onapsdk/so/instantiation.py index 8130b00..a6781de 100644 --- a/src/onapsdk/so/instantiation.py +++ b/src/onapsdk/so/instantiation.py @@ -97,6 +97,7 @@ class SoServiceVnf(SoServiceXnf): class SoServicePnf(SoServiceXnf): """Class to store a Pnf instance parameters.""" + registration_parameters: Optional["PnfRegistrationParameters"] = None @dataclass class SoService: @@ -109,6 +110,7 @@ class SoService: subscription_service_type: str vnfs: List[SoServiceVnf] = field(default_factory=list) pnfs: List[SoServicePnf] = field(default_factory=list) + parameters: Dict[str, Any] = field(default_factory=dict) instance_name: Optional[str] = None @classmethod @@ -148,6 +150,32 @@ class VfmoduleParameters: vfmodule_parameters: Iterable["InstantiationParameter"] = None +@dataclass +class PnfRegistrationParameters: + """Class to store parameters required for pnf-instantiation without pnf-registration-event. + + Contains required parameters for instantiation request + """ + + model_number: str + oam_v4_ip_address: str + oam_v6_ip_address: str + serial_number: str + software_version: str + unit_type: str + vendor_name: str + + @classmethod + def load(cls, data: Dict[str, Any]) -> "PnfRegistrationParameters": + """Create a PnfRegistrationParameters object from the dict. + + Returns: + PnfRegistrationParameters: PnfRegistrationParameters object created from the dictionary + + """ + return from_dict(data_class=cls, data=data) + + @dataclass class InstantiationParameter: """Class to store instantiation parameters used for preload or macro instantiation. diff --git a/src/onapsdk/so/templates/deletion_pnf.json.j2 b/src/onapsdk/so/templates/deletion_pnf.json.j2 new file mode 100644 index 0000000..852432a --- /dev/null +++ b/src/onapsdk/so/templates/deletion_pnf.json.j2 @@ -0,0 +1,27 @@ +{ + "requestDetails": { + "requestInfo": { + "source": "VID", + "requestorId": "demo" + }, + "modelInfo": { + "modelType": "pnf", + "modelName": "{{ pnf_instance.pnf.model_name }}", + "modelInvariantId": "{{ pnf_instance.pnf.model_invariant_id }}", + "modelVersion": "{{ pnf_instance.pnf.model_version }}", + "modelVersionId": "{{ pnf_instance.pnf.model_version_id }}", + "modelCustomizationId": "{{ pnf_instance.pnf.model_customization_id }}", + "modelCustomizationName": "{{ pnf_instance.pnf.name }}" + }, + "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_so_pnf.json.j2 b/src/onapsdk/so/templates/instantiate_pnf_macro_so_pnf.json.j2 index a6571bd..5f1f22c 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 @@ -64,6 +64,17 @@ "lineOfBusiness": { "lineOfBusinessName": "{{ line_of_business }}" }, + {% if so_pnf.registration_parameters %} + "pnfRegistrationFields": { + "modelNumber": "{{ so_pnf.registration_parameters.model_number }}", + "oamV4IpAddress": "{{ so_pnf.registration_parameters.oam_v4_ip_address }}", + "oamV6IpAddress": "{{ so_pnf.registration_parameters.oam_v6_ip_address }}", + "serialNumber": "{{ so_pnf.registration_parameters.serial_number }}", + "softwareVersion": "{{ so_pnf.registration_parameters.software_version }}", + "unitType": "{{ so_pnf.registration_parameters.unit_type }}", + "vendorName": "{{ so_pnf.registration_parameters.vendor_name }}" + }, + {% endif %} "productFamilyId": "1234", "instanceName": "{{ instance_name }}", "instanceParams": [ @@ -72,7 +83,7 @@ "{{ key }}": "{{ value }}"{% if not loop.last %},{% endif %} {% endfor %} } - ], + ] } ] {% endblock %} diff --git a/src/onapsdk/so/templates/instantiate_service_macro.json.j2 b/src/onapsdk/so/templates/instantiate_service_macro.json.j2 index 43b92ee..b00a043 100644 --- a/src/onapsdk/so/templates/instantiate_service_macro.json.j2 +++ b/src/onapsdk/so/templates/instantiate_service_macro.json.j2 @@ -44,7 +44,15 @@ {% endif %} { "service": { - "instanceParams": [], + "instanceParams": [ + {% if so_service %} + { + {% for key, value in so_service.parameters.items() %} + "{{ key }}": "{{ value }}"{% if not loop.last %},{% endif %} + {% endfor %} + } + {% endif %} + ], "instanceName": "{{ service_instance_name }}", "resources": { {% block pnfs %} -- cgit 1.2.3-korg