Merge pull request #379 from jonparrott/locking-to-base-storage
Moved locking logic into storage base class.
This commit is contained in:
@@ -346,21 +346,31 @@ class Storage(object):
|
|||||||
such that multiple processes and threads can operate on a single
|
such that multiple processes and threads can operate on a single
|
||||||
store.
|
store.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self, lock=None):
|
||||||
|
"""Create a Storage instance.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
lock: An optional threading.Lock-like object. Must implement at
|
||||||
|
least acquire() and release(). Does not need to be re-entrant.
|
||||||
|
"""
|
||||||
|
self._lock = lock
|
||||||
|
|
||||||
def acquire_lock(self):
|
def acquire_lock(self):
|
||||||
"""Acquires any lock necessary to access this Storage.
|
"""Acquires any lock necessary to access this Storage.
|
||||||
|
|
||||||
This lock is not reentrant.
|
This lock is not reentrant.
|
||||||
"""
|
"""
|
||||||
pass
|
if self._lock is not None:
|
||||||
|
self._lock.acquire()
|
||||||
|
|
||||||
def release_lock(self):
|
def release_lock(self):
|
||||||
"""Release the Storage lock.
|
"""Release the Storage lock.
|
||||||
|
|
||||||
Trying to release a lock that isn't held will result in a
|
Trying to release a lock that isn't held will result in a
|
||||||
RuntimeError.
|
RuntimeError in the case of a threading.Lock or multiprocessing.Lock.
|
||||||
"""
|
"""
|
||||||
pass
|
if self._lock is not None:
|
||||||
|
self._lock.release()
|
||||||
|
|
||||||
def locked_get(self):
|
def locked_get(self):
|
||||||
"""Retrieve credential.
|
"""Retrieve credential.
|
||||||
|
|||||||
@@ -408,6 +408,8 @@ class StorageByKeyName(Storage):
|
|||||||
user: users.User object, optional. Can be used to grab user ID as a
|
user: users.User object, optional. Can be used to grab user ID as a
|
||||||
key_name if no key name is specified.
|
key_name if no key name is specified.
|
||||||
"""
|
"""
|
||||||
|
super(StorageByKeyName, self).__init__()
|
||||||
|
|
||||||
if key_name is None:
|
if key_name is None:
|
||||||
if user is None:
|
if user is None:
|
||||||
raise ValueError('StorageByKeyName called with no '
|
raise ValueError('StorageByKeyName called with no '
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ class Storage(BaseStorage):
|
|||||||
property_name: string, name of the property that is an
|
property_name: string, name of the property that is an
|
||||||
CredentialsProperty
|
CredentialsProperty
|
||||||
"""
|
"""
|
||||||
|
super(Storage, self).__init__()
|
||||||
self.model_class = model_class
|
self.model_class = model_class
|
||||||
self.key_name = key_name
|
self.key_name = key_name
|
||||||
self.key_value = key_value
|
self.key_value = key_value
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class DjangoSessionStorage(client.Storage):
|
|||||||
"""Storage implementation that uses Django sessions."""
|
"""Storage implementation that uses Django sessions."""
|
||||||
|
|
||||||
def __init__(self, session):
|
def __init__(self, session):
|
||||||
|
super(DjangoSessionStorage, self).__init__()
|
||||||
self.session = session
|
self.session = session
|
||||||
|
|
||||||
def locked_get(self):
|
def locked_get(self):
|
||||||
|
|||||||
@@ -59,24 +59,9 @@ class Storage(BaseStorage):
|
|||||||
credentials are stored.
|
credentials are stored.
|
||||||
user_name: string, The name of the user to store credentials for.
|
user_name: string, The name of the user to store credentials for.
|
||||||
"""
|
"""
|
||||||
|
super(Storage, self).__init__(lock=threading.Lock())
|
||||||
self._service_name = service_name
|
self._service_name = service_name
|
||||||
self._user_name = user_name
|
self._user_name = user_name
|
||||||
self._lock = threading.Lock()
|
|
||||||
|
|
||||||
def acquire_lock(self):
|
|
||||||
"""Acquires any lock necessary to access this Storage.
|
|
||||||
|
|
||||||
This lock is not reentrant.
|
|
||||||
"""
|
|
||||||
self._lock.acquire()
|
|
||||||
|
|
||||||
def release_lock(self):
|
|
||||||
"""Release the Storage lock.
|
|
||||||
|
|
||||||
Trying to release a lock that isn't held will result in a
|
|
||||||
RuntimeError.
|
|
||||||
"""
|
|
||||||
self._lock.release()
|
|
||||||
|
|
||||||
def locked_get(self):
|
def locked_get(self):
|
||||||
"""Retrieve Credential from file.
|
"""Retrieve Credential from file.
|
||||||
|
|||||||
@@ -36,29 +36,14 @@ class Storage(BaseStorage):
|
|||||||
"""Store and retrieve a single credential to and from a file."""
|
"""Store and retrieve a single credential to and from a file."""
|
||||||
|
|
||||||
def __init__(self, filename):
|
def __init__(self, filename):
|
||||||
|
super(Storage, self).__init__(lock=threading.Lock())
|
||||||
self._filename = filename
|
self._filename = filename
|
||||||
self._lock = threading.Lock()
|
|
||||||
|
|
||||||
def _validate_file(self):
|
def _validate_file(self):
|
||||||
if os.path.islink(self._filename):
|
if os.path.islink(self._filename):
|
||||||
raise CredentialsFileSymbolicLinkError(
|
raise CredentialsFileSymbolicLinkError(
|
||||||
'File: %s is a symbolic link.' % self._filename)
|
'File: %s is a symbolic link.' % self._filename)
|
||||||
|
|
||||||
def acquire_lock(self):
|
|
||||||
"""Acquires any lock necessary to access this Storage.
|
|
||||||
|
|
||||||
This lock is not reentrant.
|
|
||||||
"""
|
|
||||||
self._lock.acquire()
|
|
||||||
|
|
||||||
def release_lock(self):
|
|
||||||
"""Release the Storage lock.
|
|
||||||
|
|
||||||
Trying to release a lock that isn't held will result in a
|
|
||||||
RuntimeError.
|
|
||||||
"""
|
|
||||||
self._lock.release()
|
|
||||||
|
|
||||||
def locked_get(self):
|
def locked_get(self):
|
||||||
"""Retrieve Credential from file.
|
"""Retrieve Credential from file.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user