Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / base.py @ 89362181

History | View | Annotate | Download (19.8 kB)

1 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 d50ed8d4 Sofia Papagiannaki
#
3 5635f9ef Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 5635f9ef Antony Chazapis
# without modification, are permitted provided that the following
5 5635f9ef Antony Chazapis
# conditions are met:
6 d50ed8d4 Sofia Papagiannaki
#
7 5635f9ef Antony Chazapis
#   1. Redistributions of source code must retain the above
8 5635f9ef Antony Chazapis
#      copyright notice, this list of conditions and the following
9 5635f9ef Antony Chazapis
#      disclaimer.
10 d50ed8d4 Sofia Papagiannaki
#
11 5635f9ef Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 5635f9ef Antony Chazapis
#      copyright notice, this list of conditions and the following
13 5635f9ef Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 5635f9ef Antony Chazapis
#      provided with the distribution.
15 d50ed8d4 Sofia Papagiannaki
#
16 5635f9ef Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5635f9ef Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5635f9ef Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5635f9ef Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5635f9ef Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5635f9ef Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5635f9ef Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5635f9ef Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5635f9ef Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5635f9ef Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5635f9ef Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5635f9ef Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 d50ed8d4 Sofia Papagiannaki
#
29 5635f9ef Antony Chazapis
# The views and conclusions contained in the software and
30 5635f9ef Antony Chazapis
# documentation are those of the authors and should not be
31 5635f9ef Antony Chazapis
# interpreted as representing official policies, either expressed
32 5635f9ef Antony Chazapis
# or implied, of GRNET S.A.
33 5635f9ef Antony Chazapis
34 228de81b Antony Chazapis
# Default setting for new accounts.
35 19ddd41b Sofia Papagiannaki
DEFAULT_ACCOUNT_QUOTA = 0  # No quota.
36 19ddd41b Sofia Papagiannaki
DEFAULT_CONTAINER_QUOTA = 0  # No quota.
37 19ddd41b Sofia Papagiannaki
DEFAULT_CONTAINER_VERSIONING = 'auto'
38 228de81b Antony Chazapis
39 228de81b Antony Chazapis
40 d50ed8d4 Sofia Papagiannaki
41 cca6c617 Antony Chazapis
class NotAllowedError(Exception):
42 cca6c617 Antony Chazapis
    pass
43 cca6c617 Antony Chazapis
44 d50ed8d4 Sofia Papagiannaki
45 5df6c6d1 Antony Chazapis
class QuotaError(Exception):
46 5df6c6d1 Antony Chazapis
    pass
47 5df6c6d1 Antony Chazapis
48 d50ed8d4 Sofia Papagiannaki
49 7efc9f86 Sofia Papagiannaki
class AccountExists(NameError):
50 7efc9f86 Sofia Papagiannaki
    pass
51 d50ed8d4 Sofia Papagiannaki
52 d50ed8d4 Sofia Papagiannaki
53 7efc9f86 Sofia Papagiannaki
class ContainerExists(NameError):
54 7efc9f86 Sofia Papagiannaki
    pass
55 7efc9f86 Sofia Papagiannaki
56 d50ed8d4 Sofia Papagiannaki
57 7efc9f86 Sofia Papagiannaki
class AccountNotEmpty(IndexError):
58 7efc9f86 Sofia Papagiannaki
    pass
59 7efc9f86 Sofia Papagiannaki
60 d50ed8d4 Sofia Papagiannaki
61 7efc9f86 Sofia Papagiannaki
class ContainerNotEmpty(IndexError):
62 7efc9f86 Sofia Papagiannaki
    pass
63 7efc9f86 Sofia Papagiannaki
64 d50ed8d4 Sofia Papagiannaki
65 7efc9f86 Sofia Papagiannaki
class ItemNotExists(NameError):
66 7efc9f86 Sofia Papagiannaki
    pass
67 7efc9f86 Sofia Papagiannaki
68 d50ed8d4 Sofia Papagiannaki
69 7efc9f86 Sofia Papagiannaki
class VersionNotExists(IndexError):
70 7efc9f86 Sofia Papagiannaki
    pass
71 7efc9f86 Sofia Papagiannaki
72 d50ed8d4 Sofia Papagiannaki
73 8ee4ec50 Vangelis Koukis
class BaseBackend(object):
74 22dab079 Antony Chazapis
    """Abstract backend class that serves as a reference for actual implementations.
75 d50ed8d4 Sofia Papagiannaki

76 b956618e Antony Chazapis
    The purpose of the backend is to provide the necessary functions for handling data
77 b956618e Antony Chazapis
    and metadata. It is responsible for the actual storage and retrieval of information.
78 d50ed8d4 Sofia Papagiannaki

79 b956618e Antony Chazapis
    Note that the account level is always valid as it is checked from another subsystem.
80 d50ed8d4 Sofia Papagiannaki

81 02c0c3fa Antony Chazapis
    When not replacing metadata/groups/policy, keys with empty values should be deleted.
82 d50ed8d4 Sofia Papagiannaki

83 22dab079 Antony Chazapis
    The following variables should be available:
84 22dab079 Antony Chazapis
        'hash_algorithm': Suggested is 'sha256'
85 d50ed8d4 Sofia Papagiannaki

86 22dab079 Antony Chazapis
        'block_size': Suggested is 4MB
87 d50ed8d4 Sofia Papagiannaki

88 19ddd41b Sofia Papagiannaki
        'default_account_policy': A dictionary with default account policy settings
89 19ddd41b Sofia Papagiannaki
        'default_container_policy': A dictionary with default container policy settings
90 b956618e Antony Chazapis
    """
