1 # Copyright 2011 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
11 # 2. Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following
13 # disclaimer in the documentation and/or other materials
14 # provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
34 class BaseBackend(object):
35 """Abstract backend class that serves as a reference for actual implementations.
37 The purpose of the backend is to provide the necessary functions for handling data
38 and metadata. It is responsible for the actual storage and retrieval of information.
40 Note that the account level is always valid as it is checked from another subsystem.
42 The following variables should be available:
43 'hash_algorithm': Suggested is 'sha256'
44 'block_size': Suggested is 4MB
47 def delete_account(self, user, account):
48 """Delete the account with the given name.
51 IndexError: Account is not empty
55 def get_account_meta(self, user, account, until=None):
56 """Return a dictionary with the account metadata.
58 The keys returned are all user-defined, except:
59 'name': The account name
60 'count': The number of containers (or 0)
61 'bytes': The total data size (or 0)
62 'modified': Last modification timestamp (overall)
63 'until_timestamp': Last modification until the timestamp provided
67 def update_account_meta(self, user, account, meta, replace=False):
68 """Update the metadata associated with the account.
71 'meta': Dictionary with metadata to update
72 'replace': Replace instead of update
76 def list_containers(self, user, account, marker=None, limit=10000, until=None):
77 """Return a list of container (name, version_id) tuples existing under an account.
80 'marker': Start list from the next item after 'marker'
81 'limit': Number of containers to return
85 def put_container(self, user, account, container):
86 """Create a new container with the given name.
89 NameError: Container already exists
93 def delete_container(self, user, account, container):
94 """Delete the container with the given name.
97 NameError: Container does not exist
98 IndexError: Container is not empty
102 def get_container_meta(self, user, account, container, until=None):
103 """Return a dictionary with the container metadata.
105 The keys returned are all user-defined, except:
106 'name': The container name
107 'count': The number of objects
108 'bytes': The total data size
109 'modified': Last modification timestamp (overall)
110 'until_timestamp': Last modification until the timestamp provided
113 NameError: Container does not exist
117 def update_container_meta(self, user, account, container, meta, replace=False):
118 """Update the metadata associated with the container.
121 'meta': Dictionary with metadata to update
122 'replace': Replace instead of update
125 NameError: Container does not exist
129 def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, keys=[], until=None):
130 """Return a list of object (name, version_id) tuples existing under a container.
133 'prefix': List objects starting with 'prefix'
134 'delimiter': Return unique names before 'delimiter' and after 'prefix'
135 'marker': Start list from the next item after 'marker'
136 'limit': Number of objects to return
137 'virtual': If not set, the result will only include names starting\
138 with 'prefix' and ending without a 'delimiter' or with\
139 the first occurance of the 'delimiter' after 'prefix'.\
140 If set, the result will include all names after 'prefix',\
141 up to and including the 'delimiter' if it is found
142 'keys': Include objects that have meta with the keys in the list
145 NameError: Container does not exist
149 def list_object_meta(self, user, account, container, until=None):
150 """Return a list with all the container's object meta keys.
153 NameError: Container does not exist
157 def get_object_meta(self, user, account, container, name, version=None):
158 """Return a dictionary with the object metadata.
160 The keys returned are all user-defined, except:
161 'name': The object name
162 'bytes': The total data size
163 'modified': Last modification timestamp (overall)
164 'version': The version identifier
165 'version_timestamp': The version's modification timestamp
168 NameError: Container/object does not exist
169 IndexError: Version does not exist
173 def update_object_meta(self, user, account, container, name, meta, replace=False):
174 """Update the metadata associated with the object.
177 'meta': Dictionary with metadata to update.
178 'replace': Replace instead of update
181 NameError: Container/object does not exist
185 def get_object_permissions(self, user, account, container, name):
186 """Return a dictionary with the object permissions.
189 'public': The object is readable by all and available at a public URL
190 'private': No permissions set
191 'read': The object is readable by the users/groups in the list
192 'write': The object is writable by the users/groups in the list
195 NameError: Container/object does not exist
199 def update_object_permissions(self, user, account, container, name, permissions):
200 """Update the permissions associated with the object.
203 'permissions': Dictionary with permissions to update
206 NameError: Container/object does not exist
207 ValueError: Invalid users/groups in permissions
208 AttributeError: Can not set permissions, as this object\
209 is already shared/private by another object higher\
210 in the hierarchy, or setting permissions here will\
211 invalidate other permissions deeper in the hierarchy
215 def get_object_hashmap(self, user, account, container, name, version=None):
216 """Return the object's size and a list with partial hashes.
219 NameError: Container/object does not exist
220 IndexError: Version does not exist
224 def update_object_hashmap(self, user, account, container, name, size, hashmap, meta={}, replace_meta=False, permissions={}):
225 """Create/update an object with the specified size and partial hashes.
228 'dest_meta': Dictionary with metadata to change
229 'replace_meta': Replace metadata instead of update
230 'permissions': Updated object permissions
233 NameError: Container does not exist
234 ValueError: Invalid users/groups in permissions
235 AttributeError: Can not set permissions
239 def copy_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions={}, src_version=None):
240 """Copy an object's data and metadata.
243 'dest_meta': Dictionary with metadata to change from source to destination
244 'replace_meta': Replace metadata instead of update
245 'permissions': New object permissions
246 'src_version': Copy from the version provided
249 NameError: Container/object does not exist
250 IndexError: Version does not exist
251 ValueError: Invalid users/groups in permissions
252 AttributeError: Can not set permissions
256 def move_object(self, user, account, src_container, src_name, dest_container, dest_name, dest_meta={}, replace_meta=False, permissions={}):
257 """Move an object's data and metadata.
260 'dest_meta': Dictionary with metadata to change from source to destination
261 'replace_meta': Replace metadata instead of update
262 'permissions': New object permissions
265 NameError: Container/object does not exist
266 ValueError: Invalid users/groups in permissions
267 AttributeError: Can not set permissions
271 def delete_object(self, user, account, container, name):
275 NameError: Container/object does not exist
279 def list_versions(self, user, account, container, name):
280 """Return a list of all (version, version_timestamp) tuples for an object."""
283 def get_block(self, hash):
284 """Return a block's data.
287 NameError: Block does not exist
291 def put_block(self, data):
292 """Store a block and return the hash."""
295 def update_block(self, hash, data, offset=0):
296 """Update a known block and return the hash.
299 IndexError: Offset or data outside block limits