Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / pithos_rest_api.py @ cccff590

History | View | Annotate | Download (31.4 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 3dabe5d2 Stavros Sachtouris
    def account_head(self,
41 3dabe5d2 Stavros Sachtouris
        until=None,
42 3dabe5d2 Stavros Sachtouris
        if_modified_since=None,
43 3dabe5d2 Stavros Sachtouris
        if_unmodified_since=None,
44 3dabe5d2 Stavros Sachtouris
        *args,
45 3dabe5d2 Stavros Sachtouris
        **kwargs):
46 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at account level
47 afd9d603 Stavros Sachtouris
        --- request parameters ---
48 afd9d603 Stavros Sachtouris
        @param until (string): optional timestamp
49 afd9d603 Stavros Sachtouris
        --- --- optional request headers ---
50 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
51 3dabe5d2 Stavros Sachtouris
            since provided timestamp
52 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
53 3dabe5d2 Stavros Sachtouris
            change since provided timestamp
54 afd9d603 Stavros Sachtouris
        """
55 afd9d603 Stavros Sachtouris
        self.assert_account()
56 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
57 afd9d603 Stavros Sachtouris
58 3dabe5d2 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
59 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
60 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
61 afd9d603 Stavros Sachtouris
62 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
63 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
64 afd9d603 Stavros Sachtouris
65 3dabe5d2 Stavros Sachtouris
    def account_get(self,
66 3dabe5d2 Stavros Sachtouris
        limit=None,
67 3dabe5d2 Stavros Sachtouris
        marker=None,
68 3dabe5d2 Stavros Sachtouris
        format='json',
69 3dabe5d2 Stavros Sachtouris
        show_only_shared=False,
70 3dabe5d2 Stavros Sachtouris
        until=None,
71 3dabe5d2 Stavros Sachtouris
        if_modified_since=None,
72 3dabe5d2 Stavros Sachtouris
        if_unmodified_since=None,
73 3dabe5d2 Stavros Sachtouris
        *args,
74 3dabe5d2 Stavros Sachtouris
        **kwargs):
75 afd9d603 Stavros Sachtouris
        """  Full Pithos+ GET at account level
76 afd9d603 Stavros Sachtouris
        --- request parameters ---
77 3dabe5d2 Stavros Sachtouris
        @param limit (integer): The amount of results requested
78 3dabe5d2 Stavros Sachtouris
            (server will use default value if None)
79 3dabe5d2 Stavros Sachtouris
        @param marker (string): Return containers with name
80 3dabe5d2 Stavros Sachtouris
            lexicographically after marker
81 3dabe5d2 Stavros Sachtouris
        @param format (string): reply format can be json or xml
82 3dabe5d2 Stavros Sachtouris
            (default: json)
83 3dabe5d2 Stavros Sachtouris
        @param shared (bool): If true, only shared containers will be
84 3dabe5d2 Stavros Sachtouris
            included in results
85 afd9d603 Stavros Sachtouris
        @param until (string): optional timestamp
86 afd9d603 Stavros Sachtouris
        --- --- optional request headers ---
87 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
88 3dabe5d2 Stavros Sachtouris
            since provided timestamp
89 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
90 3dabe5d2 Stavros Sachtouris
            changed since provided timestamp
91 afd9d603 Stavros Sachtouris
        """
92 afd9d603 Stavros Sachtouris
        self.assert_account()
93 afd9d603 Stavros Sachtouris
94 3dabe5d2 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
95 3dabe5d2 Stavros Sachtouris
        self.set_param('limit', limit, iff=limit is not None)
96 3dabe5d2 Stavros Sachtouris
        self.set_param('marker', marker, iff=marker is not None)
97 3dabe5d2 Stavros Sachtouris
        self.set_param('shared', iff=show_only_shared)
98 3dabe5d2 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
99 afd9d603 Stavros Sachtouris
100 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
101 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
102 afd9d603 Stavros Sachtouris
103 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
104 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', (200, 204))
105 3dabe5d2 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
106 afd9d603 Stavros Sachtouris
107 3dabe5d2 Stavros Sachtouris
    def account_post(self,
108 3dabe5d2 Stavros Sachtouris
        update=True,
109 3dabe5d2 Stavros Sachtouris
        groups={},
110 3dabe5d2 Stavros Sachtouris
        metadata=None,
111 3dabe5d2 Stavros Sachtouris
        quota=None,
112 3dabe5d2 Stavros Sachtouris
        versioning=None,
113 3dabe5d2 Stavros Sachtouris
        *args,
114 3dabe5d2 Stavros Sachtouris
        **kwargs):
115 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at account level
116 afd9d603 Stavros Sachtouris
        --- request parameters ---
117 afd9d603 Stavros Sachtouris
        @param update (bool): if True, Do not replace metadata/groups
118 afd9d603 Stavros Sachtouris
        --- request headers ---
119 afd9d603 Stavros Sachtouris
        @groups (dict): Optional user defined groups in the form
120 3dabe5d2 Stavros Sachtouris
                    {   'group1':['user1', 'user2', ...],
121 afd9d603 Stavros Sachtouris
                        'group2':['userA', 'userB', ...], ...
122 afd9d603 Stavros Sachtouris
                    }
123 afd9d603 Stavros Sachtouris
        @metadata (dict): Optional user defined metadata in the form
124 afd9d603 Stavros Sachtouris
                    {   'name1': 'value1',
125 afd9d603 Stavros Sachtouris
                        'name2': 'value2', ...
126 afd9d603 Stavros Sachtouris
                    }
127 afd9d603 Stavros Sachtouris
        @param quota(integer): If supported, sets the Account quota
128 afd9d603 Stavros Sachtouris
        @param versioning(string): If supported, sets the Account versioning
129 afd9d603 Stavros Sachtouris
                    to 'auto' or some other supported versioning string
130 afd9d603 Stavros Sachtouris
        """
131 afd9d603 Stavros Sachtouris
        self.assert_account()
132 afd9d603 Stavros Sachtouris
133 3dabe5d2 Stavros Sachtouris
        self.set_param('update', iff=update)
134 afd9d603 Stavros Sachtouris
135 afd9d603 Stavros Sachtouris
        for group, usernames in groups.items():
136 afd9d603 Stavros Sachtouris
            userstr = ''
137 afd9d603 Stavros Sachtouris
            dlm = ''
138 afd9d603 Stavros Sachtouris
            for user in usernames:
139 afd9d603 Stavros Sachtouris
                userstr = userstr + dlm + user
140 afd9d603 Stavros Sachtouris
                dlm = ','
141 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Account-Group-' + group, userstr)
142 afd9d603 Stavros Sachtouris
        if metadata is not None:
143 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
144 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Account-Meta-' + metaname, metaval)
145 afd9d603 Stavros Sachtouris
        self.set_header('X-Account-Policy-Quota', quota)
146 afd9d603 Stavros Sachtouris
        self.set_header('X-Account-Policy-Versioning', versioning)
147 afd9d603 Stavros Sachtouris
148 afd9d603 Stavros Sachtouris
        path = path4url(self.account)
149 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 202)
150 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
151 afd9d603 Stavros Sachtouris
152 afd9d603 Stavros Sachtouris
    def container_head(self, until=None,
153 afd9d603 Stavros Sachtouris
        if_modified_since=None, if_unmodified_since=None, *args, **kwargs):
