class NotAllowedError(Exception):
pass
+class QuotaError(Exception):
+ pass
+
class BaseBackend(object):
"""Abstract backend class that serves as a reference for actual implementations.
The following variables should be available:
'hash_algorithm': Suggested is 'sha256'
+
'block_size': Suggested is 4MB
+
+ 'default_policy': A dictionary with default policy settings
"""
+ def __init__(self, db_module, db_connection, block_module, block_path):
+ """Initialize backend with supplied modules and options."""
+ pass
+
+ def close(self):
+ """Close the backend connection."""
+ pass
+
def list_accounts(self, user, marker=None, limit=10000):
"""Return a list of accounts the user can access.
Parameters:
'marker': Start list from the next item after 'marker'
+
'limit': Number of containers to return
"""
return []
- def get_account_meta(self, user, account, until=None):
- """Return a dictionary with the account metadata.
+ def get_account_meta(self, user, account, domain, until=None):
+ """Return a dictionary with the account metadata for the domain.
The keys returned are all user-defined, except:
'name': The account name
+
'count': The number of containers (or 0)
+
'bytes': The total data size (or 0)
+
'modified': Last modification timestamp (overall)
+
'until_timestamp': Last modification until the timestamp provided
Raises:
"""
return {}
- def update_account_meta(self, user, account, meta, replace=False):
- """Update the metadata associated with the account.
+ def update_account_meta(self, user, account, domain, meta, replace=False):
+ """Update the metadata associated with the account for the domain.
Parameters:
+ 'domain': Metadata domain
+
'meta': Dictionary with metadata to update
+
'replace': Replace instead of update
Raises:
Raises:
NotAllowedError: Operation not permitted
+
ValueError: Invalid data in groups
"""
return
+ def get_account_policy(self, user, account):
+ """Return a dictionary with the account policy.
+
+ The keys returned are:
+ 'quota': The maximum bytes allowed (default is 0 - unlimited)
+
+ 'versioning': Can be 'auto', 'manual' or 'none' (default is 'manual')
+
+ Raises:
+ NotAllowedError: Operation not permitted
+ """
+ return {}
+
+ def update_account_policy(self, user, account, policy, replace=False):
+ """Update the policy associated with the account.
+
+ Raises:
+ NotAllowedError: Operation not permitted
+
+ ValueError: Invalid policy defined
+ """
+ return
+
+ def put_account(self, user, account, policy={}):
+ """Create a new account with the given name.
+
+ Raises:
+ NotAllowedError: Operation not permitted
+
+ ValueError: Invalid policy defined
+ """
+ return
+
def delete_account(self, user, account):
"""Delete the account with the given name.
Raises:
NotAllowedError: Operation not permitted
+
IndexError: Account is not empty
"""
return
- def list_containers(self, user, account, marker=None, limit=10000, until=None):
+ def list_containers(self, user, account, marker=None, limit=10000, shared=False, until=None):
"""Return a list of container names existing under an account.
Parameters:
'marker': Start list from the next item after 'marker'
+
'limit': Number of containers to return
+
+ 'shared': Only list containers with permissions set
+
Raises:
NotAllowedError: Operation not permitted
"""
return []
- def get_container_meta(self, user, account, container, until=None):
- """Return a dictionary with the container metadata.
+ def get_container_meta(self, user, account, container, domain, until=None):
+ """Return a dictionary with the container metadata for the domain.
The keys returned are all user-defined, except:
'name': The container name
+
'count': The number of objects
+
'bytes': The total data size
+
'modified': Last modification timestamp (overall)
+
'until_timestamp': Last modification until the timestamp provided
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
"""
return {}
- def update_container_meta(self, user, account, container, meta, replace=False):
- """Update the metadata associated with the container.
+ def update_container_meta(self, user, account, container, domain, meta, replace=False):
+ """Update the metadata associated with the container for the domain.
Parameters:
+ 'domain': Metadata domain
+
'meta': Dictionary with metadata to update
+
'replace': Replace instead of update
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
"""
return
The keys returned are:
'quota': The maximum bytes allowed (default is 0 - unlimited)
+
'versioning': Can be 'auto', 'manual' or 'none' (default is 'manual')
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
"""
return {}
def update_container_policy(self, user, account, container, policy, replace=False):
- """Update the policy associated with the account.
+ """Update the policy associated with the container.
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
+
ValueError: Invalid policy defined
"""
return
- def put_container(self, user, account, container, policy=None):
+ def put_container(self, user, account, container, policy={}):
"""Create a new container with the given name.
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container already exists
+
ValueError: Invalid policy defined
"""
return
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
+
IndexError: Container is not empty
"""
return
- def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, keys=[], until=None):
+ def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None):
"""Return a list of object (name, version_id) tuples existing under a container.
Parameters:
'prefix': List objects starting with 'prefix'
+
'delimiter': Return unique names before 'delimiter' and after 'prefix'
+
'marker': Start list from the next item after 'marker'
+
'limit': Number of objects to return
- 'virtual': If not set, the result will only include names starting\
- with 'prefix' and ending without a 'delimiter' or with\
- the first occurance of the 'delimiter' after 'prefix'.\
- If set, the result will include all names after 'prefix',\
+
+ 'virtual': If not set, the result will only include names starting
+ with 'prefix' and ending without a 'delimiter' or with
+ the first occurance of the 'delimiter' after 'prefix'.
+ If set, the result will include all names after 'prefix',
up to and including the 'delimiter' if it is found
- 'keys': Include objects that have meta with the keys in the list
+
+ 'domain': Metadata domain for keys
+
+ 'keys': Include objects that satisfy the key queries in the list.
+ Use 'key', '!key' for existence queries, 'key op value' for
+ value queries, where 'op' can be one of =, !=, <=, >=, <, >
+
+ 'shared': Only list objects with permissions set
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
"""
return []
- def list_object_meta(self, user, account, container, until=None):
- """Return a list with all the container's object meta keys.
+ def list_object_meta(self, user, account, container, domain, until=None):
+ """Return a list with all the container's object meta keys for the domain.
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
"""
return []
- def get_object_meta(self, user, account, container, name, version=None):
- """Return a dictionary with the object metadata.
+ def get_object_meta(self, user, account, container, name, domain, version=None):
+ """Return a dictionary with the object metadata for the domain.
The keys returned are all user-defined, except:
'name': The object name
+
'bytes': The total data size
+
+ 'hash': The hashmap hash
+
'modified': Last modification timestamp (overall)
+
'modified_by': The user that committed the object (version requested)
+
'version': The version identifier
+
'version_timestamp': The version's modification timestamp
+
+ 'uuid': A unique identifier that persists data or metadata updates and renames
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
+
IndexError: Version does not exist
"""
return {}
- def update_object_meta(self, user, account, container, name, meta, replace=False):
- """Update the metadata associated with the object.
+ def update_object_meta(self, user, account, container, name, domain, meta, replace=False):
+ """Update the metadata associated with the object for the domain and return the new version.
Parameters:
+ 'domain': Metadata domain
+
'meta': Dictionary with metadata to update
+
'replace': Replace instead of update
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
"""
- return
+ return ''
def get_object_permissions(self, user, account, container, name):
- """Return the path from which this object gets its permissions from,\
+ """Return the action allowed on the object, the path
+ from which the object gets its permissions from,
along with a dictionary containing the permissions.
- The keys are:
+ The dictionary keys are (also used for defining the action):
'read': The object is readable by the users/groups in the list
+
'write': The object is writable by the users/groups in the list
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
"""
return {}
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
+
ValueError: Invalid users/groups in permissions
- AttributeError: Can not set permissions, as this object\
- is already shared/private by another object higher\
- in the hierarchy, or setting permissions here will\
+
+ AttributeError: Can not set permissions, as this object
+ is already shared/private by another object higher
+ in the hierarchy, or setting permissions here will
invalidate other permissions deeper in the hierarchy
"""
return
def get_object_public(self, user, account, container, name):
- """Return the public URL of the object if applicable.
+ """Return the public id of the object if applicable.
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
"""
return None
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
"""
return
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
+
IndexError: Version does not exist
"""
return 0, []
- def update_object_hashmap(self, user, account, container, name, size, hashmap, meta={}, replace_meta=False, permissions=None):
- """Create/update an object with the specified size and partial hashes.
+ def update_object_hashmap(self, user, account, container, name, size, hashmap, domain, meta={}, replace_meta=False, permissions=None):
+ """Create/update an object with the specified size and partial hashes and return the new version.
Parameters:
- 'dest_meta': Dictionary with metadata to change
+ 'domain': Metadata domain
+
+ 'meta': Dictionary with metadata to change
+
'replace_meta': Replace metadata instead of update
+
'permissions': Updated object permissions
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container does not exist
+
ValueError: Invalid users/groups in permissions
+
AttributeError: Can not set permissions
+
+ QuotaError: Account or container quota exceeded
"""
- return
+ return ''
- def copy_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions=None, src_version=None):
- """Copy an object's data and metadata.
+ def copy_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, domain, meta={}, replace_meta=False, permissions=None, src_version=None):
+ """Copy an object's data and metadata and return the new version.
Parameters:
- 'dest_meta': Dictionary with metadata to change from source to destination
+ 'domain': Metadata domain
+
+ 'meta': Dictionary with metadata to change from source to destination
+
'replace_meta': Replace metadata instead of update
+
'permissions': New object permissions
+
'src_version': Copy from the version provided
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
+
IndexError: Version does not exist
+
ValueError: Invalid users/groups in permissions
+
AttributeError: Can not set permissions
+
+ QuotaError: Account or container quota exceeded
"""
- return
+ return ''
- def move_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions=None):
- """Move an object's data and metadata.
+ def move_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, domain, meta={}, replace_meta=False, permissions=None):
+ """Move an object's data and metadata and return the new version.
Parameters:
- 'dest_meta': Dictionary with metadata to change from source to destination
+ 'domain': Metadata domain
+
+ 'meta': Dictionary with metadata to change from source to destination
+
'replace_meta': Replace metadata instead of update
+
'permissions': New object permissions
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
+
ValueError: Invalid users/groups in permissions
+
AttributeError: Can not set permissions
+
+ QuotaError: Account or container quota exceeded
"""
- return
+ return ''
def delete_object(self, user, account, container, name, until=None):
"""Delete/purge an object.
Raises:
NotAllowedError: Operation not permitted
+
NameError: Container/object does not exist
"""
return
"""
return []
+ def get_uuid(self, user, uuid):
+ """Return the (account, container, name) for the UUID given.
+
+ Raises:
+ NotAllowedError: Operation not permitted
+
+ NameError: UUID does not exist
+ """
+ return None
+
+ def get_public(self, user, public):
+ """Return the (account, container, name) for the public id given.
+
+ Raises:
+ NotAllowedError: Operation not permitted
+
+ NameError: Public id does not exist
+ """
+ return None
+
def get_block(self, hash):
"""Return a block's data.