91 d50ed8d4 Sofia Papagiannaki
92 d14fe290 Antony Chazapis
    def close(self):
93 d14fe290 Antony Chazapis
        """Close the backend connection."""
94 d14fe290 Antony Chazapis
        pass
95 d50ed8d4 Sofia Papagiannaki
96 f6c97079 Antony Chazapis
    def list_accounts(self, user, marker=None, limit=10000):
97 f6c97079 Antony Chazapis
        """Return a list of accounts the user can access.
98 d50ed8d4 Sofia Papagiannaki

99 f6c97079 Antony Chazapis
        Parameters:
100 f6c97079 Antony Chazapis
            'marker': Start list from the next item after 'marker'
101 d50ed8d4 Sofia Papagiannaki

102 f6c97079 Antony Chazapis
            'limit': Number of containers to return
103 f6c97079 Antony Chazapis
        """
104 f6c97079 Antony Chazapis
        return []
105 d50ed8d4 Sofia Papagiannaki
106 82482e2c Antony Chazapis
    def get_account_meta(self, user, account, domain, until=None, include_user_defined=True):
107 cb69c154 Antony Chazapis
        """Return a dictionary with the account metadata for the domain.
108 d50ed8d4 Sofia Papagiannaki

109 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
110 b956618e Antony Chazapis
            'name': The account name
111 d50ed8d4 Sofia Papagiannaki

112 b956618e Antony Chazapis
            'count': The number of containers (or 0)
113 d50ed8d4 Sofia Papagiannaki

114 b956618e Antony Chazapis
            'bytes': The total data size (or 0)
115 d50ed8d4 Sofia Papagiannaki

116 58a6c894 Antony Chazapis
            'modified': Last modification timestamp (overall)
117 d50ed8d4 Sofia Papagiannaki

118 58a6c894 Antony Chazapis
            'until_timestamp': Last modification until the timestamp provided
119 d50ed8d4 Sofia Papagiannaki

120 cca6c617 Antony Chazapis
        Raises:
121 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
122 b956618e Antony Chazapis
        """
123 b956618e Antony Chazapis
        return {}
124 d50ed8d4 Sofia Papagiannaki
125 cb69c154 Antony Chazapis
    def update_account_meta(self, user, account, domain, meta, replace=False):
126 cb69c154 Antony Chazapis
        """Update the metadata associated with the account for the domain.
127 d50ed8d4 Sofia Papagiannaki

128 b956618e Antony Chazapis
        Parameters:
129 cb69c154 Antony Chazapis
            'domain': Metadata domain
130 d50ed8d4 Sofia Papagiannaki

131 b956618e Antony Chazapis
            'meta': Dictionary with metadata to update
132 d50ed8d4 Sofia Papagiannaki

133 22dab079 Antony Chazapis
            'replace': Replace instead of update
134 d50ed8d4 Sofia Papagiannaki

135 cca6c617 Antony Chazapis
        Raises:
136 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
137 b956618e Antony Chazapis
        """
138 b956618e Antony Chazapis
        return
139 d50ed8d4 Sofia Papagiannaki
140 02c0c3fa Antony Chazapis
    def get_account_groups(self, user, account):
141 02c0c3fa Antony Chazapis
        """Return a dictionary with the user groups defined for this account.
142 d50ed8d4 Sofia Papagiannaki

143 cca6c617 Antony Chazapis
        Raises:
144 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
145 58a6c894 Antony Chazapis
        """
146 02c0c3fa Antony Chazapis
        return {}
147 d50ed8d4 Sofia Papagiannaki
148 02c0c3fa Antony Chazapis
    def update_account_groups(self, user, account, groups, replace=False):
149 02c0c3fa Antony Chazapis
        """Update the groups associated with the account.
150 d50ed8d4 Sofia Papagiannaki

151 b956618e Antony Chazapis
        Raises:
152 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
153 d50ed8d4 Sofia Papagiannaki

154 02c0c3fa Antony Chazapis
            ValueError: Invalid data in groups
155 b956618e Antony Chazapis
        """
156 b956618e Antony Chazapis
        return
157 d50ed8d4 Sofia Papagiannaki
158 b2832c6a Antony Chazapis
    def get_account_policy(self, user, account):