154 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at container level
155 afd9d603 Stavros Sachtouris
        --- request params ---
156 afd9d603 Stavros Sachtouris
        @param until (string): optional timestamp
157 3dabe5d2 Stavros Sachtouris
        --- optional request headers ---
158 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
159 3dabe5d2 Stavros Sachtouris
            since provided timestamp
160 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
161 3dabe5d2 Stavros Sachtouris
            changed since provided timestamp
162 afd9d603 Stavros Sachtouris
        """
163 afd9d603 Stavros Sachtouris
        self.assert_container()
164 afd9d603 Stavros Sachtouris
165 afd9d603 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
166 afd9d603 Stavros Sachtouris
167 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
168 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
169 afd9d603 Stavros Sachtouris
170 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
171 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
172 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
173 afd9d603 Stavros Sachtouris
174 3dabe5d2 Stavros Sachtouris
    def container_get(self,
175 3dabe5d2 Stavros Sachtouris
        limit=None,
176 3dabe5d2 Stavros Sachtouris
        marker=None,
177 3dabe5d2 Stavros Sachtouris
        prefix=None,
178 3dabe5d2 Stavros Sachtouris
        delimiter=None,
179 3dabe5d2 Stavros Sachtouris
        path=None,
180 3dabe5d2 Stavros Sachtouris
        format='json',
181 3dabe5d2 Stavros Sachtouris
        meta=[],
182 3dabe5d2 Stavros Sachtouris
        show_only_shared=False,
183 3dabe5d2 Stavros Sachtouris
        until=None,
184 3dabe5d2 Stavros Sachtouris
        if_modified_since=None,
185 3dabe5d2 Stavros Sachtouris
        if_unmodified_since=None,
186 3dabe5d2 Stavros Sachtouris
        *args,
187 3dabe5d2 Stavros Sachtouris
        **kwargs):
188 afd9d603 Stavros Sachtouris
        """ Full Pithos+ GET at container level
189 afd9d603 Stavros Sachtouris
        --- request parameters ---
190 3dabe5d2 Stavros Sachtouris
        @param limit (integer): The amount of results requested
191 3dabe5d2 Stavros Sachtouris
            (server qill use default value if None)
192 3dabe5d2 Stavros Sachtouris
        @param marker (string): Return containers with name lexicographically
193 3dabe5d2 Stavros Sachtouris
            after marker
194 afd9d603 Stavros Sachtouris
        @param prefix (string): Return objects starting with prefix
195 afd9d603 Stavros Sachtouris
        @param delimiter (string): Return objects up to the delimiter
196 3dabe5d2 Stavros Sachtouris
        @param path (string): assume prefix = path and delimiter = /
197 3dabe5d2 Stavros Sachtouris
            (overwrites prefix and delimiter)
198 3dabe5d2 Stavros Sachtouris
        @param format (string): reply format can be json or xml (default:json)
199 3dabe5d2 Stavros Sachtouris
        @param meta (list): Return objects that satisfy the key queries in
200 3dabe5d2 Stavros Sachtouris
            the specified comma separated list (use <key>, !<key> for
201 3dabe5d2 Stavros Sachtouris
            existence queries, <key><op><value> for value queries, where <op>
202 3dabe5d2 Stavros Sachtouris
            can be one of =, !=, <=, >=, <, >)
203 3dabe5d2 Stavros Sachtouris
        @param shared (bool): If true, only shared containers will be included
204 3dabe5d2 Stavros Sachtouris
        in results
205 afd9d603 Stavros Sachtouris
        @param until (string): optional timestamp
206 afd9d603 Stavros Sachtouris
        --- --- optional request headers ---
207 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
208 3dabe5d2 Stavros Sachtouris
            since provided timestamp
209 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
210 3dabe5d2 Stavros Sachtouris
            changed since provided timestamp
211 afd9d603 Stavros Sachtouris
        """
212 afd9d603 Stavros Sachtouris
        self.assert_container()
213 afd9d603 Stavros Sachtouris
214 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
215 afd9d603 Stavros Sachtouris
        self.set_param('limit', limit, iff=limit is not None)
216 afd9d603 Stavros Sachtouris
        self.set_param('marker', marker, iff=marker is not None)
217 afd9d603 Stavros Sachtouris
        if path is None:
218 afd9d603 Stavros Sachtouris
            self.set_param('prefix', prefix, iff=prefix is not None)
219 afd9d603 Stavros Sachtouris
            self.set_param('delimiter', delimiter, iff=delimiter is not None)
220 afd9d603 Stavros Sachtouris
        else:
221 afd9d603 Stavros Sachtouris
            self.set_param('path', path)
222 afd9d603 Stavros Sachtouris
        self.set_param('shared', iff=show_only_shared)
223 3dabe5d2 Stavros Sachtouris
        self.set_param('meta',
224 3dabe5d2 Stavros Sachtouris
            list2str(meta),
225 3dabe5d2 Stavros Sachtouris
            iff=meta is not None and len(meta) > 0)
226 afd9d603 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
227 afd9d603 Stavros Sachtouris
228 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
229 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
230 afd9d603 Stavros Sachtouris
231 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
232 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
233 afd9d603 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
234 afd9d603 Stavros Sachtouris
235 3dabe5d2 Stavros Sachtouris
    def container_put(self,
236 3dabe5d2 Stavros Sachtouris
        quota=None,
237 3dabe5d2 Stavros Sachtouris
        versioning=None,
238 3dabe5d2 Stavros Sachtouris
        metadata=None,
239 3dabe5d2 Stavros Sachtouris
        *args,
240 3dabe5d2 Stavros Sachtouris
        **kwargs):
241 afd9d603 Stavros Sachtouris
        """ Full Pithos+ PUT at container level
