Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / pithos_rest_api.py @ 2005b18e

History | View | Annotate | Download (32 kB)

1 afd9d603 Stavros Sachtouris
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 afd9d603 Stavros Sachtouris
#
3 afd9d603 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 afd9d603 Stavros Sachtouris
# without modification, are permitted provided that the following
5 afd9d603 Stavros Sachtouris
# conditions are met:
6 afd9d603 Stavros Sachtouris
#
7 afd9d603 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 afd9d603 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 afd9d603 Stavros Sachtouris
#      disclaimer.
10 afd9d603 Stavros Sachtouris
#
11 afd9d603 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 afd9d603 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 afd9d603 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 afd9d603 Stavros Sachtouris
#      provided with the distribution.
15 afd9d603 Stavros Sachtouris
#
16 afd9d603 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 afd9d603 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 afd9d603 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 afd9d603 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 afd9d603 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 afd9d603 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 afd9d603 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 afd9d603 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 afd9d603 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 afd9d603 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 afd9d603 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 afd9d603 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 afd9d603 Stavros Sachtouris
#
29 afd9d603 Stavros Sachtouris
# The views and conclusions contained in the software and
30 afd9d603 Stavros Sachtouris
# documentation are those of the authors and should not be
31 afd9d603 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 afd9d603 Stavros Sachtouris
# or implied, of GRNET S.A.
33 afd9d603 Stavros Sachtouris
34 3dabe5d2 Stavros Sachtouris
from kamaki.clients.storage import StorageClient
35 436f2ce1 Stavros Sachtouris
from kamaki.clients.utils import path4url, list2str
36 afd9d603 Stavros Sachtouris
37 3dabe5d2 Stavros Sachtouris
38 afd9d603 Stavros Sachtouris
class PithosRestAPI(StorageClient):
39 afd9d603 Stavros Sachtouris
40 24ff0a35 Stavros Sachtouris
    def account_head(
41 24ff0a35 Stavros Sachtouris
            self,
42 24ff0a35 Stavros Sachtouris
            until=None,
43 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
44 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
45 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
46 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at account level
47 9e4508df Stavros Sachtouris

48 afd9d603 Stavros Sachtouris
        --- request parameters ---
49 9e4508df Stavros Sachtouris

50 9e4508df Stavros Sachtouris
        :param until: (string) optional timestamp
51 9e4508df Stavros Sachtouris

52 9e4508df Stavros Sachtouris
        --- request headers ---
53 9e4508df Stavros Sachtouris

54 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
55 9e4508df Stavros Sachtouris
            since provided timestamp
56 9e4508df Stavros Sachtouris

57 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
58 9e4508df Stavros Sachtouris
            change since provided timestamp
59 9e4508df Stavros Sachtouris

60 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
61 afd9d603 Stavros Sachtouris
        """
62 4067cdaf Stavros Sachtouris
63 d88ba587 Stavros Sachtouris
        self._assert_account()
64 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
65 afd9d603 Stavros Sachtouris
66 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
67 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
68 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
69 afd9d603 Stavros Sachtouris
70 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
71 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
72 afd9d603 Stavros Sachtouris
73 24ff0a35 Stavros Sachtouris
    def account_get(
74 24ff0a35 Stavros Sachtouris
            self,
75 24ff0a35 Stavros Sachtouris
            limit=None,
76 24ff0a35 Stavros Sachtouris
            marker=None,
77 24ff0a35 Stavros Sachtouris
            format='json',
78 24ff0a35 Stavros Sachtouris
            show_only_shared=False,
79 24ff0a35 Stavros Sachtouris
            until=None,
80 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
81 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
82 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
83 afd9d603 Stavros Sachtouris
        """  Full Pithos+ GET at account level
84 9e4508df Stavros Sachtouris

85 afd9d603 Stavros Sachtouris
        --- request parameters ---
86 9e4508df Stavros Sachtouris

87 9e4508df Stavros Sachtouris
        :param limit: (integer) The amount of results requested
88 9e4508df Stavros Sachtouris
            (server will use default value if None)
89 9e4508df Stavros Sachtouris

90 9e4508df Stavros Sachtouris
        :param marker: string Return containers with name
91 9e4508df Stavros Sachtouris
            lexicographically after marker
92 9e4508df Stavros Sachtouris

93 9e4508df Stavros Sachtouris
        :param format: (string) reply format can be json or xml
94 9e4508df Stavros Sachtouris
            (default: json)
95 9e4508df Stavros Sachtouris

96 9e4508df Stavros Sachtouris
        :param shared: (bool) If true, only shared containers will be
97 9e4508df Stavros Sachtouris
            included in results
98 9e4508df Stavros Sachtouris

99 9e4508df Stavros Sachtouris
        :param until: (string) optional timestamp
100 9e4508df Stavros Sachtouris

101 9e4508df Stavros Sachtouris
        --- request headers ---
102 9e4508df Stavros Sachtouris

103 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
104 9e4508df Stavros Sachtouris
            since provided timestamp
105 9e4508df Stavros Sachtouris

106 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
107 9e4508df Stavros Sachtouris
            changed since provided timestamp
108 9e4508df Stavros Sachtouris

109 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
110 afd9d603 Stavros Sachtouris
        """
111 4067cdaf Stavros Sachtouris
112 d88ba587 Stavros Sachtouris
        self._assert_account()
113 afd9d603 Stavros Sachtouris
114 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
115 24ff0a35 Stavros Sachtouris
        self.set_param('limit', limit, iff=limit)
116 24ff0a35 Stavros Sachtouris
        self.set_param('marker', marker, iff=marker)
117 3dabe5d2 Stavros Sachtouris
        self.set_param('shared', iff=show_only_shared)
118 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
119 afd9d603 Stavros Sachtouris
120 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
121 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
122 afd9d603 Stavros Sachtouris
123 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
124 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', (200, 204))
125 3dabe5d2 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
126 afd9d603 Stavros Sachtouris
127 24ff0a35 Stavros Sachtouris
    def account_post(
128 24ff0a35 Stavros Sachtouris
            self,
129 24ff0a35 Stavros Sachtouris
            update=True,
130 24ff0a35 Stavros Sachtouris
            groups={},
131 24ff0a35 Stavros Sachtouris
            metadata=None,
132 24ff0a35 Stavros Sachtouris
            quota=None,
133 24ff0a35 Stavros Sachtouris
            versioning=None,
134 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
135 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at account level
136 9e4508df Stavros Sachtouris

137 afd9d603 Stavros Sachtouris
        --- request parameters ---
138 9e4508df Stavros Sachtouris

139 9e4508df Stavros Sachtouris
        :param update: (bool) if True, Do not replace metadata/groups
140 9e4508df Stavros Sachtouris

141 afd9d603 Stavros Sachtouris
        --- request headers ---
142 9e4508df Stavros Sachtouris

143 9e4508df Stavros Sachtouris
        :param groups: (dict) Optional user defined groups in the form
144 9e4508df Stavros Sachtouris
            { 'group1':['user1', 'user2', ...],
145 9e4508df Stavros Sachtouris
            'group2':['userA', 'userB', ...], }
146 9e4508df Stavros Sachtouris

147 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
148 9e4508df Stavros Sachtouris
            { 'name1': 'value1', 'name2': 'value2', ... }
149 9e4508df Stavros Sachtouris

150 9e4508df Stavros Sachtouris
        :param quota: (integer) If supported, sets the Account quota
151 9e4508df Stavros Sachtouris

152 9e4508df Stavros Sachtouris
        :param versioning: (string) If supported, sets the Account versioning
153 9e4508df Stavros Sachtouris
            to 'auto' or some other supported versioning string
154 9e4508df Stavros Sachtouris

155 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
156 afd9d603 Stavros Sachtouris
        """
157 4067cdaf Stavros Sachtouris
158 d88ba587 Stavros Sachtouris
        self._assert_account()
159 afd9d603 Stavros Sachtouris
160 3dabe5d2 Stavros Sachtouris
        self.set_param('update', iff=update)
161 afd9d603 Stavros Sachtouris
162 afd9d603 Stavros Sachtouris
        for group, usernames in groups.items():
163 afd9d603 Stavros Sachtouris
            userstr = ''
164 afd9d603 Stavros Sachtouris
            dlm = ''
165 afd9d603 Stavros Sachtouris
            for user in usernames:
166 afd9d603 Stavros Sachtouris
                userstr = userstr + dlm + user
167 afd9d603 Stavros Sachtouris
                dlm = ','
168 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Account-Group-' + group, userstr)
169 24ff0a35 Stavros Sachtouris
        if metadata:
170 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
171 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Account-Meta-' + metaname, metaval)
172 afd9d603 Stavros Sachtouris
        self.set_header('X-Account-Policy-Quota', quota)
173 afd9d603 Stavros Sachtouris
        self.set_header('X-Account-Policy-Versioning', versioning)
174 afd9d603 Stavros Sachtouris
175 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
176 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 202)
177 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
178 afd9d603 Stavros Sachtouris
179 24ff0a35 Stavros Sachtouris
    def container_head(
180 24ff0a35 Stavros Sachtouris
            self,
181 24ff0a35 Stavros Sachtouris
            until=None,
182 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
183 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
184 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
185 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at container level
186 9e4508df Stavros Sachtouris

187 afd9d603 Stavros Sachtouris
        --- request params ---
188 9e4508df Stavros Sachtouris

189 9e4508df Stavros Sachtouris
        :param until: (string) optional timestamp
190 9e4508df Stavros Sachtouris

191 9e4508df Stavros Sachtouris
        --- request headers ---
192 9e4508df Stavros Sachtouris

193 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
194 9e4508df Stavros Sachtouris
            since provided timestamp
195 9e4508df Stavros Sachtouris

196 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
197 9e4508df Stavros Sachtouris
            changed since provided timestamp
198 9e4508df Stavros Sachtouris

199 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
200 afd9d603 Stavros Sachtouris
        """
201 4067cdaf Stavros Sachtouris
202 d88ba587 Stavros Sachtouris
        self._assert_container()
203 afd9d603 Stavros Sachtouris
204 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
205 afd9d603 Stavros Sachtouris
206 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
207 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
208 afd9d603 Stavros Sachtouris
209 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
210 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
211 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
212 afd9d603 Stavros Sachtouris
213 24ff0a35 Stavros Sachtouris
    def container_get(
214 24ff0a35 Stavros Sachtouris
            self,
215 24ff0a35 Stavros Sachtouris
            limit=None,
216 24ff0a35 Stavros Sachtouris
            marker=None,
217 24ff0a35 Stavros Sachtouris
            prefix=None,
218 24ff0a35 Stavros Sachtouris
            delimiter=None,
219 24ff0a35 Stavros Sachtouris
            path=None,
220 24ff0a35 Stavros Sachtouris
            format='json',
221 24ff0a35 Stavros Sachtouris
            meta=[],
222 24ff0a35 Stavros Sachtouris
            show_only_shared=False,
223 24ff0a35 Stavros Sachtouris
            until=None,
224 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
225 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
226 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
227 afd9d603 Stavros Sachtouris
        """ Full Pithos+ GET at container level
228 9e4508df Stavros Sachtouris

229 afd9d603 Stavros Sachtouris
        --- request parameters ---
230 9e4508df Stavros Sachtouris

231 9e4508df Stavros Sachtouris
        :param limit: (integer) The amount of results requested
232 9e4508df Stavros Sachtouris
            (server will use default value if None)
233 9e4508df Stavros Sachtouris

234 9e4508df Stavros Sachtouris
        :param marker: (string) Return containers with name lexicographically
235 9e4508df Stavros Sachtouris
            after marker
236 9e4508df Stavros Sachtouris

237 9e4508df Stavros Sachtouris
        :param prefix: (string) Return objects starting with prefix
238 9e4508df Stavros Sachtouris

239 9e4508df Stavros Sachtouris
        :param delimiter: (string) Return objects up to the delimiter
240 9e4508df Stavros Sachtouris

241 9e4508df Stavros Sachtouris
        :param path: (string) assume prefix = path and delimiter = /
242 9e4508df Stavros Sachtouris
            (overwrites prefix and delimiter)
243 9e4508df Stavros Sachtouris

244 9e4508df Stavros Sachtouris
        :param format: (string) reply format can be json or xml (default:json)
245 9e4508df Stavros Sachtouris

246 9e4508df Stavros Sachtouris
        :param meta: (list) Return objects that satisfy the key queries in
247 9e4508df Stavros Sachtouris
            the specified comma separated list (use <key>, !<key> for
248 9e4508df Stavros Sachtouris
            existence queries, <key><op><value> for value queries, where <op>
249 9e4508df Stavros Sachtouris
            can be one of =, !=, <=, >=, <, >)
250 9e4508df Stavros Sachtouris

251 9e4508df Stavros Sachtouris
        :param shared: (bool) If true, only shared containers will be included
252 9e4508df Stavros Sachtouris
            in results
253 9e4508df Stavros Sachtouris

254 9e4508df Stavros Sachtouris
        :param until: (string) optional timestamp
255 9e4508df Stavros Sachtouris

256 9e4508df Stavros Sachtouris
        --- request headers ---
257 9e4508df Stavros Sachtouris

258 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
259 9e4508df Stavros Sachtouris
            since provided timestamp
260 9e4508df Stavros Sachtouris

261 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
262 9e4508df Stavros Sachtouris
            changed since provided timestamp
263 9e4508df Stavros Sachtouris

264 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
265 afd9d603 Stavros Sachtouris
        """
266 4067cdaf Stavros Sachtouris
267 d88ba587 Stavros Sachtouris
        self._assert_container()
268 afd9d603 Stavros Sachtouris
269 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
270 24ff0a35 Stavros Sachtouris
        self.set_param('limit', limit, iff=limit)
271 24ff0a35 Stavros Sachtouris
        self.set_param('marker', marker, iff=marker)
272 24ff0a35 Stavros Sachtouris
        if not path:
273 24ff0a35 Stavros Sachtouris
            self.set_param('prefix', prefix, iff=prefix)
274 24ff0a35 Stavros Sachtouris
            self.set_param('delimiter', delimiter, iff=delimiter)
275 afd9d603 Stavros Sachtouris
        else:
276 afd9d603 Stavros Sachtouris
            self.set_param('path', path)
277 afd9d603 Stavros Sachtouris
        self.set_param('shared', iff=show_only_shared)
278 24ff0a35 Stavros Sachtouris
        self.set_param('meta', list2str(meta), iff=meta)
279 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
280 afd9d603 Stavros Sachtouris
281 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
282 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
283 afd9d603 Stavros Sachtouris
284 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
285 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
286 afd9d603 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
287 afd9d603 Stavros Sachtouris
288 24ff0a35 Stavros Sachtouris
    def container_put(
289 24ff0a35 Stavros Sachtouris
            self,
290 24ff0a35 Stavros Sachtouris
            quota=None, versioning=None, metadata=None,
291 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
292 afd9d603 Stavros Sachtouris
        """ Full Pithos+ PUT at container level
293 9e4508df Stavros Sachtouris

294 afd9d603 Stavros Sachtouris
        --- request headers ---
295 9e4508df Stavros Sachtouris

296 9e4508df Stavros Sachtouris
        :param quota: (integer) Size limit in KB
297 9e4508df Stavros Sachtouris

298 9e4508df Stavros Sachtouris
        :param versioning: (string) 'auto' or other string supported by server
299 9e4508df Stavros Sachtouris

300 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
301 9e4508df Stavros Sachtouris
            { 'name1': 'value1', 'name2': 'value2', ... }
302 9e4508df Stavros Sachtouris

303 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
304 afd9d603 Stavros Sachtouris
        """
305 d88ba587 Stavros Sachtouris
        self._assert_container()
306 afd9d603 Stavros Sachtouris
307 24ff0a35 Stavros Sachtouris
        if metadata:
308 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
309 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Container-Meta-' + metaname, metaval)
310 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Quota', quota)
311 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Versioning', versioning)
312 afd9d603 Stavros Sachtouris
313 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
314 3dabe5d2 Stavros Sachtouris
        success = kwargs.pop('success', (201, 202))
315 afd9d603 Stavros Sachtouris
        return self.put(path, *args, success=success, **kwargs)
316 afd9d603 Stavros Sachtouris
317 24ff0a35 Stavros Sachtouris
    def container_post(
318 24ff0a35 Stavros Sachtouris
            self,
319 24ff0a35 Stavros Sachtouris
            update=True,
320 24ff0a35 Stavros Sachtouris
            format='json',
321 24ff0a35 Stavros Sachtouris
            quota=None,
322 24ff0a35 Stavros Sachtouris
            versioning=None,
323 24ff0a35 Stavros Sachtouris
            metadata=None,
324 24ff0a35 Stavros Sachtouris
            content_type=None,
325 24ff0a35 Stavros Sachtouris
            content_length=None,
326 24ff0a35 Stavros Sachtouris
            transfer_encoding=None,
327 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
328 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at container level
329 9e4508df Stavros Sachtouris

330 afd9d603 Stavros Sachtouris
        --- request params ---
331 9e4508df Stavros Sachtouris

332 9e4508df Stavros Sachtouris
        :param update: (bool)  if True, Do not replace metadata/groups
333 9e4508df Stavros Sachtouris

334 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
335 9e4508df Stavros Sachtouris

336 afd9d603 Stavros Sachtouris
        --- request headers ---
337 9e4508df Stavros Sachtouris

338 9e4508df Stavros Sachtouris
        :param quota: (integer) Size limit in KB
339 9e4508df Stavros Sachtouris

340 9e4508df Stavros Sachtouris
        :param versioning: (string) 'auto' or other string supported by server
341 9e4508df Stavros Sachtouris

342 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
343 9e4508df Stavros Sachtouris
            { 'name1': 'value1', 'name2': 'value2', ... }
344 9e4508df Stavros Sachtouris

345 9e4508df Stavros Sachtouris
        :param content_type: (string) set a custom content type
346 9e4508df Stavros Sachtouris

347 9e4508df Stavros Sachtouris
        :param content_length: (string) set a custrom content length
348 9e4508df Stavros Sachtouris

349 9e4508df Stavros Sachtouris
        :param transfer_encoding: (string) set a custrom transfer encoding
350 9e4508df Stavros Sachtouris

351 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
352 afd9d603 Stavros Sachtouris
        """
353 d88ba587 Stavros Sachtouris
        self._assert_container()
354 afd9d603 Stavros Sachtouris
355 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
356 afd9d603 Stavros Sachtouris
        self.set_param('update', iff=update)
357 afd9d603 Stavros Sachtouris
358 24ff0a35 Stavros Sachtouris
        if metadata:
359 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
360 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Container-Meta-' + metaname, metaval)
361 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Quota', quota)
362 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Versioning', versioning)
363 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
364 afd9d603 Stavros Sachtouris
        self.set_header('Content-Length', content_length)
365 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
366 afd9d603 Stavros Sachtouris
367 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
368 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 202)
369 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
370 afd9d603 Stavros Sachtouris
371 afd9d603 Stavros Sachtouris
    def container_delete(self, until=None, delimiter=None, *args, **kwargs):