159 b2832c6a Antony Chazapis
        """Return a dictionary with the account policy.
160 d50ed8d4 Sofia Papagiannaki

161 b2832c6a Antony Chazapis
        The keys returned are:
162 b2832c6a Antony Chazapis
            'quota': The maximum bytes allowed (default is 0 - unlimited)
163 d50ed8d4 Sofia Papagiannaki

164 b2832c6a Antony Chazapis
            'versioning': Can be 'auto', 'manual' or 'none' (default is 'manual')
165 d50ed8d4 Sofia Papagiannaki

166 b2832c6a Antony Chazapis
        Raises:
167 b2832c6a Antony Chazapis
            NotAllowedError: Operation not permitted
168 b2832c6a Antony Chazapis
        """
169 b2832c6a Antony Chazapis
        return {}
170 d50ed8d4 Sofia Papagiannaki
171 b2832c6a Antony Chazapis
    def update_account_policy(self, user, account, policy, replace=False):
172 b2832c6a Antony Chazapis
        """Update the policy associated with the account.
173 d50ed8d4 Sofia Papagiannaki

174 b2832c6a Antony Chazapis
        Raises:
175 b2832c6a Antony Chazapis
            NotAllowedError: Operation not permitted
176 d50ed8d4 Sofia Papagiannaki

177 b2832c6a Antony Chazapis
            ValueError: Invalid policy defined
178 b2832c6a Antony Chazapis
        """
179 b2832c6a Antony Chazapis
        return
180 d50ed8d4 Sofia Papagiannaki
181 78348987 Sofia Papagiannaki
    def put_account(self, user, account, policy=None):
182 a9b3f29d Antony Chazapis
        """Create a new account with the given name.
183 d50ed8d4 Sofia Papagiannaki

184 a9b3f29d Antony Chazapis
        Raises:
185 a9b3f29d Antony Chazapis
            NotAllowedError: Operation not permitted
186 d50ed8d4 Sofia Papagiannaki

187 b2832c6a Antony Chazapis
            ValueError: Invalid policy defined
188 a9b3f29d Antony Chazapis
        """
189 a9b3f29d Antony Chazapis
        return
190 d50ed8d4 Sofia Papagiannaki
191 02c0c3fa Antony Chazapis
    def delete_account(self, user, account):
192 02c0c3fa Antony Chazapis
        """Delete the account with the given name.
193 d50ed8d4 Sofia Papagiannaki

194 b956618e Antony Chazapis
        Raises:
195 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
196 d50ed8d4 Sofia Papagiannaki

197 7efc9f86 Sofia Papagiannaki
            AccountNotEmpty: Account is not empty
198 b956618e Antony Chazapis
        """
199 b956618e Antony Chazapis
        return
200 d50ed8d4 Sofia Papagiannaki
201 4d15c94e Sofia Papagiannaki
    def list_containers(self, user, account, marker=None, limit=10000, shared=False, until=None, public=False):
202 f6c97079 Antony Chazapis
        """Return a list of container names existing under an account.
203 d50ed8d4 Sofia Papagiannaki

204 02c0c3fa Antony Chazapis
        Parameters:
205 02c0c3fa Antony Chazapis
            'marker': Start list from the next item after 'marker'
206 d50ed8d4 Sofia Papagiannaki

207 02c0c3fa Antony Chazapis
            'limit': Number of containers to return
208 d50ed8d4 Sofia Papagiannaki

209 b18ef3ad Antony Chazapis
            'shared': Only list containers with permissions set
210 d50ed8d4 Sofia Papagiannaki

211 4d15c94e Sofia Papagiannaki
            'public': Only list containers containing public objects
212 d50ed8d4 Sofia Papagiannaki

213 d50ed8d4 Sofia Papagiannaki

214 02c0c3fa Antony Chazapis
        Raises:
215 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
216 02c0c3fa Antony Chazapis
        """
217 02c0c3fa Antony Chazapis
        return []
218 d50ed8d4 Sofia Papagiannaki
219 371d907a Antony Chazapis
    def list_container_meta(self, user, account, container, domain, until=None):
220 371d907a Antony Chazapis
        """Return a list with all the container's object meta keys for the domain.
221 d50ed8d4 Sofia Papagiannaki

222 371d907a Antony Chazapis
        Raises:
223 371d907a Antony Chazapis
            NotAllowedError: Operation not permitted
224 d50ed8d4 Sofia Papagiannaki

225 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
226 371d907a Antony Chazapis
        """
227 371d907a Antony Chazapis
        return []
228 d50ed8d4 Sofia Papagiannaki
229 82482e2c Antony Chazapis
    def get_container_meta(self, user, account, container, domain, until=None, include_user_defined=True):