242 afd9d603 Stavros Sachtouris
        --- request headers ---
243 afd9d603 Stavros Sachtouris
        @param quota (integer): Size limit in KB
244 afd9d603 Stavros Sachtouris
        @param versioning (string): 'auto' or other string supported by server
245 afd9d603 Stavros Sachtouris
        @metadata (dict): Optional user defined metadata in the form
246 afd9d603 Stavros Sachtouris
        {   'name1': 'value1',
247 afd9d603 Stavros Sachtouris
        'name2': 'value2', ...
248 afd9d603 Stavros Sachtouris
        }
249 afd9d603 Stavros Sachtouris
        """
250 afd9d603 Stavros Sachtouris
        self.assert_container()
251 afd9d603 Stavros Sachtouris
252 afd9d603 Stavros Sachtouris
        if metadata is not None:
253 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
254 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Container-Meta-' + metaname, metaval)
255 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Quota', quota)
256 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Versioning', versioning)
257 afd9d603 Stavros Sachtouris
258 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
259 3dabe5d2 Stavros Sachtouris
        success = kwargs.pop('success', (201, 202))
260 afd9d603 Stavros Sachtouris
        return self.put(path, *args, success=success, **kwargs)
261 afd9d603 Stavros Sachtouris
262 3dabe5d2 Stavros Sachtouris
    def container_post(self,
263 3dabe5d2 Stavros Sachtouris
        update=True,
264 3dabe5d2 Stavros Sachtouris
        format='json',
265 3dabe5d2 Stavros Sachtouris
        quota=None,
266 3dabe5d2 Stavros Sachtouris
        versioning=None,
267 3dabe5d2 Stavros Sachtouris
        metadata=None,
268 3dabe5d2 Stavros Sachtouris
        content_type=None,
269 3dabe5d2 Stavros Sachtouris
        content_length=None,
270 3dabe5d2 Stavros Sachtouris
        transfer_encoding=None,
271 3dabe5d2 Stavros Sachtouris
        *args,
272 3dabe5d2 Stavros Sachtouris
        **kwargs):
273 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at container level
274 afd9d603 Stavros Sachtouris
        --- request params ---
275 afd9d603 Stavros Sachtouris
        @param update (bool):  if True, Do not replace metadata/groups
276 afd9d603 Stavros Sachtouris
        @param format(string): json (default) or xml
277 afd9d603 Stavros Sachtouris
        --- request headers ---
278 afd9d603 Stavros Sachtouris
        @param quota (integer): Size limit in KB
279 afd9d603 Stavros Sachtouris
        @param versioning (string): 'auto' or other string supported by server
280 afd9d603 Stavros Sachtouris
        @metadata (dict): Optional user defined metadata in the form
281 afd9d603 Stavros Sachtouris
        {   'name1': 'value1',
282 afd9d603 Stavros Sachtouris
        'name2': 'value2', ...
283 afd9d603 Stavros Sachtouris
        }
284 afd9d603 Stavros Sachtouris
        @param content_type (string): set a custom content type
285 afd9d603 Stavros Sachtouris
        @param content_length (string): set a custrom content length
286 afd9d603 Stavros Sachtouris
        @param transfer_encoding (string): set a custrom transfer encoding
287 afd9d603 Stavros Sachtouris
        """
288 afd9d603 Stavros Sachtouris
        self.assert_container()
289 afd9d603 Stavros Sachtouris
290 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
291 afd9d603 Stavros Sachtouris
        self.set_param('update', iff=update)
292 afd9d603 Stavros Sachtouris
293 afd9d603 Stavros Sachtouris
        if metadata is not None:
294 afd9d603 Stavros Sachtouris
            for metaname, metaval in metadata.items():
295 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Container-Meta-' + metaname, metaval)
296 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Quota', quota)
297 afd9d603 Stavros Sachtouris
        self.set_header('X-Container-Policy-Versioning', versioning)
298 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
299 afd9d603 Stavros Sachtouris
        self.set_header('Content-Length', content_length)
300 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
301 afd9d603 Stavros Sachtouris
302 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container)
303 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 202)
304 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
305 afd9d603 Stavros Sachtouris
306 afd9d603 Stavros Sachtouris
    def container_delete(self, until=None, delimiter=None, *args, **kwargs):
307 afd9d603 Stavros Sachtouris
        """ Full Pithos+ DELETE at container level
308 afd9d603 Stavros Sachtouris
        --- request parameters ---
309 3dabe5d2 Stavros Sachtouris
        @param until (timestamp string): if defined, container is purged up to
310 3dabe5d2 Stavros Sachtouris
            that time
311 afd9d603 Stavros Sachtouris
        """
312 3dabe5d2 Stavros Sachtouris
        self.assert_container()
313 afd9d603 Stavros Sachtouris
314 afd9d603 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
315 afd9d603 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter is not None)
316 afd9d603 Stavros Sachtouris
317 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container)
318 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
319 afd9d603 Stavros Sachtouris
        return self.delete(path, success=success)
