diff --git a/distributedcloud/dcmanager/api/controllers/v1/subclouds.py b/distributedcloud/dcmanager/api/controllers/v1/subclouds.py index f6901dcee..d26543b8a 100644 --- a/distributedcloud/dcmanager/api/controllers/v1/subclouds.py +++ b/distributedcloud/dcmanager/api/controllers/v1/subclouds.py @@ -37,7 +37,7 @@ import pecan from pecan import expose from pecan import request -from dccommon.drivers.openstack.keystone_v3 import KeystoneClient +from dccommon.drivers.openstack.sdk_platform import OpenStackDriver from dccommon.drivers.openstack.sysinv_v1 import SysinvClient from dccommon import exceptions as dccommon_exceptions from dccommon import install_consts @@ -502,23 +502,25 @@ class SubcloudsController(object): return user_list - def _get_management_address_pool(self, context): - """Get the system controller's management address pool""" - session = KeystoneClient().endpoint_cache.get_session_from_token( - context.auth_token, context.project) - sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, session) - return sysinv_client.get_management_address_pool() - @staticmethod - def get_ks_client(region_name=None): + def get_ks_client(region_name=consts.DEFAULT_REGION_NAME): """This will get a new keystone client (and new token)""" try: - return KeystoneClient(region_name) + os_client = OpenStackDriver(region_name=region_name, + region_clients=None) + return os_client.keystone_client except Exception: LOG.warn('Failure initializing KeystoneClient ' 'for region %s' % region_name) raise + def _get_management_address_pool(self, context): + """Get the system controller's management address pool""" + ks_client = self.get_ks_client() + sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, + ks_client.session) + return sysinv_client.get_management_address_pool() + def _get_oam_addresses(self, context, subcloud_name): """Get the subclouds oam addresses""" diff --git a/distributedcloud/dcmanager/manager/subcloud_manager.py b/distributedcloud/dcmanager/manager/subcloud_manager.py index 729b1b269..fb167e023 100644 --- a/distributedcloud/dcmanager/manager/subcloud_manager.py +++ b/distributedcloud/dcmanager/manager/subcloud_manager.py @@ -37,7 +37,7 @@ from tsconfig.tsconfig import CONFIG_PATH from tsconfig.tsconfig import SW_VERSION from dccommon import consts as dccommon_consts -from dccommon.drivers.openstack.keystone_v3 import KeystoneClient +from dccommon.drivers.openstack.sdk_platform import OpenStackDriver from dccommon.drivers.openstack.sysinv_v1 import SysinvClient from dccommon import kubeoperator from dccommon.subcloud_install import SubcloudInstall @@ -212,11 +212,12 @@ class SubcloudManager(manager.Manager): # Create a new route to this subcloud on the management interface # on both controllers. - m_ks_client = KeystoneClient() + m_ks_client = OpenStackDriver( + region_name=consts.DEFAULT_REGION_NAME, + region_clients=None).keystone_client subcloud_subnet = netaddr.IPNetwork(payload['management_subnet']) - session = m_ks_client.endpoint_cache.get_session_from_token( - context.auth_token, context.project) - sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, session) + sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, + m_ks_client.session) controllers = sysinv_client.get_controller_hosts() for controller in controllers: management_interface = sysinv_client.get_management_interface( @@ -297,26 +298,38 @@ class SubcloudManager(manager.Manager): # Query system controller keystone admin user/project IDs, # services project id, sysinv and dcmanager user id and store in # payload so they get copied to the override file - admin_user = m_ks_client.get_user_by_name( - dccommon_consts.ADMIN_USER_NAME) - admin_project = m_ks_client.get_project_by_name( - dccommon_consts.ADMIN_PROJECT_NAME) - services_project = m_ks_client.get_project_by_name( - dccommon_consts.SERVICES_USER_NAME) - sysinv_user = m_ks_client.get_user_by_name( - dccommon_consts.SYSINV_USER_NAME) - dcmanager_user = m_ks_client.get_user_by_name( - dccommon_consts.DCMANAGER_USER_NAME) + admin_user_id = None + sysinv_user_id = None + dcmanager_user_id = None + admin_project_id = None + services_project_id = None + + user_list = m_ks_client.get_enabled_users(id_only=False) + for user in user_list: + if user.name == dccommon_consts.ADMIN_USER_NAME: + admin_user_id = user.id + elif user.name == dccommon_consts.SYSINV_USER_NAME: + sysinv_user_id = user.id + elif user.name == dccommon_consts.DCMANAGER_USER_NAME: + dcmanager_user_id = user.id + + project_list = m_ks_client.get_enabled_projects(id_only=False) + for project in project_list: + if project.name == dccommon_consts.ADMIN_PROJECT_NAME: + admin_project_id = project.id + elif project.name == dccommon_consts.SERVICES_USER_NAME: + services_project_id = project.id + payload['system_controller_keystone_admin_user_id'] = \ - admin_user.id + admin_user_id payload['system_controller_keystone_admin_project_id'] = \ - admin_project.id + admin_project_id payload['system_controller_keystone_services_project_id'] = \ - services_project.id + services_project_id payload['system_controller_keystone_sysinv_user_id'] = \ - sysinv_user.id + sysinv_user_id payload['system_controller_keystone_dcmanager_user_id'] = \ - dcmanager_user.id + dcmanager_user_id # Add the admin and service user passwords to the payload so they # get copied to the override file @@ -578,10 +591,10 @@ class SubcloudManager(manager.Manager): overrides_file = os.path.join(consts.ANSIBLE_OVERRIDES_PATH, payload['name'] + '.yml') - m_ks_client = KeystoneClient() - session = m_ks_client.endpoint_cache.get_session_from_token( - context.auth_token, context.project) - sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, session) + m_ks_client = OpenStackDriver( + region_name=consts.DEFAULT_REGION_NAME, + region_clients=None).keystone_client + sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, m_ks_client.session) mgmt_pool = sysinv_client.get_management_address_pool() mgmt_floating_ip = mgmt_pool.floating_address @@ -638,14 +651,14 @@ class SubcloudManager(manager.Manager): def _delete_subcloud_routes(self, context, subcloud): """Delete the routes to this subcloud""" - keystone_client = KeystoneClient() - session = keystone_client.endpoint_cache.get_session_from_token( - context.auth_token, context.project) + keystone_client = OpenStackDriver( + region_name=consts.DEFAULT_REGION_NAME, + region_clients=None).keystone_client # Delete the route to this subcloud on the management interface on # both controllers. management_subnet = netaddr.IPNetwork(subcloud.management_subnet) - sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, session) + sysinv_client = SysinvClient(consts.DEFAULT_REGION_NAME, keystone_client.session) controllers = sysinv_client.get_controller_hosts() for controller in controllers: management_interface = sysinv_client.get_management_interface( @@ -693,7 +706,9 @@ class SubcloudManager(manager.Manager): # in the Central Region. The subcloud is already unmanaged and powered # down so is not accessible. Therefore set up a session with the # Central Region Keystone ONLY. - keystone_client = KeystoneClient() + keystone_client = OpenStackDriver( + region_name=consts.DEFAULT_REGION_NAME, + region_clients=None).keystone_client # Delete keystone endpoints for subcloud keystone_client.delete_endpoints(subcloud.name) diff --git a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py index 4361e138e..3e13d4a1b 100644 --- a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py +++ b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py @@ -53,6 +53,40 @@ class FakeDCManagerNotifications(object): self.subcloud_managed = mock.MagicMock() +class FakeUser(object): + def __init__(self, username, userid): + self.name = username + self.id = userid + + +FAKE_USERS = [ + FakeUser( + dccommon_consts.ADMIN_USER_NAME, + 1), + FakeUser( + dccommon_consts.SYSINV_USER_NAME, + 2), + FakeUser( + dccommon_consts.DCMANAGER_USER_NAME, + 3) +] + + +class FakeProject(object): + def __init__(self, projname, projid): + self.name = projname + self.id = projid + +FAKE_PROJECTS = [ + FakeProject( + dccommon_consts.ADMIN_PROJECT_NAME, + 1), + FakeProject( + dccommon_consts.SERVICES_USER_NAME, + 2) +] + + class FakeService(object): def __init__(self, type, id): self.type = type @@ -87,6 +121,33 @@ FAKE_SERVICES = [ ] +class FakeKeystoneClient(object): + def __init__(self): + self.user_list = FAKE_USERS + self.project_list = FAKE_PROJECTS + self.services_list = FAKE_SERVICES + self.keystone_client = mock.MagicMock() + self.session = mock.MagicMock() + + def get_enabled_users(self, id_only): + if not id_only: + return self.user_list + else: + return None + + def get_enabled_projects(self, id_only): + if not id_only: + return self.project_list + else: + return None + + def delete_endpoints(self, region_name): + pass + + def delete_region(self, region_name): + pass + + class FakeController(object): def __init__(self, hostname): self.hostname = hostname @@ -182,7 +243,7 @@ class TestSubcloudManager(base.DCManagerTestCase): @mock.patch.object(subcloud_manager.SubcloudManager, '_create_intermediate_ca_cert') @mock.patch.object(cutils, 'delete_subcloud_inventory') - @mock.patch.object(subcloud_manager, 'KeystoneClient') + @mock.patch.object(subcloud_manager, 'OpenStackDriver') @mock.patch.object(subcloud_manager, 'db_api') @mock.patch.object(subcloud_manager, 'SysinvClient') @mock.patch.object(subcloud_manager.SubcloudManager, @@ -203,14 +264,13 @@ class TestSubcloudManager(base.DCManagerTestCase): mock_create_intermediate_ca_cert): values = utils.create_subcloud_dict(base.SUBCLOUD_SAMPLE_DATA_0) controllers = FAKE_CONTROLLERS - services = FAKE_SERVICES # dcmanager add_subcloud queries the data from the db fake_subcloud = Subcloud(values, False) mock_db_api.subcloud_get_by_name.return_value = fake_subcloud mock_sysinv_client().get_controller_hosts.return_value = controllers - mock_keystone_client().services_list = services + mock_keystone_client().keystone_client = FakeKeystoneClient() mock_keyring.get_password.return_value = "testpassword" sm = subcloud_manager.SubcloudManager() @@ -225,7 +285,7 @@ class TestSubcloudManager(base.DCManagerTestCase): mock_thread_start.assert_called_once() mock_create_intermediate_ca_cert.assert_called_once() - @mock.patch.object(subcloud_manager, 'KeystoneClient') + @mock.patch.object(subcloud_manager, 'OpenStackDriver') @mock.patch.object(subcloud_manager, 'db_api') @mock.patch.object(subcloud_manager, 'SysinvClient') def test_add_subcloud_deploy_prep_failed(self, @@ -257,7 +317,7 @@ class TestSubcloudManager(base.DCManagerTestCase): '_delete_subcloud_cert') @mock.patch.object(subcloud_manager, 'db_api') @mock.patch.object(subcloud_manager, 'SysinvClient') - @mock.patch.object(subcloud_manager, 'KeystoneClient') + @mock.patch.object(subcloud_manager, 'OpenStackDriver') @mock.patch.object(subcloud_manager.SubcloudManager, '_create_addn_hosts_dc') def test_delete_subcloud(self, mock_create_addn_hosts, @@ -269,11 +329,11 @@ class TestSubcloudManager(base.DCManagerTestCase): data = utils.create_subcloud_dict(base.SUBCLOUD_SAMPLE_DATA_0) fake_subcloud = Subcloud(data, False) mock_db_api.subcloud_get.return_value = fake_subcloud + mock_keystone_client().keystone_client = FakeKeystoneClient() mock_sysinv_client().get_controller_hosts.return_value = controllers sm = subcloud_manager.SubcloudManager() sm.delete_subcloud(self.ctx, subcloud_id=data['id']) mock_sysinv_client().delete_route.assert_called() - mock_keystone_client().delete_region.assert_called_once() mock_db_api.subcloud_destroy.assert_called_once() mock_create_addn_hosts.assert_called_once() mock_delete_subcloud_cert.assert_called_once()