230 cb69c154 Antony Chazapis
        """Return a dictionary with the container metadata for the domain.
231 d50ed8d4 Sofia Papagiannaki

232 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
233 b956618e Antony Chazapis
            'name': The container name
234 d50ed8d4 Sofia Papagiannaki

235 b956618e Antony Chazapis
            'count': The number of objects
236 d50ed8d4 Sofia Papagiannaki

237 b956618e Antony Chazapis
            'bytes': The total data size
238 d50ed8d4 Sofia Papagiannaki

239 58a6c894 Antony Chazapis
            'modified': Last modification timestamp (overall)
240 d50ed8d4 Sofia Papagiannaki

241 58a6c894 Antony Chazapis
            'until_timestamp': Last modification until the timestamp provided
242 d50ed8d4 Sofia Papagiannaki

243 b956618e Antony Chazapis
        Raises:
244 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
245 d50ed8d4 Sofia Papagiannaki

246 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
247 b956618e Antony Chazapis
        """
248 b956618e Antony Chazapis
        return {}
249 d50ed8d4 Sofia Papagiannaki
250 cb69c154 Antony Chazapis
    def update_container_meta(self, user, account, container, domain, meta, replace=False):
251 cb69c154 Antony Chazapis
        """Update the metadata associated with the container for the domain.
252 d50ed8d4 Sofia Papagiannaki

253 b956618e Antony Chazapis
        Parameters:
254 cb69c154 Antony Chazapis
            'domain': Metadata domain
255 d50ed8d4 Sofia Papagiannaki

256 b956618e Antony Chazapis
            'meta': Dictionary with metadata to update
257 d50ed8d4 Sofia Papagiannaki

258 22dab079 Antony Chazapis
            'replace': Replace instead of update
259 d50ed8d4 Sofia Papagiannaki

260 b956618e Antony Chazapis
        Raises:
261 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
262 d50ed8d4 Sofia Papagiannaki

263 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
264 b956618e Antony Chazapis
        """
265 b956618e Antony Chazapis
        return
266 d50ed8d4 Sofia Papagiannaki
267 02c0c3fa Antony Chazapis
    def get_container_policy(self, user, account, container):
268 02c0c3fa Antony Chazapis
        """Return a dictionary with the container policy.
269 d50ed8d4 Sofia Papagiannaki

270 02c0c3fa Antony Chazapis
        The keys returned are:
271 02c0c3fa Antony Chazapis
            'quota': The maximum bytes allowed (default is 0 - unlimited)
272 d50ed8d4 Sofia Papagiannaki

273 02c0c3fa Antony Chazapis
            'versioning': Can be 'auto', 'manual' or 'none' (default is 'manual')
274 d50ed8d4 Sofia Papagiannaki

275 02c0c3fa Antony Chazapis
        Raises:
276 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
277 d50ed8d4 Sofia Papagiannaki

278 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
279 02c0c3fa Antony Chazapis
        """
280 02c0c3fa Antony Chazapis
        return {}
281 d50ed8d4 Sofia Papagiannaki
282 02c0c3fa Antony Chazapis
    def update_container_policy(self, user, account, container, policy, replace=False):
283 b2832c6a Antony Chazapis
        """Update the policy associated with the container.
284 d50ed8d4 Sofia Papagiannaki

285 02c0c3fa Antony Chazapis
        Raises:
286 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
287 d50ed8d4 Sofia Papagiannaki

288 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
289 d50ed8d4 Sofia Papagiannaki

290 02c0c3fa Antony Chazapis
            ValueError: Invalid policy defined
291 02c0c3fa Antony Chazapis
        """
292 02c0c3fa Antony Chazapis
        return
293 d50ed8d4 Sofia Papagiannaki
294 78348987 Sofia Papagiannaki
    def put_container(self, user, account, container, policy=None, delimiter=None):
295 02c0c3fa Antony Chazapis
        """Create a new container with the given name.
296 d50ed8d4 Sofia Papagiannaki

297 e46b2bcf Sofia Papagiannaki
        Parameters:
298 e46b2bcf Sofia Papagiannaki
            'delimiter': If present deletes container contents instead of the container
299 d50ed8d4 Sofia Papagiannaki

300 02c0c3fa Antony Chazapis
        Raises:
301 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
302 d50ed8d4 Sofia Papagiannaki

303 7efc9f86 Sofia Papagiannaki
            ContainerExists: Container already exists
304 d50ed8d4 Sofia Papagiannaki

305 02c0c3fa Antony Chazapis
            ValueError: Invalid policy defined
306 02c0c3fa Antony Chazapis
        """
307 02c0c3fa Antony Chazapis
        return
308 d50ed8d4 Sofia Papagiannaki
309 84846143 Antony Chazapis
    def delete_container(self, user, account, container, until=None):
310 84846143 Antony Chazapis
        """Delete/purge the container with the given name.
311 d50ed8d4 Sofia Papagiannaki

312 02c0c3fa Antony Chazapis
        Raises:
313 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
314 d50ed8d4 Sofia Papagiannaki

315 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
316 d50ed8d4 Sofia Papagiannaki

317 7efc9f86 Sofia Papagiannaki
            ContainerNotEmpty: Container is not empty
318 02c0c3fa Antony Chazapis
        """
319 02c0c3fa Antony Chazapis
        return
320 d50ed8d4 Sofia Papagiannaki
321 78348987 Sofia Papagiannaki
    def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=None, shared=False, until=None, size_range=None, public=False):