320 afd9d603 Stavros Sachtouris
321 3dabe5d2 Stavros Sachtouris
    def object_head(self, object,
322 3dabe5d2 Stavros Sachtouris
        version=None,
323 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
324 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
325 3dabe5d2 Stavros Sachtouris
        if_modified_since=None,
326 3dabe5d2 Stavros Sachtouris
        if_unmodified_since=None,
327 3dabe5d2 Stavros Sachtouris
        *args,
328 3dabe5d2 Stavros Sachtouris
        **kwargs):
329 afd9d603 Stavros Sachtouris
        """ Full Pithos+ HEAD at object level
330 afd9d603 Stavros Sachtouris
        --- request parameters ---
331 afd9d603 Stavros Sachtouris
        @param version (string): optional version identified
332 afd9d603 Stavros Sachtouris
        --- request headers ---
333 afd9d603 Stavros Sachtouris
        @param if_etag_match (string): if provided, return only results
334 afd9d603 Stavros Sachtouris
                with etag matching with this
335 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, return only results
336 afd9d603 Stavros Sachtouris
                with etag not matching with this
337 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
338 3dabe5d2 Stavros Sachtouris
            since provided timestamp
339 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
340 3dabe5d2 Stavros Sachtouris
            changed since provided timestamp
341 afd9d603 Stavros Sachtouris
        """
342 afd9d603 Stavros Sachtouris
        self.assert_container()
343 afd9d603 Stavros Sachtouris
344 afd9d603 Stavros Sachtouris
        self.set_param('version', version, iff=version is not None)
345 afd9d603 Stavros Sachtouris
346 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
347 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
348 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
349 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
350 afd9d603 Stavros Sachtouris
351 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
352 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
353 afd9d603 Stavros Sachtouris
        return self.head(path, *args, success=success, **kwargs)
354 afd9d603 Stavros Sachtouris
355 3dabe5d2 Stavros Sachtouris
    def object_get(self, object,
356 3dabe5d2 Stavros Sachtouris
        format='json',
357 3dabe5d2 Stavros Sachtouris
        hashmap=False,
358 3dabe5d2 Stavros Sachtouris
        version=None,
359 3dabe5d2 Stavros Sachtouris
        data_range=None,
360 3dabe5d2 Stavros Sachtouris
        if_range=False,
361 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
362 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
363 3dabe5d2 Stavros Sachtouris
        if_modified_since=None,
364 3dabe5d2 Stavros Sachtouris
        if_unmodified_since=None,
365 3dabe5d2 Stavros Sachtouris
        *args,
366 3dabe5d2 Stavros Sachtouris
        **kwargs):
367 afd9d603 Stavros Sachtouris
        """ Full Pithos+ GET at object level
368 afd9d603 Stavros Sachtouris
        --- request parameters ---
369 afd9d603 Stavros Sachtouris
        @param format (string): json (default) or xml
370 afd9d603 Stavros Sachtouris
        @param hashmap (bool): Optional request for hashmap
371 afd9d603 Stavros Sachtouris
        @param version (string): optional version identified
372 afd9d603 Stavros Sachtouris
        --- request headers ---
373 afd9d603 Stavros Sachtouris
        @param data_range (string): Optional range of data to retrieve
374 3dabe5d2 Stavros Sachtouris
        @param if_range (bool):
375 afd9d603 Stavros Sachtouris
        @param if_etag_match (string): if provided, return only results
376 afd9d603 Stavros Sachtouris
                with etag matching with this
377 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, return only results
378 afd9d603 Stavros Sachtouris
                with etag not matching with this
379 3dabe5d2 Stavros Sachtouris
        @param if_modified_since (string): Retrieve if account has changed
380 3dabe5d2 Stavros Sachtouris
            since provided timestamp
381 3dabe5d2 Stavros Sachtouris
        @param if_unmodified_since (string): Retrieve if account has not
382 3dabe5d2 Stavros Sachtouris
            changed since provided timestamp
383 afd9d603 Stavros Sachtouris
        """
384 afd9d603 Stavros Sachtouris
        self.assert_container()
385 afd9d603 Stavros Sachtouris
386 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
387 afd9d603 Stavros Sachtouris
        self.set_param('version', version, iff=version is not None)
388 afd9d603 Stavros Sachtouris
        self.set_param('hashmap', hashmap, iff=hashmap)
389 afd9d603 Stavros Sachtouris
390 afd9d603 Stavros Sachtouris
        self.set_header('Range', data_range)
391 3dabe5d2 Stavros Sachtouris
        self.set_header('If-Range', '',
392 3dabe5d2 Stavros Sachtouris
            if_range is True and data_range is not None)
393 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match, )
394 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
395 afd9d603 Stavros Sachtouris
        self.set_header('If-Modified-Since', if_modified_since)
396 afd9d603 Stavros Sachtouris
        self.set_header('If-Unmodified-Since', if_unmodified_since)
397 afd9d603 Stavros Sachtouris
398 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
399 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 200)
400 afd9d603 Stavros Sachtouris
        return self.get(path, *args, success=success, **kwargs)
401 afd9d603 Stavros Sachtouris
402 3dabe5d2 Stavros Sachtouris
    def object_put(self, object,
403 3dabe5d2 Stavros Sachtouris
        format='json',
404 3dabe5d2 Stavros Sachtouris
        hashmap=False,
405 3dabe5d2 Stavros Sachtouris
        delimiter=None,
406 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
407 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
408 3dabe5d2 Stavros Sachtouris
        etag=None,
409 3dabe5d2 Stavros Sachtouris
        content_length=None,
410 3dabe5d2 Stavros Sachtouris
        content_type=None,
411 3dabe5d2 Stavros Sachtouris
        transfer_encoding=None,
412 3dabe5d2 Stavros Sachtouris
        copy_from=None,
413 3dabe5d2 Stavros Sachtouris
        move_from=None,
414 3dabe5d2 Stavros Sachtouris
        source_account=None,
415 3dabe5d2 Stavros Sachtouris
        source_version=None,
416 3dabe5d2 Stavros Sachtouris
        content_encoding=None,
417 3dabe5d2 Stavros Sachtouris
        content_disposition=None,
418 3dabe5d2 Stavros Sachtouris
        manifest=None,
419 3dabe5d2 Stavros Sachtouris
        permissions=None,
420 3dabe5d2 Stavros Sachtouris
        public=None,
421 3dabe5d2 Stavros Sachtouris
        metadata=None,
422 3dabe5d2 Stavros Sachtouris
        *args,
423 3dabe5d2 Stavros Sachtouris
        **kwargs):
