Exemplo n.º 1
0
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"]
Exemplo n.º 2
0
    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)
Exemplo n.º 5
0
    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"])
Exemplo n.º 6
0
    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
        )
Exemplo n.º 8
0
    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
        )
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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")
Exemplo n.º 13
0
    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)
Exemplo n.º 15
0
    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
        )
Exemplo n.º 19
0
    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)
Exemplo n.º 20
0
    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
        )
Exemplo n.º 22
0
    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