Revert "Revert "Create basic_cnf test leveraging onapsdk"" 66/113866/9
authorThierry Hardy <thierry.hardy@orange.com>
Wed, 14 Oct 2020 08:51:57 +0000 (08:51 +0000)
committerThierry Hardy <thierry.hardy@orange.com>
Fri, 16 Oct 2020 15:11:00 +0000 (17:11 +0200)
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 <thierry.hardy@orange.com>
18 files changed:
requirements.txt
setup.cfg
src/onaptests/configuration/basic_cnf_yaml_settings.py [new file with mode: 0644]
src/onaptests/configuration/settings.py
src/onaptests/configuration/ubuntu16_multicloud_yaml_settings.py
src/onaptests/configuration/ubuntu16_nomulticloud_settings.py
src/onaptests/scenario/basic_cnf.py [new file with mode: 0644]
src/onaptests/steps/cloud/connect_service_subscription_to_cloud_region.py
src/onaptests/steps/cloud/k8s_connectivity_info_create.py [new file with mode: 0644]
src/onaptests/steps/cloud/register_cloud.py
src/onaptests/steps/instantiate/k8s_profile_create.py [new file with mode: 0644]
src/onaptests/steps/instantiate/service_ala_carte.py
src/onaptests/steps/instantiate/vf_module_ala_carte.py
src/onaptests/steps/instantiate/vnf_ala_carte.py
src/onaptests/templates/artifacts/k8sprof.tar.gz [new file with mode: 0644]
src/onaptests/templates/heat-files/basic_cnf/basic_cnf.zip [new file with mode: 0644]
src/onaptests/templates/vnf-services/basic_cnf-service.yaml [new file with mode: 0644]
src/onaptests/utils/exceptions.py

index a2e82b3..4342c56 100644 (file)
@@ -1,4 +1,4 @@
 xtesting
 openstacksdk
-onapsdk>=7.0.0
+onapsdk>=7.1.0
 jinja2
index 44a0458..d5e2fc7 100644 (file)
--- 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 (file)
index 0000000..18c511e
--- /dev/null
@@ -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')
index 745dc08..d181b04 100644 (file)
@@ -39,4 +39,5 @@ LOG_CONFIG = {
 }
 
 REPORTING_FILE_PATH = "/tmp/reporting.html"
+K8S_REGION_TYPE = "k8s"
 # SOCK_HTTP = "socks5h://127.0.0.1:8080"
index d45b142..5036ed8 100644 (file)
@@ -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"
 
index 21795ac..24686af 100644 (file)
@@ -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 (file)
index 0000000..30c3c3b
--- /dev/null
@@ -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()
index 636f8cd..1d0dbfb 100644 (file)
@@ -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 (file)
index 0000000..6106d7e
--- /dev/null
@@ -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()
index 6836b12..8931847 100644 (file)
@@ -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 (file)
index 0000000..0bc6c2d
--- /dev/null
@@ -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()
index 3a99f4d..2b42132 100644 (file)
@@ -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()
index b5fd7eb..16e2387 100644 (file)
@@ -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()
index d529219..ad1a241 100644 (file)
@@ -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 (file)
index 0000000..fdfa8c8
Binary files /dev/null and b/src/onaptests/templates/artifacts/k8sprof.tar.gz differ
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 (file)
index 0000000..6d6e81e
Binary files /dev/null and b/src/onaptests/templates/heat-files/basic_cnf/basic_cnf.zip differ
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 (file)
index 0000000..c3c701f
--- /dev/null
@@ -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"
+              }
+          ]
index f80fc09..daadc32 100644 (file)
@@ -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."""