424 afd9d603 Stavros Sachtouris
        """ Full Pithos+ PUT at object level
425 afd9d603 Stavros Sachtouris
        --- request parameters ---
426 afd9d603 Stavros Sachtouris
        @param format (string): json (default) or xml
427 afd9d603 Stavros Sachtouris
        @param hashmap (bool): Optional hashmap provided instead of data
428 afd9d603 Stavros Sachtouris
        --- request headers ---
429 afd9d603 Stavros Sachtouris
        @param if_etag_match (string): if provided, return only results
430 afd9d603 Stavros Sachtouris
                with etag matching with this
431 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, return only results
432 afd9d603 Stavros Sachtouris
                with etag not matching with this
433 3dabe5d2 Stavros Sachtouris
        @param etag (string): The MD5 hash of the object (optional to check
434 3dabe5d2 Stavros Sachtouris
            written data)
435 afd9d603 Stavros Sachtouris
        @param content_length (integer): The size of the data written
436 afd9d603 Stavros Sachtouris
        @param content_type (string): The MIME content type of the object
437 3dabe5d2 Stavros Sachtouris
        @param transfer_encoding (string): Set to chunked to specify
438 3dabe5d2 Stavros Sachtouris
            incremental uploading (if used, Content-Length is ignored)
439 3dabe5d2 Stavros Sachtouris
        @param copy_from (string): The source path in the form
440 3dabe5d2 Stavros Sachtouris
            /<container>/<object>
441 3dabe5d2 Stavros Sachtouris
        @param move_from (string): The source path in the form
442 3dabe5d2 Stavros Sachtouris
            /<container>/<object>
443 afd9d603 Stavros Sachtouris
        @param source_account (string): The source account to copy/move from
444 afd9d603 Stavros Sachtouris
        @param source_version (string): The source version to copy from
445 afd9d603 Stavros Sachtouris
        @param conent_encoding (string): The encoding of the object
446 3dabe5d2 Stavros Sachtouris
        @param content_disposition (string): Presentation style of the object
447 3dabe5d2 Stavros Sachtouris
        @param manifest (string): Object parts prefix in
448 3dabe5d2 Stavros Sachtouris
            /<container>/<object> form
449 3dabe5d2 Stavros Sachtouris
        @param permissions (dict): Object permissions in the form (all fields
450 3dabe5d2 Stavros Sachtouris
            are optional)
451 3dabe5d2 Stavros Sachtouris
            {   'read':[user1, group1, user2, ...],
452 3dabe5d2 Stavros Sachtouris
                'write':['user3, group2, group3, ...]
453 3dabe5d2 Stavros Sachtouris
            }
454 3dabe5d2 Stavros Sachtouris
        @param public (bool): If true, Object is publicly accessible,
455 3dabe5d2 Stavros Sachtouris
            if false, not
456 afd9d603 Stavros Sachtouris
        @param metadata (dict): Optional user defined metadata in the form
457 afd9d603 Stavros Sachtouris
                {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
458 afd9d603 Stavros Sachtouris
        """
459 afd9d603 Stavros Sachtouris
        self.assert_container()
460 afd9d603 Stavros Sachtouris
461 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
462 afd9d603 Stavros Sachtouris
        self.set_param('hashmap', hashmap, iff=hashmap)
463 afd9d603 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter is not None)
464 afd9d603 Stavros Sachtouris
465 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
466 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
467 afd9d603 Stavros Sachtouris
        self.set_header('ETag', etag)
468 afd9d603 Stavros Sachtouris
        self.set_header('Content-Length', content_length)
469 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
470 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
471 afd9d603 Stavros Sachtouris
        self.set_header('X-Copy-From', copy_from)
472 afd9d603 Stavros Sachtouris
        self.set_header('X-Move-From', move_from)
473 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Account', source_account)
474 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
475 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
476 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
477 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Manifest', manifest)
478 afd9d603 Stavros Sachtouris
        perms = None
479 3dabe5d2 Stavros Sachtouris
        if permissions:
480 3dabe5d2 Stavros Sachtouris
            for permission_type, permission_list in permissions.items():
481 afd9d603 Stavros Sachtouris
                if perms is None:
482 3dabe5d2 Stavros Sachtouris
                    perms = ''  # Remove permissions
483 3dabe5d2 Stavros Sachtouris
                if len(permission_list) == 0:
484 afd9d603 Stavros Sachtouris
                    continue
485 3dabe5d2 Stavros Sachtouris
                if len(perms):
486 3dabe5d2 Stavros Sachtouris
                    perms += ';'
487 3dabe5d2 Stavros Sachtouris
                perms += '%s=%s'\
488 3dabe5d2 Stavros Sachtouris
                % (permission_type, list2str(permission_list, seperator=','))
489 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
490 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
491 afd9d603 Stavros Sachtouris
        if metadata is not None:
492 afd9d603 Stavros Sachtouris
            for key, val in metadata.items():
493 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Object-Meta-' + key, val)
494 afd9d603 Stavros Sachtouris
495 3dabe5d2 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
496 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
497 afd9d603 Stavros Sachtouris
        return self.put(path, *args, success=success, **kwargs)
498 afd9d603 Stavros Sachtouris
499 3dabe5d2 Stavros Sachtouris
    def object_copy(self, object, destination,
500 3dabe5d2 Stavros Sachtouris
        format='json',
501 3dabe5d2 Stavros Sachtouris
        ignore_content_type=False,
502 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
503 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
504 3dabe5d2 Stavros Sachtouris
        destination_account=None,
505 3dabe5d2 Stavros Sachtouris
        content_type=None,
506 3dabe5d2 Stavros Sachtouris
        content_encoding=None,
507 3dabe5d2 Stavros Sachtouris
        content_disposition=None,
508 3dabe5d2 Stavros Sachtouris
        source_version=None,
509 3dabe5d2 Stavros Sachtouris
        permissions=None,
510 3dabe5d2 Stavros Sachtouris
        public=False,
511 3dabe5d2 Stavros Sachtouris
        metadata=None,
512 3dabe5d2 Stavros Sachtouris
        *args,
513 3dabe5d2 Stavros Sachtouris
        **kwargs):