372 afd9d603 Stavros Sachtouris
        """ Full Pithos+ DELETE at container level
373 9e4508df Stavros Sachtouris

374 afd9d603 Stavros Sachtouris
        --- request parameters ---
375 9e4508df Stavros Sachtouris

376 9e4508df Stavros Sachtouris
        :param until: (timestamp string) if defined, container is purged up to
377 9e4508df Stavros Sachtouris
            that time
378 9e4508df Stavros Sachtouris

379 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
380 afd9d603 Stavros Sachtouris
        """
381 4067cdaf Stavros Sachtouris
382 d88ba587 Stavros Sachtouris
        self._assert_container()
383 afd9d603 Stavros Sachtouris
384 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
385 24ff0a35 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter)
386 afd9d603 Stavros Sachtouris
387 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container)
388 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
389 afd9d603 Stavros Sachtouris
        return self.delete(path, success=success)
390 afd9d603 Stavros Sachtouris
391 24ff0a35 Stavros Sachtouris
    def object_head(
392 24ff0a35 Stavros Sachtouris
            self, object,
393 24ff0a35 Stavros Sachtouris
            version=None,
394 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
395 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
396 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
397 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
398 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
399 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at object level
400 9e4508df Stavros Sachtouris

401 afd9d603 Stavros Sachtouris
        --- request parameters ---
402 9e4508df Stavros Sachtouris

403 9e4508df Stavros Sachtouris
        :param version: (string) optional version identified
404 9e4508df Stavros Sachtouris

405 afd9d603 Stavros Sachtouris
        --- request headers ---
406 9e4508df Stavros Sachtouris

407 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, return only results
408 9e4508df Stavros Sachtouris
            with etag matching with this
409 9e4508df Stavros Sachtouris

410 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, return only results
411 9e4508df Stavros Sachtouris
            with etag not matching with this
412 9e4508df Stavros Sachtouris

413 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
414 9e4508df Stavros Sachtouris
            since provided timestamp
415 9e4508df Stavros Sachtouris

416 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
417 9e4508df Stavros Sachtouris
            changed since provided timestamp
418 9e4508df Stavros Sachtouris

419 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
420 afd9d603 Stavros Sachtouris
        """
421 4067cdaf Stavros Sachtouris
422 d88ba587 Stavros Sachtouris
        self._assert_container()
423 afd9d603 Stavros Sachtouris
424 24ff0a35 Stavros Sachtouris
        self.set_param('version', version, iff=version)
425 afd9d603 Stavros Sachtouris
426 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
427 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
428 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
429 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
430 afd9d603 Stavros Sachtouris
431 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
432 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
433 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
434 afd9d603 Stavros Sachtouris
435 24ff0a35 Stavros Sachtouris
    def object_get(
436 24ff0a35 Stavros Sachtouris
            self, object,
437 24ff0a35 Stavros Sachtouris
            format='json',
438 24ff0a35 Stavros Sachtouris
            hashmap=False,
439 24ff0a35 Stavros Sachtouris
            version=None,
440 24ff0a35 Stavros Sachtouris
            data_range=None,
441 24ff0a35 Stavros Sachtouris
            if_range=False,
442 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
443 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
444 24ff0a35 Stavros Sachtouris
            if_modified_since=None,
445 24ff0a35 Stavros Sachtouris
            if_unmodified_since=None,
446 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
447 afd9d603 Stavros Sachtouris
        """ Full Pithos+ GET at object level
448 9e4508df Stavros Sachtouris

449 afd9d603 Stavros Sachtouris
        --- request parameters ---
450 9e4508df Stavros Sachtouris

451 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
452 9e4508df Stavros Sachtouris

453 9e4508df Stavros Sachtouris
        :param hashmap: (bool) Optional request for hashmap
454 9e4508df Stavros Sachtouris

455 9e4508df Stavros Sachtouris
        :param version: (string) optional version identified
456 9e4508df Stavros Sachtouris

457 afd9d603 Stavros Sachtouris
        --- request headers ---
458 9e4508df Stavros Sachtouris

459 9e4508df Stavros Sachtouris
        :param data_range: (string) Optional range of data to retrieve
460 9e4508df Stavros Sachtouris

461 9e4508df Stavros Sachtouris
        :param if_range: (bool)
462 9e4508df Stavros Sachtouris

463 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, return only results
464 9e4508df Stavros Sachtouris
            with etag matching with this
465 9e4508df Stavros Sachtouris

466 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, return only results
467 9e4508df Stavros Sachtouris
            with etag not matching with this
468 9e4508df Stavros Sachtouris

469 9e4508df Stavros Sachtouris
        :param if_modified_since: (string) Retrieve if account has changed
470 9e4508df Stavros Sachtouris
            since provided timestamp
471 9e4508df Stavros Sachtouris

472 9e4508df Stavros Sachtouris
        :param if_unmodified_since: (string) Retrieve if account has not
473 9e4508df Stavros Sachtouris
            changed since provided timestamp
474 9e4508df Stavros Sachtouris

475 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
476 afd9d603 Stavros Sachtouris
        """
477 4067cdaf Stavros Sachtouris
478 d88ba587 Stavros Sachtouris
        self._assert_container()
479 afd9d603 Stavros Sachtouris
480 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
481 24ff0a35 Stavros Sachtouris
        self.set_param('version', version, iff=version)
482 afd9d603 Stavros Sachtouris
        self.set_param('hashmap', hashmap, iff=hashmap)
483 afd9d603 Stavros Sachtouris
484 afd9d603 Stavros Sachtouris
        self.set_header('Range', data_range)
485 2005b18e Stavros Sachtouris
        self.set_header('If-Range', '', if_range and data_range)
486 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match, )
487 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
488 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
489 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
490 afd9d603 Stavros Sachtouris
491 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
492 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
493 afd9d603 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
494 afd9d603 Stavros Sachtouris
495 24ff0a35 Stavros Sachtouris
    def object_put(
496 24ff0a35 Stavros Sachtouris
            self, object,
497 24ff0a35 Stavros Sachtouris
            format='json',
498 24ff0a35 Stavros Sachtouris
            hashmap=False,
499 24ff0a35 Stavros Sachtouris
            delimiter=None,
500 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
501 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
502 24ff0a35 Stavros Sachtouris
            etag=None,
503 24ff0a35 Stavros Sachtouris
            content_length=None,
504 24ff0a35 Stavros Sachtouris
            content_type=None,
505 24ff0a35 Stavros Sachtouris
            transfer_encoding=None,
506 24ff0a35 Stavros Sachtouris
            copy_from=None,
507 24ff0a35 Stavros Sachtouris
            move_from=None,
508 24ff0a35 Stavros Sachtouris
            source_account=None,
509 24ff0a35 Stavros Sachtouris
            source_version=None,
510 24ff0a35 Stavros Sachtouris
            content_encoding=None,
511 24ff0a35 Stavros Sachtouris
            content_disposition=None,
512 24ff0a35 Stavros Sachtouris
            manifest=None,
513 24ff0a35 Stavros Sachtouris
            permissions=None,
514 24ff0a35 Stavros Sachtouris
            public=None,
515 24ff0a35 Stavros Sachtouris
            metadata=None,
516 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
517 afd9d603 Stavros Sachtouris
        """ Full Pithos+ PUT at object level
518 9e4508df Stavros Sachtouris

519 afd9d603 Stavros Sachtouris
        --- request parameters ---
520 9e4508df Stavros Sachtouris

521 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
522 9e4508df Stavros Sachtouris

523 9e4508df Stavros Sachtouris
        :param hashmap: (bool) Optional hashmap provided instead of data
524 9e4508df Stavros Sachtouris

525 afd9d603 Stavros Sachtouris
        --- request headers ---
526 9e4508df Stavros Sachtouris

527 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, return only results
528 9e4508df Stavros Sachtouris
            with etag matching with this
529 9e4508df Stavros Sachtouris

530 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, return only results
531 9e4508df Stavros Sachtouris
            with etag not matching with this
532 9e4508df Stavros Sachtouris

533 9e4508df Stavros Sachtouris
        :param etag: (string) The MD5 hash of the object (optional to check
534 9e4508df Stavros Sachtouris
            written data)
535 9e4508df Stavros Sachtouris

536 9e4508df Stavros Sachtouris
        :param content_length: (integer) The size of the data written
537 9e4508df Stavros Sachtouris

538 9e4508df Stavros Sachtouris
        :param content_type: (string) The MIME content type of the object
539 9e4508df Stavros Sachtouris

540 9e4508df Stavros Sachtouris
        :param transfer_encoding: (string) Set to chunked to specify
541 9e4508df Stavros Sachtouris
            incremental uploading (if used, Content-Length is ignored)
542 9e4508df Stavros Sachtouris

543 9e4508df Stavros Sachtouris
        :param copy_from: (string) The source path in the form
544 9e4508df Stavros Sachtouris
            /<container>/<object>
545 9e4508df Stavros Sachtouris

546 9e4508df Stavros Sachtouris
        :param move_from: (string) The source path in the form
547 9e4508df Stavros Sachtouris
            /<container>/<object>
548 9e4508df Stavros Sachtouris

549 9e4508df Stavros Sachtouris
        :param source_account: (string) The source account to copy/move from
550 9e4508df Stavros Sachtouris

551 9e4508df Stavros Sachtouris
        :param source_version: (string) The source version to copy from
552 9e4508df Stavros Sachtouris

553 9e4508df Stavros Sachtouris
        :param conent_encoding: (string) The encoding of the object
554 9e4508df Stavros Sachtouris

555 9e4508df Stavros Sachtouris
        :param content_disposition: (string) Presentation style of the object
556 9e4508df Stavros Sachtouris

557 9e4508df Stavros Sachtouris
        :param manifest: (string) Object parts prefix in
558 9e4508df Stavros Sachtouris
            /<container>/<object> form
559 9e4508df Stavros Sachtouris

560 9e4508df Stavros Sachtouris
        :param permissions: (dict) Object permissions in the form (all fields
561 9e4508df Stavros Sachtouris
            are optional)
562 9e4508df Stavros Sachtouris
            { 'read':[user1, group1, user2, ...],
563 9e4508df Stavros Sachtouris
            'write':['user3, group2, group3, ...] }
564 9e4508df Stavros Sachtouris

565 9e4508df Stavros Sachtouris
        :param public: (bool) If true, Object is publicly accessible,
566 9e4508df Stavros Sachtouris
            if false, not
567 9e4508df Stavros Sachtouris

568 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
569 9e4508df Stavros Sachtouris
            {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
570 9e4508df Stavros Sachtouris

571 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
572 afd9d603 Stavros Sachtouris
        """
573 4067cdaf Stavros Sachtouris
574 d88ba587 Stavros Sachtouris
        self._assert_container()
575 afd9d603 Stavros Sachtouris
576 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
577 afd9d603 Stavros Sachtouris
        self.set_param('hashmap', hashmap, iff=hashmap)
578 24ff0a35 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter)
579 afd9d603 Stavros Sachtouris
580 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
581 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
582 afd9d603 Stavros Sachtouris
        self.set_header('ETag', etag)
583 afd9d603 Stavros Sachtouris
        self.set_header('Content-Length', content_length)
584 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
585 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
586 afd9d603 Stavros Sachtouris
        self.set_header('X-Copy-From', copy_from)
587 afd9d603 Stavros Sachtouris
        self.set_header('X-Move-From', move_from)
588 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Account', source_account)
589 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
590 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
591 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
592 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Manifest', manifest)
593 afd9d603 Stavros Sachtouris
        perms = None
594 3dabe5d2 Stavros Sachtouris
        if permissions:
595 3dabe5d2 Stavros Sachtouris
            for permission_type, permission_list in permissions.items():
596 24ff0a35 Stavros Sachtouris
                if not perms:
597 3dabe5d2 Stavros Sachtouris
                    perms = ''  # Remove permissions
598 3dabe5d2 Stavros Sachtouris
                if len(permission_list) == 0:
599 afd9d603 Stavros Sachtouris
                    continue
600 3dabe5d2 Stavros Sachtouris
                if len(perms):
601 3dabe5d2 Stavros Sachtouris
                    perms += ';'
602 24ff0a35 Stavros Sachtouris
                perms += '%s=%s' % (
603 24ff0a35 Stavros Sachtouris
                    permission_type,
604 24ff0a35 Stavros Sachtouris
                    list2str(permission_list, separator=','))
605 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
606 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
607 24ff0a35 Stavros Sachtouris
        if metadata:
608 afd9d603 Stavros Sachtouris
            for key, val in metadata.items():
609 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Object-Meta-' + key, val)
610 afd9d603 Stavros Sachtouris
611 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
612 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
613 afd9d603 Stavros Sachtouris
        return self.put(path, *args, success=success, **kwargs)
614 afd9d603 Stavros Sachtouris
615 24ff0a35 Stavros Sachtouris
    def object_copy(
616 24ff0a35 Stavros Sachtouris
            self, object, destination,
617 24ff0a35 Stavros Sachtouris
            format='json',
618 24ff0a35 Stavros Sachtouris
            ignore_content_type=False,
619 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
620 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
621 24ff0a35 Stavros Sachtouris
            destination_account=None,
622 24ff0a35 Stavros Sachtouris
            content_type=None,
623 24ff0a35 Stavros Sachtouris
            content_encoding=None,
624 24ff0a35 Stavros Sachtouris
            content_disposition=None,
625 24ff0a35 Stavros Sachtouris
            source_version=None,
626 24ff0a35 Stavros Sachtouris
            permissions=None,
627 24ff0a35 Stavros Sachtouris
            public=False,
628 24ff0a35 Stavros Sachtouris
            metadata=None,
629 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
630 afd9d603 Stavros Sachtouris
        """ Full Pithos+ COPY at object level
631 9e4508df Stavros Sachtouris

632 afd9d603 Stavros Sachtouris
        --- request parameters ---
633 9e4508df Stavros Sachtouris

634 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
635 9e4508df Stavros Sachtouris

636 9e4508df Stavros Sachtouris
        :param ignore_content_type: (bool) Ignore the supplied Content-Type
637 9e4508df Stavros Sachtouris

638 afd9d603 Stavros Sachtouris
        --- request headers ---
639 9e4508df Stavros Sachtouris

640 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, copy only results
641 9e4508df Stavros Sachtouris
            with etag matching with this
642 9e4508df Stavros Sachtouris

643 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, copy only results
644 9e4508df Stavros Sachtouris
            with etag not matching with this
645 9e4508df Stavros Sachtouris

646 9e4508df Stavros Sachtouris
        :param destination: (string) The destination path in the form
647 9e4508df Stavros Sachtouris
            /<container>/<object>
648 9e4508df Stavros Sachtouris

649 9e4508df Stavros Sachtouris
        :param destination_account: (string) The destination account to copy to
650 9e4508df Stavros Sachtouris

651 9e4508df Stavros Sachtouris
        :param content_type: (string) The MIME content type of the object
652 9e4508df Stavros Sachtouris

653 9e4508df Stavros Sachtouris
        :param content_encoding: (string) The encoding of the object
654 9e4508df Stavros Sachtouris

655 9e4508df Stavros Sachtouris
        :param content_disposition: (string) Object resentation style
656 9e4508df Stavros Sachtouris

657 9e4508df Stavros Sachtouris
        :param source_version: (string) The source version to copy from
658 9e4508df Stavros Sachtouris

659 9e4508df Stavros Sachtouris
        :param permissions: (dict) Object permissions in the form
660 9e4508df Stavros Sachtouris
            (all fields are optional)
661 9e4508df Stavros Sachtouris
            { 'read':[user1, group1, user2, ...],
662 9e4508df Stavros Sachtouris
            'write':['user3, group2, group3, ...] }
663 9e4508df Stavros Sachtouris

664 9e4508df Stavros Sachtouris
        :param permissions: update permissions
665 9e4508df Stavros Sachtouris

666 9e4508df Stavros Sachtouris
        :param public: (bool) If true, Object is publicly accessible
667 9e4508df Stavros Sachtouris

668 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
669 9e4508df Stavros Sachtouris
            {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
670 9e4508df Stavros Sachtouris
            Metadata are appended to the source metadata. In case of same
671 9e4508df Stavros Sachtouris
            keys, they replace the old metadata
672 9e4508df Stavros Sachtouris

673 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
674 afd9d603 Stavros Sachtouris
        """
675 4067cdaf Stavros Sachtouris
676 d88ba587 Stavros Sachtouris
        self._assert_container()
677 afd9d603 Stavros Sachtouris
678 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
679 afd9d603 Stavros Sachtouris
        self.set_param('ignore_content_type', iff=ignore_content_type)
680 afd9d603 Stavros Sachtouris
681 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
682 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
683 afd9d603 Stavros Sachtouris
        self.set_header('Destination', destination)
684 afd9d603 Stavros Sachtouris
        self.set_header('Destination-Account', destination_account)
685 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
686 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
687 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
688 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
689 afd9d603 Stavros Sachtouris
        perms = None
690 3dabe5d2 Stavros Sachtouris
        if permissions:
691 3dabe5d2 Stavros Sachtouris
            for permission_type, permission_list in permissions.items():
692 24ff0a35 Stavros Sachtouris
                if not perms:
693 3dabe5d2 Stavros Sachtouris
                    perms = ''  # Remove permissions
694 3dabe5d2 Stavros Sachtouris
                if len(permission_list) == 0:
695 afd9d603 Stavros Sachtouris
                    continue
696 3dabe5d2 Stavros Sachtouris
                if len(perms):
697 3dabe5d2 Stavros Sachtouris
                    perms += ';'
698 24ff0a35 Stavros Sachtouris
                perms += '%s=%s' % (
699 24ff0a35 Stavros Sachtouris
                    permission_type,
700 24ff0a35 Stavros Sachtouris
                    list2str(permission_list, separator=','))
701 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
702 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
703 24ff0a35 Stavros Sachtouris
        if metadata:
704 afd9d603 Stavros Sachtouris
            for key, val in metadata.items():
705 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Object-Meta-' + key, val)
706 afd9d603 Stavros Sachtouris
707 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
708 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
709 afd9d603 Stavros Sachtouris
        return self.copy(path, *args, success=success, **kwargs)
710 afd9d603 Stavros Sachtouris
711 24ff0a35 Stavros Sachtouris
    def object_move(
712 24ff0a35 Stavros Sachtouris
            self, object,
713 24ff0a35 Stavros Sachtouris
            format='json',
714 24ff0a35 Stavros Sachtouris
            ignore_content_type=False,
715 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
716 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
717 24ff0a35 Stavros Sachtouris
            destination=None,
718 24ff0a35 Stavros Sachtouris
            destination_account=None,
719 24ff0a35 Stavros Sachtouris
            content_type=None,
720 24ff0a35 Stavros Sachtouris
            content_encoding=None,
721 24ff0a35 Stavros Sachtouris
            content_disposition=None,
722 24ff0a35 Stavros Sachtouris
            permissions={},
723 24ff0a35 Stavros Sachtouris
            public=False,
724 24ff0a35 Stavros Sachtouris
            metadata={},
725 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
726 afd9d603 Stavros Sachtouris
        """ Full Pithos+ COPY at object level
727 9e4508df Stavros Sachtouris

728 afd9d603 Stavros Sachtouris
        --- request parameters ---
729 9e4508df Stavros Sachtouris

730 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
731 9e4508df Stavros Sachtouris

732 9e4508df Stavros Sachtouris
        :param ignore_content_type: (bool) Ignore the supplied Content-Type
733 9e4508df Stavros Sachtouris

734 afd9d603 Stavros Sachtouris
        --- request headers ---
735 9e4508df Stavros Sachtouris

736 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, return only results
737 9e4508df Stavros Sachtouris
            with etag matching with this
738 9e4508df Stavros Sachtouris

739 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, return only results
740 9e4508df Stavros Sachtouris
            with etag not matching with this
741 9e4508df Stavros Sachtouris

742 9e4508df Stavros Sachtouris
        :param destination: (string) The destination path in the form
743 9e4508df Stavros Sachtouris
            /<container>/<object>
744 9e4508df Stavros Sachtouris

745 9e4508df Stavros Sachtouris
        :param destination_account: (string) The destination account to copy to
746 9e4508df Stavros Sachtouris

747 9e4508df Stavros Sachtouris
        :param content_type: (string) The MIME content type of the object
748 9e4508df Stavros Sachtouris

749 9e4508df Stavros Sachtouris
        :param content_encoding: (string) The encoding of the object
750 9e4508df Stavros Sachtouris

751 9e4508df Stavros Sachtouris
        :param content_disposition: (string) Object presentation style
752 9e4508df Stavros Sachtouris

753 9e4508df Stavros Sachtouris
        :param source_version: (string) The source version to copy from
754 9e4508df Stavros Sachtouris

755 9e4508df Stavros Sachtouris
        :param permissions: (dict) Object permissions in the form
756 9e4508df Stavros Sachtouris
            (all fields are optional)
757 9e4508df Stavros Sachtouris
            { 'read':[user1, group1, user2, ...],
758 9e4508df Stavros Sachtouris
            'write':['user3, group2, group3, ...] }
759 9e4508df Stavros Sachtouris

760 9e4508df Stavros Sachtouris
        :param public: (bool) If true, Object is publicly accessible
761 9e4508df Stavros Sachtouris

762 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
763 9e4508df Stavros Sachtouris
            {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
764 9e4508df Stavros Sachtouris

765 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
766 afd9d603 Stavros Sachtouris
        """
767 4067cdaf Stavros Sachtouris
768 d88ba587 Stavros Sachtouris
        self._assert_container()
769 afd9d603 Stavros Sachtouris
770 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
771 afd9d603 Stavros Sachtouris
        self.set_param('ignore_content_type', iff=ignore_content_type)
772 afd9d603 Stavros Sachtouris
773 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
774 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
775 afd9d603 Stavros Sachtouris
        self.set_header('Destination', destination)
776 afd9d603 Stavros Sachtouris
        self.set_header('Destination-Account', destination_account)
777 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
778 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
779 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
780 afd9d603 Stavros Sachtouris
        perms = None
781 3dabe5d2 Stavros Sachtouris
        for permission_type, permission_list in permissions.items():
782 24ff0a35 Stavros Sachtouris
            if not perms:
783 3dabe5d2 Stavros Sachtouris
                perms = ''  # Remove permissions
784 3dabe5d2 Stavros Sachtouris
            if len(permission_list) == 0:
785 afd9d603 Stavros Sachtouris
                continue
786 3dabe5d2 Stavros Sachtouris
            if len(perms):
787 3dabe5d2 Stavros Sachtouris
                perms += ';'
788 24ff0a35 Stavros Sachtouris
            perms += '%s=%s' % (
789 24ff0a35 Stavros Sachtouris
                permission_type,
790 24ff0a35 Stavros Sachtouris
                list2str(permission_list, separator=','))
791 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
792 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
793 afd9d603 Stavros Sachtouris
        for key, val in metadata.items():
794 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Object-Meta-' + key, val)
795 afd9d603 Stavros Sachtouris
796 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
797 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
798 afd9d603 Stavros Sachtouris
        return self.move(path, *args, success=success, **kwargs)
799 afd9d603 Stavros Sachtouris
800 24ff0a35 Stavros Sachtouris
    def object_post(
801 24ff0a35 Stavros Sachtouris
            self, object,
802 24ff0a35 Stavros Sachtouris
            format='json',
803 24ff0a35 Stavros Sachtouris
            update=True,
804 24ff0a35 Stavros Sachtouris
            if_etag_match=None,
805 24ff0a35 Stavros Sachtouris
            if_etag_not_match=None,
806 24ff0a35 Stavros Sachtouris
            content_length=None,
807 24ff0a35 Stavros Sachtouris
            content_type=None,
808 24ff0a35 Stavros Sachtouris
            content_range=None,
809 24ff0a35 Stavros Sachtouris
            transfer_encoding=None,
810 24ff0a35 Stavros Sachtouris
            content_encoding=None,
811 24ff0a35 Stavros Sachtouris
            content_disposition=None,
812 24ff0a35 Stavros Sachtouris
            source_object=None,
813 24ff0a35 Stavros Sachtouris
            source_account=None,
814 24ff0a35 Stavros Sachtouris
            source_version=None,
815 24ff0a35 Stavros Sachtouris
            object_bytes=None,
816 24ff0a35 Stavros Sachtouris
            manifest=None,
817 24ff0a35 Stavros Sachtouris
            permissions={},
818 24ff0a35 Stavros Sachtouris
            public=False,
819 24ff0a35 Stavros Sachtouris
            metadata={},
820 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
821 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at object level
822 9e4508df Stavros Sachtouris

823 afd9d603 Stavros Sachtouris
        --- request parameters ---
824 9e4508df Stavros Sachtouris

825 9e4508df Stavros Sachtouris
        :param format: (string) json (default) or xml
826 9e4508df Stavros Sachtouris

827 9e4508df Stavros Sachtouris
        :param update: (bool) Do not replace metadata
828 9e4508df Stavros Sachtouris

829 afd9d603 Stavros Sachtouris
        --- request headers ---
830 9e4508df Stavros Sachtouris

831 9e4508df Stavros Sachtouris
        :param if_etag_match: (string) if provided, return only results
832 9e4508df Stavros Sachtouris
            with etag matching with this
833 9e4508df Stavros Sachtouris

834 9e4508df Stavros Sachtouris
        :param if_etag_not_match: (string) if provided, return only results
835 9e4508df Stavros Sachtouris
            with etag not matching with this
836 9e4508df Stavros Sachtouris

837 9e4508df Stavros Sachtouris
        :param content_length: (string) The size of the data written
838 9e4508df Stavros Sachtouris

839 9e4508df Stavros Sachtouris
        :param content_type: (string) The MIME content type of the object
840 9e4508df Stavros Sachtouris

841 9e4508df Stavros Sachtouris
        :param content_range: (string) The range of data supplied
842 9e4508df Stavros Sachtouris

843 9e4508df Stavros Sachtouris
        :param transfer_encoding: (string) Set to chunked to specify
844 9e4508df Stavros Sachtouris
            incremental uploading (if used, Content-Length is ignored)
845 9e4508df Stavros Sachtouris

846 9e4508df Stavros Sachtouris
        :param content_encoding: (string) The encoding of the object
847 9e4508df Stavros Sachtouris

848 9e4508df Stavros Sachtouris
        :param content_disposition: (string) Object presentation style
849 9e4508df Stavros Sachtouris

850 9e4508df Stavros Sachtouris
        :param source_object: (string) Update with data from the object at
851 9e4508df Stavros Sachtouris
            path /<container>/<object>
852 9e4508df Stavros Sachtouris

853 9e4508df Stavros Sachtouris
        :param source_account: (string) The source account to update from
854 9e4508df Stavros Sachtouris

855 9e4508df Stavros Sachtouris
        :param source_version: (string) The source version to copy from
856 9e4508df Stavros Sachtouris

857 9e4508df Stavros Sachtouris
        :param object_bytes: (integer) The updated objects final size
858 9e4508df Stavros Sachtouris

859 9e4508df Stavros Sachtouris
        :param manifest: (string) Object parts prefix as /<container>/<object>
860 9e4508df Stavros Sachtouris

861 9e4508df Stavros Sachtouris
        :param permissions: (dict) Object permissions in the form (all fields
862 9e4508df Stavros Sachtouris
            are optional)
863 9e4508df Stavros Sachtouris
            { 'read':[user1, group1, user2, ...],
864 9e4508df Stavros Sachtouris
            'write':['user3, group2, group3, ...] }
865 9e4508df Stavros Sachtouris

866 9e4508df Stavros Sachtouris
        :param public: (bool) If true, Object is publicly accessible
867 9e4508df Stavros Sachtouris

868 9e4508df Stavros Sachtouris
        :param metadata: (dict) Optional user defined metadata in the form
869 9e4508df Stavros Sachtouris
            {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
870 9e4508df Stavros Sachtouris

871 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
872 afd9d603 Stavros Sachtouris
        """
873 4067cdaf Stavros Sachtouris
874 d88ba587 Stavros Sachtouris
        self._assert_container()
875 afd9d603 Stavros Sachtouris
876 24ff0a35 Stavros Sachtouris
        self.set_param('format', format, iff=format)
877 3dabe5d2 Stavros Sachtouris
        self.set_param('update', iff=update)
878 afd9d603 Stavros Sachtouris
879 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
880 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
881 24ff0a35 Stavros Sachtouris
        self.set_header(
882 24ff0a35 Stavros Sachtouris
            'Content-Length',
883 3dabe5d2 Stavros Sachtouris
            content_length,
884 24ff0a35 Stavros Sachtouris
            iff=not transfer_encoding)
885 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
886 afd9d603 Stavros Sachtouris
        self.set_header('Content-Range', content_range)
887 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
888 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
889 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
890 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Object', source_object)
891 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Account', source_account)
892 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
893 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Bytes', object_bytes)
894 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Manifest', manifest)
895 afd9d603 Stavros Sachtouris
        perms = None
896 3dabe5d2 Stavros Sachtouris
        for permission_type, permission_list in permissions.items():
897 24ff0a35 Stavros Sachtouris
            if not perms:
898 3dabe5d2 Stavros Sachtouris
                perms = ''  # Remove permissions
899 3dabe5d2 Stavros Sachtouris
            if len(permission_list) == 0:
900 afd9d603 Stavros Sachtouris
                continue
901 3dabe5d2 Stavros Sachtouris
            if len(perms):
902 3dabe5d2 Stavros Sachtouris
                perms += ';'
903 24ff0a35 Stavros Sachtouris
            perms += '%s=%s' % (
904 24ff0a35 Stavros Sachtouris
                permission_type,
905 24ff0a35 Stavros Sachtouris
                list2str(permission_list, separator=','))
906 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
907 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
908 afd9d603 Stavros Sachtouris
        for key, val in metadata.items():
909 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Object-Meta-' + key, val)
910 afd9d603 Stavros Sachtouris
911 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
912 3dabe5d2 Stavros Sachtouris
        success = kwargs.pop('success', (202, 204))
913 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
914 3dabe5d2 Stavros Sachtouris
915 24ff0a35 Stavros Sachtouris
    def object_delete(
916 24ff0a35 Stavros Sachtouris
            self, object,
917 24ff0a35 Stavros Sachtouris
            until=None, delimiter=None,
918 24ff0a35 Stavros Sachtouris
            *args, **kwargs):
919 afd9d603 Stavros Sachtouris
        """ Full Pithos+ DELETE at object level
920 9e4508df Stavros Sachtouris

921 3dabe5d2 Stavros Sachtouris
        --- request parameters ---
922 9e4508df Stavros Sachtouris

923 9e4508df Stavros Sachtouris
        :param until: (string) Optional timestamp
924 9e4508df Stavros Sachtouris

925 9e4508df Stavros Sachtouris
        :returns: ConnectionResponse
926 afd9d603 Stavros Sachtouris
        """
927 d88ba587 Stavros Sachtouris
        self._assert_container()
928 afd9d603 Stavros Sachtouris
929 24ff0a35 Stavros Sachtouris
        self.set_param('until', until, iff=until)
930 24ff0a35 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter)
931 afd9d603 Stavros Sachtouris
932 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
933 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
934 3dabe5d2 Stavros Sachtouris
        return self.delete(path, *args, success=success, **kwargs)