diff options
Diffstat (limited to 'functest/opnfv_tests/openstack/tempest')
3 files changed, 149 insertions, 65 deletions
diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py index 893fff8c..a21322d8 100644 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py @@ -35,6 +35,8 @@ TEMPEST_DEFCORE = os.path.join(REPO_PATH, TEMPEST_TEST_LIST_DIR, 'defcore_req.txt') TEMPEST_RAW_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_raw_list.txt') TEMPEST_LIST = os.path.join(TEMPEST_RESULTS_DIR, 'test_list.txt') +REFSTACK_RESULTS_DIR = os.path.join(CONST.dir_results, + 'refstack') CI_INSTALLER_TYPE = CONST.INSTALLER_TYPE CI_INSTALLER_IP = CONST.INSTALLER_IP @@ -43,6 +45,88 @@ CI_INSTALLER_IP = CONST.INSTALLER_IP logger = ft_logger.Logger("Tempest").getLogger() +def create_tempest_resources(use_custom_images=False, + use_custom_flavors=False): + keystone_client = os_utils.get_keystone_client() + + logger.debug("Creating tenant and user for Tempest suite") + tenant_id = os_utils.create_tenant( + keystone_client, + CONST.tempest_identity_tenant_name, + CONST.tempest_identity_tenant_description) + if not tenant_id: + logger.error("Failed to create %s tenant" + % CONST.tempest_identity_tenant_name) + + user_id = os_utils.create_user(keystone_client, + CONST.tempest_identity_user_name, + CONST.tempest_identity_user_password, + None, tenant_id) + if not user_id: + logger.error("Failed to create %s user" % + CONST.tempest_identity_user_name) + + logger.debug("Creating private network for Tempest suite") + network_dic = os_utils.create_shared_network_full( + CONST.tempest_private_net_name, + CONST.tempest_private_subnet_name, + CONST.tempest_router_name, + CONST.tempest_private_subnet_cidr) + if network_dic is None: + raise Exception('Failed to create private network') + + image_id = "" + image_id_alt = "" + flavor_id = "" + flavor_id_alt = "" + + if CONST.tempest_use_custom_images or use_custom_images: + # adding alternative image should be trivial should we need it + logger.debug("Creating image for Tempest suite") + _, image_id = os_utils.get_or_create_image( + CONST.openstack_image_name, GLANCE_IMAGE_PATH, + CONST.openstack_image_disk_format) + if image_id is None: + raise Exception('Failed to create image') + + if use_custom_images: + logger.debug("Creating 2nd image for Tempest suite") + _, image_id_alt = os_utils.get_or_create_image( + CONST.openstack_image_name_alt, GLANCE_IMAGE_PATH, + CONST.openstack_image_disk_format) + if image_id_alt is None: + raise Exception('Failed to create image') + + if CONST.tempest_use_custom_flavors or use_custom_flavors: + # adding alternative flavor should be trivial should we need it + logger.debug("Creating flavor for Tempest suite") + _, flavor_id = os_utils.get_or_create_flavor( + CONST.openstack_flavor_name, + CONST.openstack_flavor_ram, + CONST.openstack_flavor_disk, + CONST.openstack_flavor_vcpus) + if flavor_id is None: + raise Exception('Failed to create flavor') + + if use_custom_flavors: + logger.debug("Creating 2nd flavor for tempest_defcore") + _, flavor_id_alt = os_utils.get_or_create_flavor( + CONST.openstack_flavor_name_alt, + CONST.openstack_flavor_ram, + CONST.openstack_flavor_disk, + CONST.openstack_flavor_vcpus) + if flavor_id_alt is None: + raise Exception('Failed to create flavor') + + img_flavor_dict = {} + img_flavor_dict['image_id'] = image_id + img_flavor_dict['image_id_alt'] = image_id_alt + img_flavor_dict['flavor_id'] = flavor_id + img_flavor_dict['flavor_id_alt'] = flavor_id_alt + + return img_flavor_dict + + def get_verifier_id(): """ Returns verifer id for current Tempest @@ -106,6 +190,17 @@ def get_verifier_deployment_dir(verifier_id, deployment_id): 'for-deployment-{}'.format(deployment_id)) +def get_repo_tag(repo): + """ + Returns last tag of current branch + """ + cmd = ("git -C {0} describe --abbrev=0 HEAD".format(repo)) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) + tag = p.stdout.readline().rstrip() + + return str(tag) + + def backup_tempest_config(conf_file): """ Copy config file to tempest results directory @@ -130,6 +225,33 @@ def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None, configure_tempest_multisite_params(conf_file) +def configure_tempest_defcore(deployment_dir, img_flavor_dict): + """ + Add/update needed parameters into tempest.conf file + """ + conf_file = configure_verifier(deployment_dir) + configure_tempest_update_params(conf_file, + img_flavor_dict.get("image_id"), + img_flavor_dict.get("flavor_id")) + + logger.debug("Updating selected tempest.conf parameters for defcore...") + config = ConfigParser.RawConfigParser() + config.read(conf_file) + config.set('compute', 'image_ref', img_flavor_dict.get("image_id")) + config.set('compute', 'image_ref_alt', + img_flavor_dict['image_id_alt']) + config.set('compute', 'flavor_ref', img_flavor_dict.get("flavor_id")) + config.set('compute', 'flavor_ref_alt', + img_flavor_dict['flavor_id_alt']) + + with open(conf_file, 'wb') as config_file: + config.write(config_file) + + confpath = os.path.join(CONST.dir_functest_test, + CONST.refstack_tempest_conf_path) + shutil.copyfile(conf_file, confpath) + + def configure_tempest_update_params(tempest_conf_file, IMAGE_ID=None, FLAVOR_ID=None): """ @@ -142,6 +264,8 @@ def configure_tempest_update_params(tempest_conf_file, 'compute', 'fixed_network_name', CONST.tempest_private_net_name) + config.set('compute', 'volume_device_name', + CONST.tempest_volume_device_name) if CONST.tempest_use_custom_images: if IMAGE_ID is not None: config.set('compute', 'image_ref', IMAGE_ID) @@ -276,3 +400,16 @@ def configure_tempest_multisite_params(tempest_conf_file): config.write(config_file) backup_tempest_config(tempest_conf_file) + + +def install_verifier_ext(path): + """ + Install extension to active verifier + """ + logger.info("Installing verifier from existing repo...") + tag = get_repo_tag(path) + cmd = ("rally verify add-verifier-ext --source {0} " + "--version {1}" + .format(path, tag)) + error_msg = ("Problem while adding verifier extension from %s" % path) + ft_utils.execute_command_raise(cmd, error_msg=error_msg) diff --git a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt b/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt index 1456db87..fbbee2ff 100644 --- a/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt +++ b/functest/opnfv_tests/openstack/tempest/custom_tests/defcore_req.txt @@ -1,7 +1,7 @@ # Set of DefCore tempest test cases not flagged and required. It only contains OpenStack core (no object storage) # The approved guidelines (2016.08) are valid for Kilo, Liberty, Mitaka and Newton releases of OpenStack # The list can be generated using the Rest API from RefStack project: -# https://refstack.openstack.org/api/v1/guidelines/2016.08/tests?target=compute&type=required&alias=true&flag=false +# https://refstack.openstack.org/api/v1/guidelines/2017.01/tests?target=compute&type=required&alias=true&flag=false tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image[id-3731d080-d4c5-4872-b41a-64d0d0021314] tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name[id-3b7c6fe4-dfe7-477c-9243-b06359db51e6] tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name[id-ac1ad47f-984b-4441-9274-c9079b7a0666] @@ -14,6 +14,7 @@ tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_s tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[id-585e934c-448e-43c4-acbf-d06a9b899997] tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus[id-cbc0f52f-05aa-492b-bdc1-84b575ca294b] tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[id-5de47127-9977-400a-936f-abcfbec1218f] +tempest.api.compute.servers.test_delete_server.DeleteServersTestJSON.test_delete_active_server[id-925fdfb4-5b13-47ea-ac8a-c36ae6fddb05] tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action[id-aacc71ca-1d70-4aa5-bbf6-0ff71470e43c] tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions[id-77ca5cc5-9990-45e0-ab98-1de8fead201a] tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor[id-80c574cc-0925-44ba-8602-299028357dd9] @@ -245,4 +246,4 @@ tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTest tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id[id-bb9da53e-d335-4309-9c15-7e76fd5e4d6d] tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination[id-e9138a2c-f67b-4796-8efa-635c196d01de] tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params[id-2a7064eb-b9c3-429b-b888-33928fc5edd3] -tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c]
\ No newline at end of file +tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination[id-af55e775-8e4b-4feb-8719-215c43b0238c] diff --git a/functest/opnfv_tests/openstack/tempest/tempest.py b/functest/opnfv_tests/openstack/tempest/tempest.py index 4c96500d..d3b15926 100644 --- a/functest/opnfv_tests/openstack/tempest/tempest.py +++ b/functest/opnfv_tests/openstack/tempest/tempest.py @@ -21,7 +21,6 @@ from functest.opnfv_tests.openstack.tempest import conf_utils from functest.utils.constants import CONST import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils -import functest.utils.openstack_utils as os_utils """ logging configuration """ logger = ft_logger.Logger("Tempest").getLogger() @@ -33,8 +32,6 @@ class TempestCommon(testcase_base.TestcaseBase): super(TempestCommon, self).__init__() self.MODE = "" self.OPTION = "" - self.FLAVOR_ID = None - self.IMAGE_ID = None self.VERIFIER_ID = conf_utils.get_verifier_id() self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir( self.VERIFIER_ID) @@ -48,55 +45,6 @@ class TempestCommon(testcase_base.TestcaseBase): with open(filename) as src: return [line.strip() for line in src.readlines()] - def create_tempest_resources(self): - keystone_client = os_utils.get_keystone_client() - - logger.debug("Creating tenant and user for Tempest suite") - tenant_id = os_utils.create_tenant( - keystone_client, - CONST.tempest_identity_tenant_name, - CONST.tempest_identity_tenant_description) - if not tenant_id: - logger.error("Failed to create %s tenant" - % CONST.tempest_identity_tenant_name) - - user_id = os_utils.create_user(keystone_client, - CONST.tempest_identity_user_name, - CONST.tempest_identity_user_password, - None, tenant_id) - if not user_id: - logger.error("Failed to create %s user" % - CONST.tempest_identity_user_name) - - logger.debug("Creating private network for Tempest suite") - network_dic = os_utils.create_shared_network_full( - CONST.tempest_private_net_name, - CONST.tempest_private_subnet_name, - CONST.tempest_router_name, - CONST.tempest_private_subnet_cidr) - if network_dic is None: - raise Exception('Failed to create private network') - - if CONST.tempest_use_custom_images: - # adding alternative image should be trivial should we need it - logger.debug("Creating image for Tempest suite") - _, self.IMAGE_ID = os_utils.get_or_create_image( - CONST.openstack_image_name, conf_utils.GLANCE_IMAGE_PATH, - CONST.openstack_image_disk_format) - if self.IMAGE_ID is None: - raise Exception('Failed to create image') - - if CONST.tempest_use_custom_flavors: - # adding alternative flavor should be trivial should we need it - logger.debug("Creating flavor for Tempest suite") - _, self.FLAVOR_ID = os_utils.get_or_create_flavor( - CONST.openstack_flavor_name, - CONST.openstack_flavor_ram, - CONST.openstack_flavor_disk, - CONST.openstack_flavor_vcpus) - if self.FLAVOR_ID is None: - raise Exception('Failed to create flavor') - def generate_test_list(self, verifier_repo_dir): logger.debug("Generating test case list...") if self.MODE == 'defcore': @@ -160,13 +108,9 @@ class TempestCommon(testcase_base.TestcaseBase): result_file.write(str(cases_line) + '\n') result_file.close() - def _parse_verification_id(line): - first_pos = line.index("UUID=") + len("UUID=") - last_pos = line.index(") for deployment") - return line[first_pos:last_pos] - def run_verifier_tests(self): - self.OPTION += (" --load-list {}".format(conf_utils.TEMPEST_LIST)) + self.OPTION += (" --load-list {} --detailed" + .format(conf_utils.TEMPEST_LIST)) cmd_line = "rally verify start " + self.OPTION logger.info("Starting Tempest test suite: '%s'." % cmd_line) @@ -269,11 +213,12 @@ class TempestCommon(testcase_base.TestcaseBase): os.makedirs(conf_utils.TEMPEST_RESULTS_DIR) try: - self.create_tempest_resources() - conf_utils.configure_tempest(self.DEPLOYMENT_DIR, - self.IMAGE_ID, - self.FLAVOR_ID, - self.MODE) + image_and_flavor = conf_utils.create_tempest_resources() + conf_utils.configure_tempest( + self.DEPLOYMENT_DIR, + IMAGE_ID=image_and_flavor.get("image_id"), + FLAVOR_ID=image_and_flavor.get("flavor_id"), + MODE=self.MODE) self.generate_test_list(self.VERIFIER_REPO_DIR) self.apply_tempest_blacklist() self.run_verifier_tests() @@ -320,6 +265,7 @@ class TempestMultisite(TempestCommon): self.case_name = "multisite" self.MODE = "feature_multisite" self.OPTION = "--concurrency 1" + conf_utils.install_verifier_ext(CONST.dir_repo_kingbird) class TempestCustom(TempestCommon): |