514 afd9d603 Stavros Sachtouris
        """ Full Pithos+ COPY at object level
515 afd9d603 Stavros Sachtouris
        --- request parameters ---
516 afd9d603 Stavros Sachtouris
        @param format (string): json (default) or xml
517 afd9d603 Stavros Sachtouris
        @param ignore_content_type (bool): Ignore the supplied Content-Type
518 afd9d603 Stavros Sachtouris
        --- request headers ---
519 afd9d603 Stavros Sachtouris
         @param if_etag_match (string): if provided, copy only results
520 afd9d603 Stavros Sachtouris
                with etag matching with this
521 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, copy only results
522 afd9d603 Stavros Sachtouris
                with etag not matching with this
523 3dabe5d2 Stavros Sachtouris
        @param destination (string): The destination path in the form
524 3dabe5d2 Stavros Sachtouris
            /<container>/<object>
525 afd9d603 Stavros Sachtouris
        @param destination_account (string): The destination account to copy to
526 afd9d603 Stavros Sachtouris
        @param content_type (string): The MIME content type of the object
527 afd9d603 Stavros Sachtouris
        @param content_encoding (string): The encoding of the object
528 3dabe5d2 Stavros Sachtouris
        @param content_disposition (string): Object resentation style
529 afd9d603 Stavros Sachtouris
        @param source_version (string): The source version to copy from
530 3dabe5d2 Stavros Sachtouris
        @param permissions (dict): Object permissions in the form
531 3dabe5d2 Stavros Sachtouris
            (all fields are optional)
532 3dabe5d2 Stavros Sachtouris
            {   'read':[user1, group1, user2, ...],
533 3dabe5d2 Stavros Sachtouris
                'write':['user3, group2, group3, ...]
534 3dabe5d2 Stavros Sachtouris
            }
535 3dabe5d2 Stavros Sachtouris
            permissions override source permissions,
536 3dabe5d2 Stavros Sachtouris
            removing any old permissions
537 3dabe5d2 Stavros Sachtouris
        @param public (bool): If true, Object is publicly accessible
538 afd9d603 Stavros Sachtouris
        @param metadata (dict): Optional user defined metadata in the form
539 3dabe5d2 Stavros Sachtouris
            {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
540 3dabe5d2 Stavros Sachtouris
            Metadata are appended to the source metadata. In case of same
541 3dabe5d2 Stavros Sachtouris
            keys, they replace the old metadata
542 afd9d603 Stavros Sachtouris
        """
543 afd9d603 Stavros Sachtouris
        self.assert_container()
544 afd9d603 Stavros Sachtouris
545 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
546 afd9d603 Stavros Sachtouris
        self.set_param('ignore_content_type', iff=ignore_content_type)
547 afd9d603 Stavros Sachtouris
548 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
549 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
550 afd9d603 Stavros Sachtouris
        self.set_header('Destination', destination)
551 afd9d603 Stavros Sachtouris
        self.set_header('Destination-Account', destination_account)
552 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
553 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
554 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
555 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
556 afd9d603 Stavros Sachtouris
        perms = None
557 3dabe5d2 Stavros Sachtouris
        if permissions:
558 3dabe5d2 Stavros Sachtouris
            for permission_type, permission_list in permissions.items():
559 afd9d603 Stavros Sachtouris
                if perms is None:
560 3dabe5d2 Stavros Sachtouris
                    perms = ''  # Remove permissions
561 3dabe5d2 Stavros Sachtouris
                if len(permission_list) == 0:
562 afd9d603 Stavros Sachtouris
                    continue
563 3dabe5d2 Stavros Sachtouris
                if len(perms):
564 3dabe5d2 Stavros Sachtouris
                    perms += ';'
565 3dabe5d2 Stavros Sachtouris
                perms += '%s=%s'\
566 3dabe5d2 Stavros Sachtouris
                % (permission_type, list2str(permission_list, seperator=','))
567 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
568 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
569 afd9d603 Stavros Sachtouris
        if metadata is not None:
570 afd9d603 Stavros Sachtouris
            for key, val in metadata.items():
571 3dabe5d2 Stavros Sachtouris
                self.set_header('X-Object-Meta-' + key, val)
572 afd9d603 Stavros Sachtouris
573 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
574 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
575 afd9d603 Stavros Sachtouris
        return self.copy(path, *args, success=success, **kwargs)
576 afd9d603 Stavros Sachtouris
577 3dabe5d2 Stavros Sachtouris
    def object_move(self, object,
578 3dabe5d2 Stavros Sachtouris
        format='json',
579 3dabe5d2 Stavros Sachtouris
        ignore_content_type=False,
580 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
581 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
582 3dabe5d2 Stavros Sachtouris
        destination=None,
583 3dabe5d2 Stavros Sachtouris
        destination_account=None,
584 3dabe5d2 Stavros Sachtouris
        content_type=None,
585 3dabe5d2 Stavros Sachtouris
        content_encoding=None,
586 3dabe5d2 Stavros Sachtouris
        content_disposition=None,
587 3dabe5d2 Stavros Sachtouris
        permissions={},
588 3dabe5d2 Stavros Sachtouris
        public=False,
589 3dabe5d2 Stavros Sachtouris
        metadata={},
590 3dabe5d2 Stavros Sachtouris
        *args,
591 3dabe5d2 Stavros Sachtouris
        **kwargs):
