diff options
Diffstat (limited to 'src/onapsdk/so/instantiation.py')
-rw-r--r-- | src/onapsdk/so/instantiation.py | 90 |
1 files changed, 85 insertions, 5 deletions
diff --git a/src/onapsdk/so/instantiation.py b/src/onapsdk/so/instantiation.py index bb0bde2..c1bf10e 100644 --- a/src/onapsdk/so/instantiation.py +++ b/src/onapsdk/so/instantiation.py @@ -1,4 +1,4 @@ -"""Instantion module.""" +"""Instantiation module.""" # Copyright 2022 Orange, Deutsche Telekom AG # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -33,7 +33,7 @@ from .so_element import OrchestrationRequest @dataclass -class Operation: +class Operation: # pylint: disable=too-many-lines """Operation class with data about method and suffix for VnfOperation.""" request_method: str @@ -45,6 +45,13 @@ class VnfOperation(Operation): # pylint: disable=too-few-public-methods UPDATE = Operation("PUT", "") HEALTHCHECK = Operation("POST", "/healthcheck") + UPGRADE = Operation("POST", "/upgradeCnf") + + +class ServiceOperation(Operation): # pylint: disable=too-few-public-methods + """Class to store possible operations' data for service (request method and suffix).""" + + UPGRADE_SERVICE = Operation("POST", "/upgrade") @dataclass @@ -571,6 +578,7 @@ class VnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a @classmethod def so_action(cls, # pylint: disable=too-many-arguments, too-many-locals vnf_instance: "VnfInstance", + vnf_object: "Vnf", operation_type: VnfOperation, aai_service_instance: "ServiceInstance", line_of_business: str, @@ -582,6 +590,7 @@ class VnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a Args: vnf_instance (VnfInstance): vnf instance object + vnf_object(VnfObject): vnf object operation_type (VnfOperation): name of the operation to trigger aai_service_instance (AaiService): Service Instance object from aai line_of_business (LineOfBusiness): LineOfBusiness name to use @@ -597,7 +606,9 @@ class VnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a VnfInstantiation: VnfInstantiation object """ - if operation_type not in (VnfOperation.HEALTHCHECK, VnfOperation.UPDATE): + if operation_type not in (VnfOperation.HEALTHCHECK, + VnfOperation.UPDATE, + VnfOperation.UPGRADE): raise StatusError("Operation not supported!") owning_entity_id = None @@ -628,8 +639,11 @@ class VnfInstantiation(NodeTemplateInstantiation): # pylint: disable=too-many-a owning_entity=owning_entity, line_of_business=line_of_business, platform=platform, - service_instance_name=aai_service_instance.instance_name, - so_service=so_service + service_instance_name=so_service.instance_name, + so_service=so_service, + service_instance=aai_service_instance, + vnf=vnf_object, + service=so_service ), headers=headers_so_creator(OnapService.headers) ) @@ -845,6 +859,72 @@ class ServiceInstantiation(Instantiation): # pylint: disable=too-many-ancestors project=project ) + @classmethod + def so_service_action(cls, # pylint: disable=too-many-arguments, too-many-locals + aai_service_instance: "ServiceInstance", + operation_svc_type: ServiceOperation, + platform: str, + sdc_service: "SdcService", + so_service: "SoService" = None + ) -> "ServiceInstantiation": + """Select Service with SO macro request. + + Raises: + StatusError: if the provided operation is not supported + + Returns: + ServiceInstantiation: ServiceInstantiation object + + """ + if operation_svc_type == ServiceOperation.UPGRADE_SERVICE: + template = "upgrade_service.json.j2" + else: + raise StatusError("Operation not supported!") + + owning_entity_id = None + project = settings.PROJECT + + for relationship in aai_service_instance.relationships: + if relationship.related_to == "owning-entity": + owning_entity_id = relationship.relationship_data.pop().get("relationship-value") + if relationship.related_to == "project": + project = relationship.relationship_data.pop().get("relationship-value") + + owning_entity = OwningEntity.get_by_owning_entity_id( + owning_entity_id=owning_entity_id) + + response: dict = cls.send_message_json( + operation_svc_type.request_method, + (f"So Action {sdc_service.name} " + f" Service instance {aai_service_instance.instance_id}"), + (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" + f"serviceInstances/{aai_service_instance.instance_id}" + f"{operation_svc_type.request_suffix}"), + data=jinja_env().get_template(template).render( + sdc_service=sdc_service, + cloud_region=next(aai_service_instance.service_subscription.cloud_regions), + tenant=next(aai_service_instance.service_subscription.tenants), + project=project, + owning_entity=owning_entity, + platform=platform, + service_instance=aai_service_instance, + service=so_service + ), + headers=headers_so_creator(OnapService.headers) + ) + + return ServiceInstantiation( + request_id=response["requestReferences"]["requestId"], + instance_id=response["requestReferences"]["instanceId"], + name=aai_service_instance.name, + sdc_service="SdcService", + cloud_region="CloudRegion", + tenant="Tenant", + customer="Customer", + owning_entity=OwningEntity, + project=project + ) + @property def aai_service_instance(self) -> "ServiceInstance": """Service instance associated with service instantiation request. |