Update OSDriver to read admin creds from conf

Earlier OpenStackDriver used to query context object for
admin credentails, Now it is modified to read from config file
as we allow regular tenants also to have context and these tenants
can also send request to KB.

Blueprint: https://blueprints.launchpad.net/kingbird/+spec/kingbird-openstack-driver
Change-Id: I017fc3b9cf35ebd135c0d8e2bc040679cb0577a1
This commit is contained in:
Ashish Singh 2016-01-18 16:28:55 +05:30
parent e7b660414f
commit a14da0d86f
10 changed files with 109 additions and 35 deletions

View File

@ -21,11 +21,12 @@ LOG = log.getLogger(__name__)
class CinderClient(base.DriverBase):
'''Cinder V2 driver.'''
def __init__(self, context, region=None, token=None):
region = region if region else context.region
def __init__(self, region, **kwargs):
self.cinder_client = ci_client.Client(
auth_url=context.auth_url, username=context.user_name,
api_key=context.password, tenant_id=context.tenant_id,
auth_url=kwargs['auth_url'],
username=kwargs['user_name'],
api_key=kwargs['password'],
tenant_id=kwargs['tenant_id'],
region_name=region)
def get_resource_usages(self, project_id):

View File

@ -29,11 +29,12 @@ importutils.import_module('keystonemiddleware.auth_token')
class KeystoneClient(base.DriverBase):
'''Keystone V3 driver.'''
def __init__(self, context):
auth = v3.Password(auth_url=context.auth_url,
username=context.user_name,
password=context.password,
project_name=context.project_name)
def __init__(self, **kwargs):
auth = v3.Password(
auth_url=kwargs['auth_url'],
username=kwargs['user_name'],
password=kwargs['password'],
project_name=kwargs['tenant_name'])
sess = session.Session(auth=auth)
self.keystone_client = client.Client(session=sess)

View File

@ -22,11 +22,13 @@ API_VERSION = '2.0'
class NeutronClient(base.DriverBase):
'''Neutron V2 driver.'''
def __init__(self, context, region=None, token=None):
region = region if region else context.region
def __init__(self, region, **kwargs):
self.neutron_client = client.Client(
API_VERSION, username=context.user_name, password=context.password,
tenant_name=context.tenant_name, auth_url=context.auth_url,
API_VERSION,
username=kwargs['user_name'],
password=kwargs['password'],
tenant_name=kwargs['tenant_name'],
auth_url=kwargs['auth_url'],
region_name=region)
def get_resource_usages(self, project_id):

View File

@ -22,11 +22,11 @@ API_VERSION = '2.1'
class NovaClient(base.DriverBase):
'''Nova V2.1 driver.'''
def __init__(self, context, region=None, token=None):
region = region if region else context.region
def __init__(self, region, **kwargs):
self.nova_client = nv_client.Client(
API_VERSION, context.user_name, context.password,
context.tenant_name, context.auth_url, region_name=region)
API_VERSION, kwargs['user_name'],
kwargs['password'], kwargs['tenant_name'],
kwargs['auth_url'], region_name=region)
def get_resource_usages(self, project_id):
'''Calcualte resources usage and return the dict'''

View File