592 afd9d603 Stavros Sachtouris
        """ Full Pithos+ COPY at object level
593 afd9d603 Stavros Sachtouris
        --- request parameters ---
594 afd9d603 Stavros Sachtouris
        @param format (string): json (default) or xml
595 afd9d603 Stavros Sachtouris
        @param ignore_content_type (bool): Ignore the supplied Content-Type
596 afd9d603 Stavros Sachtouris
        --- request headers ---
597 afd9d603 Stavros Sachtouris
         @param if_etag_match (string): if provided, return only results
598 afd9d603 Stavros Sachtouris
                with etag matching with this
599 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, return only results
600 afd9d603 Stavros Sachtouris
                with etag not matching with this
601 3dabe5d2 Stavros Sachtouris
        @param destination (string): The destination path in the form
602 3dabe5d2 Stavros Sachtouris
            /<container>/<object>
603 afd9d603 Stavros Sachtouris
        @param destination_account (string): The destination account to copy to
604 afd9d603 Stavros Sachtouris
        @param content_type (string): The MIME content type of the object
605 afd9d603 Stavros Sachtouris
        @param content_encoding (string): The encoding of the object
606 3dabe5d2 Stavros Sachtouris
        @param content_disposition (string): Object presentation style
607 afd9d603 Stavros Sachtouris
        @param source_version (string): The source version to copy from
608 3dabe5d2 Stavros Sachtouris
        @param permissions (dict): Object permissions in the form
609 3dabe5d2 Stavros Sachtouris
            (all fields are optional)
610 3dabe5d2 Stavros Sachtouris
            {   'read':[user1, group1, user2, ...],
611 3dabe5d2 Stavros Sachtouris
                'write':['user3, group2, group3, ...]
612 3dabe5d2 Stavros Sachtouris
            }
613 3dabe5d2 Stavros Sachtouris
        @param public (bool): If true, Object is publicly accessible
614 afd9d603 Stavros Sachtouris
        @param metadata (dict): Optional user defined metadata in the form
615 afd9d603 Stavros Sachtouris
                {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
616 afd9d603 Stavros Sachtouris
        """
617 afd9d603 Stavros Sachtouris
        self.assert_container()
618 afd9d603 Stavros Sachtouris
619 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
620 afd9d603 Stavros Sachtouris
        self.set_param('ignore_content_type', iff=ignore_content_type)
621 afd9d603 Stavros Sachtouris
622 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
623 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
624 afd9d603 Stavros Sachtouris
        self.set_header('Destination', destination)
625 afd9d603 Stavros Sachtouris
        self.set_header('Destination-Account', destination_account)
626 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
627 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
628 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
629 afd9d603 Stavros Sachtouris
        perms = None
630 3dabe5d2 Stavros Sachtouris
        for permission_type, permission_list in permissions.items():
631 afd9d603 Stavros Sachtouris
            if perms is None:
632 3dabe5d2 Stavros Sachtouris
                perms = ''  # Remove permissions
633 3dabe5d2 Stavros Sachtouris
            if len(permission_list) == 0:
634 afd9d603 Stavros Sachtouris
                continue
635 3dabe5d2 Stavros Sachtouris
            if len(perms):
636 3dabe5d2 Stavros Sachtouris
                perms += ';'
637 3dabe5d2 Stavros Sachtouris
            perms += '%s=%s'\
638 3dabe5d2 Stavros Sachtouris
            % (permission_type, list2str(permission_list, seperator=','))
639 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
640 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
641 afd9d603 Stavros Sachtouris
        for key, val in metadata.items():
642 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Object-Meta-' + key, val)
643 afd9d603 Stavros Sachtouris
644 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
645 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 201)
646 afd9d603 Stavros Sachtouris
        return self.move(path, *args, success=success, **kwargs)
647 afd9d603 Stavros Sachtouris
648 3dabe5d2 Stavros Sachtouris
    def object_post(self, object,
649 3dabe5d2 Stavros Sachtouris
        format='json',
650 3dabe5d2 Stavros Sachtouris
        update=True,
651 3dabe5d2 Stavros Sachtouris
        if_etag_match=None,
652 3dabe5d2 Stavros Sachtouris
        if_etag_not_match=None,
653 3dabe5d2 Stavros Sachtouris
        content_length=None,
654 3dabe5d2 Stavros Sachtouris
        content_type=None,
655 3dabe5d2 Stavros Sachtouris
        content_range=None,
656 3dabe5d2 Stavros Sachtouris
        transfer_encoding=None,
657 3dabe5d2 Stavros Sachtouris
        content_encoding=None,
658 3dabe5d2 Stavros Sachtouris
        content_disposition=None,
659 3dabe5d2 Stavros Sachtouris
        source_object=None,
660 3dabe5d2 Stavros Sachtouris
        source_account=None,
661 3dabe5d2 Stavros Sachtouris
        source_version=None,
662 3dabe5d2 Stavros Sachtouris
        object_bytes=None,
663 3dabe5d2 Stavros Sachtouris
        manifest=None,
664 3dabe5d2 Stavros Sachtouris
        permissions={},
665 3dabe5d2 Stavros Sachtouris
        public=False,
666 3dabe5d2 Stavros Sachtouris
        metadata={},
667 3dabe5d2 Stavros Sachtouris
        *args,
668 3dabe5d2 Stavros Sachtouris
        **kwargs):
