Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / base.py @ 78e1f8da

History | View | Annotate | Download (21.2 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 cca6c617 Antony Chazapis
class NotAllowedError(Exception):
41 cca6c617 Antony Chazapis
    pass
42 cca6c617 Antony Chazapis
43 d50ed8d4 Sofia Papagiannaki
44 5df6c6d1 Antony Chazapis
class QuotaError(Exception):
45 5df6c6d1 Antony Chazapis
    pass
46 5df6c6d1 Antony Chazapis
47 d50ed8d4 Sofia Papagiannaki
48 7efc9f86 Sofia Papagiannaki
class AccountExists(NameError):
49 7efc9f86 Sofia Papagiannaki
    pass
50 d50ed8d4 Sofia Papagiannaki
51 d50ed8d4 Sofia Papagiannaki
52 7efc9f86 Sofia Papagiannaki
class ContainerExists(NameError):
53 7efc9f86 Sofia Papagiannaki
    pass
54 7efc9f86 Sofia Papagiannaki
55 d50ed8d4 Sofia Papagiannaki
56 7efc9f86 Sofia Papagiannaki
class AccountNotEmpty(IndexError):
57 7efc9f86 Sofia Papagiannaki
    pass
58 7efc9f86 Sofia Papagiannaki
59 d50ed8d4 Sofia Papagiannaki
60 7efc9f86 Sofia Papagiannaki
class ContainerNotEmpty(IndexError):
61 7efc9f86 Sofia Papagiannaki
    pass
62 7efc9f86 Sofia Papagiannaki
63 d50ed8d4 Sofia Papagiannaki
64 7efc9f86 Sofia Papagiannaki
class ItemNotExists(NameError):
65 7efc9f86 Sofia Papagiannaki
    pass
66 7efc9f86 Sofia Papagiannaki
67 d50ed8d4 Sofia Papagiannaki
68 7efc9f86 Sofia Papagiannaki
class VersionNotExists(IndexError):
69 7efc9f86 Sofia Papagiannaki
    pass
70 7efc9f86 Sofia Papagiannaki
71 3a5994a8 Sofia Papagiannaki
class InvalidHash(TypeError):
72 3a5994a8 Sofia Papagiannaki
    pass
73 d50ed8d4 Sofia Papagiannaki
74 8ee4ec50 Vangelis Koukis
class BaseBackend(object):
75 29148653 Sofia Papagiannaki
    """Abstract backend class.
76 29148653 Sofia Papagiannaki

77 29148653 Sofia Papagiannaki
    This class serves as a reference for actual implementations.
78 d50ed8d4 Sofia Papagiannaki

79 29148653 Sofia Papagiannaki
    The purpose of the backend is to provide the necessary functions
80 29148653 Sofia Papagiannaki
    for handling data and metadata.
81 d50ed8d4 Sofia Papagiannaki

82 29148653 Sofia Papagiannaki
    It is responsible for the actual storage and retrieval of information.
83 d50ed8d4 Sofia Papagiannaki

84 29148653 Sofia Papagiannaki
    Note that the account level is always valid as it is checked
85 29148653 Sofia Papagiannaki
    from another subsystem.
86 29148653 Sofia Papagiannaki

87 29148653 Sofia Papagiannaki
    When not replacing metadata/groups/policy, keys with empty values
88 29148653 Sofia Papagiannaki
    should be deleted.
89 d50ed8d4 Sofia Papagiannaki

90 22dab079 Antony Chazapis
    The following variables should be available:
91 22dab079 Antony Chazapis
        'hash_algorithm': Suggested is 'sha256'
92 d50ed8d4 Sofia Papagiannaki

93 22dab079 Antony Chazapis
        'block_size': Suggested is 4MB
94 d50ed8d4 Sofia Papagiannaki

95 29148653 Sofia Papagiannaki
        'default_account_policy': A dictionary with default account policy
96 29148653 Sofia Papagiannaki
                                  settings
97 29148653 Sofia Papagiannaki
        'default_container_policy': A dictionary with default container policy
98 29148653 Sofia Papagiannaki
                                    settings
99 b956618e Antony Chazapis
    """
100 d50ed8d4 Sofia Papagiannaki
101 d14fe290 Antony Chazapis
    def close(self):
102 d14fe290 Antony Chazapis
        """Close the backend connection."""
103 d14fe290 Antony Chazapis
        pass
104 d50ed8d4 Sofia Papagiannaki
105 f6c97079 Antony Chazapis
    def list_accounts(self, user, marker=None, limit=10000):
106 f6c97079 Antony Chazapis
        """Return a list of accounts the user can access.
107 d50ed8d4 Sofia Papagiannaki

108 29148653 Sofia Papagiannaki
        Keyword arguments:
109 f6c97079 Antony Chazapis
            'marker': Start list from the next item after 'marker'
110 d50ed8d4 Sofia Papagiannaki

111 f6c97079 Antony Chazapis
            'limit': Number of containers to return
112 f6c97079 Antony Chazapis
        """
113 f6c97079 Antony Chazapis
        return []
114 d50ed8d4 Sofia Papagiannaki
115 78e1f8da Sofia Papagiannaki
    def get_account_meta(self, user, account, domain=None, until=None,
116 78e1f8da Sofia Papagiannaki
                         include_user_defined=True):
117 cb69c154 Antony Chazapis
        """Return a dictionary with the account metadata for the domain.
118 d50ed8d4 Sofia Papagiannaki

119 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
120 b956618e Antony Chazapis
            'name': The account name
121 d50ed8d4 Sofia Papagiannaki

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

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

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

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

130 cca6c617 Antony Chazapis
        Raises:
131 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
132 78e1f8da Sofia Papagiannaki

133 78e1f8da Sofia Papagiannaki
            ValueError: if domain is None and include_user_defined==True
134 b956618e Antony Chazapis
        """
135 b956618e Antony Chazapis
        return {}
136 d50ed8d4 Sofia Papagiannaki
137 cb69c154 Antony Chazapis
    def update_account_meta(self, user, account, domain, meta, replace=False):
138 cb69c154 Antony Chazapis
        """Update the metadata associated with the account for the domain.
139 d50ed8d4 Sofia Papagiannaki

140 b956618e Antony Chazapis
        Parameters:
141 cb69c154 Antony Chazapis
            'domain': Metadata domain
142 d50ed8d4 Sofia Papagiannaki

143 29148653 Sofia Papagiannaki
        Keyword arguments:
144 b956618e Antony Chazapis
            'meta': Dictionary with metadata to update
145 d50ed8d4 Sofia Papagiannaki

146 22dab079 Antony Chazapis
            'replace': Replace instead of update
147 d50ed8d4 Sofia Papagiannaki

148 cca6c617 Antony Chazapis
        Raises:
149 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
150 b956618e Antony Chazapis
        """
151 b956618e Antony Chazapis
        return
152 d50ed8d4 Sofia Papagiannaki
153 02c0c3fa Antony Chazapis
    def get_account_groups(self, user, account):
154 29148653 Sofia Papagiannaki
        """Return a dictionary with the user groups defined for the account.
155 d50ed8d4 Sofia Papagiannaki

156 cca6c617 Antony Chazapis
        Raises:
157 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
158 58a6c894 Antony Chazapis
        """
159 02c0c3fa Antony Chazapis
        return {}
160 d50ed8d4 Sofia Papagiannaki
161 02c0c3fa Antony Chazapis
    def update_account_groups(self, user, account, groups, replace=False):
162 02c0c3fa Antony Chazapis
        """Update the groups associated with the account.
163 d50ed8d4 Sofia Papagiannaki

164 b956618e Antony Chazapis
        Raises:
165 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
166 d50ed8d4 Sofia Papagiannaki

167 02c0c3fa Antony Chazapis
            ValueError: Invalid data in groups
168 b956618e Antony Chazapis
        """
169 b956618e Antony Chazapis
        return
170 d50ed8d4 Sofia Papagiannaki
171 b2832c6a Antony Chazapis
    def get_account_policy(self, user, account):
172 b2832c6a Antony Chazapis
        """Return a dictionary with the account policy.
173 d50ed8d4 Sofia Papagiannaki

174 b2832c6a Antony Chazapis
        The keys returned are:
175 b2832c6a Antony Chazapis
            'quota': The maximum bytes allowed (default is 0 - unlimited)
176 d50ed8d4 Sofia Papagiannaki

177 29148653 Sofia Papagiannaki
            'versioning': Can be 'auto', 'manual' or 'none' (default: 'manual')
178 d50ed8d4 Sofia Papagiannaki

179 b2832c6a Antony Chazapis
        Raises:
180 b2832c6a Antony Chazapis
            NotAllowedError: Operation not permitted
181 b2832c6a Antony Chazapis
        """
182 b2832c6a Antony Chazapis
        return {}
183 d50ed8d4 Sofia Papagiannaki
184 b2832c6a Antony Chazapis
    def update_account_policy(self, user, account, policy, replace=False):
185 b2832c6a Antony Chazapis
        """Update the policy associated with the account.
186 d50ed8d4 Sofia Papagiannaki

187 b2832c6a Antony Chazapis
        Raises:
188 b2832c6a Antony Chazapis
            NotAllowedError: Operation not permitted
189 d50ed8d4 Sofia Papagiannaki

190 b2832c6a Antony Chazapis
            ValueError: Invalid policy defined
191 b2832c6a Antony Chazapis
        """
192 b2832c6a Antony Chazapis
        return
193 d50ed8d4 Sofia Papagiannaki
194 78348987 Sofia Papagiannaki
    def put_account(self, user, account, policy=None):
195 a9b3f29d Antony Chazapis
        """Create a new account with the given name.
196 d50ed8d4 Sofia Papagiannaki

197 a9b3f29d Antony Chazapis
        Raises:
198 a9b3f29d Antony Chazapis
            NotAllowedError: Operation not permitted
199 d50ed8d4 Sofia Papagiannaki

200 b2832c6a Antony Chazapis
            ValueError: Invalid policy defined
201 a9b3f29d Antony Chazapis
        """
202 a9b3f29d Antony Chazapis
        return
203 d50ed8d4 Sofia Papagiannaki
204 02c0c3fa Antony Chazapis
    def delete_account(self, user, account):
205 02c0c3fa Antony Chazapis
        """Delete the account with the given name.
206 d50ed8d4 Sofia Papagiannaki

207 b956618e Antony Chazapis
        Raises:
208 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
209 d50ed8d4 Sofia Papagiannaki

210 7efc9f86 Sofia Papagiannaki
            AccountNotEmpty: Account is not empty
211 b956618e Antony Chazapis
        """
212 b956618e Antony Chazapis
        return
213 d50ed8d4 Sofia Papagiannaki
214 29148653 Sofia Papagiannaki
    def list_containers(self, user, account, marker=None, limit=10000,
215 29148653 Sofia Papagiannaki
                        shared=False, until=None, public=False):
216 f6c97079 Antony Chazapis
        """Return a list of container names existing under an account.
217 d50ed8d4 Sofia Papagiannaki

218 29148653 Sofia Papagiannaki
        Keyword arguments:
219 02c0c3fa Antony Chazapis
            'marker': Start list from the next item after 'marker'
220 d50ed8d4 Sofia Papagiannaki

221 02c0c3fa Antony Chazapis
            'limit': Number of containers to return
222 d50ed8d4 Sofia Papagiannaki

223 b18ef3ad Antony Chazapis
            'shared': Only list containers with permissions set
224 d50ed8d4 Sofia Papagiannaki

225 4d15c94e Sofia Papagiannaki
            'public': Only list containers containing public objects
226 d50ed8d4 Sofia Papagiannaki

227 d50ed8d4 Sofia Papagiannaki

228 02c0c3fa Antony Chazapis
        Raises:
229 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
230 02c0c3fa Antony Chazapis
        """
231 02c0c3fa Antony Chazapis
        return []
232 d50ed8d4 Sofia Papagiannaki
233 29148653 Sofia Papagiannaki
    def list_container_meta(self, user, account, container, domain,
234 29148653 Sofia Papagiannaki
                            until=None):
235 29148653 Sofia Papagiannaki
        """Return a list of the container's object meta keys for a domain.
236 d50ed8d4 Sofia Papagiannaki

237 371d907a Antony Chazapis
        Raises:
238 371d907a Antony Chazapis
            NotAllowedError: Operation not permitted
239 d50ed8d4 Sofia Papagiannaki

240 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
241 371d907a Antony Chazapis
        """
242 371d907a Antony Chazapis
        return []
243 d50ed8d4 Sofia Papagiannaki
244 78e1f8da Sofia Papagiannaki
    def get_container_meta(self, user, account, container, domain=None, until=None,
245 29148653 Sofia Papagiannaki
                           include_user_defined=True):
246 cb69c154 Antony Chazapis
        """Return a dictionary with the container metadata for the domain.
247 d50ed8d4 Sofia Papagiannaki

248 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
249 b956618e Antony Chazapis
            'name': The container name
250 d50ed8d4 Sofia Papagiannaki

251 b956618e Antony Chazapis
            'count': The number of objects
252 d50ed8d4 Sofia Papagiannaki

253 b956618e Antony Chazapis
            'bytes': The total data size
254 d50ed8d4 Sofia Papagiannaki

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

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

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

262 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
263 78e1f8da Sofia Papagiannaki

264 78e1f8da Sofia Papagiannaki
            ValueError: if domain is None and include_user_defined==True
265 b956618e Antony Chazapis
        """
266 b956618e Antony Chazapis
        return {}
267 d50ed8d4 Sofia Papagiannaki
268 29148653 Sofia Papagiannaki
    def update_container_meta(self, user, account, container, domain, meta,
269 29148653 Sofia Papagiannaki
                              replace=False):
270 cb69c154 Antony Chazapis
        """Update the metadata associated with the container for the domain.
271 d50ed8d4 Sofia Papagiannaki

272 b956618e Antony Chazapis
        Parameters:
273 cb69c154 Antony Chazapis
            'domain': Metadata domain
274 d50ed8d4 Sofia Papagiannaki

275 29148653 Sofia Papagiannaki
        Keyword arguments:
276 b956618e Antony Chazapis
            'meta': Dictionary with metadata to update
277 d50ed8d4 Sofia Papagiannaki

278 22dab079 Antony Chazapis
            'replace': Replace instead of update
279 d50ed8d4 Sofia Papagiannaki

280 b956618e Antony Chazapis
        Raises:
281 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
282 d50ed8d4 Sofia Papagiannaki

283 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
284 b956618e Antony Chazapis
        """
285 b956618e Antony Chazapis
        return
286 d50ed8d4 Sofia Papagiannaki
287 02c0c3fa Antony Chazapis
    def get_container_policy(self, user, account, container):
288 02c0c3fa Antony Chazapis
        """Return a dictionary with the container policy.
289 d50ed8d4 Sofia Papagiannaki

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

293 29148653 Sofia Papagiannaki
            'versioning': Can be 'auto', 'manual' or 'none' (default: 'manual')
294 d50ed8d4 Sofia Papagiannaki

295 02c0c3fa Antony Chazapis
        Raises:
296 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
297 d50ed8d4 Sofia Papagiannaki

298 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
299 02c0c3fa Antony Chazapis
        """
300 02c0c3fa Antony Chazapis
        return {}
301 d50ed8d4 Sofia Papagiannaki
302 29148653 Sofia Papagiannaki
    def update_container_policy(self, user, account, container, policy,
303 29148653 Sofia Papagiannaki
                                replace=False):
304 b2832c6a Antony Chazapis
        """Update the policy associated with the container.
305 d50ed8d4 Sofia Papagiannaki

306 02c0c3fa Antony Chazapis
        Raises:
307 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
308 d50ed8d4 Sofia Papagiannaki

309 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
310 d50ed8d4 Sofia Papagiannaki

311 02c0c3fa Antony Chazapis
            ValueError: Invalid policy defined
312 02c0c3fa Antony Chazapis
        """
313 02c0c3fa Antony Chazapis
        return
314 d50ed8d4 Sofia Papagiannaki
315 29148653 Sofia Papagiannaki
    def put_container(self, user, account, container, policy=None):
316 02c0c3fa Antony Chazapis
        """Create a new container with the given name.
317 d50ed8d4 Sofia Papagiannaki

318 02c0c3fa Antony Chazapis
        Raises:
319 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
320 d50ed8d4 Sofia Papagiannaki

321 7efc9f86 Sofia Papagiannaki
            ContainerExists: Container already exists
322 d50ed8d4 Sofia Papagiannaki

323 02c0c3fa Antony Chazapis
            ValueError: Invalid policy defined
324 02c0c3fa Antony Chazapis
        """
325 02c0c3fa Antony Chazapis
        return
326 d50ed8d4 Sofia Papagiannaki
327 29148653 Sofia Papagiannaki
    def delete_container(self, user, account, container, until=None,
328 29148653 Sofia Papagiannaki
                         delimiter=None):
329 84846143 Antony Chazapis
        """Delete/purge the container with the given name.
330 d50ed8d4 Sofia Papagiannaki

331 29148653 Sofia Papagiannaki
        Keyword arguments:
332 29148653 Sofia Papagiannaki
            'delimiter': If not None, deletes the container contents starting
333 29148653 Sofia Papagiannaki
                         with the delimiter
334 29148653 Sofia Papagiannaki

335 02c0c3fa Antony Chazapis
        Raises:
336 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
337 d50ed8d4 Sofia Papagiannaki

338 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
339 d50ed8d4 Sofia Papagiannaki

340 7efc9f86 Sofia Papagiannaki
            ContainerNotEmpty: Container is not empty
341 02c0c3fa Antony Chazapis
        """
342 02c0c3fa Antony Chazapis
        return
343 d50ed8d4 Sofia Papagiannaki
344 29148653 Sofia Papagiannaki
    def list_objects(self, user, account, container, prefix='', delimiter=None,
345 29148653 Sofia Papagiannaki
                     marker=None, limit=10000, virtual=True, domain=None,
346 29148653 Sofia Papagiannaki
                     keys=None, shared=False, until=None, size_range=None,
347 29148653 Sofia Papagiannaki
                     public=False):
348 29148653 Sofia Papagiannaki
        """List (object name, object version_id) under a container.
349 d50ed8d4 Sofia Papagiannaki

350 29148653 Sofia Papagiannaki
        Keyword arguments:
351 b956618e Antony Chazapis
            'prefix': List objects starting with 'prefix'
352 d50ed8d4 Sofia Papagiannaki

353 29148653 Sofia Papagiannaki
            'delimiter': Return unique names before 'delimiter' and
354 29148653 Sofia Papagiannaki
                         after 'prefix'
355 d50ed8d4 Sofia Papagiannaki

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

358 b956618e Antony Chazapis
            'limit': Number of objects to return
359 d50ed8d4 Sofia Papagiannaki

360 f4b61e0c Antony Chazapis
            'virtual': If not set, the result will only include names starting
361 f4b61e0c Antony Chazapis
                       with 'prefix' and ending without a 'delimiter' or with
362 f4b61e0c Antony Chazapis
                       the first occurance of the 'delimiter' after 'prefix'.
363 29148653 Sofia Papagiannaki
                       If set, the result will include all names after 'prefix'
364 3f839f59 Antony Chazapis
                       up to and including the 'delimiter' if it is found
365 d50ed8d4 Sofia Papagiannaki

366 cb69c154 Antony Chazapis
            'domain': Metadata domain for keys
367 d50ed8d4 Sofia Papagiannaki

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

372 b18ef3ad Antony Chazapis
            'shared': Only list objects with permissions set
373 d50ed8d4 Sofia Papagiannaki

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

377 4d15c94e Sofia Papagiannaki
            'public': Only list public objects
378 d50ed8d4 Sofia Papagiannaki

379 d50ed8d4 Sofia Papagiannaki

380 22dab079 Antony Chazapis
        Raises:
381 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
382 d50ed8d4 Sofia Papagiannaki

383 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
384 22dab079 Antony Chazapis
        """
385 22dab079 Antony Chazapis
        return []
386 d50ed8d4 Sofia Papagiannaki
387 29148653 Sofia Papagiannaki
    def list_object_meta(self, user, account, container, prefix='',
388 29148653 Sofia Papagiannaki
                         delimiter=None, marker=None, limit=10000,
389 29148653 Sofia Papagiannaki
                         virtual=True, domain=None, keys=None, shared=False,
390 29148653 Sofia Papagiannaki
                         until=None, size_range=None, public=False):
391 29148653 Sofia Papagiannaki
        """Return a list of metadata dicts of objects under a container.
392 d50ed8d4 Sofia Papagiannaki

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

396 15a96c3e Antony Chazapis
        Raises:
397 15a96c3e Antony Chazapis
            NotAllowedError: Operation not permitted
398 d50ed8d4 Sofia Papagiannaki

399 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
400 b956618e Antony Chazapis
        """
401 b956618e Antony Chazapis
        return []
402 d50ed8d4 Sofia Papagiannaki
403 15a96c3e Antony Chazapis
    def list_object_permissions(self, user, account, container, prefix=''):
404 29148653 Sofia Papagiannaki
        """Return a list of paths enforce permissions under a container.
405 d50ed8d4 Sofia Papagiannaki

406 15a96c3e Antony Chazapis
        Raises:
407 15a96c3e Antony Chazapis
            NotAllowedError: Operation not permitted
408 15a96c3e Antony Chazapis
        """
409 15a96c3e Antony Chazapis
        return []
410 d50ed8d4 Sofia Papagiannaki
411 15a96c3e Antony Chazapis
    def list_object_public(self, user, account, container, prefix=''):
412 29148653 Sofia Papagiannaki
        """Return a mapping of object paths to public ids under a container."""
413 15a96c3e Antony Chazapis
        return {}
414 d50ed8d4 Sofia Papagiannaki
415 78e1f8da Sofia Papagiannaki
    def get_object_meta(self, user, account, container, name, domain=None,
416 29148653 Sofia Papagiannaki
                        version=None, include_user_defined=True):
417 cb69c154 Antony Chazapis
        """Return a dictionary with the object metadata for the domain.
418 d50ed8d4 Sofia Papagiannaki

419 b956618e Antony Chazapis
        The keys returned are all user-defined, except:
420 58a6c894 Antony Chazapis
            'name': The object name
421 d50ed8d4 Sofia Papagiannaki

422 b956618e Antony Chazapis
            'bytes': The total data size
423 d50ed8d4 Sofia Papagiannaki

424 66ce2ca5 Antony Chazapis
            'type': The content type
425 d50ed8d4 Sofia Papagiannaki

426 4a1c29ea Antony Chazapis
            'hash': The hashmap hash
427 d50ed8d4 Sofia Papagiannaki

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

430 29148653 Sofia Papagiannaki
            'modified_by': The user that committed the object
431 29148653 Sofia Papagiannaki
                           (version requested)
432 d50ed8d4 Sofia Papagiannaki

433 58a6c894 Antony Chazapis
            'version': The version identifier
434 d50ed8d4 Sofia Papagiannaki

435 58a6c894 Antony Chazapis
            'version_timestamp': The version's modification timestamp
436 d50ed8d4 Sofia Papagiannaki

437 29148653 Sofia Papagiannaki
            'uuid': A unique identifier that persists data or metadata updates
438 29148653 Sofia Papagiannaki
                    and renames
439 d50ed8d4 Sofia Papagiannaki

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

442 b956618e Antony Chazapis
        Raises:
443 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
444 d50ed8d4 Sofia Papagiannaki

445 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
446 d50ed8d4 Sofia Papagiannaki

447 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
448 78e1f8da Sofia Papagiannaki

449 78e1f8da Sofia Papagiannaki
            ValueError: if domain is None and include_user_defined==True
450 b956618e Antony Chazapis
        """
451 b956618e Antony Chazapis
        return {}
452 d50ed8d4 Sofia Papagiannaki
453 29148653 Sofia Papagiannaki
    def update_object_meta(self, user, account, container, name, domain, meta,
454 29148653 Sofia Papagiannaki
                           replace=False):
455 29148653 Sofia Papagiannaki
        """Update object metadata for a domain and return the new version.
456 d50ed8d4 Sofia Papagiannaki

457 b956618e Antony Chazapis
        Parameters:
458 cb69c154 Antony Chazapis
            'domain': Metadata domain
459 d50ed8d4 Sofia Papagiannaki

460 a6eb13e9 Antony Chazapis
            'meta': Dictionary with metadata to update
461 d50ed8d4 Sofia Papagiannaki

462 22dab079 Antony Chazapis
            'replace': Replace instead of update
463 d50ed8d4 Sofia Papagiannaki

464 b956618e Antony Chazapis
        Raises:
465 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
466 d50ed8d4 Sofia Papagiannaki

467 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
468 b956618e Antony Chazapis
        """
469 02c4d2ba Antony Chazapis
        return ''
470 d50ed8d4 Sofia Papagiannaki
471 3436eeb0 Antony Chazapis
    def get_object_permissions(self, user, account, container, name):
472 067cf1fc Antony Chazapis
        """Return the action allowed on the object, the path
473 067cf1fc Antony Chazapis
        from which the object gets its permissions from,
474 cca6c617 Antony Chazapis
        along with a dictionary containing the permissions.
475 d50ed8d4 Sofia Papagiannaki

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

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

481 3436eeb0 Antony Chazapis
        Raises:
482 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
483 d50ed8d4 Sofia Papagiannaki

484 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
485 3436eeb0 Antony Chazapis
        """
486 3436eeb0 Antony Chazapis
        return {}
487 d50ed8d4 Sofia Papagiannaki
488 29148653 Sofia Papagiannaki
    def update_object_permissions(self, user, account, container, name,
489 29148653 Sofia Papagiannaki
                                  permissions):
490 345dcf39 Antony Chazapis
        """Update (set) the permissions associated with the object.
491 d50ed8d4 Sofia Papagiannaki

492 3436eeb0 Antony Chazapis
        Parameters:
493 345dcf39 Antony Chazapis
            'permissions': Dictionary with permissions to set
494 d50ed8d4 Sofia Papagiannaki

495 3436eeb0 Antony Chazapis
        Raises:
496 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
497 d50ed8d4 Sofia Papagiannaki

498 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
499 d50ed8d4 Sofia Papagiannaki

500 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
501 3436eeb0 Antony Chazapis
        """
502 3436eeb0 Antony Chazapis
        return
503 d50ed8d4 Sofia Papagiannaki
504 02c0c3fa Antony Chazapis
    def get_object_public(self, user, account, container, name):
505 bb4eafc6 Antony Chazapis
        """Return the public id of the object if applicable.
506 d50ed8d4 Sofia Papagiannaki

507 02c0c3fa Antony Chazapis
        Raises:
508 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
509 d50ed8d4 Sofia Papagiannaki

510 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
511 02c0c3fa Antony Chazapis
        """
512 02c0c3fa Antony Chazapis
        return None
513 d50ed8d4 Sofia Papagiannaki
514 02c0c3fa Antony Chazapis
    def update_object_public(self, user, account, container, name, public):
515 02c0c3fa Antony Chazapis
        """Update the public status of the object.
516 d50ed8d4 Sofia Papagiannaki

517 02c0c3fa Antony Chazapis
        Parameters:
518 02c0c3fa Antony Chazapis
            'public': Boolean value
519 d50ed8d4 Sofia Papagiannaki

520 02c0c3fa Antony Chazapis
        Raises:
521 02c0c3fa Antony Chazapis
            NotAllowedError: Operation not permitted
522 d50ed8d4 Sofia Papagiannaki

523 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
524 02c0c3fa Antony Chazapis
        """
525 02c0c3fa Antony Chazapis
        return
526 d50ed8d4 Sofia Papagiannaki
527 83dd59c5 Antony Chazapis
    def get_object_hashmap(self, user, account, container, name, version=None):
528 22dab079 Antony Chazapis
        """Return the object's size and a list with partial hashes.
529 d50ed8d4 Sofia Papagiannaki

530 b956618e Antony Chazapis
        Raises:
531 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
532 d50ed8d4 Sofia Papagiannaki

533 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
534 d50ed8d4 Sofia Papagiannaki

535 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
536 b956618e Antony Chazapis
        """
537 22dab079 Antony Chazapis
        return 0, []
538 d50ed8d4 Sofia Papagiannaki
539 29148653 Sofia Papagiannaki
    def update_object_hashmap(self, user, account, container, name, size, type,
540 29148653 Sofia Papagiannaki
                              hashmap, checksum, domain, meta=None,
541 29148653 Sofia Papagiannaki
                              replace_meta=False, permissions=None):
542 29148653 Sofia Papagiannaki
        """Create/update an object's hashmap and return the new version.
543 d50ed8d4 Sofia Papagiannaki

544 3436eeb0 Antony Chazapis
        Parameters:
545 cb69c154 Antony Chazapis
            'domain': Metadata domain
546 d50ed8d4 Sofia Papagiannaki

547 cb69c154 Antony Chazapis
            'meta': Dictionary with metadata to change
548 d50ed8d4 Sofia Papagiannaki

549 3436eeb0 Antony Chazapis
            'replace_meta': Replace metadata instead of update
550 d50ed8d4 Sofia Papagiannaki

551 3436eeb0 Antony Chazapis
            'permissions': Updated object permissions
552 d50ed8d4 Sofia Papagiannaki

553 b956618e Antony Chazapis
        Raises:
554 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
555 d50ed8d4 Sofia Papagiannaki

556 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container does not exist
557 d50ed8d4 Sofia Papagiannaki

558 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
559 d50ed8d4 Sofia Papagiannaki

560 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
561 b956618e Antony Chazapis
        """
562 02c4d2ba Antony Chazapis
        return ''
563 d50ed8d4 Sofia Papagiannaki
564 29148653 Sofia Papagiannaki
    def update_object_checksum(self, user, account, container, name, version,
565 29148653 Sofia Papagiannaki
                               checksum):
566 33b4e4a6 Antony Chazapis
        """Update an object's checksum."""
567 33b4e4a6 Antony Chazapis
        return
568 d50ed8d4 Sofia Papagiannaki
569 29148653 Sofia Papagiannaki
    def copy_object(self, user, src_account, src_container, src_name,
570 29148653 Sofia Papagiannaki
                    dest_account, dest_container, dest_name, type, domain,
571 29148653 Sofia Papagiannaki
                    meta=None, replace_meta=False, permissions=None,
572 29148653 Sofia Papagiannaki
                    src_version=None, delimiter=None):
573 02c4d2ba Antony Chazapis
        """Copy an object's data and metadata and return the new version.
574 d50ed8d4 Sofia Papagiannaki

575 b956618e Antony Chazapis
        Parameters:
576 cb69c154 Antony Chazapis
            'domain': Metadata domain
577 d50ed8d4 Sofia Papagiannaki

578 29148653 Sofia Papagiannaki
            'meta': Dictionary with metadata to change from source
579 29148653 Sofia Papagiannaki
                    to destination
580 d50ed8d4 Sofia Papagiannaki

581 22dab079 Antony Chazapis
            'replace_meta': Replace metadata instead of update
582 d50ed8d4 Sofia Papagiannaki

583 3436eeb0 Antony Chazapis
            'permissions': New object permissions
584 d50ed8d4 Sofia Papagiannaki

585 3436eeb0 Antony Chazapis
            'src_version': Copy from the version provided
586 d50ed8d4 Sofia Papagiannaki

587 29148653 Sofia Papagiannaki
            'delimiter': Copy objects whose path starts with
588 29148653 Sofia Papagiannaki
                         src_name + delimiter
589 d50ed8d4 Sofia Papagiannaki

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

593 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
594 d50ed8d4 Sofia Papagiannaki

595 7efc9f86 Sofia Papagiannaki
            VersionNotExists: Version does not exist
596 d50ed8d4 Sofia Papagiannaki

597 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
598 d50ed8d4 Sofia Papagiannaki

599 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
600 b956618e Antony Chazapis
        """
601 02c4d2ba Antony Chazapis
        return ''
602 d50ed8d4 Sofia Papagiannaki
603 29148653 Sofia Papagiannaki
    def move_object(self, user, src_account, src_container, src_name,
604 29148653 Sofia Papagiannaki
                    dest_account, dest_container, dest_name, type, domain,
605 29148653 Sofia Papagiannaki
                    meta=None, replace_meta=False, permissions=None,
606 29148653 Sofia Papagiannaki
                    delimiter=None):
607 02c4d2ba Antony Chazapis
        """Move an object's data and metadata and return the new version.
608 d50ed8d4 Sofia Papagiannaki

609 b956618e Antony Chazapis
        Parameters:
610 cb69c154 Antony Chazapis
            'domain': Metadata domain
611 d50ed8d4 Sofia Papagiannaki

612 29148653 Sofia Papagiannaki
            'meta': Dictionary with metadata to change from source
613 29148653 Sofia Papagiannaki
                    to destination
614 d50ed8d4 Sofia Papagiannaki

615 22dab079 Antony Chazapis
            'replace_meta': Replace metadata instead of update
616 d50ed8d4 Sofia Papagiannaki

617 3436eeb0 Antony Chazapis
            'permissions': New object permissions
618 d50ed8d4 Sofia Papagiannaki

619 29148653 Sofia Papagiannaki
            'delimiter': Move objects whose path starts with
620 29148653 Sofia Papagiannaki
                         src_name + delimiter
621 d50ed8d4 Sofia Papagiannaki

622 b956618e Antony Chazapis
        Raises:
623 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
624 d50ed8d4 Sofia Papagiannaki

625 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
626 d50ed8d4 Sofia Papagiannaki

627 3436eeb0 Antony Chazapis
            ValueError: Invalid users/groups in permissions
628 d50ed8d4 Sofia Papagiannaki

629 5df6c6d1 Antony Chazapis
            QuotaError: Account or container quota exceeded
630 b956618e Antony Chazapis
        """
631 02c4d2ba Antony Chazapis
        return ''
632 d50ed8d4 Sofia Papagiannaki
633 29148653 Sofia Papagiannaki
    def delete_object(self, user, account, container, name, until=None,
634 29148653 Sofia Papagiannaki
                      delimiter=None):
635 84846143 Antony Chazapis
        """Delete/purge an object.
636 d50ed8d4 Sofia Papagiannaki

637 4d15c94e Sofia Papagiannaki
        Parameters:
638 29148653 Sofia Papagiannaki
            'delimiter': Delete objects whose path starting with
639 29148653 Sofia Papagiannaki
                         name + delimiter
640 d50ed8d4 Sofia Papagiannaki

641 b956618e Antony Chazapis
        Raises:
642 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
643 d50ed8d4 Sofia Papagiannaki

644 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Container/object does not exist
645 b956618e Antony Chazapis
        """
646 b956618e Antony Chazapis
        return
647 d50ed8d4 Sofia Papagiannaki
648 83dd59c5 Antony Chazapis
    def list_versions(self, user, account, container, name):
649 29148653 Sofia Papagiannaki
        """Return a list of all object (version, version_timestamp) tuples.
650 d50ed8d4 Sofia Papagiannaki

651 cca6c617 Antony Chazapis
        Raises:
652 cca6c617 Antony Chazapis
            NotAllowedError: Operation not permitted
653 cca6c617 Antony Chazapis
        """
654 58a6c894 Antony Chazapis
        return []
655 d50ed8d4 Sofia Papagiannaki
656 37bee317 Antony Chazapis
    def get_uuid(self, user, uuid):
657 37bee317 Antony Chazapis
        """Return the (account, container, name) for the UUID given.
658 d50ed8d4 Sofia Papagiannaki

659 37bee317 Antony Chazapis
        Raises:
660 37bee317 Antony Chazapis
            NotAllowedError: Operation not permitted
661 d50ed8d4 Sofia Papagiannaki

662 37bee317 Antony Chazapis
            NameError: UUID does not exist
663 37bee317 Antony Chazapis
        """
664 37bee317 Antony Chazapis
        return None
665 d50ed8d4 Sofia Papagiannaki
666 bb4eafc6 Antony Chazapis
    def get_public(self, user, public):
667 bb4eafc6 Antony Chazapis
        """Return the (account, container, name) for the public id given.
668 d50ed8d4 Sofia Papagiannaki

669 bb4eafc6 Antony Chazapis
        Raises:
670 bb4eafc6 Antony Chazapis
            NotAllowedError: Operation not permitted
671 d50ed8d4 Sofia Papagiannaki

672 bb4eafc6 Antony Chazapis
            NameError: Public id does not exist
673 bb4eafc6 Antony Chazapis
        """
674 bb4eafc6 Antony Chazapis
        return None
675 d50ed8d4 Sofia Papagiannaki
676 22dab079 Antony Chazapis
    def get_block(self, hash):
677 22dab079 Antony Chazapis
        """Return a block's data.
678 d50ed8d4 Sofia Papagiannaki

679 22dab079 Antony Chazapis
        Raises:
680 7efc9f86 Sofia Papagiannaki
            ItemNotExists: Block does not exist
681 22dab079 Antony Chazapis
        """
682 22dab079 Antony Chazapis
        return ''
683 d50ed8d4 Sofia Papagiannaki
684 22dab079 Antony Chazapis
    def put_block(self, data):
685 22dab079 Antony Chazapis
        """Store a block and return the hash."""
686 22dab079 Antony Chazapis
        return 0
687 d50ed8d4 Sofia Papagiannaki
688 22dab079 Antony Chazapis
    def update_block(self, hash, data, offset=0):
689 22dab079 Antony Chazapis
        """Update a known block and return the hash.
690 d50ed8d4 Sofia Papagiannaki

691 22dab079 Antony Chazapis
        Raises:
692 22dab079 Antony Chazapis
            IndexError: Offset or data outside block limits
693 22dab079 Antony Chazapis
        """
694 22dab079 Antony Chazapis
        return 0
695 29148653 Sofia Papagiannaki
696 29148653 Sofia Papagiannaki
    def get_domain_objects(self, domain, user=None):
697 29148653 Sofia Papagiannaki
        """Return a list of tuples for objects under the domain.
698 29148653 Sofia Papagiannaki

699 29148653 Sofia Papagiannaki
        Parameters:
700 29148653 Sofia Papagiannaki
            'user': return only objects accessible to the user.
701 29148653 Sofia Papagiannaki
        """