diff options
author | Thierry Hardy <thierry.hardy@orange.com> | 2020-10-02 16:18:17 +0200 |
---|---|---|
committer | Thierry Hardy <thierry.hardy@orange.com> | 2020-10-08 15:47:00 +0200 |
commit | 0123c525b0182a5d6f9cd1bee3830eb1956239c7 (patch) | |
tree | 2ba5a5b7ae88e53aa634cabd113338b42d49c8d0 /src/onaptests/steps | |
parent | d1d44781c7d03c8794dd626184f77d9836264212 (diff) |
Create basic_cnf test leveraging onapsdk
Add the scenario basic_cnf that uses multicloud-k8s plugin to instantiate cnf on k8s
Add the removal of profile in cleanup part
Add store_state
Issue-ID: TEST-243
Signed-off-by: Thierry Hardy <thierry.hardy@orange.com>
Change-Id: Ib743c259decf95cdc69975e1ef7d4ba7aadccfae
Diffstat (limited to 'src/onaptests/steps')
7 files changed, 220 insertions, 8 deletions
diff --git a/src/onaptests/steps/cloud/connect_service_subscription_to_cloud_region.py b/src/onaptests/steps/cloud/connect_service_subscription_to_cloud_region.py index 636f8cd..d48ff7c 100644 --- a/src/onaptests/steps/cloud/connect_service_subscription_to_cloud_region.py +++ b/src/onaptests/steps/cloud/connect_service_subscription_to_cloud_region.py @@ -6,6 +6,7 @@ from ..base import BaseStep from .customer_service_subscription_create import CustomerServiceSubscriptionCreateStep from .link_cloud_to_complex import LinkCloudRegionToComplexStep from .register_cloud import RegisterCloudRegionStep +from .k8s_connectivity_info_create import K8SConnectivityInfoStep class ConnectServiceSubToCloudRegionStep(BaseStep): @@ -21,6 +22,8 @@ class ConnectServiceSubToCloudRegionStep(BaseStep): """ super().__init__(cleanup=cleanup) + if settings.CLOUD_REGION_TYPE == "k8s": + self.add_step(K8SConnectivityInfoStep(cleanup=cleanup)) self.add_step(RegisterCloudRegionStep(cleanup=cleanup)) self.add_step(LinkCloudRegionToComplexStep(cleanup=cleanup)) self.add_step(CustomerServiceSubscriptionCreateStep(cleanup=cleanup)) diff --git a/src/onaptests/steps/cloud/k8s_connectivity_info_create.py b/src/onaptests/steps/cloud/k8s_connectivity_info_create.py new file mode 100644 index 0000000..ef95876 --- /dev/null +++ b/src/onaptests/steps/cloud/k8s_connectivity_info_create.py @@ -0,0 +1,33 @@ +from onapsdk.configuration import settings +from onapsdk.msb.k8s import ConnectivityInfo + +from ..base import BaseStep + +class K8SConnectivityInfoStep(BaseStep): + """CreateConnnectivityInfoStep.""" + + @BaseStep.store_state + def execute(self): + """Creation k8s connectivity information + + Use settings values: + - CLOUD_REGION_ID, + - CLOUD_REGION_CLOUD_OWNER, + - K8S_KUBECONFIG_FILE. + """ + super().execute() + ######## Create Connectivity Info ######################################### + try: + ConnectivityInfo.get_connectivity_info_by_region_id(settings.CLOUD_REGION_ID) + except ValueError: + ConnectivityInfo.create(settings.CLOUD_REGION_ID, + settings.CLOUD_REGION_CLOUD_OWNER, + open(settings.K8S_KUBECONFIG_FILE, 'rb').read()) + + def cleanup(self) -> None: + """Cleanup K8S Connectivity information. + """ + self._logger.info("*Clean the k8s connectivity information *") + super().cleanup() + connectinfo = ConnectivityInfo.get_connectivity_info_by_region_id(settings.CLOUD_REGION_ID) + connectinfo.delete() diff --git a/src/onaptests/steps/cloud/register_cloud.py b/src/onaptests/steps/cloud/register_cloud.py index 6836b12..0ab0dfb 100644 --- a/src/onaptests/steps/cloud/register_cloud.py +++ b/src/onaptests/steps/cloud/register_cloud.py @@ -18,6 +18,9 @@ class RegisterCloudRegionStep(BaseStep): - CLOUD_REGION_CLOUD_OWNER, - CLOUD_REGION_ID, - CLOUD_DOMAIN, + - CLOUD_REGION_VERSION, + - CLOUD_OWNER_DEFINED_TYPE, + - COMPLEX_PHYSICAL_LOCATION_ID, - VIM_USERNAME, - VIM_PASSWORD, - VIM_SERVICE_URL, @@ -38,7 +41,10 @@ class RegisterCloudRegionStep(BaseStep): orchestration_disabled=False, in_maint=False, cloud_type=settings.CLOUD_REGION_TYPE, - cloud_region_version=settings.CLOUD_REGION_VERSION + cloud_region_version=settings.CLOUD_REGION_VERSION, + owner_defined_type=settings.CLOUD_OWNER_DEFINED_TYPE, + complex_name=settings.COMPLEX_PHYSICAL_LOCATION_ID + # cloud_extra_info=settings.CLOUD_EXTRA_INFO ) cloud_region.add_esr_system_info( esr_system_info_id=str(uuid4()), diff --git a/src/onaptests/steps/instantiate/k8s_profile_create.py b/src/onaptests/steps/instantiate/k8s_profile_create.py new file mode 100644 index 0000000..375aa2c --- /dev/null +++ b/src/onaptests/steps/instantiate/k8s_profile_create.py @@ -0,0 +1,165 @@ +from typing import Iterable +from uuid import uuid4 +from yaml import load + +from onapsdk.aai.business import Customer, ServiceInstance, ServiceSubscription +from onapsdk.configuration import settings +from onapsdk.msb.k8s import Definition +from onapsdk.so.instantiation import VnfParameter + +from ..base import BaseStep +from .vnf_ala_carte import YamlTemplateVnfAlaCarteInstantiateStep + +class K8SProfileStep(BaseStep): + """CreateK8sProfileStep.""" + + def __init__(self, cleanup=False): + """Initialize step. + """ + super().__init__(cleanup=cleanup) + + self._yaml_template: dict = None + self._service_instance_name: str = None + self._service_instance: ServiceInstance = None + self.add_step(YamlTemplateVnfAlaCarteInstantiateStep(cleanup)) + + @property + def yaml_template(self) -> dict: + """Step YAML template. + + Load from file if it's a root step, get from parent otherwise. + + Returns: + dict: Step YAML template + + """ + if self.is_root: + if not self._yaml_template: + with open(settings.SERVICE_YAML_TEMPLATE, "r") as yaml_template: + self._yaml_template: dict = load(yaml_template) + return self._yaml_template + return self.parent.yaml_template + + @property + def service_name(self) -> str: + """Service name. + + Get from YAML template if it's a root step, get from parent otherwise. + + Returns: + str: Service name + + """ + if self.is_root: + return next(iter(self.yaml_template.keys())) + return self.parent.service_name + + @property + def service_instance_name(self) -> str: + """Service instance name. + + Generate using `service_name` and `uuid4()` function if it's a root step, + get from parent otherwise. + + Returns: + str: Service instance name + + """ + if self.is_root: + if not self._service_instance_name: + self._service_instance_name: str = f"{self.service_name}-{str(uuid4())}" + return self._service_instance_name + return self.parent.service_instance_name + + def get_vnf_parameters(self, vnf_name: str) -> Iterable[VnfParameter]: + """Get VNF parameters from YAML template. + + Args: + vnf_name (str): VNF name to get parameters for. + + Yields: + Iterator[Iterable[VnfParameter]]: VNF parameter + + """ + + # workaround, as VNF name differs from model name (added " 0") + vnf_name = vnf_name.split()[0] + for vnf in self.yaml_template[self.service_name]["vnfs"]: + if vnf["vnf_name"] == vnf_name: + for vnf_parameter in vnf["vnf_parameters"]: + yield VnfParameter( + name=vnf_parameter["name"], + value=vnf_parameter["value"] + ) + + @BaseStep.store_state + def execute(self): + """Creation of k8s profile for resource bundle definition + + Use settings values: + - GLOBAL_CUSTOMER_ID + - K8S_PROFILE_K8S_VERSION + - K8S_PROFILE_ARTIFACT_PATH. + """ + super().execute() + customer: Customer = Customer.get_by_global_customer_id(settings.GLOBAL_CUSTOMER_ID) + service_subscription: ServiceSubscription = customer.get_service_subscription_by_service_type(self.service_name) + self._service_instance: ServiceInstance = service_subscription.get_service_instance_by_name(self.service_instance_name) + + for vnf_instance in self._service_instance.vnf_instances: + # possible to have several modules for 1 VNF + for vf_module in vnf_instance.vnf.vf_modules: + # Define profile (rb_profile) for resource bundle definition + # Retrieve resource bundle definition (rbdef) corresponding to vf module + rbdef_name = vf_module.metadata["vfModuleModelInvariantUUID"] + rbdef_version = vf_module.metadata["vfModuleModelUUID"] + rbdef = Definition.get_definition_by_name_version(rbdef_name, rbdef_version) + # Get k8s profile name from yaml service template + vnf_parameters = self.get_vnf_parameters(vnf_instance.vnf.name) + k8s_profile_name = "" + k8s_profile_namespace = "" + for param in vnf_parameters: + if param.name == "k8s-rb-profile-name": + k8s_profile_name = param.value + if param.name == "k8s-rb-profile-namespace": + k8s_profile_namespace = param.value + if k8s_profile_name == "" or k8s_profile_namespace == "": + raise Exception("Vf module instantiation failed, missing rb profile information") + ######## Check profile for Definition ################################### + try: + rbdef.get_profile_by_name(k8s_profile_name) + except ValueError: + ######## Create profile for Definition ################################### + profile = rbdef.create_profile(k8s_profile_name, + k8s_profile_namespace, + settings.K8S_PROFILE_K8S_VERSION) + ####### Upload artifact for created profile ############################## + profile.upload_artifact(open(settings.K8S_PROFILE_ARTIFACT_PATH, 'rb').read()) + + def cleanup(self) -> None: + """Cleanup K8S profiles. + """ + self._logger.info("*Clean the k8s profile *") + for vnf_instance in self._service_instance.vnf_instances: + # possible to have several modules for 1 VNF + for vf_module in vnf_instance.vnf.vf_modules: + # Retrieve resource bundle definition (rbdef) corresponding to vf module + rbdef_name = vf_module.metadata["vfModuleModelInvariantUUID"] + rbdef_version = vf_module.metadata["vfModuleModelUUID"] + rbdef = Definition.get_definition_by_name_version(rbdef_name, rbdef_version) + # Get k8s profile name from yaml service template + vnf_parameters = self.get_vnf_parameters(vnf_instance.vnf.name) + k8s_profile_name = "" + for param in vnf_parameters: + if param.name == "k8s-rb-profile-name": + k8s_profile_name = param.value + if k8s_profile_name == "": + raise Exception("K8s profile deletion failed, missing rb profile name") + ######## Delete profile for Definition ################################### + try: + profile = rbdef.get_profile_by_name(k8s_profile_name) + profile.delete() + except ValueError: + self._logger.error("K8s profile deletion %s failed", k8s_profile_name) + raise Exception("K8s profile deletion failed") + super().cleanup() diff --git a/src/onaptests/steps/instantiate/service_ala_carte.py b/src/onaptests/steps/instantiate/service_ala_carte.py index b3b56c4..80473b7 100644 --- a/src/onaptests/steps/instantiate/service_ala_carte.py +++ b/src/onaptests/steps/instantiate/service_ala_carte.py @@ -219,7 +219,6 @@ class YamlTemplateServiceAlaCarteInstantiateStep(YamlTemplateBaseStep): Exception: Service cleaning failed """ - super().cleanup() service_deletion = self._service_instance.delete() nb_try = 0 nb_try_max = 30 @@ -232,3 +231,4 @@ class YamlTemplateServiceAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("Service deletion %s failed", self._service_instance_name) raise Exception("Service cleanup failed") + super().cleanup() diff --git a/src/onaptests/steps/instantiate/vf_module_ala_carte.py b/src/onaptests/steps/instantiate/vf_module_ala_carte.py index 14ef2d8..c1b2e23 100644 --- a/src/onaptests/steps/instantiate/vf_module_ala_carte.py +++ b/src/onaptests/steps/instantiate/vf_module_ala_carte.py @@ -10,6 +10,7 @@ from onapsdk.so.instantiation import VnfParameter from ..base import YamlTemplateBaseStep from .vnf_ala_carte import YamlTemplateVnfAlaCarteInstantiateStep +from .k8s_profile_create import K8SProfileStep class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): """Instantiate vf module a'la carte using YAML template.""" @@ -25,7 +26,12 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): self._yaml_template: dict = None self._service_instance_name: str = None self._service_instance: ServiceInstance = None - self.add_step(YamlTemplateVnfAlaCarteInstantiateStep(cleanup)) + if settings.CLOUD_REGION_TYPE == "k8s": + self.add_step(K8SProfileStep(cleanup)) + else: + self.add_step(YamlTemplateVnfAlaCarteInstantiateStep(cleanup)) + + @property def yaml_template(self) -> dict: @@ -87,7 +93,7 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): """ # workaround, as VNF name differs from model name (added " 0") - vnf_name=vnf_name.split()[0] + vnf_name = vnf_name.split()[0] for vnf in self.yaml_template[self.service_name]["vnfs"]: if vnf["vnf_name"] == vnf_name: for vnf_parameter in vnf["vnf_parameters"]: @@ -125,7 +131,7 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): cloud_region, tenant, self._service_instance_name, - vnf_parameters= self.get_vnf_parameters(vnf_instance.vnf.name)) + vnf_parameters=self.get_vnf_parameters(vnf_instance.vnf.name)) while not vf_module_instantiation.finished: time.sleep(10) if vf_module_instantiation.failed: @@ -139,7 +145,6 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): Exception: Vf module cleaning failed """ - super().cleanup() for vnf_instance in self._service_instance.vnf_instances: self._logger.debug("VNF instance %s found in Service Instance ", vnf_instance.name) @@ -160,3 +165,4 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("VfModule deletion %s failed", vf_module.name) raise Exception("Vf module cleanup failed") + super().cleanup() diff --git a/src/onaptests/steps/instantiate/vnf_ala_carte.py b/src/onaptests/steps/instantiate/vnf_ala_carte.py index 0ab498d..9fa7576 100644 --- a/src/onaptests/steps/instantiate/vnf_ala_carte.py +++ b/src/onaptests/steps/instantiate/vnf_ala_carte.py @@ -119,8 +119,6 @@ class YamlTemplateVnfAlaCarteInstantiateStep(YamlTemplateBaseStep): Exception: VNF cleaning failed """ - super().cleanup() - for vnf_instance in self._service_instance.vnf_instances: vnf_deletion = vnf_instance.delete() nb_try = 0 @@ -135,3 +133,4 @@ class YamlTemplateVnfAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("VNF deletion %s failed", vnf_instance.name) raise Exception("VNF Cleanup failed") + super().cleanup() |