322 58a6c894 Antony Chazapis
        """Return a list of object (name, version_id) tuples existing under a container.
323 d50ed8d4 Sofia Papagiannaki

324 b956618e Antony Chazapis
        Parameters:
325 b956618e Antony Chazapis
            'prefix': List objects starting with 'prefix'
326 d50ed8d4 Sofia Papagiannaki

327 b956618e Antony Chazapis
            'delimiter': Return unique names before 'delimiter' and after 'prefix'
328 d50ed8d4 Sofia Papagiannaki

329 b956618e Antony Chazapis
            'marker': Start list from the next item after 'marker'
330 d50ed8d4 Sofia Papagiannaki

331 b956618e Antony Chazapis
            'limit': Number of objects to return
332 d50ed8d4 Sofia Papagiannaki

333 f4b61e0c Antony Chazapis
            'virtual': If not set, the result will only include names starting
334 f4b61e0c Antony Chazapis
                       with 'prefix' and ending without a 'delimiter' or with
335 f4b61e0c Antony Chazapis
                       the first occurance of the 'delimiter' after 'prefix'.
336 f4b61e0c Antony Chazapis
                       If set, the result will include all names after 'prefix',
337 3f839f59 Antony Chazapis
                       up to and including the 'delimiter' if it is found
338 d50ed8d4 Sofia Papagiannaki

339 cb69c154 Antony Chazapis
            'domain': Metadata domain for keys
340 d50ed8d4 Sofia Papagiannaki

341 95d47e1a Antony Chazapis
            'keys': Include objects that satisfy the key queries in the list.
342 95d47e1a Antony Chazapis
                    Use 'key', '!key' for existence queries, 'key op value' for
343 4e5673a0 Antony Chazapis
                    value queries, where 'op' can be one of =, !=, <=, >=, <, >
344 d50ed8d4 Sofia Papagiannaki

345 b18ef3ad Antony Chazapis
            'shared': Only list objects with permissions set
346 d50ed8d4 Sofia Papagiannaki

347 7ff57991 Antony Chazapis
            'size_range': Include objects with byte size in (from, to).
348 7ff57991 Antony Chazapis
                          Use None to specify unlimited
349 d50ed8d4 Sofia Papagiannaki

350 4d15c94e Sofia Papagiannaki
            'public': Only list public objects
351 d50ed8d4 Sofia Papagiannaki

352 d50ed8d4 Sofia Papagiannaki

353 22dab079 Antony Chazapis
        Raises:
354 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
355 d50ed8d4 Sofia Papagiannaki

356 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
357 22dab079 Antony Chazapis
        """
358 22dab079 Antony Chazapis
        return []
359 d50ed8d4 Sofia Papagiannaki
360 78348987 Sofia Papagiannaki
    def list_object_meta(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=None, shared=False, until=None, size_range=None):
361 371d907a Antony Chazapis
        """Return a list of object metadata dicts existing under a container.
362 d50ed8d4 Sofia Papagiannaki

363 371d907a Antony Chazapis
        Same parameters with list_objects. Returned dicts have no user-defined
364 371d907a Antony Chazapis
        metadata and, if until is not None, a None 'modified' timestamp.
365 d50ed8d4 Sofia Papagiannaki

366 15a96c3e Antony Chazapis
        Raises:
367 15a96c3e Antony Chazapis
            NotAllowedError: Operation not permitted
368 d50ed8d4 Sofia Papagiannaki

369 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
370 b956618e Antony Chazapis
        """
371 b956618e Antony Chazapis
        return []
372 d50ed8d4 Sofia Papagiannaki
373 15a96c3e Antony Chazapis
    def list_object_permissions(self, user, account, container, prefix=''):
374 15a96c3e Antony Chazapis
        """Return a list of paths that enforce permissions under a container.
375 d50ed8d4 Sofia Papagiannaki

376 15a96c3e Antony Chazapis
        Raises:
377 15a96c3e Antony Chazapis
            NotAllowedError: Operation not permitted
378 15a96c3e Antony Chazapis
        """
379 15a96c3e Antony Chazapis
        return []
380 d50ed8d4 Sofia Papagiannaki
381 15a96c3e Antony Chazapis
    def list_object_public(self, user, account, container, prefix=''):
382 15a96c3e Antony Chazapis
        """Return a dict mapping paths to public ids for objects that are public under a container."""
383 15a96c3e Antony Chazapis
        return {}
384 d50ed8d4 Sofia Papagiannaki
385 82482e2c Antony Chazapis
    def get_object_meta(self, user, account, container, name, domain, version=None, include_user_defined=True):
