From 961d31d83a1b2e872f5e270bcea93519544b5cd2 Mon Sep 17 00:00:00 2001 From: Linda Wang Date: Tue, 22 Aug 2017 11:38:58 +0000 Subject: Config test_accounts_file for refstack_defcore Tenant and user are required by refstack_defcore, which could be configured in the test_accounts_file. [1] [1]: https://github.com/openstack/refstack-client/blob/master/refstack_client/refstack_client.py#L170-L193 Change-Id: I9c920b6f15f491d671ebf222976305bedf4dd747 Signed-off-by: Linda Wang --- functest/ci/config_functest.yaml | 5 ++ .../opnfv_tests/openstack/tempest/conf_utils.py | 51 ++++++++++++++ .../unit/openstack/tempest/test_conf_utils.py | 82 ++++++++++++++++++---- 3 files changed, 125 insertions(+), 13 deletions(-) diff --git a/functest/ci/config_functest.yaml b/functest/ci/config_functest.yaml index b3fc397f1..3278c0266 100644 --- a/functest/ci/config_functest.yaml +++ b/functest/ci/config_functest.yaml @@ -96,6 +96,11 @@ odl_sfc: tempest: deployment_name: opnfv-tempest + identity: + tenant_name: tempest + tenant_description: Tenant for Tempest test suite + user_name: tempest + user_password: Tempest123! validation: ssh_timeout: 130 object_storage: diff --git a/functest/opnfv_tests/openstack/tempest/conf_utils.py b/functest/opnfv_tests/openstack/tempest/conf_utils.py index fd3785b99..8574b0de0 100644 --- a/functest/opnfv_tests/openstack/tempest/conf_utils.py +++ b/functest/opnfv_tests/openstack/tempest/conf_utils.py @@ -41,6 +41,9 @@ REFSTACK_RESULTS_DIR = os.path.join(CONST.__getattribute__('dir_results'), 'refstack') TEMPEST_CONF_YAML = pkg_resources.resource_filename( 'functest', 'opnfv_tests/openstack/tempest/custom_tests/tempest_conf.yaml') +TEST_ACCOUNTS_FILE = pkg_resources.resource_filename( + 'functest', + 'opnfv_tests/openstack/tempest/custom_tests/test_accounts.yaml') CI_INSTALLER_TYPE = CONST.__getattribute__('INSTALLER_TYPE') CI_INSTALLER_IP = CONST.__getattribute__('INSTALLER_IP') @@ -117,6 +120,30 @@ def create_tempest_resources(use_custom_images=False, return img_flavor_dict +def create_tenant_user(): + 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.__getattribute__('tempest_identity_tenant_name'), + CONST.__getattribute__('tempest_identity_tenant_description')) + if not tenant_id: + logger.error("Failed to create %s tenant" + % CONST.__getattribute__('tempest_identity_tenant_name')) + + user_id = os_utils.create_user( + keystone_client, + CONST.__getattribute__('tempest_identity_user_name'), + CONST.__getattribute__('tempest_identity_user_password'), + None, tenant_id) + if not user_id: + logger.error("Failed to create %s user" % + CONST.__getattribute__('tempest_identity_user_name')) + + return tenant_id + + def get_verifier_id(): """ Returns verifer id for current Tempest @@ -228,6 +255,8 @@ def configure_tempest_defcore(deployment_dir, img_flavor_dict): config.set('DEFAULT', 'log_file', '{}/tempest.log'.format(deployment_dir)) config.set('oslo_concurrency', 'lock_path', '{}/lock_files'.format(deployment_dir)) + generate_test_accounts_file() + config.set('auth', 'test_accounts_file', TEST_ACCOUNTS_FILE) config.set('scenario', 'img_dir', '{}'.format(deployment_dir)) config.set('scenario', 'img_file', 'tempest-image') config.set('compute', 'image_ref', img_flavor_dict.get("image_id")) @@ -246,6 +275,28 @@ def configure_tempest_defcore(deployment_dir, img_flavor_dict): shutil.copyfile(conf_file, confpath) +def generate_test_accounts_file(): + """ + Add needed tenant and user params into test_accounts.yaml + """ + + logger.debug("Add needed params into test_accounts.yaml...") + tenant_id = create_tenant_user() + accounts_list = [ + { + 'tenant_name': + CONST.__getattribute__('tempest_identity_tenant_name'), + 'tenant_id': str(tenant_id), + 'username': CONST.__getattribute__('tempest_identity_user_name'), + 'password': + CONST.__getattribute__('tempest_identity_user_password') + } + ] + + with open(TEST_ACCOUNTS_FILE, "w") as f: + yaml.dump(accounts_list, f, default_flow_style=False) + + def configure_tempest_update_params(tempest_conf_file, IMAGE_ID=None, FLAVOR_ID=None): """ diff --git a/functest/tests/unit/openstack/tempest/test_conf_utils.py b/functest/tests/unit/openstack/tempest/test_conf_utils.py index bbfcc57d5..e2937a180 100644 --- a/functest/tests/unit/openstack/tempest/test_conf_utils.py +++ b/functest/tests/unit/openstack/tempest/test_conf_utils.py @@ -18,11 +18,8 @@ class OSTempestConfUtilsTesting(unittest.TestCase): def test_create_tempest_resources_missing_network_dic(self): with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.get_keystone_client', - return_value=mock.Mock()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.create_shared_network_full', - return_value=None), \ + 'os_utils.create_shared_network_full', + return_value=None), \ self.assertRaises(Exception) as context: conf_utils.create_tempest_resources() msg = 'Failed to create private network' @@ -30,11 +27,8 @@ class OSTempestConfUtilsTesting(unittest.TestCase): def test_create_tempest_resources_missing_image(self): with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.get_keystone_client', + 'os_utils.create_shared_network_full', return_value=mock.Mock()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.create_shared_network_full', - return_value=mock.Mock()), \ mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' 'os_utils.get_or_create_image', return_value=(mock.Mock(), None)), \ @@ -52,11 +46,8 @@ class OSTempestConfUtilsTesting(unittest.TestCase): def test_create_tempest_resources_missing_flavor(self): with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.get_keystone_client', + 'os_utils.create_shared_network_full', return_value=mock.Mock()), \ - mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' - 'os_utils.create_shared_network_full', - return_value=mock.Mock()), \ mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' 'os_utils.get_or_create_image', return_value=(mock.Mock(), 'image_id')), \ @@ -76,6 +67,58 @@ class OSTempestConfUtilsTesting(unittest.TestCase): msg = 'Failed to create flavor' self.assertTrue(msg in context) + @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'logger.error') + def create_tenant_user_and_tenant_ok(self, mock_logger_error): + with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.get_keystone_client', + return_value=mock.Mock()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.create_tenant', + return_value='test_tenant_id'): + conf_utils.create_tenant_user() + mock_logger_error.assert_not_called() + + @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'logger.error') + def create_tenant_user_and_user_ok(self, mock_logger_error): + with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.get_keystone_client', + return_value=mock.Mock()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.create_user', + return_value='test_user_id'): + conf_utils.create_tenant_user() + mock_logger_error.assert_not_called() + + @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'logger.error') + def create_tenant_user_and_tenant_failed(self, mock_logger_error): + with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.get_keystone_client', + return_value=mock.Mock()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.create_tenant', + return_value=None): + conf_utils.create_tenant_user() + msg = ("Failed to create %s tenant" + % CONST.__getattribute__('tempest_identity_tenant_name')) + mock_logger_error.assert_any_call(msg) + + @mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'logger.error') + def create_tenant_user_and_user_failed(self, mock_logger_error): + with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.get_keystone_client', + return_value=mock.Mock()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'os_utils.create_user', + return_value=None): + conf_utils.create_tenant_user() + msg = ("Failed to create %s user" + % CONST.__getattribute__('tempest_identity_user_name')) + mock_logger_error.assert_any_call(msg) + def test_get_verifier_id_missing_verifier(self): CONST.__setattr__('tempest_deployment_name', 'test_deploy_name') with mock.patch('functest.opnfv_tests.openstack.tempest.' @@ -205,6 +248,8 @@ class OSTempestConfUtilsTesting(unittest.TestCase): 'conf_utils.ConfigParser.RawConfigParser.' 'write') as mwrite, \ mock.patch('__builtin__.open', mock.mock_open()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.' + 'conf_utils.generate_test_accounts_file'), \ mock.patch('functest.opnfv_tests.openstack.tempest.' 'conf_utils.shutil.copyfile'): conf_utils.configure_tempest_defcore('test_dep_dir', @@ -218,6 +263,17 @@ class OSTempestConfUtilsTesting(unittest.TestCase): self.assertTrue(mread.called) self.assertTrue(mwrite.called) + def test_generate_test_accounts_file_default(self): + with mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'create_tenant_user', + return_value='test_tenant_id') as mock_create, \ + mock.patch("__builtin__.open", mock.mock_open()), \ + mock.patch('functest.opnfv_tests.openstack.tempest.conf_utils.' + 'yaml.dump') as mock_dump: + conf_utils.generate_test_accounts_file() + self.assertTrue(mock_create.called) + self.assertTrue(mock_dump.called) + def _test_missing_param(self, params, image_id, flavor_id): with mock.patch('functest.opnfv_tests.openstack.tempest.' 'conf_utils.ConfigParser.RawConfigParser.' -- cgit 1.2.3-korg