@ -27,14 +27,48 @@ from kingbird.drivers.openstack.keystone_v3 import KeystoneClient
from kingbird.drivers.openstack.neutron_v2 import NeutronClient
from kingbird.drivers.openstack.nova_v2 import NovaClient
from oslo_config import cfg
LOG = log.getLogger(__name__)
admin_creds_opts = [
cfg.StrOpt('auth_url',
default='http://127.0.0.1:5000/v3',
help='keystone authorization url'),
cfg.StrOpt('identity_url',
default='http://127.0.0.1:35357/v3',
help='keystone service url'),
cfg.StrOpt('admin_username',
help='username of admin account, needed when'
' auto_refresh_endpoint set to True'),
cfg.StrOpt('admin_password',
help='password of admin account, needed when'
' auto_refresh_endpoint set to True'),
cfg.StrOpt('admin_tenant',
help='tenant name of admin account, needed when'
' auto_refresh_endpoint set to True'),
cfg.StrOpt('admin_tenant_id',
help='tenant name of admin account, needed when'
' auto_refresh_endpoint set to True'),
cfg.StrOpt('admin_user_domain_name',
default='Default',
help='user domain name of admin account, needed when'
' auto_refresh_endpoint set to True'),
cfg.StrOpt('admin_tenant_domain_name',
default='Default',
help='tenant domain name of admin account, needed when'
' auto_refresh_endpoint set to True')
]
admin_creds_opt_group = cfg.OptGroup('admin_creds')
cfg.CONF.register_group(admin_creds_opt_group)
cfg.CONF.register_opts(admin_creds_opts, group=admin_creds_opt_group)
class OpenStackDriver(object):
os_clients_dict = collections.defaultdict(dict)
def __init__(self, ctx, region_name=None, token=None):
def __init__(self, region_name):
# Check if objects are cached and try to use those
self.region_name = region_name
if region_name in OpenStackDriver.os_clients_dict:
@ -48,9 +82,16 @@ class OpenStackDriver(object):
else:
# Create new objects and cache them
LOG.debug(_("Creating fresh OS Clients objects"))
self.nova_client = NovaClient(ctx, region_name, token)
self.cinder_client = CinderClient(ctx, region_name, token)
self.neutron_client = NeutronClient(ctx, region_name, token)
admin_kwargs = {
'user_name': cfg.CONF.admin_creds.admin_username,
'password': cfg.CONF.admin_creds.admin_password,
'tenant_name': cfg.CONF.admin_creds.admin_tenant,
'auth_url': cfg.CONF.admin_creds.auth_url,
'tenant_id': cfg.CONF.admin_creds.admin_tenant_id
}
self.nova_client = NovaClient(region_name, **admin_kwargs)
self.cinder_client = CinderClient(region_name, **admin_kwargs)
self.neutron_client = NeutronClient(region_name, **admin_kwargs)
OpenStackDriver.os_clients_dict[
region_name] = collections.defaultdict(dict)
OpenStackDriver.os_clients_dict[region_name][
@ -62,7 +103,7 @@ class OpenStackDriver(object):
if 'keystone' in OpenStackDriver.os_clients_dict:
self.keystone_client = OpenStackDriver.os_clients_dict['keystone']
else:
self.keystone_client = KeystoneClient(ctx)
self.keystone_client = KeystoneClient(**admin_kwargs)
OpenStackDriver.os_clients_dict['keystone'] = self.keystone_client
def get_enabled_projects(self):

View File

@ -16,6 +16,13 @@ from kingbird.drivers.openstack import cinder_v2
from kingbird.tests import base
from kingbird.tests import utils
FAKE_ADMIN_CREDS = {
'user_name': 'fake_user',
'password': 'pass1234',
'tenant_id': '392847',
'auth_url': 'http://127.0.0.1:5000/v3'
}
class TestCinderClient(base.KingbirdTestCase):
def setUp(self):
@ -23,7 +30,7 @@ class TestCinderClient(base.KingbirdTestCase):
self.ctx = utils.dummy_context()
def test_init(self):
ci_client = cinder_v2.CinderClient(self.ctx, 'fake_region')
ci_client = cinder_v2.CinderClient('fake_region', **FAKE_ADMIN_CREDS)
self.assertIsNotNone(ci_client)
self.assertIsInstance(ci_client.cinder_client,
cinderclient.v2.client.Client)

View File

@ -18,6 +18,13 @@ from kingbird.drivers.openstack import keystone_v3
from kingbird.tests import base
from kingbird.tests import utils
FAKE_ADMIN_CREDS = {
'user_name': 'fake_user',
'password': 'pass1234',
'tenant_name': 'test_tenant',
'auth_url': 'http://127.0.0.1:5000/v3'
}
class TestKeystoneClient(base.KingbirdTestCase):
def setUp(self):
@ -25,7 +32,7 @@ class TestKeystoneClient(base.KingbirdTestCase):
self.ctx = utils.dummy_context()
def test_init(self):
key_client = keystone_v3.KeystoneClient(self.ctx)
key_client = keystone_v3.KeystoneClient(**FAKE_ADMIN_CREDS)
self.assertIsNotNone(key_client.keystone_client)
self.assertIsInstance(key_client.keystone_client,
keystoneclient.v3.client.Client)

View File

@ -16,6 +16,13 @@ from kingbird.drivers.openstack import neutron_v2
from kingbird.tests import base
from kingbird.tests import utils
FAKE_ADMIN_CREDS = {
'user_name': 'fake_user',
'password': 'pass1234',
'tenant_name': 'test_tenant',
'auth_url': 'http://127.0.0.1:5000/v3'
}
class TestNeutronClient(base.KingbirdTestCase):
def setUp(self):
@ -23,7 +30,8 @@ class TestNeutronClient(base.KingbirdTestCase):
self.ctx = utils.dummy_context()
def test_init(self):
neutron_client = neutron_v2.NeutronClient(self.ctx, 'fake_region')
neutron_client = neutron_v2.NeutronClient('fake_region',
**FAKE_ADMIN_CREDS)
self.assertIsNotNone(neutron_client)
self.assertIsInstance(neutron_client.neutron_client,
neutronclient.v2_0.client.Client)

View File

@ -16,6 +16,13 @@ from kingbird.drivers.openstack import nova_v2
from kingbird.tests import base
from kingbird.tests import utils
FAKE_ADMIN_CREDS = {
'user_name': 'fake_user',
'password': 'pass1234',
'tenant_name': 'test_tenant',
'auth_url': 'http://127.0.0.1:5000/v3'
}
class TestNovaClient(base.KingbirdTestCase):
def setUp(self):
@ -23,7 +30,7 @@ class TestNovaClient(base.KingbirdTestCase):
self.ctx = utils.dummy_context()
def test_init(self):
nv_client = nova_v2.NovaClient(self.ctx, 'fake_region')
nv_client = nova_v2.NovaClient('fake_region', **FAKE_ADMIN_CREDS)
self.assertIsNotNone(nv_client)
self.assertIsInstance(nv_client.nova_client,
novaclient.v2.client.Client)

View File

@ -33,7 +33,7 @@ class TestOpenStackDriver(base.KingbirdTestCase):
@mock.patch.object(sdk, 'KeystoneClient')
def test_init(self, mock_keystone_client, mock_cinder_client,
mock_neutron_client, mock_nova_client):
os_driver = sdk.OpenStackDriver(self.context, 'fake_region_1', None)
os_driver = sdk.OpenStackDriver('fake_region_1')
self.assertIsNotNone(os_driver.neutron_client)
self.assertIsNotNone(os_driver.nova_client)
self.assertIsNotNone(os_driver.keystone_client)
@ -47,7 +47,7 @@ class TestOpenStackDriver(base.KingbirdTestCase):
mock_cinder_client, mock_neutron_client,
mock_nova_client):
project_id = 'fake_project'
os_driver = sdk.OpenStackDriver(self.context, 'fake_region_2')
os_driver = sdk.OpenStackDriver('fake_region_2')
total_quotas = os_driver.get_resource_usages(project_id)
mock_nova_client().get_resource_usages.assert_called_once_with(
project_id)
@ -69,7 +69,7 @@ class TestOpenStackDriver(base.KingbirdTestCase):
write_limits['nova'] = {'ram': 1222, 'vcpus': 10, 'instances': 7}
write_limits['cinder'] = {'disk': 1222}
write_limits['neutron'] = {'network': 10, 'subnet': 10}
os_driver = sdk.OpenStackDriver(self.context, 'fake_region_3')
os_driver = sdk.OpenStackDriver('fake_region_3')
os_driver.write_quota_limits(project_id, write_limits)
mock_nova_client(
).update_quota_limits.assert_called_once_with(project_id,
@ -89,7 +89,7 @@ class TestOpenStackDriver(base.KingbirdTestCase):
mock_network_client, mock_nova_client,
mock_keystone_client):
project_id = 'fake_project'
os_driver = sdk.OpenStackDriver(self.context, 'fake_region_4', None)
os_driver = sdk.OpenStackDriver('fake_region_4')
os_driver.delete_quota_limits(project_id)
mock_nova_client().delete_quota_limits.assert_called_once_with(
project_id)
@ -106,7 +106,7 @@ class TestOpenStackDriver(base.KingbirdTestCase):
mock_network_client, mock_nova_client,
mock_keystone_client):
input_project_list = ['project_1', 'project_2', 'project_3']
os_driver = sdk.OpenStackDriver(self.context, 'fake_region_5', None)
os_driver = sdk.OpenStackDriver('fake_region_5')
os_driver.keystone_client.get_enabled_projects.return_value = \
input_project_list
output_project_list = os_driver.get_enabled_projects()
@ -119,10 +119,10 @@ class TestOpenStackDriver(base.KingbirdTestCase):
def test_cache_os_clients(self, mock_cinder_client,
mock_network_client, mock_nova_client,
mock_keystone_client):
os_driver_1 = sdk.OpenStackDriver(self.context, 'RegionOne', None)
os_driver_2 = sdk.OpenStackDriver(self.context, 'RegionTwo', None)
os_driver_3 = sdk.OpenStackDriver(self.context, 'RegionOne', None)
os_driver_4 = sdk.OpenStackDriver(self.context, 'RegionTwo', None)
os_driver_1 = sdk.OpenStackDriver('RegionOne')
os_driver_2 = sdk.OpenStackDriver('RegionTwo')
os_driver_3 = sdk.OpenStackDriver('RegionOne')
os_driver_4 = sdk.OpenStackDriver('RegionTwo')
# assert equal for same region clients objects to test caching
self.assertEqual(os_driver_1.nova_client, os_driver_3.nova_client)
self.assertEqual(os_driver_1.cinder_client, os_driver_3.cinder_client)