386 cb69c154 Antony Chazapis
        """Return a dictionary with the object metadata for the domain.
387 d50ed8d4 Sofia Papagiannaki

388 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
389 58a6c894 Antony Chazapis
            'name': The object name
390 d50ed8d4 Sofia Papagiannaki

391 b956618e Antony Chazapis
            'bytes': The total data size
392 d50ed8d4 Sofia Papagiannaki

393 66ce2ca5 Antony Chazapis
            'type': The content type
394 d50ed8d4 Sofia Papagiannaki

395 4a1c29ea Antony Chazapis
            'hash': The hashmap hash
396 d50ed8d4 Sofia Papagiannaki

397 58a6c894 Antony Chazapis
            'modified': Last modification timestamp (overall)
398 d50ed8d4 Sofia Papagiannaki

399 104626e3 Antony Chazapis
            'modified_by': The user that committed the object (version requested)
400 d50ed8d4 Sofia Papagiannaki

401 58a6c894 Antony Chazapis
            'version': The version identifier
402 d50ed8d4 Sofia Papagiannaki

403 58a6c894 Antony Chazapis
            'version_timestamp': The version's modification timestamp
404 d50ed8d4 Sofia Papagiannaki

405 25ae8b75 Antony Chazapis
            'uuid': A unique identifier that persists data or metadata updates and renames
406 d50ed8d4 Sofia Papagiannaki

407 33b4e4a6 Antony Chazapis
            'checksum': The MD5 sum of the object (may be empty)
408 d50ed8d4 Sofia Papagiannaki

409 b956618e Antony Chazapis
        Raises:
410 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
411 d50ed8d4 Sofia Papagiannaki

412 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
413 d50ed8d4 Sofia Papagiannaki

414 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
415 b956618e Antony Chazapis
        """
416 b956618e Antony Chazapis
        return {}
417 d50ed8d4 Sofia Papagiannaki
418 cb69c154 Antony Chazapis
    def update_object_meta(self, user, account, container, name, domain, meta, replace=False):
419 cb69c154 Antony Chazapis
        """Update the metadata associated with the object for the domain and return the new version.
420 d50ed8d4 Sofia Papagiannaki

421 b956618e Antony Chazapis
        Parameters:
422 cb69c154 Antony Chazapis
            'domain': Metadata domain
423 d50ed8d4 Sofia Papagiannaki

424 a6eb13e9 Antony Chazapis
            'meta': Dictionary with metadata to update
425 d50ed8d4 Sofia Papagiannaki

426 22dab079 Antony Chazapis
            'replace': Replace instead of update
427 d50ed8d4 Sofia Papagiannaki

428 b956618e Antony Chazapis
        Raises:
429 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
430 d50ed8d4 Sofia Papagiannaki

431 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
432 b956618e Antony Chazapis
        """
433 02c4d2ba Antony Chazapis
        return ''
434 d50ed8d4 Sofia Papagiannaki
435 3436eeb0 Antony Chazapis
    def get_object_permissions(self, user, account, container, name):
436 067cf1fc Antony Chazapis
        """Return the action allowed on the object, the path
437 067cf1fc Antony Chazapis
        from which the object gets its permissions from,
438 cca6c617 Antony Chazapis
        along with a dictionary containing the permissions.
439 d50ed8d4 Sofia Papagiannaki

440 067cf1fc Antony Chazapis
        The dictionary keys are (also used for defining the action):
441 3436eeb0 Antony Chazapis
            'read': The object is readable by the users/groups in the list
442 d50ed8d4 Sofia Papagiannaki

443 3436eeb0 Antony Chazapis
            'write': The object is writable by the users/groups in the list
444 d50ed8d4 Sofia Papagiannaki

445 3436eeb0 Antony Chazapis
        Raises:
446 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
447 d50ed8d4 Sofia Papagiannaki

448 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
449 3436eeb0 Antony Chazapis
        """
450 3436eeb0 Antony Chazapis
        return {}
451 d50ed8d4 Sofia Papagiannaki
452 3436eeb0 Antony Chazapis
    def update_object_permissions(self, user, account, container, name, permissions):
453 345dcf39 Antony Chazapis
        """Update (set) the permissions associated with the object.
454 d50ed8d4 Sofia Papagiannaki

455 3436eeb0 Antony Chazapis
        Parameters:
456 345dcf39 Antony Chazapis
            'permissions': Dictionary with permissions to set
457 d50ed8d4 Sofia Papagiannaki

458 3436eeb0 Antony Chazapis
        Raises:
459 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
460 d50ed8d4 Sofia Papagiannaki

461 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
462 d50ed8d4 Sofia Papagiannaki

463 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
464 3436eeb0 Antony Chazapis
        """
465 3436eeb0 Antony Chazapis
        return
466 d50ed8d4 Sofia Papagiannaki
467 02c0c3fa Antony Chazapis
    def get_object_public(self, user, account, container, name):
468 bb4eafc6 Antony Chazapis
        """Return the public id of the object if applicable.
469 d50ed8d4 Sofia Papagiannaki

470 02c0c3fa Antony Chazapis
        Raises:
471 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
472 d50ed8d4 Sofia Papagiannaki

473 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
474 02c0c3fa Antony Chazapis
        """
475 02c0c3fa Antony Chazapis
        return None