669 afd9d603 Stavros Sachtouris
        """ Full Pithos+ POST at object level
670 afd9d603 Stavros Sachtouris
        --- request parameters ---
671 afd9d603 Stavros Sachtouris
        @param format (string): json (default) or xml
672 afd9d603 Stavros Sachtouris
        @param update (bool): Do not replace metadata
673 afd9d603 Stavros Sachtouris
        --- request headers ---
674 afd9d603 Stavros Sachtouris
        @param if_etag_match (string): if provided, return only results
675 afd9d603 Stavros Sachtouris
                with etag matching with this
676 afd9d603 Stavros Sachtouris
        @param if_etag_not_match (string): if provided, return only results
677 afd9d603 Stavros Sachtouris
                with etag not matching with this
678 afd9d603 Stavros Sachtouris
        @param content_length (string): The size of the data written
679 afd9d603 Stavros Sachtouris
        @param content_type (string): The MIME content type of the object
680 afd9d603 Stavros Sachtouris
        @param content_range (string): The range of data supplied
681 3dabe5d2 Stavros Sachtouris
        @param transfer_encoding (string): Set to chunked to specify
682 3dabe5d2 Stavros Sachtouris
            incremental uploading (if used, Content-Length is ignored)
683 afd9d603 Stavros Sachtouris
        @param content_encoding (string): The encoding of the object
684 3dabe5d2 Stavros Sachtouris
        @param content_disposition (string): Object presentation style
685 3dabe5d2 Stavros Sachtouris
        @param source_object (string): Update with data from the object at
686 3dabe5d2 Stavros Sachtouris
            path /<container>/<object>
687 afd9d603 Stavros Sachtouris
        @param source_account (string): The source account to update from
688 afd9d603 Stavros Sachtouris
        @param source_version (string): The source version to copy from
689 afd9d603 Stavros Sachtouris
        @param object_bytes (integer): The updated objects final size
690 3dabe5d2 Stavros Sachtouris
        @param manifest (string): Object parts prefix as /<container>/<object>
691 3dabe5d2 Stavros Sachtouris
        @param permissions (dict): Object permissions in the form (all fields
692 3dabe5d2 Stavros Sachtouris
            are optional)
693 3dabe5d2 Stavros Sachtouris
            {   'read':[user1, group1, user2, ...],
694 3dabe5d2 Stavros Sachtouris
                'write':['user3, group2, group3, ...]
695 3dabe5d2 Stavros Sachtouris
            }
696 3dabe5d2 Stavros Sachtouris
        @param public (bool): If true, Object is publicly accessible
697 afd9d603 Stavros Sachtouris
        @param metadata (dict): Optional user defined metadata in the form
698 afd9d603 Stavros Sachtouris
                {'meta-key-1':'meta-value-1', 'meta-key-2':'meta-value-2', ...}
699 afd9d603 Stavros Sachtouris
        """
700 afd9d603 Stavros Sachtouris
        self.assert_container()
701 afd9d603 Stavros Sachtouris
702 afd9d603 Stavros Sachtouris
        self.set_param('format', format, iff=format is not None)
703 3dabe5d2 Stavros Sachtouris
        self.set_param('update', iff=update)
704 afd9d603 Stavros Sachtouris
705 afd9d603 Stavros Sachtouris
        self.set_header('If-Match', if_etag_match)
706 afd9d603 Stavros Sachtouris
        self.set_header('If-None-Match', if_etag_not_match)
707 3dabe5d2 Stavros Sachtouris
        self.set_header('Content-Length',
708 3dabe5d2 Stavros Sachtouris
            content_length,
709 3dabe5d2 Stavros Sachtouris
            iff=transfer_encoding is None)
710 afd9d603 Stavros Sachtouris
        self.set_header('Content-Type', content_type)
711 afd9d603 Stavros Sachtouris
        self.set_header('Content-Range', content_range)
712 afd9d603 Stavros Sachtouris
        self.set_header('Transfer-Encoding', transfer_encoding)
713 afd9d603 Stavros Sachtouris
        self.set_header('Content-Encoding', content_encoding)
714 afd9d603 Stavros Sachtouris
        self.set_header('Content-Disposition', content_disposition)
715 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Object', source_object)
716 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Account', source_account)
717 afd9d603 Stavros Sachtouris
        self.set_header('X-Source-Version', source_version)
718 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Bytes', object_bytes)
719 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Manifest', manifest)
720 afd9d603 Stavros Sachtouris
        perms = None
721 3dabe5d2 Stavros Sachtouris
        for permission_type, permission_list in permissions.items():
722 afd9d603 Stavros Sachtouris
            if perms is None:
723 3dabe5d2 Stavros Sachtouris
                perms = ''  # Remove permissions
724 3dabe5d2 Stavros Sachtouris
            if len(permission_list) == 0:
725 afd9d603 Stavros Sachtouris
                continue
726 3dabe5d2 Stavros Sachtouris
            if len(perms):
727 3dabe5d2 Stavros Sachtouris
                perms += ';'
728 3dabe5d2 Stavros Sachtouris
            perms += '%s=%s'\
729 3dabe5d2 Stavros Sachtouris
            % (permission_type, list2str(permission_list, seperator=','))
730 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Sharing', perms)
731 afd9d603 Stavros Sachtouris
        self.set_header('X-Object-Public', public)
732 afd9d603 Stavros Sachtouris
        for key, val in metadata.items():
733 3dabe5d2 Stavros Sachtouris
            self.set_header('X-Object-Meta-' + key, val)
734 afd9d603 Stavros Sachtouris
735 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
736 3dabe5d2 Stavros Sachtouris
        success = kwargs.pop('success', (202, 204))
737 afd9d603 Stavros Sachtouris
        return self.post(path, *args, success=success, **kwargs)
738 3dabe5d2 Stavros Sachtouris
739 3dabe5d2 Stavros Sachtouris
    def object_delete(self, object,
740 3dabe5d2 Stavros Sachtouris
        until=None,
741 3dabe5d2 Stavros Sachtouris
        delimiter=None,
742 3dabe5d2 Stavros Sachtouris
        *args,
743 3dabe5d2 Stavros Sachtouris
        **kwargs):
744 afd9d603 Stavros Sachtouris
        """ Full Pithos+ DELETE at object level
745 3dabe5d2 Stavros Sachtouris
        --- request parameters ---
746 afd9d603 Stavros Sachtouris
        @param until (string): Optional timestamp
747 afd9d603 Stavros Sachtouris
        """
748 afd9d603 Stavros Sachtouris
        self.assert_container()
749 afd9d603 Stavros Sachtouris
750 afd9d603 Stavros Sachtouris
        self.set_param('until', until, iff=until is not None)
751 afd9d603 Stavros Sachtouris
        self.set_param('delimiter', delimiter, iff=delimiter is not None)
752 afd9d603 Stavros Sachtouris
753 afd9d603 Stavros Sachtouris
        path = path4url(self.account, self.container, object)
754 afd9d603 Stavros Sachtouris
        success = kwargs.pop('success', 204)
755 3dabe5d2 Stavros Sachtouris
        return self.delete(path, *args, success=success, **kwargs)