From 75c4c518d27d261d0b1c884f11ca0fd4b1a56edf Mon Sep 17 00:00:00 2001 From: Sripriya Date: Tue, 29 Mar 2016 20:29:01 -0700 Subject: [PATCH] Fix keystone v2 support for multisite Placement attr regions returned empty along with vim_project when user provides keystone v2 in auth url This fixes the vim-register for VIM with keystone v2 version Closes-Bug: #1563661 Closes-Bug: #1563189 Change-Id: I439a21da6909ca6587dbb3d9de3dc478d02f7158 --- tacker/nfvo/drivers/vim/openstack_driver.py | 10 ++-- .../tests/etc/samples/vim-config-ks-v2.yaml | 4 ++ tacker/tests/functional/base.py | 11 ---- tacker/tests/functional/nfvo/test_vim.py | 58 +++++++++++++++---- 4 files changed, 56 insertions(+), 27 deletions(-) create mode 100644 tacker/tests/etc/samples/vim-config-ks-v2.yaml diff --git a/tacker/nfvo/drivers/vim/openstack_driver.py b/tacker/nfvo/drivers/vim/openstack_driver.py index c21234e83..f04e25e74 100644 --- a/tacker/nfvo/drivers/vim/openstack_driver.py +++ b/tacker/nfvo/drivers/vim/openstack_driver.py @@ -79,8 +79,8 @@ class OpenStack_Driver(abstract_vim_driver.VimAbstractDriver): 'user_domain_id' ] = CONF.keystone_authtoken.user_domain_id else: - auth_cred['tenant_id'] = vim_project.pop('id', None) - auth_cred['tenant_name'] = vim_project.pop('name', None) + auth_cred['tenant_id'] = vim_project.get('id', None) + auth_cred['tenant_name'] = vim_project.get('name', None) # user_id is not supported in keystone v2 auth_cred.pop('user_id', None) auth_cred['auth_url'] = vim_obj['auth_url'] @@ -106,8 +106,10 @@ class OpenStack_Driver(abstract_vim_driver.VimAbstractDriver): def _find_regions(self, ks_client): if ks_client.version == 'v2.0': service_list = ks_client.services.list() - heat_service_id = (service.id for service in - service_list if service.type == 'orchestration') + heat_service_id = None + for service in service_list: + if service.type == 'orchestration': + heat_service_id = service.id endpoints_list = ks_client.endpoints.list() region_list = [endpoint.region for endpoint in endpoints_list if endpoint.service_id == heat_service_id] diff --git a/tacker/tests/etc/samples/vim-config-ks-v2.yaml b/tacker/tests/etc/samples/vim-config-ks-v2.yaml new file mode 100644 index 000000000..142c37bd6 --- /dev/null +++ b/tacker/tests/etc/samples/vim-config-ks-v2.yaml @@ -0,0 +1,4 @@ +auth_url: http://127.0.0.1:5000/v2.0 +username: nfv_user +password: devstack +project_name: nfv diff --git a/tacker/tests/functional/base.py b/tacker/tests/functional/base.py index 2276939a7..e83b9841c 100644 --- a/tacker/tests/functional/base.py +++ b/tacker/tests/functional/base.py @@ -119,17 +119,6 @@ class BaseTackerTest(base.TestCase): self.assertEqual(vnf_current_status, 'ACTIVE') self.validate_vnf_instance(vnfd_instance, vnf_instance) - def verify_vim(self, vim_instance, config_data, name, description): - self.assertIsNotNone(vim_instance) - self.assertEqual(vim_instance['vim']['description'], description) - self.assertEqual(vim_instance['vim']['name'], name) - self.assertIsNotNone(vim_instance['vim']['tenant_id']) - self.assertIsNotNone(vim_instance['vim']['id']) - self.assertEqual(vim_instance['vim']['auth_cred']['username'], - config_data['username']) - self.assertEqual(vim_instance['vim']['auth_cred']['project_name'], - config_data['project_name']) - def get_vim(self, vim_list, vim_name): if len(vim_list.values()) == 0: assert False, "vim_list is Empty: Default VIM is missing" diff --git a/tacker/tests/functional/nfvo/test_vim.py b/tacker/tests/functional/nfvo/test_vim.py index 826bf343d..05fa43c45 100644 --- a/tacker/tests/functional/nfvo/test_vim.py +++ b/tacker/tests/functional/nfvo/test_vim.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. + from tacker.tests.functional import base from tacker.tests.utils import read_file @@ -19,15 +20,15 @@ import yaml class VimTestCreate(base.BaseTackerTest): - def _test_create_delete_vim(self, vim_file, name, - description, vim_type): - data = dict() + def _test_create_delete_vim(self, vim_file, name, description, vim_type, + version=None): data = yaml.load(read_file(vim_file)) password = data['password'] username = data['username'] project_name = data['project_name'] auth_url = data['auth_url'] + vim_arg = {'vim': {'name': name, 'description': description, 'type': vim_type, 'auth_url': auth_url, @@ -36,24 +37,57 @@ class VimTestCreate(base.BaseTackerTest): 'vim_project': {'name': project_name}}} # Register vim - vim_instance = self.client.create_vim(vim_arg) - vim_id = vim_instance['vim']['id'] - self.verify_vim(vim_instance, data, name, description) + vim_res = self.client.create_vim(vim_arg) + vim_obj = vim_res['vim'] + vim_id = vim_obj['id'] + self.verify_vim(vim_obj, data, name, description, version) # Read vim - vim_instance_show = self.client.show_vim(vim_id) - self.verify_vim(vim_instance_show, data, name, description) + vim_show_res = self.client.show_vim(vim_id) + self.verify_vim(vim_show_res['vim'], data, name, description, version) # Delete vim try: self.client.delete_vim(vim_id) except Exception: - assert False, ("Failed to delete vim %s" % - vim_id) + self.assertFalse(True, "Failed to delete vim %s" % vim_id) + + def verify_vim(self, vim_instance, config_data, name, description, + version): + expected_regions = ['RegionOne'] + self.assertIsNotNone(vim_instance) + self.assertEqual(vim_instance['description'], description) + self.assertEqual(vim_instance['name'], name) + self.assertIsNotNone(vim_instance['tenant_id']) + self.assertIsNotNone(vim_instance['id']) + self.assertEqual(vim_instance['auth_cred']['username'], + config_data['username']) + self.assertEqual(vim_instance['placement_attr']['regions'], + expected_regions) + if version: + method_name = 'verify_vim_' + version + getattr(self, method_name)(vim_instance, config_data) + + def verify_vim_v2(self, vim_instance, config_data): + self.assertEqual(vim_instance['auth_cred']['tenant_name'], + config_data['project_name']) + + def verify_vim_v3(self, vim_instance, config_data): + self.assertEqual(vim_instance['auth_cred']['project_name'], + config_data['project_name']) def test_create_delete_local_vim(self): name = 'Default vim' description = 'Local vim description' vim_type = 'openstack' - self._test_create_delete_vim( - 'local-vim.yaml', name, description, vim_type) + ks_version = 'v3' + self._test_create_delete_vim('local-vim.yaml', name, description, + vim_type, ks_version) + + def test_create_delete_local_vim_keystone_v2(self): + name = 'Openstack' + description = 'OpenStack VIM with keystone v2' + vim_type = 'openstack' + ks_version = 'v2' + self._test_create_delete_vim('vim-config-ks-v2.yaml', name, + description, vim_type, ks_version)