Merge "Use cached keystone client in add subcloud workflow"
This commit is contained in:
commit
bd743b62b7
@ -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"""
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user