From e050624faa3a4b792a7325241457eed68785bd19 Mon Sep 17 00:00:00 2001 From: Thierry Hardy Date: Wed, 14 Oct 2020 08:51:57 +0000 Subject: [PATCH] Revert "Revert "Create basic_cnf test leveraging onapsdk"" This reverts commit ded9ae3b507b9687a68cc00dfc75e13130be13ff. Reason for revert: ONAP SDK 7.1 version is released Correction hardcode value (k8s) and onapsdk version to 7.1.0 Issue-ID: TEST-243 Change-Id: I535af4298f79a34476074612079dc479d2fc0b61 Signed-off-by: Thierry Hardy --- requirements.txt | 2 +- setup.cfg | 1 + .../configuration/basic_cnf_yaml_settings.py | 79 ++++++++++ src/onaptests/configuration/settings.py | 1 + .../ubuntu16_multicloud_yaml_settings.py | 1 + .../ubuntu16_nomulticloud_settings.py | 1 + src/onaptests/scenario/basic_cnf.py | 77 ++++++++++ ...connect_service_subscription_to_cloud_region.py | 3 + .../steps/cloud/k8s_connectivity_info_create.py | 35 +++++ src/onaptests/steps/cloud/register_cloud.py | 7 +- .../steps/instantiate/k8s_profile_create.py | 170 +++++++++++++++++++++ .../steps/instantiate/service_ala_carte.py | 2 +- .../steps/instantiate/vf_module_ala_carte.py | 16 +- src/onaptests/steps/instantiate/vnf_ala_carte.py | 3 +- src/onaptests/templates/artifacts/k8sprof.tar.gz | Bin 0 -> 199 bytes .../templates/heat-files/basic_cnf/basic_cnf.zip | Bin 0 -> 4005 bytes .../templates/vnf-services/basic_cnf-service.yaml | 19 +++ src/onaptests/utils/exceptions.py | 6 + 18 files changed, 414 insertions(+), 9 deletions(-) create mode 100644 src/onaptests/configuration/basic_cnf_yaml_settings.py create mode 100644 src/onaptests/scenario/basic_cnf.py create mode 100644 src/onaptests/steps/cloud/k8s_connectivity_info_create.py create mode 100644 src/onaptests/steps/instantiate/k8s_profile_create.py create mode 100644 src/onaptests/templates/artifacts/k8sprof.tar.gz create mode 100644 src/onaptests/templates/heat-files/basic_cnf/basic_cnf.zip create mode 100644 src/onaptests/templates/vnf-services/basic_cnf-service.yaml diff --git a/requirements.txt b/requirements.txt index a2e82b3..4342c56 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ xtesting openstacksdk -onapsdk>=7.0.0 +onapsdk>=7.1.0 jinja2 diff --git a/setup.cfg b/setup.cfg index 44a0458..d5e2fc7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -46,4 +46,5 @@ testpaths = tests xtesting.testcase = basic_vm = onaptests.scenario.basic_vm:BasicVm basic_network = onaptests.scenario.basic_network:BasicNetwork + basic_cnf = onaptests.scenario.basic_cnf:BasicCnf clearwater_ims = onaptests.scenario.clearwater_ims:ClearwaterIms diff --git a/src/onaptests/configuration/basic_cnf_yaml_settings.py b/src/onaptests/configuration/basic_cnf_yaml_settings.py new file mode 100644 index 0000000..18c511e --- /dev/null +++ b/src/onaptests/configuration/basic_cnf_yaml_settings.py @@ -0,0 +1,79 @@ +import os +import openstack +import sys +from yaml import load + +import onaptests.utils.exceptions as onap_test_exceptions +from .settings import * # pylint: disable=W0614 + +""" Specific basic_cnf with multicloud-k8s and yaml config scenario.""" + +# This scenario uses multicloud-k8s and not multicloud +# (no registration requested) +USE_MULTICLOUD = False +# Set ONLY_INSTANTIATE to true to run an instantiation without repeating +# onboarding and related AAI configuration (Cloud config) +ONLY_INSTANTIATE= False + +# if a yaml file is define, retrieve info from this yaml files +# if not declare the parameters in the settings +SERVICE_YAML_TEMPLATE = (sys.path[-1] + "/onaptests/templates/vnf-services/" + + "basic_cnf-service.yaml") + +try: + # Try to retrieve the SERVICE NAME from the yaml file + with open(SERVICE_YAML_TEMPLATE, "r") as yaml_template: + yaml_config_file = load(yaml_template) + SERVICE_NAME = next(iter(yaml_config_file.keys())) +except (FileNotFoundError, ValueError): + raise onap_test_exceptions.TestConfigurationException + +CLEANUP_FLAG = True +# nb of seconds before cleanup in case cleanup option is set +CLEANUP_ACTIVITY_TIMER = 10 + +# Definition of k8s profile version +K8S_PROFILE_K8S_VERSION = "1.0" +# Relative path to k8s profile artifact in the python package (so under /src) +K8S_PROFILE_ARTIFACT_PATH = (sys.path[-1] + + "/onaptests/templates/artifacts/k8sprof.tar.gz") +# Relative path to config file to set k8s connectivity information +K8S_KUBECONFIG_FILE = (sys.path[-1] + + "/onaptests/templates/artifacts/config") + +VENDOR_NAME = "basicnf_vendor" + +CLOUD_REGION_CLOUD_OWNER = "basicnf-owner" # must not contain _ +CLOUD_REGION_ID = "k8sregion" +CLOUD_REGION_TYPE = "k8s" +CLOUD_REGION_VERSION = "1.0" +CLOUD_DOMAIN = "Default" +CLOUD_OWNER_DEFINED_TYPE = "t1" + +COMPLEX_PHYSICAL_LOCATION_ID = "lannion" +COMPLEX_DATA_CENTER_CODE = "1234-5" +AVAILABILITY_ZONE_NAME = "basicnf-availability-zone" +AVAILABILITY_ZONE_TYPE = "nova" + +GLOBAL_CUSTOMER_ID = "basicnf-customer" + +OWNING_ENTITY = "basicnf_owning_entity" +PROJECT = "basicnf_project" +LINE_OF_BUSINESS = "basicnf_lob" +PLATFORM = "basicnf_platform" + +SERVICE_INSTANCE_NAME = "basic_cnf_service_instance" + +# The cloud Part +# Assuming a cloud.yaml is available, use the openstack client +# to retrieve cloud info and avoid data duplication +# For basic_cnf, no tenant information is required but some dummy +# information shall be provided by default +# So it is not requested to set OS_TEST_CLOUD +TEST_CLOUD = os.getenv('OS_TEST_CLOUD') +cloud = openstack.connect(cloud=TEST_CLOUD) +VIM_USERNAME = cloud.config.auth.get('username','dummy') +VIM_PASSWORD = cloud.config.auth.get('password','dummy123') +VIM_SERVICE_URL = cloud.config.auth.get('auth_url','http://10.12.25.2:5000/v3') +TENANT_ID = cloud.config.auth.get('project_id','123456') +TENANT_NAME = cloud.config.auth.get('project_name','dummy_test') diff --git a/src/onaptests/configuration/settings.py b/src/onaptests/configuration/settings.py index 745dc08..d181b04 100644 --- a/src/onaptests/configuration/settings.py +++ b/src/onaptests/configuration/settings.py @@ -39,4 +39,5 @@ LOG_CONFIG = { } REPORTING_FILE_PATH = "/tmp/reporting.html" +K8S_REGION_TYPE = "k8s" # SOCK_HTTP = "socks5h://127.0.0.1:8080" diff --git a/src/onaptests/configuration/ubuntu16_multicloud_yaml_settings.py b/src/onaptests/configuration/ubuntu16_multicloud_yaml_settings.py index d45b142..5036ed8 100644 --- a/src/onaptests/configuration/ubuntu16_multicloud_yaml_settings.py +++ b/src/onaptests/configuration/ubuntu16_multicloud_yaml_settings.py @@ -16,6 +16,7 @@ SERVICE_NAME = "ubuntu16test" # must be the same as in YAML CLOUD_REGION_CLOUD_OWNER = "sdktestsOwner" # must not contain _ CLOUD_REGION_ID = "RegionOne" # should be valid, as otherwise MultiCloud fails CLOUD_REGION_TYPE = "openstack" +CLOUD_OWNER_DEFINED_TYPE = "N/A" CLOUD_REGION_VERSION = "titanium_cloud" CLOUD_DOMAIN = "Default" diff --git a/src/onaptests/configuration/ubuntu16_nomulticloud_settings.py b/src/onaptests/configuration/ubuntu16_nomulticloud_settings.py index 21795ac..24686af 100644 --- a/src/onaptests/configuration/ubuntu16_nomulticloud_settings.py +++ b/src/onaptests/configuration/ubuntu16_nomulticloud_settings.py @@ -41,6 +41,7 @@ VSP_NAME = "basicvm_ubuntu_vsp" CLOUD_REGION_CLOUD_OWNER = "basicvm-cloud-owner" CLOUD_REGION_TYPE = "openstack" CLOUD_REGION_VERSION = "openstack" +CLOUD_OWNER_DEFINED_TYPE = "N/A" AVAILABILITY_ZONE_NAME = "basicvm-availability-zone" AVAILABILITY_ZONE_TYPE = "nova" diff --git a/src/onaptests/scenario/basic_cnf.py b/src/onaptests/scenario/basic_cnf.py new file mode 100644 index 0000000..30c3c3b --- /dev/null +++ b/src/onaptests/scenario/basic_cnf.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +"""Basic CNF test case.""" +import logging +import time + +from xtesting.core import testcase +from onapsdk.configuration import settings +import onaptests.utils.exceptions as onap_test_exceptions +from onaptests.steps.instantiate.vf_module_ala_carte import YamlTemplateVfModuleAlaCarteInstantiateStep + +class BasicCnf(testcase.TestCase): + """Onboard then instantiate a simple CNF with ONAP.""" + + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + """Init BasicCnf.""" + if "case_name" not in kwargs: + kwargs["case_name"] = 'basic_cnf' + super(BasicCnf, self).__init__(**kwargs) + self.__logger.debug("BasicCnf init started") + self.test = YamlTemplateVfModuleAlaCarteInstantiateStep( + cleanup=settings.CLEANUP_FLAG) + self.start_time = None + self.stop_time = None + self.result = 0 + + def run(self): + """Run onap_tests with basic_cnf VM.""" + self.start_time = time.time() + self.__logger.debug("start time") + try: + self.test.execute() + self.__logger.info("basic_cnf successfully created") + # The cleanup is part of the test, not only a teardown action + if settings.CLEANUP_FLAG: + self.__logger.info("basic_cnf cleanup called") + time.sleep(settings.CLEANUP_ACTIVITY_TIMER) + self.test.cleanup() + self.result = 100 + else: + self.__logger.info("No cleanup requested. Test completed.") + self.result = 100 + except onap_test_exceptions.TestConfigurationException: + self.result = 0 + self.__logger.error("Basic CNF configuration error") + except onap_test_exceptions.ServiceInstantiateException: + self.result = 0 + self.__logger.error("Basic CNF service instantiation error") + except onap_test_exceptions.ServiceCleanupException: + self.result = 0 + self.__logger.error("Basic CNF service instance cleanup error") + except onap_test_exceptions.VnfInstantiateException: + self.result = 0 + self.__logger.error("Basic CNF Vnf instantiation error") + except onap_test_exceptions.VnfCleanupException: + self.result = 0 + self.__logger.error("Basic CNF Vnf instance cleanup error") + except onap_test_exceptions.ProfileInformationException: + self.__logger.error("Missing k8s profile information") + self.result = 0 + except onap_test_exceptions.ProfileCleanupException: + self.__logger.error("K8s profile deletion failed") + self.result = 0 + except onap_test_exceptions.VfModuleInstantiateException: + self.result = 0 + self.__logger.error("Basic CNF Module instantiation error") + except onap_test_exceptions.VfModuleCleanupException: + self.__logger.error("Basic CNF Module cleanup failed.") + self.result = 0 + finally: + self.stop_time = time.time() + + def clean(self): + """Clean Additional resources if needed.""" + self.__logger.info("Generate Test report") + self.test.reports_collection.generate_report() 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..1d0dbfb 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 == settings.K8S_REGION_TYPE: + 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..6106d7e --- /dev/null +++ b/src/onaptests/steps/cloud/k8s_connectivity_info_create.py @@ -0,0 +1,35 @@ +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: + self._logger.info("Check if k8s connectivity information exists") + ConnectivityInfo.get_connectivity_info_by_region_id(settings.CLOUD_REGION_ID) + except ValueError: + self._logger.info("Create the k8s connectivity information") + 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..8931847 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,9 @@ 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_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..0bc6c2d --- /dev/null +++ b/src/onaptests/steps/instantiate/k8s_profile_create.py @@ -0,0 +1,170 @@ +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 + +import onaptests.utils.exceptions as onap_test_exceptions +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. + """ + self._logger.info("Create the k8s profile if it doesn't exist") + 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 == "": + self._logger.error("Missing rb profile information") + raise onap_test_exceptions.ProfileInformationException + + ######## 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 == "": + self._logger.error("K8s profile deletion failed, missing rb profile name") + raise onap_test_exceptions.ProfileInformationException + ######## 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 onap_test_exceptions.ProfileCleanupException + super().cleanup() diff --git a/src/onaptests/steps/instantiate/service_ala_carte.py b/src/onaptests/steps/instantiate/service_ala_carte.py index 3a99f4d..2b42132 100644 --- a/src/onaptests/steps/instantiate/service_ala_carte.py +++ b/src/onaptests/steps/instantiate/service_ala_carte.py @@ -220,7 +220,6 @@ class YamlTemplateServiceAlaCarteInstantiateStep(YamlTemplateBaseStep): Exception: Service cleaning failed """ - super().cleanup() service_deletion = self._service_instance.delete() nb_try = 0 nb_try_max = 30 @@ -233,3 +232,4 @@ class YamlTemplateServiceAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("Service deletion %s failed", self._service_instance_name) raise onap_test_exceptions.ServiceCleanupException + 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 b5fd7eb..16e2387 100644 --- a/src/onaptests/steps/instantiate/vf_module_ala_carte.py +++ b/src/onaptests/steps/instantiate/vf_module_ala_carte.py @@ -11,6 +11,7 @@ from onapsdk.so.instantiation import VnfParameter import onaptests.utils.exceptions as onap_test_exceptions 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.""" @@ -26,7 +27,14 @@ 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 == settings.K8S_REGION_TYPE: + # K8SProfileStep creates the requested profile and then calls + # YamlTemplateVnfAlaCarteInstantiateStep step + self.add_step(K8SProfileStep(cleanup)) + else: + self.add_step(YamlTemplateVnfAlaCarteInstantiateStep(cleanup)) + + @property def yaml_template(self) -> dict: @@ -88,7 +96,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"]: @@ -126,7 +134,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: @@ -140,7 +148,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) @@ -161,3 +168,4 @@ class YamlTemplateVfModuleAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("VfModule deletion %s failed", vf_module.name) raise onap_test_exceptions.VfModuleCleanupException + super.cleanup() diff --git a/src/onaptests/steps/instantiate/vnf_ala_carte.py b/src/onaptests/steps/instantiate/vnf_ala_carte.py index d529219..ad1a241 100644 --- a/src/onaptests/steps/instantiate/vnf_ala_carte.py +++ b/src/onaptests/steps/instantiate/vnf_ala_carte.py @@ -120,8 +120,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 @@ -136,3 +134,4 @@ class YamlTemplateVnfAlaCarteInstantiateStep(YamlTemplateBaseStep): else: self._logger.error("VNF deletion %s failed", vnf_instance.name) raise onap_test_exceptions.VnfCleanupException + super.cleanup() diff --git a/src/onaptests/templates/artifacts/k8sprof.tar.gz b/src/onaptests/templates/artifacts/k8sprof.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fdfa8c89d87d48fe365b88e7a3c40beb896fce07 GIT binary patch literal 199 zcmV;&06702iwFREH)dS`1MSn_3W6{c$MIe7DTepPmUEUb6GAHlvv4Z-_E|y{6yEfQ z;QP5bV`s1f+wV}+<<5t8F%*YNe1;x5=PuP`slKlhmkE=kiLpsyjTPFAODmNA&^!;i z&=!qSqTYupbL-Wsb94Pa700pceG|%KovYr+b~yQ5D%BTN=R>Zd`smaLyH%Ouk00000000000002+*UlEE*rxy}000dq BU}OLQ literal 0 HcmV?d00001 diff --git a/src/onaptests/templates/heat-files/basic_cnf/basic_cnf.zip b/src/onaptests/templates/heat-files/basic_cnf/basic_cnf.zip new file mode 100644 index 0000000000000000000000000000000000000000..6d6e81e8ab5d71b7fca47e18327c4c5c8978e0b4 GIT binary patch literal 4005 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 literal 0 HcmV?d00001 diff --git a/src/onaptests/templates/vnf-services/basic_cnf-service.yaml b/src/onaptests/templates/vnf-services/basic_cnf-service.yaml new file mode 100644 index 0000000..c3c701f --- /dev/null +++ b/src/onaptests/templates/vnf-services/basic_cnf-service.yaml @@ -0,0 +1,19 @@ +--- +basic_cnf: + tosca_file_from_SDC: service-basic_cnf-template + version: "1.0" + subscription_type: "basic_cnf" + vnfs: + - vnf_name: basic_cnf + heat_files_to_upload: onaptests/templates/heat-files/basic_cnf/basic_cnf.zip + vnf_parameters: [ + {"name": "dummy_name_0", + "value": "dummy_name" + }, + {"name": "k8s-rb-profile-name", + "value": "cnftest" + }, + {"name": "k8s-rb-profile-namespace", + "value": "k8s" + } + ] diff --git a/src/onaptests/utils/exceptions.py b/src/onaptests/utils/exceptions.py index f80fc09..daadc32 100644 --- a/src/onaptests/utils/exceptions.py +++ b/src/onaptests/utils/exceptions.py @@ -49,3 +49,9 @@ class NetworkInstantiateException(Exception): class NetworkCleanupException(Exception): """Network cannot be cleaned.""" + +class ProfileInformationException(Exception): + """Missing k8s profile information.""" + +class ProfileCleanupException(Exception): + """K8s profile cannot be cleaned.""" -- 2.16.6