diff --git a/sahara/service/sessions.py b/sahara/service/sessions.py index 10824c71..3400e7d9 100644 --- a/sahara/service/sessions.py +++ b/sahara/service/sessions.py @@ -27,6 +27,7 @@ LOG = logging.getLogger(__name__) _SESSION_CACHE = None +SESSION_TYPE_CINDER = 'cinder' SESSION_TYPE_GENERIC = 'generic' SESSION_TYPE_KEYSTONE = 'keystone' SESSION_TYPE_NOVA = 'nova' @@ -55,6 +56,7 @@ class SessionCache(object): '''create a new SessionCache''' self._sessions = {} self._session_funcs = { + SESSION_TYPE_CINDER: self.get_cinder_session, SESSION_TYPE_GENERIC: self.get_generic_session, SESSION_TYPE_KEYSTONE: self.get_keystone_session, SESSION_TYPE_NOVA: self.get_nova_session, @@ -89,6 +91,17 @@ class SessionCache(object): _('Session type {type} not recognized'). format(type=session_type)) + def get_cinder_session(self): + session = self._sessions.get(SESSION_TYPE_CINDER) + if not session: + if CONF.cinder.ca_file: + session = keystone.Session(cert=CONF.cinder.ca_file, + verify=CONF.cinder.api_insecure) + else: + session = self.get_generic_session() + self._set_session(SESSION_TYPE_CINDER, session) + return session + def get_generic_session(self): session = self._sessions.get(SESSION_TYPE_GENERIC) if not session: @@ -115,5 +128,5 @@ class SessionCache(object): verify=CONF.nova.api_insecure) else: session = self.get_generic_session() - self._sessions[SESSION_TYPE_NOVA] = session + self._set_session(SESSION_TYPE_NOVA, session) return session diff --git a/sahara/tests/unit/service/test_sessions.py b/sahara/tests/unit/service/test_sessions.py index 7bf8501a..8a501c4f 100644 --- a/sahara/tests/unit/service/test_sessions.py +++ b/sahara/tests/unit/service/test_sessions.py @@ -71,3 +71,23 @@ class TestSessionCache(base.SaharaTestCase): keystone_session.reset_mock() sc.get_session(sessions.SESSION_TYPE_NOVA) self.assertFalse(keystone_session.called) + + @mock.patch('keystoneclient.session.Session') + def test_get_cinder_session(self, keystone_session): + sc = sessions.SessionCache() + self.override_config('ca_file', '/some/cacert', group='cinder') + self.override_config('api_insecure', True, group='cinder') + sc.get_session(sessions.SESSION_TYPE_CINDER) + keystone_session.assert_called_once_with(cert='/some/cacert', + verify=True) + + sc = sessions.SessionCache() + keystone_session.reset_mock() + self.override_config('ca_file', None, group='cinder') + self.override_config('api_insecure', None, group='cinder') + sc.get_session(sessions.SESSION_TYPE_CINDER) + keystone_session.assert_called_once_with() + + keystone_session.reset_mock() + sc.get_session(sessions.SESSION_TYPE_CINDER) + self.assertFalse(keystone_session.called) diff --git a/sahara/tests/unit/utils/test_cinder.py b/sahara/tests/unit/utils/test_cinder.py index 7c10c003..53929fed 100644 --- a/sahara/tests/unit/utils/test_cinder.py +++ b/sahara/tests/unit/utils/test_cinder.py @@ -45,9 +45,10 @@ class TestCinder(test_base.SaharaTestCase): username=username, tenant_id=tenant_id, token=token, tenant_name=tenant_name, service_catalog=service_catalog, **kwargs) + @mock.patch('sahara.utils.openstack.keystone.auth') @mock.patch('cinderclient.v2.client.Client') @mock.patch('cinderclient.v1.client.Client') - def test_get_cinder_client_api_v1(self, patched1, patched2): + def test_get_cinder_client_api_v1(self, patched1, patched2, auth): self.override_config('api_version', 1, group='cinder') patched1.return_value = FakeCinderClient(1) patched2.return_value = FakeCinderClient(2) @@ -55,9 +56,10 @@ class TestCinder(test_base.SaharaTestCase): client = cinder.client() self.assertEqual(1, client.client.api_version) + @mock.patch('sahara.utils.openstack.keystone.auth') @mock.patch('cinderclient.v2.client.Client') @mock.patch('cinderclient.v1.client.Client') - def test_get_cinder_client_api_v2(self, patched1, patched2): + def test_get_cinder_client_api_v2(self, patched1, patched2, auth): self.override_config('api_version', 2, group='cinder') patched1.return_value = FakeCinderClient(1) patched2.return_value = FakeCinderClient(2) diff --git a/sahara/utils/openstack/cinder.py b/sahara/utils/openstack/cinder.py index a5ede039..2bfeffd4 100644 --- a/sahara/utils/openstack/cinder.py +++ b/sahara/utils/openstack/cinder.py @@ -23,7 +23,9 @@ from oslo_log import log as logging from sahara import context from sahara import exceptions as ex from sahara.i18n import _LW +from sahara.service import sessions from sahara.utils.openstack import base +from sahara.utils.openstack import keystone LOG = logging.getLogger(__name__) @@ -65,23 +67,13 @@ def validate_config(): def client(): - ctx = context.current() - args = { - 'insecure': CONF.cinder.api_insecure, - 'cacert': CONF.cinder.ca_file - } + session = sessions.cache().get_session(sessions.SESSION_TYPE_CINDER) + auth = keystone.auth() + if CONF.cinder.api_version == 1: - volume_url = base.url_for(ctx.service_catalog, 'volume') - cinder = cinder_client_v1.Client(ctx.username, ctx.auth_token, - ctx.tenant_id, volume_url, **args) + cinder = cinder_client_v1.Client(session=session, auth=auth) else: - volume_url = base.url_for(ctx.service_catalog, 'volumev2') - cinder = cinder_client_v2.Client(ctx.username, ctx.auth_token, - ctx.tenant_id, volume_url, **args) - - cinder.client.auth_token = ctx.auth_token - cinder.client.management_url = volume_url - + cinder = cinder_client_v2.Client(session=session, auth=auth) return cinder