X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fopenstack%2Ftempest%2Fconf_utils.py;h=f4a94f6549194ecc895df7209ddc86189279a8c6;hb=3fb0175dab6d60af2fe40274fab19abf3ea6162f;hp=91a5bb4b0ab3739ab9bb10c36fcfa503d71230c8;hpb=de489169452cd732dc90dc7eded0ff1ee5f68e52;p=functest.git diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py index 91a5bb4b0..f4a94f654 100644 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py @@ -13,8 +13,6 @@ import re import shutil import subprocess -import opnfv.utils.constants as releng_constants - from functest.utils.constants import CONST import functest.utils.functest_logger as ft_logger import functest.utils.functest_utils as ft_utils @@ -37,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 @@ -45,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 @@ -108,26 +190,73 @@ def get_verifier_deployment_dir(verifier_id, deployment_id): 'for-deployment-{}'.format(deployment_id)) -def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None): +def get_repo_tag(repo): """ - Add/update needed parameters into tempest.conf file generated by Rally + Returns last tag of current branch """ - tempest_conf_file = os.path.join(deployment_dir, "tempest.conf") - if os.path.isfile(tempest_conf_file): - logger.debug("Verifier is already configured.") - logger.debug("Reconfiguring the current verifier...") - cmd = "rally verify configure-verifier --reconfigure" - else: - logger.info("Configuring the verifier...") - cmd = "rally verify configure-verifier" - ft_utils.execute_command(cmd) + cmd = ("git -C {0} describe --abbrev=0 HEAD".format(repo)) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) + tag = p.stdout.readline().rstrip() - logger.debug("Looking for tempest.conf file...") - if not os.path.isfile(tempest_conf_file): - logger.error("Tempest configuration file %s NOT found." - % tempest_conf_file) - return releng_constants.EXIT_RUN_ERROR + return str(tag) + + +def backup_tempest_config(conf_file): + """ + Copy config file to tempest results directory + """ + if not os.path.exists(TEMPEST_RESULTS_DIR): + os.makedirs(TEMPEST_RESULTS_DIR) + + shutil.copyfile(conf_file, + os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf')) + + +def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None, + MODE=None): + """ + Calls rally verify and updates the generated tempest.conf with + given parameters + """ + conf_file = configure_verifier(deployment_dir) + configure_tempest_update_params(conf_file, + IMAGE_ID, FLAVOR_ID) + if MODE == 'feature_multisite': + 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): + """ + Add/update needed parameters into tempest.conf file + """ logger.debug("Updating selected tempest.conf parameters...") config = ConfigParser.RawConfigParser() config.read(tempest_conf_file) @@ -135,6 +264,8 @@ def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None): '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) @@ -171,36 +302,38 @@ def configure_tempest(deployment_dir, IMAGE_ID=None, FLAVOR_ID=None): with open(tempest_conf_file, 'wb') as config_file: config.write(config_file) - # Copy tempest.conf to /home/opnfv/functest/results/tempest/ - if not os.path.exists(TEMPEST_RESULTS_DIR): - os.makedirs(TEMPEST_RESULTS_DIR) + backup_tempest_config(tempest_conf_file) - shutil.copyfile(tempest_conf_file, - os.path.join(TEMPEST_RESULTS_DIR, 'tempest.conf')) - return releng_constants.EXIT_OK - - -def configure_tempest_multisite(deployment_dir): +def configure_verifier(deployment_dir): """ - Add/update needed parameters into tempest.conf file generated by Rally + Execute rally verify configure-verifier, which generates tempest.conf """ - logger.debug("configure the tempest") - configure_tempest(deployment_dir) + tempest_conf_file = os.path.join(deployment_dir, "tempest.conf") + if os.path.isfile(tempest_conf_file): + logger.debug("Verifier is already configured.") + logger.debug("Reconfiguring the current verifier...") + cmd = "rally verify configure-verifier --reconfigure" + else: + logger.info("Configuring the verifier...") + cmd = "rally verify configure-verifier" + ft_utils.execute_command(cmd) - logger.debug("Finding tempest.conf file...") - tempest_conf_old = os.path.join(deployment_dir, 'tempest.conf') - if not os.path.isfile(tempest_conf_old): + logger.debug("Looking for tempest.conf file...") + if not os.path.isfile(tempest_conf_file): logger.error("Tempest configuration file %s NOT found." - % tempest_conf_old) - return releng_constants.EXIT_RUN_ERROR + % tempest_conf_file) + raise Exception("Tempest configuration file %s NOT found." + % tempest_conf_file) + else: + return tempest_conf_file - # Copy tempest.conf to /home/opnfv/functest/results/tempest/ - cur_path = os.path.split(os.path.realpath(__file__))[0] - tempest_conf_file = os.path.join(cur_path, 'tempest_multisite.conf') - shutil.copyfile(tempest_conf_old, tempest_conf_file) - logger.debug("Updating selected tempest.conf parameters...") +def configure_tempest_multisite_params(tempest_conf_file): + """ + Add/update multisite parameters into tempest.conf file generated by Rally + """ + logger.debug("Updating multisite tempest.conf parameters...") config = ConfigParser.RawConfigParser() config.read(tempest_conf_file) @@ -208,7 +341,7 @@ def configure_tempest_multisite(deployment_dir): # cmd = ("openstack endpoint show kingbird | grep publicurl |" # "awk '{print $4}' | awk -F '/' '{print $4}'") # kingbird_api_version = os.popen(cmd).read() - kingbird_api_version = os_utils.get_endpoint(service_type='multisite') + # kingbird_api_version = os_utils.get_endpoint(service_type='multisite') if CI_INSTALLER_TYPE == 'fuel': # For MOS based setup, the service is accessible @@ -259,11 +392,28 @@ def configure_tempest_multisite(deployment_dir): config.add_section("kingbird") except Exception: logger.info('kingbird section exist') + + # set the domain id + config.set('auth', 'admin_domain_name', 'default') + config.set('kingbird', 'endpoint_type', 'publicURL') - config.set('kingbird', 'TIME_TO_SYNC', '20') + config.set('kingbird', 'TIME_TO_SYNC', '120') config.set('kingbird', 'endpoint_url', kingbird_endpoint_url) - config.set('kingbird', 'api_version', kingbird_api_version) + config.set('kingbird', 'api_version', 'v1.0') with open(tempest_conf_file, 'wb') as config_file: config.write(config_file) - return releng_constants.EXIT_OK + 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)