From a1d152e737c1fcfabbc576a38b4a97dbe5eae86d Mon Sep 17 00:00:00 2001 From: David Ames Date: Mon, 17 Sep 2018 14:57:55 +0000 Subject: [PATCH] Fix get_project_id --- .../test_zaza_utilities_openstack.py | 44 +++++++++++++++++++ zaza/configure/network.py | 5 ++- zaza/utilities/openstack.py | 28 +++++++----- 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/unit_tests/utilities/test_zaza_utilities_openstack.py b/unit_tests/utilities/test_zaza_utilities_openstack.py index b6a156f..6e5cee4 100644 --- a/unit_tests/utilities/test_zaza_utilities_openstack.py +++ b/unit_tests/utilities/test_zaza_utilities_openstack.py @@ -744,3 +744,47 @@ class TestOpenStackUtils(ut_utils.BaseTestCase): xenial_mitaka = openstack_utils.get_os_release('xenial_mitaka') release_comp = xenial_queens > xenial_mitaka self.assertTrue(release_comp) + + def test_get_keystone_api_version(self): + self.patch_object(openstack_utils, "get_current_os_versions") + self.patch_object(openstack_utils, "get_application_config_option") + + self.get_current_os_versions.return_value = {"keystone": "liberty"} + self.get_application_config_option.return_value = None + self.assertEqual(openstack_utils.get_keystone_api_version(), 2) + + self.get_application_config_option.return_value = "3" + self.assertEqual(openstack_utils.get_keystone_api_version(), 3) + + self.get_current_os_versions.return_value = {"keystone": "queens"} + self.get_application_config_option.return_value = None + self.assertEqual(openstack_utils.get_keystone_api_version(), 3) + + def test_get_project_id(self): + # No domain + self.patch_object(openstack_utils, "get_keystone_api_version") + self.get_keystone_api_version.return_value = 2 + ksclient = mock.MagicMock() + project_id = "project-uuid" + project_name = "myproject" + project = mock.MagicMock() + project._info = {"name": project_name, "id": project_id} + ksclient.projects.list.return_value = [project] + self.assertEqual( + openstack_utils.get_project_id(ksclient, project_name), + project_id) + ksclient.projects.list.assert_called_once_with(domain=None) + ksclient.domains.list.assert_not_called() + + # With domain + ksclient.reset_mock() + domain_name = "mydomain" + domain_id = "domain-uuid" + domain = mock.MagicMock() + domain.id = domain_id + ksclient.domains.list.return_value = [domain] + self.assertEqual( + openstack_utils.get_project_id( + ksclient, project_name, domain_name=domain_name), project_id) + ksclient.domains.list.assert_called_once_with(name=domain_name) + ksclient.projects.list.assert_called_once_with(domain=domain_id) diff --git a/zaza/configure/network.py b/zaza/configure/network.py index 0b10b56..93c6f27 100755 --- a/zaza/configure/network.py +++ b/zaza/configure/network.py @@ -110,11 +110,14 @@ def setup_sdn(network_config, keystone_session=None): neutron_client = openstack_utils.get_neutron_session_client( keystone_session) + admin_domain = None + if openstack_utils.get_keystone_api_version() > 2: + admin_domain = "admin_domain" # Resolve the project name from the overcloud openrc into a project id project_id = openstack_utils.get_project_id( keystone_client, "admin", - domain_name="admin_domain", + domain_name=admin_domain, ) # Network Setup subnetpools = False diff --git a/zaza/utilities/openstack.py b/zaza/utilities/openstack.py index 2785305..adf9f49 100644 --- a/zaza/utilities/openstack.py +++ b/zaza/utilities/openstack.py @@ -1287,6 +1287,23 @@ def get_keystone_ip(): return unit.public_address +def get_keystone_api_version(): + """Return the keystone api version. + + :returns: Keystone's api version + :rtype: int + """ + os_version = get_current_os_versions('keystone')['keystone'] + api_version = get_application_config_option('keystone', + 'preferred-api-version') + if os_version >= 'queens': + api_version = 3 + elif api_version is None: + api_version = 2 + + return int(api_version) + + def get_overcloud_auth(address=None): """Get overcloud OpenStack authentication from the environment. @@ -1306,18 +1323,9 @@ def get_overcloud_auth(address=None): if not address: address = get_keystone_ip() - os_version = get_current_os_versions('keystone')['keystone'] - - api_version = get_application_config_option('keystone', - 'preferred-api-version') - if os_version >= 'queens': - api_version = 3 - elif api_version is None: - api_version = 2 - password = juju_utils.leader_get('keystone', 'admin_passwd') - if api_version == 2: + if get_keystone_api_version() == 2: # V2 Explicitly, or None when charm does not possess the config key logging.info('Using keystone API V2 for overcloud auth') auth_settings = {