X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fcore%2Fvnf.py;h=15065f7309dd151e1e86ff3e921d5317d4eb965a;hb=f15f1764ae1531e086a68d6070964a8b6c60a987;hp=0589b5d2a1ae50deb23d26a008ef8d20263b71ca;hpb=fb3ef61a03cdf2fb938d771e9d23f6435cff240f;p=functest.git diff --git a/functest/core/vnf.py b/functest/core/vnf.py index 0589b5d2a..15065f730 100644 --- a/functest/core/vnf.py +++ b/functest/core/vnf.py @@ -11,10 +11,16 @@ import logging import time +import uuid -import functest.core.testcase as base -from functest.utils.constants import CONST -import functest.utils.openstack_utils as os_utils +from snaps.config.user import UserConfig +from snaps.config.project import ProjectConfig +from snaps.openstack.create_user import OpenStackUser +from snaps.openstack.create_project import OpenStackProject +from snaps.openstack.utils import keystone_utils +from snaps.openstack.tests import openstack_tests + +from functest.core import testcase __author__ = ("Morgan Richomme , " "Valentin Boucher ") @@ -36,34 +42,38 @@ class VnfTestException(Exception): """Raise when VNF cannot be tested.""" -class VnfOnBoarding(base.TestCase): +class VnfOnBoarding(testcase.TestCase): + # pylint: disable=too-many-instance-attributes """Base model for VNF test cases.""" __logger = logging.getLogger(__name__) + env_file = "/home/opnfv/functest/conf/env_file" def __init__(self, **kwargs): super(VnfOnBoarding, self).__init__(**kwargs) - self.tenant_created = False - self.user_created = False - self.tenant_name = CONST.__getattribute__( - 'vnf_{}_tenant_name'.format(self.case_name)) - self.tenant_description = CONST.__getattribute__( - 'vnf_{}_tenant_description'.format(self.case_name)) + self.uuid = uuid.uuid4() + self.user_name = "{}-{}".format(self.case_name, self.uuid) + self.tenant_name = "{}-{}".format(self.case_name, self.uuid) + self.snaps_creds = {} + self.created_object = [] + self.os_project = None + self.tenant_description = "Created by OPNFV Functest: {}".format( + self.case_name) def run(self, **kwargs): """ Run of the VNF test case: - * Deploy an orchestrator if needed (e.g. heat, cloudify, ONAP), + * Deploy an orchestrator if needed (e.g. heat, cloudify, ONAP,...), * Deploy the VNF, * Perform tests on the VNF A VNF test case is successfull when the 3 steps are PASS If one of the step is FAIL, the test case is FAIL - Returns: - TestCase.EX_OK if result is 'PASS'. - TestCase.EX_TESTCASE_FAILED otherwise. + Returns: + TestCase.EX_OK if result is 'PASS'. + TestCase.EX_TESTCASE_FAILED otherwise. """ self.start_time = time.time() @@ -75,13 +85,14 @@ class VnfOnBoarding(base.TestCase): self.stop_time = time.time() # Calculation with different weight depending on the steps TODO self.result = 100 - return base.TestCase.EX_OK - else: - self.result = 0 - return base.TestCase.EX_TESTCASE_FAILED + return testcase.TestCase.EX_OK + self.result = 0 + self.stop_time = time.time() + return testcase.TestCase.EX_TESTCASE_FAILED except Exception: # pylint: disable=broad-except + self.stop_time = time.time() self.__logger.exception("Exception on VNF testing") - return base.TestCase.EX_TESTCASE_FAILED + return testcase.TestCase.EX_TESTCASE_FAILED def prepare(self): """ @@ -96,21 +107,46 @@ class VnfOnBoarding(base.TestCase): Raise VnfPreparationException in case of problem """ try: - self.__logger.info("Prepare VNF: %s, description: %s", - self.tenant_name, self.tenant_description) - admin_creds = os_utils.get_credentials() - keystone_client = os_utils.get_keystone_client() - self.tenant_created = os_utils.get_or_create_tenant_for_vnf( - keystone_client, self.tenant_name, self.tenant_description) - self.user_created = os_utils.get_or_create_user_for_vnf( - keystone_client, self.tenant_name) - creds = admin_creds.copy() - creds.update({ - "tenant": self.tenant_name, - "username": self.tenant_name, - "password": self.tenant_name - }) - return base.TestCase.EX_OK + self.__logger.info( + "Prepare VNF: %s, description: %s", self.case_name, + self.tenant_description) + snaps_creds = openstack_tests.get_credentials( + os_env_file=self.env_file) + + self.os_project = OpenStackProject( + snaps_creds, + ProjectConfig( + name=self.tenant_name, + description=self.tenant_description, + domain=snaps_creds.project_domain_name + )) + self.os_project.create() + self.created_object.append(self.os_project) + + snaps_creds.project_domain_id = \ + self.os_project.get_project().domain_id + snaps_creds.user_domain_id = \ + self.os_project.get_project().domain_id + + for role in ['admin', 'Admin']: + if keystone_utils.get_role_by_name( + keystone_utils.keystone_client(snaps_creds), role): + admin_role = role + break + + user_creator = OpenStackUser( + snaps_creds, + UserConfig( + name=self.user_name, + password=str(uuid.uuid4()), + project_name=self.tenant_name, + domain_name=snaps_creds.user_domain_name, + roles={admin_role: self.tenant_name})) + user_creator.create() + self.created_object.append(user_creator) + self.snaps_creds = user_creator.get_os_creds(self.tenant_name) + + return testcase.TestCase.EX_OK except Exception: # pylint: disable=broad-except self.__logger.exception("Exception raised during VNF preparation") raise VnfPreparationException @@ -119,9 +155,8 @@ class VnfOnBoarding(base.TestCase): """ Deploy an orchestrator (optional). - If function overwritten - raise orchestratorDeploymentException if error during orchestrator - deployment + If this method is overriden then raise orchestratorDeploymentException + if error during orchestrator deployment """ self.__logger.info("Deploy orchestrator (if necessary)") return True @@ -134,10 +169,8 @@ class VnfOnBoarding(base.TestCase): The details section MAY be updated in the vnf test cases. The deployment can be executed via a specific orchestrator - or using nuild-in orchestrators such as: - - * heat, openbaton, cloudify (available on all scenario), - * open-o (on open-o scenarios) + or using build-in orchestrators such as heat, OpenBaton, cloudify, + juju, onap, ... Returns: True if the VNF is properly deployed @@ -180,9 +213,9 @@ class VnfOnBoarding(base.TestCase): * the user, * the tenant """ - self.__logger.info("test cleaning") - keystone_client = os_utils.get_keystone_client() - if self.tenant_created: - os_utils.delete_tenant(keystone_client, self.tenant_name) - if self.user_created: - os_utils.delete_user(keystone_client, self.tenant_name) + self.__logger.info('Removing the VNF resources ..') + for creator in reversed(self.created_object): + try: + creator.clean() + except Exception as exc: # pylint: disable=broad-except + self.__logger.error('Unexpected error cleaning - %s', exc)