476 d50ed8d4 Sofia Papagiannaki
477 02c0c3fa Antony Chazapis
    def update_object_public(self, user, account, container, name, public):
478 02c0c3fa Antony Chazapis
        """Update the public status of the object.
479 d50ed8d4 Sofia Papagiannaki

480 02c0c3fa Antony Chazapis
        Parameters:
481 02c0c3fa Antony Chazapis
            'public': Boolean value
482 d50ed8d4 Sofia Papagiannaki

483 02c0c3fa Antony Chazapis
        Raises:
484 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
485 d50ed8d4 Sofia Papagiannaki

486 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
487 02c0c3fa Antony Chazapis
        """
488 02c0c3fa Antony Chazapis
        return
489 d50ed8d4 Sofia Papagiannaki
490 83dd59c5 Antony Chazapis
    def get_object_hashmap(self, user, account, container, name, version=None):
491 22dab079 Antony Chazapis
        """Return the object's size and a list with partial hashes.
492 d50ed8d4 Sofia Papagiannaki

493 b956618e Antony Chazapis
        Raises:
494 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
495 d50ed8d4 Sofia Papagiannaki

496 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
497 d50ed8d4 Sofia Papagiannaki

498 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
499 b956618e Antony Chazapis
        """
500 22dab079 Antony Chazapis
        return 0, []
501 d50ed8d4 Sofia Papagiannaki
502 78348987 Sofia Papagiannaki
    def update_object_hashmap(self, user, account, container, name, size, type, hashmap, checksum, domain, meta=None, replace_meta=False, permissions=None):
503 02c4d2ba Antony Chazapis
        """Create/update an object with the specified size and partial hashes and return the new version.
504 d50ed8d4 Sofia Papagiannaki

505 3436eeb0 Antony Chazapis
        Parameters:
506 cb69c154 Antony Chazapis
            'domain': Metadata domain
507 d50ed8d4 Sofia Papagiannaki

508 cb69c154 Antony Chazapis
            'meta': Dictionary with metadata to change
509 d50ed8d4 Sofia Papagiannaki

510 3436eeb0 Antony Chazapis
            'replace_meta': Replace metadata instead of update
511 d50ed8d4 Sofia Papagiannaki

512 3436eeb0 Antony Chazapis
            'permissions': Updated object permissions
513 d50ed8d4 Sofia Papagiannaki

514 b956618e Antony Chazapis
        Raises:
515 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
516 d50ed8d4 Sofia Papagiannaki

517 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
518 d50ed8d4 Sofia Papagiannaki

519 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
520 d50ed8d4 Sofia Papagiannaki

521 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
522 b956618e Antony Chazapis
        """
523 02c4d2ba Antony Chazapis
        return ''
524 d50ed8d4 Sofia Papagiannaki
525 33b4e4a6 Antony Chazapis
    def update_object_checksum(self, user, account, container, name, version, checksum):
526 33b4e4a6 Antony Chazapis
        """Update an object's checksum."""
527 33b4e4a6 Antony Chazapis
        return
528 d50ed8d4 Sofia Papagiannaki
529 78348987 Sofia Papagiannaki
    def copy_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta=None, replace_meta=False, permissions=None, src_version=None, delimiter=None):
530 02c4d2ba Antony Chazapis
        """Copy an object's data and metadata and return the new version.
531 d50ed8d4 Sofia Papagiannaki

532 b956618e Antony Chazapis
        Parameters:
533 cb69c154 Antony Chazapis
            'domain': Metadata domain
534 d50ed8d4 Sofia Papagiannaki

535 cb69c154 Antony Chazapis
            'meta': Dictionary with metadata to change from source to destination
536 d50ed8d4 Sofia Papagiannaki

537 22dab079 Antony Chazapis
            'replace_meta': Replace metadata instead of update
538 d50ed8d4 Sofia Papagiannaki

539 3436eeb0 Antony Chazapis
            'permissions': New object permissions
540 d50ed8d4 Sofia Papagiannaki

541 3436eeb0 Antony Chazapis
            'src_version': Copy from the version provided
542 d50ed8d4 Sofia Papagiannaki

543 4d15c94e Sofia Papagiannaki
            'delimiter': Copy objects whose path starts with src_name + delimiter
544 d50ed8d4 Sofia Papagiannaki

545 b956618e Antony Chazapis
        Raises:
546 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
547 d50ed8d4 Sofia Papagiannaki

548 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
549 d50ed8d4 Sofia Papagiannaki

550 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
551 d50ed8d4 Sofia Papagiannaki

552 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
553 d50ed8d4 Sofia Papagiannaki

554 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
555 b956618e Antony Chazapis
        """
556 02c4d2ba Antony Chazapis
        return ''
557 d50ed8d4 Sofia Papagiannaki
558 78348987 Sofia Papagiannaki
    def move_object(self, user, src_account, src_container, src_name, dest_account, dest_container, dest_name, type, domain, meta=None, replace_meta=False, permissions=None, delimiter=None):
