Merge "Refactor get_manager_for_store in an OO manner"
This commit is contained in:
commit
9b63cb5d00
@ -775,8 +775,8 @@ class BaseStore(driver.Store):
|
|||||||
# initialize manager to receive valid connections
|
# initialize manager to receive valid connections
|
||||||
allow_retry = \
|
allow_retry = \
|
||||||
self.conf.glance_store.swift_store_retry_get_count > 0
|
self.conf.glance_store.swift_store_retry_get_count > 0
|
||||||
with get_manager_for_store(self, location, context,
|
with self.get_manager(location, context,
|
||||||
allow_reauth=allow_retry) as manager:
|
allow_reauth=allow_retry) as manager:
|
||||||
(resp_headers, resp_body) = self._get_object(location,
|
(resp_headers, resp_body) = self._get_object(location,
|
||||||
manager=manager)
|
manager=manager)
|
||||||
|
|
||||||
@ -832,8 +832,8 @@ class BaseStore(driver.Store):
|
|||||||
# initialize a manager with re-auth if image need to be splitted
|
# initialize a manager with re-auth if image need to be splitted
|
||||||
need_chunks = (image_size == 0) or (
|
need_chunks = (image_size == 0) or (
|
||||||
image_size >= self.large_object_size)
|
image_size >= self.large_object_size)
|
||||||
with get_manager_for_store(self, location, context,
|
with self.get_manager(location, context,
|
||||||
allow_reauth=need_chunks) as manager:
|
allow_reauth=need_chunks) as manager:
|
||||||
|
|
||||||
self._create_container_if_missing(location.container,
|
self._create_container_if_missing(location.container,
|
||||||
manager.get_connection())
|
manager.get_connection())
|
||||||
@ -1093,6 +1093,23 @@ class BaseStore(driver.Store):
|
|||||||
ssl_compression=self.ssl_compression,
|
ssl_compression=self.ssl_compression,
|
||||||
cacert=self.cacert)
|
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):
|
class SingleTenantStore(BaseStore):
|
||||||
EXAMPLE_URL = "swift://<USER>:<KEY>@<AUTH_ADDRESS>/<CONTAINER>/<FILE>"
|
EXAMPLE_URL = "swift://<USER>:<KEY>@<AUTH_ADDRESS>/<CONTAINER>/<FILE>"
|
||||||
@ -1263,6 +1280,12 @@ class SingleTenantStore(BaseStore):
|
|||||||
|
|
||||||
return ks_client.Client(session=sess)
|
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):
|
class MultiTenantStore(BaseStore):
|
||||||
EXAMPLE_URL = "swift://<SWIFT_URL>/<CONTAINER>/<FILE>"
|
EXAMPLE_URL = "swift://<SWIFT_URL>/<CONTAINER>/<FILE>"
|
||||||
@ -1426,6 +1449,17 @@ class MultiTenantStore(BaseStore):
|
|||||||
client_sess = ks_session.Session(auth=client_password)
|
client_sess = ks_session.Session(auth=client_password)
|
||||||
return ks_client.Client(session=client_sess)
|
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):
|
class ChunkReader(object):
|
||||||
def __init__(self, fd, checksum, total, verifier=None):
|
def __init__(self, fd, checksum, total, verifier=None):
|
||||||
@ -1456,34 +1490,3 @@ class ChunkReader(object):
|
|||||||
if self.verifier:
|
if self.verifier:
|
||||||
self.verifier.update(result)
|
self.verifier.update(result)
|
||||||
return 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__)
|
|
||||||
|
@ -292,8 +292,7 @@ class SwiftTests(object):
|
|||||||
resp_full = b''.join([chunk for chunk in image_swift.wrapped])
|
resp_full = b''.join([chunk for chunk in image_swift.wrapped])
|
||||||
resp_half = resp_full[:len(resp_full) // 2]
|
resp_half = resp_full[:len(resp_full) // 2]
|
||||||
resp_half = six.BytesIO(resp_half)
|
resp_half = six.BytesIO(resp_half)
|
||||||
manager = swift.get_manager_for_store(self.store, loc.store_location,
|
manager = self.store.get_manager(loc.store_location, ctxt)
|
||||||
ctxt)
|
|
||||||
|
|
||||||
image_swift.wrapped = swift.swift_retry_iter(resp_half, image_size,
|
image_swift.wrapped = swift.swift_retry_iter(resp_half, image_size,
|
||||||
self.store,
|
self.store,
|
||||||
@ -1108,9 +1107,7 @@ class SwiftTests(object):
|
|||||||
store = Store(self.conf)
|
store = Store(self.conf)
|
||||||
store.configure()
|
store.configure()
|
||||||
loc = mock.MagicMock()
|
loc = mock.MagicMock()
|
||||||
swift.get_manager_for_store(store, loc)
|
self.assertEqual(store.get_manager(loc), manager)
|
||||||
self.assertEqual(swift.get_manager_for_store(store, loc),
|
|
||||||
manager)
|
|
||||||
|
|
||||||
@mock.patch("glance_store._drivers.swift."
|
@mock.patch("glance_store._drivers.swift."
|
||||||
"connection_manager.SingleTenantConnectionManager")
|
"connection_manager.SingleTenantConnectionManager")
|
||||||
@ -1120,15 +1117,12 @@ class SwiftTests(object):
|
|||||||
store = Store(self.conf)
|
store = Store(self.conf)
|
||||||
store.configure()
|
store.configure()
|
||||||
loc = mock.MagicMock()
|
loc = mock.MagicMock()
|
||||||
swift.get_manager_for_store(store, loc)
|
self.assertEqual(store.get_manager(loc), manager)
|
||||||
self.assertEqual(swift.get_manager_for_store(store, loc),
|
|
||||||
manager)
|
|
||||||
|
|
||||||
def test_get_connection_manager_failed(self):
|
def test_get_connection_manager_failed(self):
|
||||||
store = mock.MagicMock()
|
store = swift.BaseStore(mock.MagicMock())
|
||||||
loc = mock.MagicMock()
|
loc = mock.MagicMock()
|
||||||
self.assertRaises(NotImplementedError, swift.get_manager_for_store,
|
self.assertRaises(NotImplementedError, store.get_manager, loc)
|
||||||
store, loc)
|
|
||||||
|
|
||||||
@mock.patch("glance_store._drivers.swift.store.ks_v3")
|
@mock.patch("glance_store._drivers.swift.store.ks_v3")
|
||||||
@mock.patch("glance_store._drivers.swift.store.ks_session")
|
@mock.patch("glance_store._drivers.swift.store.ks_session")
|
||||||
|
Loading…
Reference in New Issue
Block a user