Merge "Refactor get_manager_for_store in an OO manner"

This commit is contained in:
Jenkins 2016-10-17 17:37:35 +00:00 committed by Gerrit Code Review
commit 9b63cb5d00
2 changed files with 43 additions and 46 deletions

View File

@ -775,8 +775,8 @@ class BaseStore(driver.Store):
# initialize manager to receive valid connections
allow_retry = \
self.conf.glance_store.swift_store_retry_get_count > 0
with get_manager_for_store(self, location, context,
allow_reauth=allow_retry) as manager:
with self.get_manager(location, context,
allow_reauth=allow_retry) as manager:
(resp_headers, resp_body) = self._get_object(location,
manager=manager)
@ -832,8 +832,8 @@ class BaseStore(driver.Store):
# initialize a manager with re-auth if image need to be splitted
need_chunks = (image_size == 0) or (
image_size >= self.large_object_size)
with get_manager_for_store(self, location, context,
allow_reauth=need_chunks) as manager:
with self.get_manager(location, context,
allow_reauth=need_chunks) as manager:
self._create_container_if_missing(location.container,
manager.get_connection())
@ -1093,6 +1093,23 @@ class BaseStore(driver.Store):
ssl_compression=self.ssl_compression,
cacert=self.cacert)
def get_manager(self, store_location, context=None, allow_reauth=False):
"""Return appropriate connection manager for store
The method detects store type (singletenant or multitenant) and returns
appropriate connection manager (singletenant or multitenant) that
allows to request swiftclient connections.
:param store_location: StoreLocation object that define image location
:param context: user context
:param allow_reauth: defines if we allow re-authentication when user
token is expired and refresh swift connection
:return: connection manager for store
"""
msg = _("There is no Connection Manager implemented for %s class.")
raise NotImplementedError(msg % self.__class__.__name__)
class SingleTenantStore(BaseStore):
EXAMPLE_URL = "swift://<USER>:<KEY>@<AUTH_ADDRESS>/<CONTAINER>/<FILE>"
@ -1263,6 +1280,12 @@ class SingleTenantStore(BaseStore):
return ks_client.Client(session=sess)
def get_manager(self, store_location, context=None, allow_reauth=False):
return connection_manager.SingleTenantConnectionManager(self,
store_location,
context,
allow_reauth)
class MultiTenantStore(BaseStore):
EXAMPLE_URL = "swift://<SWIFT_URL>/<CONTAINER>/<FILE>"
@ -1426,6 +1449,17 @@ class MultiTenantStore(BaseStore):
client_sess = ks_session.Session(auth=client_password)
return ks_client.Client(session=client_sess)
def get_manager(self, store_location, context=None, allow_reauth=False):
# if global toggle is turned off then do not allow re-authentication
# with trusts
if not self.conf.glance_store.swift_store_use_trusts:
allow_reauth = False
return connection_manager.MultiTenantConnectionManager(self,
store_location,
context,
allow_reauth)
class ChunkReader(object):
def __init__(self, fd, checksum, total, verifier=None):
@ -1456,34 +1490,3 @@ class ChunkReader(object):
if self.verifier:
self.verifier.update(result)
return result
def get_manager_for_store(store, store_location,
context=None,
allow_reauth=False):
"""Return appropriate connection manager for store
The method detects store type (singletenant or multitenant) and returns
appropriate connection manager (singletenant or multitenant) that allows
to request swiftclient connections.
:param store: store that needs swift connections
:param store_location: StoreLocation object that define image location
:param context: user context
:param allow_reauth: defines if we allow re-authentication when user token
is expired and refresh swift connection
:return: connection manager for store
"""
if store.__class__ == SingleTenantStore:
return connection_manager.SingleTenantConnectionManager(
store, store_location, context, allow_reauth)
elif store.__class__ == MultiTenantStore:
# if global toggle is turned off then do not allow re-authentication
# with trusts
if not store.conf.glance_store.swift_store_use_trusts:
allow_reauth = False
return connection_manager.MultiTenantConnectionManager(
store, store_location, context, allow_reauth)
else:
raise NotImplementedError(_("There is no Connection Manager "
"implemented for %s class.") %
store.__class__.__name__)

View File

@ -292,8 +292,7 @@ class SwiftTests(object):
resp_full = b''.join([chunk for chunk in image_swift.wrapped])
resp_half = resp_full[:len(resp_full) // 2]
resp_half = six.BytesIO(resp_half)
manager = swift.get_manager_for_store(self.store, loc.store_location,
ctxt)
manager = self.store.get_manager(loc.store_location, ctxt)
image_swift.wrapped = swift.swift_retry_iter(resp_half, image_size,
self.store,
@ -1108,9 +1107,7 @@ class SwiftTests(object):
store = Store(self.conf)
store.configure()
loc = mock.MagicMock()
swift.get_manager_for_store(store, loc)
self.assertEqual(swift.get_manager_for_store(store, loc),
manager)
self.assertEqual(store.get_manager(loc), manager)
@mock.patch("glance_store._drivers.swift."
"connection_manager.SingleTenantConnectionManager")
@ -1120,15 +1117,12 @@ class SwiftTests(object):
store = Store(self.conf)
store.configure()
loc = mock.MagicMock()
swift.get_manager_for_store(store, loc)
self.assertEqual(swift.get_manager_for_store(store, loc),
manager)
self.assertEqual(store.get_manager(loc), manager)
def test_get_connection_manager_failed(self):
store = mock.MagicMock()
store = swift.BaseStore(mock.MagicMock())
loc = mock.MagicMock()
self.assertRaises(NotImplementedError, swift.get_manager_for_store,
store, loc)
self.assertRaises(NotImplementedError, store.get_manager, loc)
@mock.patch("glance_store._drivers.swift.store.ks_v3")
@mock.patch("glance_store._drivers.swift.store.ks_session")