def test_headers_so_creator(): base_header = {} so_headers_creator = headers_so_creator(base_header) assert base_header != so_headers_creator assert so_headers_creator["x-fromappid"] == "AAI" assert so_headers_creator["authorization"] assert so_headers_creator["x-transactionid"]
def send_request(cls, instance: "VfModuleInstance") -> "VfModuleDeletion": """Send request to SO to delete VNF instance. Args: vnf_instance (VnfInstance): VNF instance to delete Returns: VnfDeletionRequest: Deletion request object """ cls._logger.debug("VF module %s deletion request", instance.vf_module_id) response = cls.send_message_json( "DELETE", (f"Create {instance.vf_module_id} VF module" "deletion request"), (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/" "serviceInstances/" f"{instance.vnf_instance.service_instance.instance_id}/" f"vnfs/{instance.vnf_instance.vnf_id}/" f"vfModules/{instance.vf_module_id}"), data=jinja_env().get_template("deletion_vf_module.json.j2").render( vf_module_instance=instance), exception=ValueError, headers=headers_so_creator(OnapService.headers)) return cls(request_id=response["requestReferences"]["requestId"])
def add_cloud_site(cls, cloud_region_id: str, complex_id: str, identity_service: IdentityService, orchestrator: str = "multicloud"): """Add cloud_site data with identity_service to SO db. Args: cloud_region_id (str): The id of cloud region complex_id (str): The id of complex identity_service (IdentityService): Identity service related to the cloud region orchestrator (str, optional): Orchestrator type. Defaults to multicloud. Important: identity_services data will be overwrite, but in the same time cloud_sites data will not (shouldn't) be overwrite! SOCatalogDB REST API has some limitations reported: https://jira.onap.org/browse/SO-2727 Return: response object """ response = cls.send_message_json( "POST", "Create a region in SO db", f"{cls.base_url}/cloudSite", data=jinja_env().get_template( "add_cloud_site_with_identity_service.json.j2").render( cloud_region_id=cloud_region_id, complex_id=complex_id, orchestrator=orchestrator, identity_service=identity_service), headers=headers_so_creator(OnapService.headers)) return response
def get_by_vnf_instance_name(cls, vnf_instance_name: str) -> "VnfInstantiation": """Get VNF instantiation request by instance name. Raises: InvalidResponse: Vnf instance with given name does not contain requestList or the requestList does not contain any details. Returns: VnfInstantiation: Vnf instantiation request object """ response: dict = cls.send_message_json( "GET", f"Check {vnf_instance_name} service instantiation status", (f"{cls.base_url}/onap/so/infra/orchestrationRequests/{cls.api_version}?" f"filter=vnfInstanceName:EQUALS:{vnf_instance_name}"), headers=headers_so_creator(OnapService.headers) ) key = "requestList" if not response.get(key, []): raise InvalidResponse(f"{key} of a Vnf instance is missing.") for details in response[key]: return cls.create_from_request_response(details) msg = f"No details available in response dictionary's {key}." raise InvalidResponse(msg)
def send_request(cls, instance: "VnfInstance", a_la_carte: bool = True) -> "VnfDeletionRequest": """Send request to SO to delete VNF instance. Args: instance (VnfInstance): VNF instance to delete a_la_carte (boolean): deletion mode Returns: VnfDeletionRequest: Deletion request object """ cls._logger.debug("VNF %s deletion request", instance.vnf_id) response = cls.send_message_json( "DELETE", f"Create {instance.vnf_id} VNF deletion request", (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/" "serviceInstances/" f"{instance.service_instance.instance_id}/" f"vnfs/{instance.vnf_id}"), data=jinja_env().get_template("deletion_vnf.json.j2").render( vnf_instance=instance, a_la_carte=a_la_carte), headers=headers_so_creator(OnapService.headers)) return cls(request_id=response["requestReferences"]["requestId"])
def instantiate_ala_carte( cls, # pylint: disable=too-many-arguments sdc_service: "SdcService", cloud_region: "CloudRegion", tenant: "Tenant", customer: "Customer", owning_entity: "OwningEntity", project: "Project", service_instance_name: str = None, enable_multicloud: bool = False) -> "ServiceInstantiation": """Instantiate service using SO a'la carte request. Args: sdc_service (SdcService): Service to instantiate cloud_region (CloudRegion): Cloud region to use in instantiation request tenant (Tenant): Tenant to use in instantiation request customer (Customer): Customer to use in instantiation request owning_entity (OwningEntity): Owning entity to use in instantiation request project (Project): Project to use in instantiation request service_instance_name (str, optional): Service instance name. Defaults to None. enable_multicloud (bool, optional): Determines if Multicloud should be enabled for instantiation request. Defaults to False. Raises: ValueError: Instantiation request returns HTTP error code. Returns: ServiceInstantiation: instantiation request object """ if not sdc_service.distributed: raise ValueError("Service is not distributed") if service_instance_name is None: service_instance_name = f"Python_ONAP_SDK_service_instance_{str(uuid4())}" response: dict = cls.send_message_json( "POST", f"Instantiate {sdc_service.name} service a'la carte", (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/serviceInstances"), data=jinja_env().get_template( "instantiate_service_ala_carte.json.j2").render( sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, service_instance_name=service_instance_name, project=project, enable_multicloud=enable_multicloud), headers=headers_so_creator(OnapService.headers), exception=ValueError) return cls(name=service_instance_name, request_id=response["requestReferences"].get("requestId"), instance_id=response["requestReferences"].get("instanceId"), sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, project=project)
def instantiate_ala_carte(cls, # pylint: disable=too-many-arguments aai_service_instance: "ServiceInstance", vnf_object: "Vnf", line_of_business: str, platform: str, cloud_region: "CloudRegion", tenant: "Tenant", sdc_service: "SdcService", vnf_instance_name: str = None, vnf_parameters: Iterable["InstantiationParameter"] = None ) -> "VnfInstantiation": """Instantiate Vnf using a'la carte method. Args: vnf_object (Vnf): Vnf to instantiate line_of_business_object (LineOfBusiness): LineOfBusiness to use in instantiation request platform_object (Platform): Platform to use in instantiation request cloud_region (CloudRegion): Cloud region to use in instantiation request. tenant (Tenant): Tenant to use in instnatiation request. vnf_instance_name (str, optional): Vnf instance name. Defaults to None. vnf_parameters (Iterable[InstantiationParameter], optional): Instantiation parameters that are sent in the request. Defaults to None Returns: VnfInstantiation: VnfInstantiation object """ if vnf_instance_name is None: vnf_instance_name = \ f"Python_ONAP_SDK_vnf_instance_{str(uuid4())}" response: dict = cls.send_message_json( "POST", (f"Instantiate {sdc_service.name} " f"service vnf {vnf_object.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/vnfs"), data=jinja_env().get_template("instantiate_vnf_ala_carte.json.j2"). render( instance_name=vnf_instance_name, vnf=vnf_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), line_of_business=line_of_business, platform=platform, service_instance=aai_service_instance, vnf_parameters=vnf_parameters or [] ), headers=headers_so_creator(OnapService.headers) ) return VnfInstantiation( name=vnf_instance_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business, platform=platform, vnf=vnf_object )
def instantiate_ala_carte( cls, # pylint: disable=too-many-arguments vf_module, vnf_instance, vf_module_instance_name: str = None, vnf_parameters: Iterable[VnfParameter] = None ) -> "VfModuleInstantiation": """Instantiate VF module. Iterate throught vf modules from service Tosca file and instantiate vf modules. Args: vf_module_instance_name_factory (str, optional): Factory to create VF module names. It's going to be a prefix of name. Index of vf module in Tosca file will be added to it. If no value is provided it's going to be "Python_ONAP_SDK_vf_module_service_instance_{str(uuid4())}". Defaults to None. vnf_parameters (Iterable[VnfParameter], optional): Parameters which are going to be used in preload upload for vf modules. Defaults to None. Raises: AttributeError: VNF is not successfully instantiated. ValueError: VF module instnatiation request returns HTTP error code. Yields: Iterator[VfModuleInstantiation]: VfModuleInstantiation class object. """ sdc_service: SdcService = vnf_instance.service_instance.service_subscription.sdc_service if vf_module_instance_name is None: vf_module_instance_name = \ f"Python_ONAP_SDK_vf_module_instance_{str(uuid4())}" VfModulePreload.upload_vf_module_preload(vnf_instance, vf_module_instance_name, vf_module, vnf_parameters) response: dict = cls.send_message_json( "POST", (f"Instantiate {sdc_service.name} " f"service vf module {vf_module.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{vnf_instance.service_instance.instance_id}/vnfs/" f"{vnf_instance.vnf_id}/vfModules"), data=jinja_env().get_template( "instantiate_vf_module_ala_carte.json.j2").render( vf_module_instance_name=vf_module_instance_name, vf_module=vf_module, service=sdc_service, cloud_region=vnf_instance.service_instance. service_subscription.cloud_region, tenant=vnf_instance.service_instance.service_subscription. tenant, vnf_instance=vnf_instance), headers=headers_so_creator(OnapService.headers), exception=ValueError) return VfModuleInstantiation( name=vf_module_instance_name, request_id=response["requestReferences"].get("requestId"), instance_id=response["requestReferences"].get("instanceId"), vf_module=vf_module)
def instantiate_ala_carte(cls, # pylint: disable=too-many-arguments aai_service_instance: "ServiceInstance", network_object: "Network", line_of_business: str, platform: str, cloud_region: "CloudRegion", tenant: "Tenant", network_instance_name: str = None, subnets: Iterable[Subnet] = None) -> "NetworkInstantiation": """Instantiate Network using a'la carte method. Args: network_object (Network): Network to instantiate line_of_business (str): LineOfBusiness name to use in instantiation request platform (str): Platform name to use in instantiation request cloud_region (CloudRegion): Cloud region to use in instantiation request. tenant (Tenant): Tenant to use in instnatiation request. network_instance_name (str, optional): Network instance name. Defaults to None. Returns: NetworkInstantiation: NetworkInstantiation object """ if network_instance_name is None: network_instance_name = \ f"Python_ONAP_SDK_network_instance_{str(uuid4())}" NetworkPreload.upload_network_preload(network=network_object, network_instance_name=network_instance_name, subnets=subnets) response: dict = cls.send_message_json( "POST", (f"Instantiate {aai_service_instance.sdc_service.name} " f"service network {network_object.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/networks"), data=jinja_env().get_template("instantiate_network_ala_carte.json.j2"). render( instance_name=network_instance_name, network=network_object, service=aai_service_instance.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), line_of_business=line_of_business, platform=platform, service_instance=aai_service_instance, subnets=subnets ), headers=headers_so_creator(OnapService.headers) ) return cls( name=network_instance_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business, platform=platform, network=network_object )
def instantiate_ala_carte( cls, # pylint: disable=too-many-arguments aai_service_instance: "ServiceInstance", vnf_object: "Vnf", line_of_business_object: "LineOfBusiness", platform_object: "Platform", vnf_instance_name: str = None) -> "VnfInstantiation": """Instantiate Vnf using a'la carte method. Args: vnf_object (Vnf): Vnf to instantiate line_of_business_object (LineOfBusiness): LineOfBusiness to use in instantiation request platform_object (Platform): Platform to use in instantiation request vnf_instance_name (str, optional): Vnf instance name. Defaults to None. Raises: ValueError: Instantiate request returns response with HTTP error code Returns: VnfInstantiation: VnfInstantiation object """ sdc_service: SdcService = aai_service_instance.service_subscription.sdc_service if vnf_instance_name is None: vnf_instance_name = \ f"Python_ONAP_SDK_vnf_instance_{str(uuid4())}" response: dict = cls.send_message_json( "POST", (f"Instantiate {aai_service_instance.service_subscription.sdc_service.name} " f"service vnf {vnf_object.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/vnfs"), data=jinja_env().get_template( "instantiate_vnf_ala_carte.json.j2").render( vnf_service_instance_name=vnf_instance_name, vnf=vnf_object, service=sdc_service, cloud_region=aai_service_instance.service_subscription. cloud_region, tenant=aai_service_instance.service_subscription.tenant, line_of_business=line_of_business_object, platform=platform_object, service_instance=aai_service_instance), headers=headers_so_creator(OnapService.headers), exception=ValueError) return VnfInstantiation( name=vnf_instance_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business_object, platform=platform_object, vnf=vnf_object)
def status(self) -> "StatusEnum": """Object instantiation status. It's populated by call SO orchestation request endpoint. Returns: StatusEnum: Instantiation status. """ response: dict = self.send_message_json( "GET", f"Check {self.request_id} orchestration request status", (f"{self.base_url}/onap/so/infra/" f"orchestrationRequests/{self.api_version}/{self.request_id}"), headers=headers_so_creator(OnapService.headers)) try: return self.StatusEnum( response["request"]["requestStatus"]["requestState"]) except (KeyError, ValueError): self._logger.exception("Invalid status") return self.StatusEnum.UNKNOWN
def get_by_vnf_instance_name(cls, vnf_instance_name: str) -> "VnfInstantiation": """Get VNF instantiation request by instance name. Raises: ValueError: Vnf instance with given name doesn't exist Returns: VnfInstantiation: Vnf instantiation request object """ response: dict = cls.send_message_json( "GET", f"Check {vnf_instance_name} service instantiation status", (f"{cls.base_url}/onap/so/infra/orchestrationRequests/{cls.api_version}?" f"filter=vnfInstanceName:EQUALS:{vnf_instance_name}"), headers=headers_so_creator(OnapService.headers)) if not response.get("requestList", []): raise ValueError("Vnf instance doesn't exist") for details in response["requestList"]: return cls.create_from_request_response(details) raise ValueError("No createInstance request found")
def send_request(cls, instance: "ServiceInstance") -> "ServiceDeletionRequest": """Send request to SO to delete service instance. Args: instance (ServiceInstance): service instance to delete Returns: ServiceDeletionRequest: Deletion request object """ cls._logger.debug("Service %s deletion request", instance.instance_id) response = cls.send_message_json( "DELETE", f"Create {instance.instance_id} Service deletion request", (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/" f"serviceInstances/{instance.instance_id}"), data=jinja_env().get_template("deletion_service.json.j2").render( service_instance=instance), exception=ValueError, headers=headers_so_creator(OnapService.headers)) return cls(request_id=response["requestReferences"]["requestId"])
def test_SoElement_headers(): """Test the header property""" element = SoElement() assert element.headers != headers_so_creator(OnapService.headers)
def headers(self): """Create headers for SO request. It is used as a property because x-transactionid header should be unique for each request. """ return headers_so_creator(OnapService.headers)
def instantiate_macro(cls, sdc_service: "SdcService", customer: "Customer", owning_entity: OwningEntity, project: str, line_of_business: str, platform: str, aai_service: "AaiService" = None, cloud_region: "CloudRegion" = None, tenant: "Tenant" = None, service_instance_name: str = None, vnf_parameters: Iterable["VnfParameters"] = None, enable_multicloud: bool = False, so_service: "SoService" = None, service_subscription: "ServiceSubscription" = None ) -> "ServiceInstantiation": """Instantiate service using SO macro request. Args: sdc_service (SdcService): Service to instantiate customer (Customer): Customer to use in instantiation request owning_entity (OwningEntity): Owning entity to use in instantiation request project (Project): Project name to use in instantiation request line_of_business_object (LineOfBusiness): LineOfBusiness name to use in instantiation request platform_object (Platform): Platform name to use in instantiation request aai_service (AaiService): Service object from aai sdc cloud_region (CloudRegion): Cloud region to use in instantiation request tenant (Tenant): Tenant to use in instantiation request service_instance_name (str, optional): Service instance name. Defaults to None. vnf_parameters: (Iterable[VnfParameters]): Parameters which are going to be used for vnfs instantiation. Defaults to None. enable_multicloud (bool, optional): Determines if Multicloud should be enabled for instantiation request. Defaults to False. 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. Raises: StatusError: if a service is not distributed. Returns: ServiceInstantiation: instantiation request object """ template_file = "instantiate_service_macro.json.j2" if so_service: template_file = "instantiate_multi_vnf_service_macro.json.j2" if so_service.instance_name: service_instance_name = so_service.instance_name else: if not service_subscription: raise ParameterError("If no so_service is provided, " "service_subscription parameter is required!") if service_instance_name is None: service_instance_name = f"Python_ONAP_SDK_service_instance_{str(uuid4())}" if not sdc_service.distributed: msg = f"Service {sdc_service.name} is not distributed." raise StatusError(msg) response: dict = cls.send_message_json( "POST", f"Instantiate {sdc_service.name} service macro", (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/serviceInstances"), data=jinja_env().get_template(template_file). \ render( so_service=so_service, sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, project=project, aai_service=aai_service, line_of_business=line_of_business, platform=platform, service_instance_name=service_instance_name, vnf_parameters=vnf_parameters, enable_multicloud=enable_multicloud, service_subscription=service_subscription ), headers=headers_so_creator(OnapService.headers) ) return cls( name=service_instance_name, request_id=response["requestReferences"].get("requestId"), instance_id=response["requestReferences"].get("instanceId"), sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, project=project )
def so_action(cls, # pylint: disable=too-many-arguments, too-many-locals vnf_instance: "VnfInstance", operation_type: VnfOperation, aai_service_instance: "ServiceInstance", line_of_business: str, platform: str, sdc_service: "SdcService", so_service: "SoService" = None ) -> "VnfInstantiation": """Execute SO action (update or healthcheck) for selected vnf with SO macro request. Args: vnf_instance (VnfInstance): vnf instance 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 in instantiation request platform (Platform): Platform name to use in instantiation request sdc_service (SdcService): Service model information so_service (SoService, optional): SO values to use in SO request Raises: StatusError: if the provided operation is not supported Returns: VnfInstantiation: VnfInstantiation object """ if operation_type not in (VnfOperation.HEALTHCHECK, VnfOperation.UPDATE): 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_type.request_method, (f"So Action {sdc_service.name} " f" vnf instance {vnf_instance.vnf_id}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/vnfs/{vnf_instance.vnf_id}" f"{operation_type.request_suffix}"), data=jinja_env().get_template("instantiate_multi_vnf_service_macro.json.j2").render( sdc_service=sdc_service, cloud_region=next(aai_service_instance.service_subscription.cloud_regions), tenant=next(aai_service_instance.service_subscription.tenants), customer=aai_service_instance.service_subscription.customer, project=project, owning_entity=owning_entity, line_of_business=line_of_business, platform=platform, service_instance_name=aai_service_instance.instance_name, so_service=so_service ), headers=headers_so_creator(OnapService.headers) ) return VnfInstantiation( name=vnf_instance.vnf_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business, platform=platform, vnf=vnf_instance )
def instantiate_macro(cls, # pylint: disable=too-many-arguments, too-many-locals aai_service_instance: "ServiceInstance", vnf_object: "Vnf", line_of_business: str, platform: str, cloud_region: "CloudRegion", tenant: "Tenant", sdc_service: "SdcService", vnf_instance_name: str = None, vnf_parameters: Iterable["InstantiationParameter"] = None, so_vnf: "SoServiceVnf" = None ) -> "VnfInstantiation": """Instantiate Vnf using macro method. Args: aai_service_instance (ServiceInstance): Service instance associated with request vnf_object (Vnf): Vnf 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. vnf_instance_name (str, optional): Vnf instance name. Defaults to None. vnf_parameters (Iterable[InstantiationParameter], optional): Instantiation parameters that are sent in the request. Defaults to None so_vnf (SoServiceVnf): object with vnf instance parameters Returns: VnfInstantiation: VnfInstantiation object """ 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) if so_vnf: template_file = "instantiate_vnf_macro_so_vnf.json.j2" if so_vnf.instance_name: vnf_instance_name = so_vnf.instance_name else: template_file = "instantiate_vnf_macro.json.j2" if vnf_instance_name is None: vnf_instance_name = \ f"Python_ONAP_SDK_vnf_instance_{str(uuid4())}" response: dict = cls.send_message_json( "POST", (f"Instantiate {sdc_service.name} " f"service vnf {vnf_object.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/vnfs"), data=jinja_env().get_template(template_file).render( instance_name=vnf_instance_name, vnf=vnf_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, platform=platform, service_instance=aai_service_instance, vnf_parameters=vnf_parameters or [], so_vnf=so_vnf ), headers=headers_so_creator(OnapService.headers) ) return VnfInstantiation( name=vnf_instance_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business, platform=platform, vnf=vnf_object )
def instantiate_macro( cls, # pylint: disable=too-many-arguments sdc_service: "SdcService", customer: "Customer", owning_entity: "OwningEntity", project: "Project", line_of_business: "LineOfBusiness", platform: "Platform", aai_service: "AaiService" = None, cloud_region: "CloudRegion" = None, tenant: "Tenant" = None, service_instance_name: str = None, vnf_parameters: Iterable["VnfParameters"] = None, enable_multicloud: bool = False) -> "ServiceInstantiation": """Instantiate service using SO macro request. Args: sdc_service (SdcService): Service to instantiate customer (Customer): Customer to use in instantiation request owning_entity (OwningEntity): Owning entity to use in instantiation request project (Project): Project to use in instantiation request line_of_business_object (LineOfBusiness): LineOfBusiness to use in instantiation request platform_object (Platform): Platform to use in instantiation request aai_service (AaiService): Service object from aai sdc cloud_region (CloudRegion): Cloud region to use in instantiation request tenant (Tenant): Tenant to use in instantiation request service_instance_name (str, optional): Service instance name. Defaults to None. vnf_parameters: (Iterable[VnfParameters]): Parameters which are going to be used for vnfs instantiation. Defaults to None. enable_multicloud (bool, optional): Determines if Multicloud should be enabled for instantiation request. Defaults to False. Raises: ValueError: Instantiation request returns HTTP error code. Returns: ServiceInstantiation: instantiation request object """ if not sdc_service.distributed: raise ValueError("Service is not distributed") if service_instance_name is None: service_instance_name = f"Python_ONAP_SDK_service_instance_{str(uuid4())}" response: dict = cls.send_message_json( "POST", f"Instantiate {sdc_service.name} service macro", (f"{cls.base_url}/onap/so/infra/" f"serviceInstantiation/{cls.api_version}/serviceInstances"), data=jinja_env().get_template("instantiate_service_macro.json.j2").\ render( sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, project=project, aai_service=aai_service, line_of_business=line_of_business, platform=platform, service_instance_name=service_instance_name, vnf_parameters=vnf_parameters, enable_multicloud=enable_multicloud ), headers=headers_so_creator(OnapService.headers), exception=ValueError ) return cls(name=service_instance_name, request_id=response["requestReferences"].get("requestId"), instance_id=response["requestReferences"].get("instanceId"), sdc_service=sdc_service, cloud_region=cloud_region, tenant=tenant, customer=customer, owning_entity=owning_entity, project=project)
def instantiate_ala_carte( cls, # pylint: disable=too-many-arguments aai_service_instance: "ServiceInstance", network_object: "Network", line_of_business_object: "LineOfBusiness", platform_object: "Platform", cloud_region: "CloudRegion" = None, tenant: "Tenant" = None, network_instance_name: str = None, subnets: Iterable[Subnet] = None) -> "NetworkInstantiation": """Instantiate Network using a'la carte method. Args: network_object (Network): Network to instantiate line_of_business_object (LineOfBusiness): LineOfBusiness to use in instantiation request platform_object (Platform): Platform to use in instantiation request cloud_region (CloudRegion, optional): Cloud region to use in instantiation request. Defaults to None. THAT PROPERTY WILL BE REQUIRED IN ONE OF THE FUTURE RELEASE. REFACTOR YOUR CODE TO USE IT!. tenant (Tenant, optional): Tenant to use in instnatiation request. Defaults to None. THAT PROPERTY WILL BE REQUIRED IN ONE OF THE FUTURE RELEASE. REFACTOR YOUR CODE TO USE IT!. network_instance_name (str, optional): Network instance name. Defaults to None. Raises: ValueError: Instantiate request returns response with HTTP error code Returns: NetworkInstantiation: NetworkInstantiation object """ sdc_service: SdcService = aai_service_instance.service_subscription.sdc_service if network_instance_name is None: network_instance_name = \ f"Python_ONAP_SDK_network_instance_{str(uuid4())}" NetworkPreload.upload_network_preload( network=network_object, network_instance_name=network_instance_name, subnets=subnets) response: dict = cls.send_message_json( "POST", (f"Instantiate {aai_service_instance.service_subscription.sdc_service.name} " f"service network {network_object.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{aai_service_instance.instance_id}/networks"), data=jinja_env().get_template("instantiate_network_ala_carte.json.j2"). render( instance_name=network_instance_name, network=network_object, service=sdc_service, cloud_region=cloud_region or \ aai_service_instance.service_subscription.cloud_region, tenant=tenant or aai_service_instance.service_subscription.tenant, line_of_business=line_of_business_object, platform=platform_object, service_instance=aai_service_instance, subnets=subnets ), headers=headers_so_creator(OnapService.headers), exception=ValueError ) return cls(name=network_instance_name, request_id=response["requestReferences"]["requestId"], instance_id=response["requestReferences"]["instanceId"], line_of_business=line_of_business_object, platform=platform_object, network=network_object)
def instantiate_ala_carte(cls, # pylint: disable=too-many-arguments vf_module: "VfModule", vnf_instance: "VnfInstance", cloud_region: "CloudRegion", tenant: "Tenant", vf_module_instance_name: str = None, vnf_parameters: Iterable["InstantiationParameter"] = None, use_preload: bool = True) -> "VfModuleInstantiation": """Instantiate VF module. Iterate throught vf modules from service Tosca file and instantiate vf modules. Args: vf_module (VfModule): VfModule to instantiate vnf_instance (VnfInstance): VnfInstance object cloud_region (CloudRegion, optional): Cloud region to use in instantiation request. Defaults to None. tenant (Tenant, optional): Tenant to use in instnatiation request. Defaults to None. vf_module_instance_name_factory (str, optional): Factory to create VF module names. It's going to be a prefix of name. Index of vf module in Tosca file will be added to it. If no value is provided it's going to be "Python_ONAP_SDK_vf_module_service_instance_{str(uuid4())}". Defaults to None. vnf_parameters (Iterable[InstantiationParameter], optional): Parameters which are going to be used in preload upload for vf modules or passed in "userParams". Defaults to None. use_preload (bool, optional): This flag determines whether instantiation parameters are used as preload or "userParams" content. Defaults to True Yields: Iterator[VfModuleInstantiation]: VfModuleInstantiation class object. """ if vf_module_instance_name is None: vf_module_instance_name = \ f"Python_ONAP_SDK_vf_module_instance_{str(uuid4())}" if use_preload: VfModulePreload.upload_vf_module_preload( vnf_instance, vf_module_instance_name, vf_module, vnf_parameters ) vnf_parameters = None sdc_service: SdcService = vnf_instance.service_instance.sdc_service response: dict = cls.send_message_json( "POST", (f"Instantiate {sdc_service.name} " f"service vf module {vf_module.name}"), (f"{cls.base_url}/onap/so/infra/serviceInstantiation/{cls.api_version}/" f"serviceInstances/{vnf_instance.service_instance.instance_id}/vnfs/" f"{vnf_instance.vnf_id}/vfModules"), data=jinja_env().get_template("instantiate_vf_module_ala_carte.json.j2"). render( vf_module_instance_name=vf_module_instance_name, vf_module=vf_module, service=sdc_service, cloud_region=cloud_region, tenant=tenant, vnf_instance=vnf_instance, vf_module_parameters=vnf_parameters or [] ), headers=headers_so_creator(OnapService.headers) ) return VfModuleInstantiation( name=vf_module_instance_name, request_id=response["requestReferences"].get("requestId"), instance_id=response["requestReferences"].get("instanceId"), vf_module=vf_module )
def add_region_to_so_db(cls, cloud_region_id: str, complex_id: str, identity_service_id: str = None, **kwargs): """Method to add cloud_site data with identity_service to SO db. Args: cloud_region_id: the name of cloud region complex_id: name of complex identity_service_id: optional - id of identity service **kwargs: keyword arguments with parameters for identity service creation, like below Important: identity_services data will be overwrite, but in the same time cloud_sites data will not (shouldn't) be overwrite! Return: response object """ if not identity_service_id: identity_service_id = 'Keystone_K8s' # params for identity_service creation orchestrator = kwargs.get('orchestrator', 'multicloud') identity_url = kwargs.get('identity_url', "http://1.2.3.4:5000/v2.0") mso_id = kwargs.get('mso_id', 'onapsdk_user') mso_pass = kwargs.get('mso_pass', 'mso_pass_onapsdk') project_domain_name = kwargs.get("project_domain_name", None) user_domain_name = kwargs.get("user_domain_name", None) member_role = kwargs.get('member_role', 'admin') admin_tenant = kwargs.get('admin_tenant', 'service') identity_server_type = kwargs.get('identity_server_type', 'KEYSTONE') identity_authentication_type = kwargs.get( 'identity_authentication_type', 'USERNAME_PASSWORD') data = { "id": cloud_region_id, "region_id": cloud_region_id, "aic_version": "2.5", "clli": complex_id, "orchestrator": orchestrator, "identityService": { "id": identity_service_id, "identityServerTypeAsString": "KEYSTONE", "hibernateLazyInitializer": {}, "identity_url": identity_url, "mso_id": mso_id, "mso_pass": mso_pass, "project_domain_name": project_domain_name, "user_domain_name": user_domain_name, "admin_tenant": admin_tenant, "member_role": member_role, "tenant_metadata": True, "identity_server_type": identity_server_type, "identity_authentication_type": identity_authentication_type } } response = cls.send_message("POST", "Create a region in SO db", f"{cls.base_url}/cloudSite", json=data, headers=headers_so_creator( OnapService.headers), exception=ValueError) return response