559 02c4d2ba Antony Chazapis
        """Move an object's data and metadata and return the new version.
560 d50ed8d4 Sofia Papagiannaki

561 b956618e Antony Chazapis
        Parameters:
562 cb69c154 Antony Chazapis
            'domain': Metadata domain
563 d50ed8d4 Sofia Papagiannaki

564 cb69c154 Antony Chazapis
            'meta': Dictionary with metadata to change from source to destination
565 d50ed8d4 Sofia Papagiannaki

566 22dab079 Antony Chazapis
            'replace_meta': Replace metadata instead of update
567 d50ed8d4 Sofia Papagiannaki

568 3436eeb0 Antony Chazapis
            'permissions': New object permissions
569 d50ed8d4 Sofia Papagiannaki

570 4d15c94e Sofia Papagiannaki
            'delimiter': Move objects whose path starts with src_name + delimiter
571 d50ed8d4 Sofia Papagiannaki

572 b956618e Antony Chazapis
        Raises:
573 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
574 d50ed8d4 Sofia Papagiannaki

575 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
576 d50ed8d4 Sofia Papagiannaki

577 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
578 d50ed8d4 Sofia Papagiannaki

579 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
580 b956618e Antony Chazapis
        """
581 02c4d2ba Antony Chazapis
        return ''
582 d50ed8d4 Sofia Papagiannaki
583 4d15c94e Sofia Papagiannaki
    def delete_object(self, user, account, container, name, until=None, delimiter=None):
584 84846143 Antony Chazapis
        """Delete/purge an object.
585 d50ed8d4 Sofia Papagiannaki

586 4d15c94e Sofia Papagiannaki
        Parameters:
587 4d15c94e Sofia Papagiannaki
            'delimiter': Delete objects whose path starting with name + delimiter
588 d50ed8d4 Sofia Papagiannaki

589 b956618e Antony Chazapis
        Raises:
590 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
591 d50ed8d4 Sofia Papagiannaki

592 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
593 b956618e Antony Chazapis
        """
594 b956618e Antony Chazapis
        return
595 d50ed8d4 Sofia Papagiannaki
596 83dd59c5 Antony Chazapis
    def list_versions(self, user, account, container, name):
597 cca6c617 Antony Chazapis
        """Return a list of all (version, version_timestamp) tuples for an object.
598 d50ed8d4 Sofia Papagiannaki

599 cca6c617 Antony Chazapis
        Raises:
600 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
601 cca6c617 Antony Chazapis
        """
602 58a6c894 Antony Chazapis
        return []
603 d50ed8d4 Sofia Papagiannaki
604 37bee317 Antony Chazapis
    def get_uuid(self, user, uuid):
605 37bee317 Antony Chazapis
        """Return the (account, container, name) for the UUID given.
606 d50ed8d4 Sofia Papagiannaki

607 37bee317 Antony Chazapis
        Raises:
608 37bee317 Antony Chazapis
            NotAllowedError: Operation not permitted
609 d50ed8d4 Sofia Papagiannaki

610 37bee317 Antony Chazapis
            NameError: UUID does not exist
611 37bee317 Antony Chazapis
        """
612 37bee317 Antony Chazapis
        return None
613 d50ed8d4 Sofia Papagiannaki
614 bb4eafc6 Antony Chazapis
    def get_public(self, user, public):
615 bb4eafc6 Antony Chazapis
        """Return the (account, container, name) for the public id given.
616 d50ed8d4 Sofia Papagiannaki

617 bb4eafc6 Antony Chazapis
        Raises:
618 bb4eafc6 Antony Chazapis
            NotAllowedError: Operation not permitted
619 d50ed8d4 Sofia Papagiannaki

620 bb4eafc6 Antony Chazapis
            NameError: Public id does not exist
621 bb4eafc6 Antony Chazapis
        """
622 bb4eafc6 Antony Chazapis
        return None
623 d50ed8d4 Sofia Papagiannaki
624 22dab079 Antony Chazapis
    def get_block(self, hash):
625 22dab079 Antony Chazapis
        """Return a block's data.
626 d50ed8d4 Sofia Papagiannaki

627 22dab079 Antony Chazapis
        Raises:
628 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Block does not exist
629 22dab079 Antony Chazapis
        """
630 22dab079 Antony Chazapis
        return ''
631 d50ed8d4 Sofia Papagiannaki
632 22dab079 Antony Chazapis
    def put_block(self, data):
633 22dab079 Antony Chazapis
        """Store a block and return the hash."""
634 22dab079 Antony Chazapis
        return 0
635 d50ed8d4 Sofia Papagiannaki
636 22dab079 Antony Chazapis
    def update_block(self, hash, data, offset=0):
637 22dab079 Antony Chazapis
        """Update a known block and return the hash.
638 d50ed8d4 Sofia Papagiannaki

639 22dab079 Antony Chazapis
        Raises:
640 22dab079 Antony Chazapis
            IndexError: Offset or data outside block limits
641 22dab079 Antony Chazapis
        """
642 22dab079 Antony Chazapis
        return 0