X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fopenstack%2Ftempest%2Ftempest.py;h=9d788de8c82ab384d6f6df063b9688283419fed4;hb=refs%2Fchanges%2F01%2F66501%2F1;hp=452c82d26fa9e81f39481e0fadb37b64260224a2;hpb=232464bfa350e41472ee659c27d9a4d4fb98585e;p=functest.git diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index 452c82d26..9d788de8c 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -27,11 +27,12 @@ from functest.core import singlevm from functest.opnfv_tests.openstack.tempest import conf_utils from functest.utils import config from functest.utils import env +from functest.utils import functest_utils LOGGER = logging.getLogger(__name__) -class TempestCommon(singlevm.VmReady1): +class TempestCommon(singlevm.VmReady2): # pylint: disable=too-many-instance-attributes """TempestCommon testcases implementation class.""" @@ -42,12 +43,26 @@ class TempestCommon(singlevm.VmReady1): if "case_name" not in kwargs: kwargs["case_name"] = 'tempest' super(TempestCommon, self).__init__(**kwargs) - self.verifier_id = conf_utils.get_verifier_id() - self.verifier_repo_dir = conf_utils.get_verifier_repo_dir( - self.verifier_id) - self.deployment_id = conf_utils.get_verifier_deployment_id() - self.deployment_dir = conf_utils.get_verifier_deployment_dir( - self.verifier_id, self.deployment_id) + assert self.orig_cloud + assert self.cloud + assert self.project + if self.orig_cloud.get_role("admin"): + self.role_name = "admin" + elif self.orig_cloud.get_role("Admin"): + self.role_name = "Admin" + else: + raise Exception("Cannot detect neither admin nor Admin") + self.orig_cloud.grant_role( + self.role_name, user=self.project.user.id, + project=self.project.project.id, + domain=self.project.domain.id) + self.orig_cloud.grant_role( + self.role_name, user=self.project.user.id, + domain=self.project.domain.id) + self.deployment_id = None + self.verifier_id = None + self.verifier_repo_dir = None + self.deployment_dir = None self.verification_id = None self.res_dir = os.path.join( getattr(config.CONF, 'dir_results'), self.case_name) @@ -68,6 +83,9 @@ class TempestCommon(singlevm.VmReady1): except Exception: # pylint: disable=broad-except pass + def create_network_resources(self): + pass + def check_services(self): """Check the mandatory services.""" for service in self.services: @@ -90,6 +108,8 @@ class TempestCommon(singlevm.VmReady1): def check_requirements(self): self.check_services() self.check_extensions() + if self.is_skipped: + self.project.clean() @staticmethod def read_file(filename): @@ -166,19 +186,15 @@ class TempestCommon(singlevm.VmReady1): result_file = open(self.list, 'w') black_tests = [] try: - installer_type = env.get('INSTALLER_TYPE') deploy_scenario = env.get('DEPLOY_SCENARIO') - if bool(installer_type) * bool(deploy_scenario): - # if INSTALLER_TYPE and DEPLOY_SCENARIO are set we read the - # file + if bool(deploy_scenario): + # if DEPLOY_SCENARIO is set we read the file black_list_file = open(conf_utils.TEMPEST_BLACKLIST) black_list_yaml = yaml.safe_load(black_list_file) black_list_file.close() for item in black_list_yaml: scenarios = item['scenarios'] - installers = item['installers'] - if (deploy_scenario in scenarios and - installer_type in installers): + if deploy_scenario in scenarios: tests = item['tests'] for test in tests: black_tests.append(test) @@ -226,6 +242,10 @@ class TempestCommon(singlevm.VmReady1): raise Exception('Verification UUID not found') LOGGER.info('Verification UUID: %s', self.verification_id) + shutil.copy( + "{}/tempest.log".format(self.deployment_dir), + "{}/tempest.debug.log".format(self.res_dir)) + def parse_verifier_result(self): """Parse and save test results.""" stat = self.get_verifier_result(self.verification_id) @@ -276,17 +296,16 @@ class TempestCommon(singlevm.VmReady1): html_file = os.path.join(self.res_dir, "tempest-report.html") cmd = ["rally", "verify", "report", "--type", "html", "--uuid", - self.verification_id, "--to", html_file] - subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) + self.verification_id, "--to", str(html_file)] + subprocess.check_output(cmd) def update_rally_regex(self, rally_conf='/etc/rally/rally.conf'): """Set image name as tempest img_name_regex""" rconfig = configparser.RawConfigParser() rconfig.read(rally_conf) - if not rconfig.has_section('tempest'): - rconfig.add_section('tempest') - rconfig.set('tempest', 'img_name_regex', '^{}$'.format( + if not rconfig.has_section('openstack'): + rconfig.add_section('openstack') + rconfig.set('openstack', 'img_name_regex', '^{}$'.format( self.image.name)) with open(rally_conf, 'wb') as config_file: rconfig.write(config_file) @@ -298,9 +317,9 @@ class TempestCommon(singlevm.VmReady1): return rconfig = configparser.RawConfigParser() rconfig.read(rally_conf) - if not rconfig.has_section('tempest'): - rconfig.add_section('tempest') - rconfig.set('tempest', 'swift_operator_role', role.name) + if not rconfig.has_section('openstack'): + rconfig.add_section('openstack') + rconfig.set('openstack', 'swift_operator_role', role.name) with open(rally_conf, 'wb') as config_file: rconfig.write(config_file) @@ -310,11 +329,60 @@ class TempestCommon(singlevm.VmReady1): os.makedirs(self.res_dir) rconfig = configparser.RawConfigParser() rconfig.read(rally_conf) + rconfig.set('DEFAULT', 'debug', True) + rconfig.set('DEFAULT', 'use_stderr', False) rconfig.set('DEFAULT', 'log-file', 'rally.log') rconfig.set('DEFAULT', 'log_dir', self.res_dir) with open(rally_conf, 'wb') as config_file: rconfig.write(config_file) + @staticmethod + def clean_rally_conf(rally_conf='/etc/rally/rally.conf'): + """Clean Rally config""" + rconfig = configparser.RawConfigParser() + rconfig.read(rally_conf) + if rconfig.has_option('openstack', 'img_name_regex'): + rconfig.remove_option('openstack', 'img_name_regex') + if rconfig.has_option('openstack', 'swift_operator_role'): + rconfig.remove_option('openstack', 'swift_operator_role') + if rconfig.has_option('DEFAULT', 'use_stderr'): + rconfig.remove_option('DEFAULT', 'use_stderr') + if rconfig.has_option('DEFAULT', 'debug'): + rconfig.remove_option('DEFAULT', 'debug') + if rconfig.has_option('DEFAULT', 'log-file'): + rconfig.remove_option('DEFAULT', 'log-file') + if rconfig.has_option('DEFAULT', 'log_dir'): + rconfig.remove_option('DEFAULT', 'log_dir') + with open(rally_conf, 'wb') as config_file: + rconfig.write(config_file) + + def update_scenario_section(self): + """Update scenario section in tempest.conf""" + rconfig = configparser.RawConfigParser() + rconfig.read(self.conf_file) + filename = getattr( + config.CONF, '{}_image'.format(self.case_name), self.filename) + if not rconfig.has_section('scenario'): + rconfig.add_section('scenario') + rconfig.set('scenario', 'img_file', os.path.basename(filename)) + rconfig.set('scenario', 'img_dir', os.path.dirname(filename)) + rconfig.set('scenario', 'img_disk_format', getattr( + config.CONF, '{}_image_format'.format(self.case_name), + self.image_format)) + extra_properties = self.extra_properties.copy() + if env.get('IMAGE_PROPERTIES'): + extra_properties.update( + functest_utils.convert_ini_to_dict( + env.get('IMAGE_PROPERTIES'))) + extra_properties.update( + getattr(config.CONF, '{}_extra_properties'.format( + self.case_name), {})) + rconfig.set( + 'scenario', 'img_properties', + functest_utils.convert_dict_to_ini(extra_properties)) + with open(self.conf_file, 'wb') as config_file: + rconfig.write(config_file) + def configure(self, **kwargs): # pylint: disable=unused-argument """ Create all openstack resources for tempest-based testcases and write @@ -322,20 +390,48 @@ class TempestCommon(singlevm.VmReady1): """ if not os.path.exists(self.res_dir): os.makedirs(self.res_dir) - compute_cnt = len(self.cloud.list_hypervisors()) + environ = dict( + os.environ, + OS_USERNAME=self.project.user.name, + OS_PROJECT_NAME=self.project.project.name, + OS_PROJECT_ID=self.project.project.id, + OS_PASSWORD=self.project.password) + try: + del environ['OS_TENANT_NAME'] + del environ['OS_TENANT_ID'] + except Exception: # pylint: disable=broad-except + pass + self.deployment_id = conf_utils.create_rally_deployment( + environ=environ) + if not self.deployment_id: + raise Exception("Deployment create failed") + self.verifier_id = conf_utils.create_verifier() + if not self.verifier_id: + raise Exception("Verifier create failed") + self.verifier_repo_dir = conf_utils.get_verifier_repo_dir( + self.verifier_id) + self.deployment_dir = conf_utils.get_verifier_deployment_dir( + self.verifier_id, self.deployment_id) + + compute_cnt = len(self.orig_cloud.list_hypervisors()) self.image_alt = self.publish_image_alt() self.flavor_alt = self.create_flavor_alt() LOGGER.debug("flavor: %s", self.flavor_alt) self.conf_file = conf_utils.configure_verifier(self.deployment_dir) + if not self.conf_file: + raise Exception("Tempest verifier configuring failed") conf_utils.configure_tempest_update_params( - self.conf_file, network_name=self.network.id, + self.conf_file, image_id=self.image.id, flavor_id=self.flavor.id, compute_cnt=compute_cnt, image_alt_id=self.image_alt.id, - flavor_alt_id=self.flavor_alt.id) + flavor_alt_id=self.flavor_alt.id, + admin_role_name=self.role_name, cidr=self.cidr, + domain_id=self.project.domain.id) + self.update_scenario_section() self.backup_tempest_config(self.conf_file, self.res_dir) def run(self, **kwargs): @@ -343,9 +439,12 @@ class TempestCommon(singlevm.VmReady1): try: assert super(TempestCommon, self).run( **kwargs) == testcase.TestCase.EX_OK + if not os.path.exists(self.res_dir): + os.makedirs(self.res_dir) self.update_rally_regex() self.update_default_role() self.update_rally_logs() + shutil.copy("/etc/rally/rally.conf", self.res_dir) self.configure(**kwargs) self.generate_test_list(**kwargs) self.apply_tempest_blacklist() @@ -364,6 +463,7 @@ class TempestCommon(singlevm.VmReady1): """ Cleanup all OpenStack objects. Should be called on completion. """ + self.clean_rally_conf() if self.image_alt: self.cloud.delete_image(self.image_alt) if self.flavor_alt: