Merge "Use cached keystone client in add subcloud workflow"

This commit is contained in:
Zuul 2020-09-28 21:28:16 +00:00 committed by Gerrit Code Review
commit bd743b62b7
3 changed files with 122 additions and 45 deletions

View File

@ -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"""

View File

@ -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)

View File

@ -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()