Statistics
| Branch: | Tag: | Revision:

root / docs / source / devguide.rst @ ed4725e4

History | View | Annotate | Download (69.7 kB)

1 f2d7b5ab Antony Chazapis
Pithos v2 Developer Guide
2 f2d7b5ab Antony Chazapis
=========================
3 f2d7b5ab Antony Chazapis
4 f2d7b5ab Antony Chazapis
Introduction
5 f2d7b5ab Antony Chazapis
------------
6 f2d7b5ab Antony Chazapis
7 f2d7b5ab Antony Chazapis
Pithos is a storage service implemented by GRNET (http://www.grnet.gr). Data is stored as objects, organized in containers, belonging to an account. This hierarchy of storage layers has been inspired by the OpenStack Object Storage (OOS) API and similar CloudFiles API by Rackspace. The Pithos API follows the OOS API as closely as possible. One of the design requirements has been to be able to use Pithos with clients built for the OOS, without changes.
8 f2d7b5ab Antony Chazapis
9 3ab38c43 Antony Chazapis
However, to be able to take full advantage of the Pithos infrastructure, client software should be aware of the extensions that differentiate Pithos from OOS. Pithos objects can be updated, or appended to. Pithos will store sharing permissions per object and enforce corresponding authorization policies. Automatic version management, allows taking account and container listings back in time, as well as reading previous instances of objects.
10 e9285524 Antony Chazapis
11 c9af0703 Antony Chazapis
The storage backend of Pithos is block oriented, permitting efficient, deduplicated data placement. The block structure of objects is exposed at the API layer, in order to encourage external software to implement advanced data management operations.
12 e9285524 Antony Chazapis
13 f2d7b5ab Antony Chazapis
This document's goals are:
14 f2d7b5ab Antony Chazapis
15 f2d7b5ab Antony Chazapis
* Define the Pithos ReST API that allows the storage and retrieval of data and metadata via HTTP calls
16 f2d7b5ab Antony Chazapis
* Specify metadata semantics and user interface guidelines for a common experience across client software implementations
17 f2d7b5ab Antony Chazapis
18 f2d7b5ab Antony Chazapis
The present document is meant to be read alongside the OOS API documentation. Thus, it is suggested that the reader is familiar with associated technologies, the OOS API as well as the first version of the Pithos API. This document refers to the second version of Pithos. Information on the first version of the storage API can be found at http://code.google.com/p/gss.
19 f2d7b5ab Antony Chazapis
20 f2d7b5ab Antony Chazapis
Whatever marked as to be determined (**TBD**), should not be considered by implementors.
21 f2d7b5ab Antony Chazapis
22 0a8bf8fb Antony Chazapis
More info about Pithos can be found here: https://code.grnet.gr/projects/pithos
23 0a8bf8fb Antony Chazapis
24 f2d7b5ab Antony Chazapis
Document Revisions
25 f2d7b5ab Antony Chazapis
^^^^^^^^^^^^^^^^^^
26 f2d7b5ab Antony Chazapis
27 f2d7b5ab Antony Chazapis
=========================  ================================
28 f2d7b5ab Antony Chazapis
Revision                   Description
29 f2d7b5ab Antony Chazapis
=========================  ================================
30 82482e2c Antony Chazapis
0.9 (Feb 17, 2012)         Change permissions model.
31 82482e2c Antony Chazapis
\                          Do not include user-defined metadata in account/container/object listings.
32 84204aa8 root
0.8 (Jan 24, 2012)         Update allowed versioning values.
33 690747fe Antony Chazapis
\                          Change policy/meta formatting in JSON/XML replies.
34 88283e9e Antony Chazapis
\                          Document that all non-ASCII characters in headers should be URL-encoded.
35 4e5673a0 Antony Chazapis
\                          Support metadata-based queries when listing objects at the container level.
36 5bc1116c Antony Chazapis
\                          Note Content-Type issue when using the internal django web server.
37 37bee317 Antony Chazapis
\                          Add object UUID field.
38 dfb28993 chazapis
\                          Always reply with the MD5 in the ETag.
39 0a8bf8fb Antony Chazapis
\                          Note that ``/login`` will only work if an external authentication system is defined.
40 53cff70c Antony Chazapis
\                          Include option to ignore Content-Type on ``COPY``/``MOVE``.
41 af7bb62f Antony Chazapis
\                          Use format parameter for conflict (409) and uploaded hash list (container level) replies.
42 4a1c29ea Antony Chazapis
0.7 (Nov 21, 2011)         Suggest upload/download methods using hashmaps.
43 c9aba6cc Antony Chazapis
\                          Propose syncing algorithm.
44 79bb41b7 Antony Chazapis
\                          Support cross-account object copy and move.
45 28486f26 Antony Chazapis
\                          Pass token as a request parameter when using ``POST`` via an HTML form.
46 2cd94d81 Antony Chazapis
\                          Optionally use source account to update object from another object.
47 6d897a63 Antony Chazapis
\                          Use container ``POST`` to upload missing blocks of data.
48 647a5f48 Antony Chazapis
\                          Report policy in account headers.
49 5df6c6d1 Antony Chazapis
\                          Add insufficient quota reply.
50 4a1c29ea Antony Chazapis
\                          Use special meta to always report Merkle hash.
51 067cf1fc Antony Chazapis
0.6 (Sept 13, 2011)        Reply with Merkle hash as the ETag when updating objects.
52 7dd293a0 Antony Chazapis
\                          Include version id in object replace/change replies.
53 96ee45a3 Antony Chazapis
\                          Change conflict (409) replies format to text.
54 f5ed44df Antony Chazapis
\                          Tags should be migrated to a meta value.
55 c5d308c6 Antony Chazapis
\                          Container ``PUT`` updates metadata/policy.
56 067cf1fc Antony Chazapis
\                          Report allowed actions in shared object replies.
57 45c60f99 Antony Chazapis
\                          Provide ``https://hostname/login`` for Shibboleth authentication.
58 f9f15f92 Antony Chazapis
\                          Use ``hashmap`` parameter in object ``GET``/``PUT`` to use hashmaps.
59 a8326bef Antony Chazapis
0.5 (July 22, 2011)        Object update from another object's data.
60 1495b972 Antony Chazapis
\                          Support object truncate.
61 1d5c57d3 Antony Chazapis
\                          Create object using a standard HTML form.
62 81f947fd Antony Chazapis
\                          Purge container/object history.
63 f6c97079 Antony Chazapis
\                          List other accounts that share objects with a user.
64 b18ef3ad Antony Chazapis
\                          List shared containers/objects.
65 66f6dfc2 Antony Chazapis
\                          Update implementation guidelines.
66 a8326bef Antony Chazapis
\                          Check preconditions when creating/updating objects.
67 7b0688a9 Sofia Papagiannaki
0.4 (July 01, 2011)        Object permissions and account groups.
68 3ab38c43 Antony Chazapis
\                          Control versioning behavior and container quotas with container policy directives.
69 3ab38c43 Antony Chazapis
\                          Support updating/deleting individual metadata with ``POST``.
70 7b0688a9 Sofia Papagiannaki
\                          Create object using hashmap.
71 8cb45c13 Antony Chazapis
0.3 (June 14, 2011)        Large object support with ``X-Object-Manifest``.
72 8cb45c13 Antony Chazapis
\                          Allow for publicly available objects via ``https://hostname/public``.
73 c9af0703 Antony Chazapis
\                          Support time-variant account/container listings. 
74 1d5c57d3 Antony Chazapis
\                          Add source version when duplicating with ``PUT``/``COPY``.
75 1d5c57d3 Antony Chazapis
\                          Request version in object ``HEAD``/``GET`` requests (list versions with ``GET``).
76 6bc372a4 Antony Chazapis
0.2 (May 31, 2011)         Add object meta listing and filtering in containers.
77 6bc372a4 Antony Chazapis
\                          Include underlying storage characteristics in container meta.
78 1d5c57d3 Antony Chazapis
\                          Support for partial object updates through ``POST``.
79 1d5c57d3 Antony Chazapis
\                          Expose object hashmaps through ``GET``.
80 1d5c57d3 Antony Chazapis
\                          Support for multi-range object ``GET`` requests.
81 f2d7b5ab Antony Chazapis
0.1 (May 17, 2011)         Initial release. Based on OpenStack Object Storage Developer Guide API v1 (Apr. 15, 2011).
82 f2d7b5ab Antony Chazapis
=========================  ================================
83 f2d7b5ab Antony Chazapis
84 45c60f99 Antony Chazapis
Pithos Users and Authentication
85 45c60f99 Antony Chazapis
-------------------------------
86 45c60f99 Antony Chazapis
87 0a8bf8fb Antony Chazapis
In Pithos, each user is uniquely identified by a token. All API requests require a token and each token is internally resolved to an account string. The API uses the account string to identify the user's own files, thus whether a request is local or cross-account.
88 45c60f99 Antony Chazapis
89 0a8bf8fb Antony Chazapis
Pithos does not keep a user database. For development and testing purposes, user identifiers and their corresponding tokens can be defined in the settings file. However, Pithos is designed with an external authentication service in mind. This service must handle the details of validating user credentials and communicate with Pithos via a middleware software component that, given a token, fills in the internal request account variable.
90 45c60f99 Antony Chazapis
91 0a8bf8fb Antony Chazapis
Client software using Pithos, if not already knowing a user's identifier and token, should forward to the ``/login`` URI. The Pithos server, depending on its configuration will redirect to the appropriate login page.
92 45c60f99 Antony Chazapis
93 45c60f99 Antony Chazapis
The login URI accepts the following parameters:
94 45c60f99 Antony Chazapis
95 45c60f99 Antony Chazapis
======================  =========================
96 45c60f99 Antony Chazapis
Request Parameter Name  Value
97 45c60f99 Antony Chazapis
======================  =========================
98 45c60f99 Antony Chazapis
next                    The URI to redirect to when the process is finished
99 f9f15f92 Antony Chazapis
renew                   Force token renewal (no value parameter)
100 ed4725e4 Sofia Papagiannaki
force                   Force logout current user (no value parameter)
101 45c60f99 Antony Chazapis
======================  =========================
102 45c60f99 Antony Chazapis
103 0a8bf8fb Antony Chazapis
When done with logging in, the service's login URI should redirect to the URI provided with ``next``, adding ``user`` and ``token`` parameters, which contain the account and token fields respectively.
104 45c60f99 Antony Chazapis
105 0a8bf8fb Antony Chazapis
A user management service that implements a login URI according to these conventions is Astakos (https://code.grnet.gr/projects/astakos), by GRNET.
106 45c60f99 Antony Chazapis
107 f2d7b5ab Antony Chazapis
The Pithos API
108 f2d7b5ab Antony Chazapis
--------------
109 f2d7b5ab Antony Chazapis
110 c9af0703 Antony Chazapis
The URI requests supported by the Pithos API follow one of the following forms:
111 f2d7b5ab Antony Chazapis
112 f2d7b5ab Antony Chazapis
* Top level: ``https://hostname/v1/``
113 f2d7b5ab Antony Chazapis
* Account level: ``https://hostname/v1/<account>``
114 f2d7b5ab Antony Chazapis
* Container level: ``https://hostname/v1/<account>/<container>``
115 f2d7b5ab Antony Chazapis
* Object level: ``https://hostname/v1/<account>/<container>/<object>``
116 f2d7b5ab Antony Chazapis
117 45c60f99 Antony Chazapis
All requests must include an ``X-Auth-Token`` - as a header, or a parameter.
118 f2d7b5ab Antony Chazapis
119 e9285524 Antony Chazapis
The allowable request operations and respective return codes per level are presented in the remainder of this chapter. Common to all requests are the following return codes.
120 f2d7b5ab Antony Chazapis
121 f2d7b5ab Antony Chazapis
=========================  ================================
122 f2d7b5ab Antony Chazapis
Return Code                Description
123 f2d7b5ab Antony Chazapis
=========================  ================================
124 f2d7b5ab Antony Chazapis
400 (Bad Request)          The request is invalid
125 297513ba Antony Chazapis
401 (Unauthorized)         Missing or invalid token
126 297513ba Antony Chazapis
403 (Forbidden)            Request not allowed
127 f2d7b5ab Antony Chazapis
404 (Not Found)            The requested resource was not found
128 f2d7b5ab Antony Chazapis
503 (Service Unavailable)  The request cannot be completed because of an internal error
129 f2d7b5ab Antony Chazapis
=========================  ================================
130 f2d7b5ab Antony Chazapis
131 f2d7b5ab Antony Chazapis
Top Level
132 f2d7b5ab Antony Chazapis
^^^^^^^^^
133 f2d7b5ab Antony Chazapis
134 f2d7b5ab Antony Chazapis
List of operations:
135 f2d7b5ab Antony Chazapis
136 f2d7b5ab Antony Chazapis
=========  ==================
137 f2d7b5ab Antony Chazapis
Operation  Description
138 f2d7b5ab Antony Chazapis
=========  ==================
139 f6c97079 Antony Chazapis
GET        Authentication (for compatibility with the OOS API) or list allowed accounts
140 f2d7b5ab Antony Chazapis
=========  ==================
141 f2d7b5ab Antony Chazapis
142 f2d7b5ab Antony Chazapis
GET
143 f2d7b5ab Antony Chazapis
"""
144 f2d7b5ab Antony Chazapis
145 f2d7b5ab Antony Chazapis
If the ``X-Auth-User`` and ``X-Auth-Key`` headers are given, a dummy ``X-Auth-Token`` and ``X-Storage-Url`` will be replied, which can be used as a guest token/namespace for testing Pithos.
146 f2d7b5ab Antony Chazapis
147 f2d7b5ab Antony Chazapis
================  =====================
148 f2d7b5ab Antony Chazapis
Return Code       Description
149 f2d7b5ab Antony Chazapis
================  =====================
150 f2d7b5ab Antony Chazapis
204 (No Content)  The request succeeded
151 f2d7b5ab Antony Chazapis
================  =====================
152 f2d7b5ab Antony Chazapis
153 f6c97079 Antony Chazapis
If an ``X-Auth-Token`` is already present, the operation will be interpreted as a request to list other accounts that share objects to the user.
154 f6c97079 Antony Chazapis
155 f6c97079 Antony Chazapis
======================  =========================
156 f6c97079 Antony Chazapis
Request Parameter Name  Value
157 f6c97079 Antony Chazapis
======================  =========================
158 f6c97079 Antony Chazapis
limit                   The amount of results requested (default is 10000)
159 f6c97079 Antony Chazapis
marker                  Return containers with name lexicographically after marker
160 f6c97079 Antony Chazapis
format                  Optional extended reply type (can be ``json`` or ``xml``)
161 f6c97079 Antony Chazapis
======================  =========================
162 f6c97079 Antony Chazapis
163 f6c97079 Antony Chazapis
The reply is a list of account names.
164 bd590bc1 Antony Chazapis
If a ``format=xml`` or ``format=json`` argument is given, extended information on the accounts will be returned, serialized in the chosen format.
165 f6c97079 Antony Chazapis
For each account, the information will include the following (names will be in lower case and with hyphens replaced with underscores):
166 f6c97079 Antony Chazapis
167 f6c97079 Antony Chazapis
===========================  ============================
168 f6c97079 Antony Chazapis
Name                         Description
169 f6c97079 Antony Chazapis
===========================  ============================
170 f6c97079 Antony Chazapis
name                         The name of the account
171 bd590bc1 Antony Chazapis
last_modified                The last account modification date (regardless of ``until``)
172 f6c97079 Antony Chazapis
===========================  ============================
173 f6c97079 Antony Chazapis
174 f6c97079 Antony Chazapis
Example ``format=json`` reply:
175 f6c97079 Antony Chazapis
176 f6c97079 Antony Chazapis
::
177 f6c97079 Antony Chazapis
178 690747fe Antony Chazapis
  [{"name": "user", "last_modified": "2011-12-02T08:10:41.565891+00:00"}, ...]
179 f6c97079 Antony Chazapis
180 f6c97079 Antony Chazapis
Example ``format=xml`` reply:
181 f6c97079 Antony Chazapis
182 f6c97079 Antony Chazapis
::
183 f6c97079 Antony Chazapis
184 f6c97079 Antony Chazapis
  <?xml version="1.0" encoding="UTF-8"?>
185 f6c97079 Antony Chazapis
  <accounts>
186 f6c97079 Antony Chazapis
    <account>
187 f6c97079 Antony Chazapis
      <name>user</name>
188 690747fe Antony Chazapis
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
189 f6c97079 Antony Chazapis
    </account>
190 f6c97079 Antony Chazapis
    <account>...</account>
191 f6c97079 Antony Chazapis
  </accounts>
192 f6c97079 Antony Chazapis
193 f6c97079 Antony Chazapis
===========================  =====================
194 f6c97079 Antony Chazapis
Return Code                  Description
195 f6c97079 Antony Chazapis
===========================  =====================
196 f6c97079 Antony Chazapis
200 (OK)                     The request succeeded
197 bd590bc1 Antony Chazapis
204 (No Content)             The user has no access to other accounts (only for non-extended replies)
198 f6c97079 Antony Chazapis
===========================  =====================
199 f6c97079 Antony Chazapis
200 690747fe Antony Chazapis
Will use a ``200`` return code if the reply is of type JSON/XML.
201 f2d7b5ab Antony Chazapis
202 f2d7b5ab Antony Chazapis
Account Level
203 f2d7b5ab Antony Chazapis
^^^^^^^^^^^^^
204 f2d7b5ab Antony Chazapis
205 f2d7b5ab Antony Chazapis
List of operations:
206 f2d7b5ab Antony Chazapis
207 f2d7b5ab Antony Chazapis
=========  ==================
208 f2d7b5ab Antony Chazapis
Operation  Description
209 f2d7b5ab Antony Chazapis
=========  ==================
210 f2d7b5ab Antony Chazapis
HEAD       Retrieve account metadata
211 f2d7b5ab Antony Chazapis
GET        List containers
212 f2d7b5ab Antony Chazapis
POST       Update account metadata
213 f2d7b5ab Antony Chazapis
=========  ==================
214 f2d7b5ab Antony Chazapis
215 f2d7b5ab Antony Chazapis
HEAD
216 f2d7b5ab Antony Chazapis
""""
217 f2d7b5ab Antony Chazapis
218 a8326bef Antony Chazapis
====================  ===========================
219 a8326bef Antony Chazapis
Request Header Name   Value
220 a8326bef Antony Chazapis
====================  ===========================
221 a8326bef Antony Chazapis
If-Modified-Since     Retrieve if account has changed since provided timestamp
222 a8326bef Antony Chazapis
If-Unmodified-Since   Retrieve if account has not changed since provided timestamp
223 a8326bef Antony Chazapis
====================  ===========================
224 a8326bef Antony Chazapis
225 a8326bef Antony Chazapis
|
226 a8326bef Antony Chazapis
227 c9af0703 Antony Chazapis
======================  ===================================
228 c9af0703 Antony Chazapis
Request Parameter Name  Value
229 c9af0703 Antony Chazapis
======================  ===================================
230 c9af0703 Antony Chazapis
until                   Optional timestamp
231 c9af0703 Antony Chazapis
======================  ===================================
232 c9af0703 Antony Chazapis
233 f6c97079 Antony Chazapis
Cross-user requests are not allowed to use ``until`` and only include the account modification date in the reply.
234 f2d7b5ab Antony Chazapis
235 f2d7b5ab Antony Chazapis
==========================  =====================
236 f2d7b5ab Antony Chazapis
Reply Header Name           Value
237 f2d7b5ab Antony Chazapis
==========================  =====================
238 f2d7b5ab Antony Chazapis
X-Account-Container-Count   The total number of containers
239 f2d7b5ab Antony Chazapis
X-Account-Bytes-Used        The total number of bytes stored
240 c9af0703 Antony Chazapis
X-Account-Until-Timestamp   The last account modification date until the timestamp provided
241 3ab38c43 Antony Chazapis
X-Account-Group-*           Optional user defined groups
242 647a5f48 Antony Chazapis
X-Account-Policy-*          Account behavior and limits
243 f2d7b5ab Antony Chazapis
X-Account-Meta-*            Optional user defined metadata
244 c9af0703 Antony Chazapis
Last-Modified               The last account modification date (regardless of ``until``)
245 f2d7b5ab Antony Chazapis
==========================  =====================
246 f2d7b5ab Antony Chazapis
247 f2d7b5ab Antony Chazapis
|
248 f2d7b5ab Antony Chazapis
249 f2d7b5ab Antony Chazapis
================  =====================
250 f2d7b5ab Antony Chazapis
Return Code       Description
251 f2d7b5ab Antony Chazapis
================  =====================
252 f2d7b5ab Antony Chazapis
204 (No Content)  The request succeeded
253 f2d7b5ab Antony Chazapis
================  =====================
254 f2d7b5ab Antony Chazapis
255 f2d7b5ab Antony Chazapis
256 f2d7b5ab Antony Chazapis
GET
257 f2d7b5ab Antony Chazapis
"""
258 f2d7b5ab Antony Chazapis
259 f2d7b5ab Antony Chazapis
====================  ===========================
260 f2d7b5ab Antony Chazapis
Request Header Name   Value
261 f2d7b5ab Antony Chazapis
====================  ===========================
262 f2d7b5ab Antony Chazapis
If-Modified-Since     Retrieve if account has changed since provided timestamp
263 f2d7b5ab Antony Chazapis
If-Unmodified-Since   Retrieve if account has not changed since provided timestamp
264 f2d7b5ab Antony Chazapis
====================  ===========================
265 f2d7b5ab Antony Chazapis
266 f2d7b5ab Antony Chazapis
|
267 f2d7b5ab Antony Chazapis
268 f2d7b5ab Antony Chazapis
======================  =========================
269 f2d7b5ab Antony Chazapis
Request Parameter Name  Value
270 f2d7b5ab Antony Chazapis
======================  =========================
271 f2d7b5ab Antony Chazapis
limit                   The amount of results requested (default is 10000)
272 f2d7b5ab Antony Chazapis
marker                  Return containers with name lexicographically after marker
273 f2d7b5ab Antony Chazapis
format                  Optional extended reply type (can be ``json`` or ``xml``)
274 b18ef3ad Antony Chazapis
shared                  Show only shared containers (no value parameter)
275 c9af0703 Antony Chazapis
until                   Optional timestamp
276 f2d7b5ab Antony Chazapis
======================  =========================
277 f2d7b5ab Antony Chazapis
278 f2d7b5ab Antony Chazapis
The reply is a list of container names. Account headers (as in a ``HEAD`` request) will also be included.
279 f6c97079 Antony Chazapis
Cross-user requests are not allowed to use ``until`` and only include the account/container modification dates in the reply.
280 f6c97079 Antony Chazapis
281 f2d7b5ab Antony Chazapis
If a ``format=xml`` or ``format=json`` argument is given, extended information on the containers will be returned, serialized in the chosen format.
282 82482e2c Antony Chazapis
For each container, the information will include all container metadata, except user-defined (names will be in lower case and with hyphens replaced with underscores):
283 f2d7b5ab Antony Chazapis
284 c9af0703 Antony Chazapis
===========================  ============================
285 c9af0703 Antony Chazapis
Name                         Description
286 c9af0703 Antony Chazapis
===========================  ============================
287 c9af0703 Antony Chazapis
name                         The name of the container
288 c9af0703 Antony Chazapis
count                        The number of objects inside the container
289 c9af0703 Antony Chazapis
bytes                        The total size of the objects inside the container
290 c9af0703 Antony Chazapis
last_modified                The last container modification date (regardless of ``until``)
291 c9af0703 Antony Chazapis
x_container_until_timestamp  The last container modification date until the timestamp provided
292 82482e2c Antony Chazapis
x_container_policy           Container behavior and limits
293 c9af0703 Antony Chazapis
===========================  ============================
294 f2d7b5ab Antony Chazapis
295 690747fe Antony Chazapis
Example ``format=json`` reply:
296 690747fe Antony Chazapis
297 690747fe Antony Chazapis
::
298 690747fe Antony Chazapis
299 690747fe Antony Chazapis
  [{"name": "pithos",
300 690747fe Antony Chazapis
    "bytes": 62452,
301 690747fe Antony Chazapis
    "count": 8374,
302 690747fe Antony Chazapis
    "last_modified": "2011-12-02T08:10:41.565891+00:00",
303 82482e2c Antony Chazapis
    "x_container_policy": {"quota": "53687091200", "versioning": "auto"}}, ...]
304 690747fe Antony Chazapis
305 690747fe Antony Chazapis
Example ``format=xml`` reply:
306 690747fe Antony Chazapis
307 690747fe Antony Chazapis
::
308 690747fe Antony Chazapis
309 690747fe Antony Chazapis
  <?xml version="1.0" encoding="UTF-8"?>
310 690747fe Antony Chazapis
  <account name="user">
311 690747fe Antony Chazapis
    <container>
312 690747fe Antony Chazapis
      <name>pithos</name>
313 690747fe Antony Chazapis
      <bytes>62452</bytes>
314 690747fe Antony Chazapis
      <count>8374</count>
315 690747fe Antony Chazapis
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
316 690747fe Antony Chazapis
      <x_container_policy>
317 690747fe Antony Chazapis
        <key>quota</key><value>53687091200</value>
318 690747fe Antony Chazapis
        <key>versioning</key><value>auto</value>
319 690747fe Antony Chazapis
      </x_container_policy>
320 690747fe Antony Chazapis
    </container>
321 690747fe Antony Chazapis
    <container>...</container>
322 690747fe Antony Chazapis
  </account>
323 690747fe Antony Chazapis
324 82482e2c Antony Chazapis
For more examples of container details returned in JSON/XML formats refer to the OOS API documentation. In addition to the OOS API, Pithos returns policy fields, grouped as key-value pairs.
325 f2d7b5ab Antony Chazapis
326 6bc372a4 Antony Chazapis
===========================  =====================
327 6bc372a4 Antony Chazapis
Return Code                  Description
328 6bc372a4 Antony Chazapis
===========================  =====================
329 6bc372a4 Antony Chazapis
200 (OK)                     The request succeeded
330 6bc372a4 Antony Chazapis
204 (No Content)             The account has no containers (only for non-extended replies)
331 6bc372a4 Antony Chazapis
304 (Not Modified)           The account has not been modified
332 6bc372a4 Antony Chazapis
412 (Precondition Failed)    The condition set can not be satisfied
333 6bc372a4 Antony Chazapis
===========================  =====================
334 f2d7b5ab Antony Chazapis
335 690747fe Antony Chazapis
Will use a ``200`` return code if the reply is of type JSON/XML.
336 f2d7b5ab Antony Chazapis
337 f2d7b5ab Antony Chazapis
338 f2d7b5ab Antony Chazapis
POST
339 f2d7b5ab Antony Chazapis
""""
340 f2d7b5ab Antony Chazapis
341 f2d7b5ab Antony Chazapis
====================  ===========================
342 f2d7b5ab Antony Chazapis
Request Header Name   Value
343 f2d7b5ab Antony Chazapis
====================  ===========================
344 3ab38c43 Antony Chazapis
X-Account-Group-*     Optional user defined groups
345 f2d7b5ab Antony Chazapis
X-Account-Meta-*      Optional user defined metadata
346 f2d7b5ab Antony Chazapis
====================  ===========================
347 f2d7b5ab Antony Chazapis
348 a8326bef Antony Chazapis
|
349 a8326bef Antony Chazapis
350 a8326bef Antony Chazapis
======================  ============================================
351 a8326bef Antony Chazapis
Request Parameter Name  Value
352 a8326bef Antony Chazapis
======================  ============================================
353 a8326bef Antony Chazapis
update                  Do not replace metadata/groups (no value parameter)
354 a8326bef Antony Chazapis
======================  ============================================
355 a8326bef Antony Chazapis
356 f2d7b5ab Antony Chazapis
No reply content/headers.
357 f2d7b5ab Antony Chazapis
358 a6eb13e9 Antony Chazapis
The operation will overwrite all user defined metadata, except if ``update`` is defined.
359 3ab38c43 Antony Chazapis
To create a group, include an ``X-Account-Group-*`` header with the name in the key and a comma separated list of user names in the value. If no ``X-Account-Group-*`` header is present, no changes will be applied to groups. The ``update`` parameter also applies to groups. To delete a specific group, use ``update`` and an empty header value.
360 f2d7b5ab Antony Chazapis
361 f2d7b5ab Antony Chazapis
================  ===============================
362 f2d7b5ab Antony Chazapis
Return Code       Description
363 f2d7b5ab Antony Chazapis
================  ===============================
364 f2d7b5ab Antony Chazapis
202 (Accepted)    The request has been accepted
365 f2d7b5ab Antony Chazapis
================  ===============================
366 f2d7b5ab Antony Chazapis
367 f2d7b5ab Antony Chazapis
368 f2d7b5ab Antony Chazapis
Container Level
369 f2d7b5ab Antony Chazapis
^^^^^^^^^^^^^^^
370 f2d7b5ab Antony Chazapis
371 f2d7b5ab Antony Chazapis
List of operations:
372 f2d7b5ab Antony Chazapis
373 f2d7b5ab Antony Chazapis
=========  ============================
374 f2d7b5ab Antony Chazapis
Operation  Description
375 f2d7b5ab Antony Chazapis
=========  ============================
376 f2d7b5ab Antony Chazapis
HEAD       Retrieve container metadata
377 f2d7b5ab Antony Chazapis
GET        List objects
378 f2d7b5ab Antony Chazapis
PUT        Create/update container
379 f2d7b5ab Antony Chazapis
POST       Update container metadata
380 f2d7b5ab Antony Chazapis
DELETE     Delete container
381 f2d7b5ab Antony Chazapis
=========  ============================
382 f2d7b5ab Antony Chazapis
383 f2d7b5ab Antony Chazapis
384 f2d7b5ab Antony Chazapis
HEAD
385 f2d7b5ab Antony Chazapis
""""
386 f2d7b5ab Antony Chazapis
387 a8326bef Antony Chazapis
====================  ===========================
388 a8326bef Antony Chazapis
Request Header Name   Value
389 a8326bef Antony Chazapis
====================  ===========================
390 a8326bef Antony Chazapis
If-Modified-Since     Retrieve if container has changed since provided timestamp
391 a8326bef Antony Chazapis
If-Unmodified-Since   Retrieve if container has not changed since provided timestamp
392 a8326bef Antony Chazapis
====================  ===========================
393 a8326bef Antony Chazapis
394 a8326bef Antony Chazapis
|
395 a8326bef Antony Chazapis
396 c9af0703 Antony Chazapis
======================  ===================================
397 c9af0703 Antony Chazapis
Request Parameter Name  Value
398 c9af0703 Antony Chazapis
======================  ===================================
399 c9af0703 Antony Chazapis
until                   Optional timestamp
400 c9af0703 Antony Chazapis
======================  ===================================
401 f2d7b5ab Antony Chazapis
402 f6c97079 Antony Chazapis
Cross-user requests are not allowed to use ``until`` and only include the container modification date in the reply.
403 c9af0703 Antony Chazapis
404 c9af0703 Antony Chazapis
===========================  ===============================
405 c9af0703 Antony Chazapis
Reply Header Name            Value
406 c9af0703 Antony Chazapis
===========================  ===============================
407 c9af0703 Antony Chazapis
X-Container-Object-Count     The total number of objects in the container
408 c9af0703 Antony Chazapis
X-Container-Bytes-Used       The total number of bytes of all objects stored
409 c9af0703 Antony Chazapis
X-Container-Block-Size       The block size used by the storage backend
410 c9af0703 Antony Chazapis
X-Container-Block-Hash       The hash algorithm used for block identifiers in object hashmaps
411 c9af0703 Antony Chazapis
X-Container-Until-Timestamp  The last container modification date until the timestamp provided
412 f5ed44df Antony Chazapis
X-Container-Object-Meta      A list with all meta keys used by objects (**TBD**)
413 3ab38c43 Antony Chazapis
X-Container-Policy-*         Container behavior and limits
414 c9af0703 Antony Chazapis
X-Container-Meta-*           Optional user defined metadata
415 c9af0703 Antony Chazapis
Last-Modified                The last container modification date (regardless of ``until``)
416 c9af0703 Antony Chazapis
===========================  ===============================
417 f2d7b5ab Antony Chazapis
418 f5ed44df Antony Chazapis
The keys returned in ``X-Container-Object-Meta`` are all the unique strings after the ``X-Object-Meta-`` prefix, formatted as a comma-separated list. See container ``PUT`` for a reference of policy directives. (**TBD**)
419 f2d7b5ab Antony Chazapis
420 f2d7b5ab Antony Chazapis
================  ===============================
421 f2d7b5ab Antony Chazapis
Return Code       Description
422 f2d7b5ab Antony Chazapis
================  ===============================
423 f2d7b5ab Antony Chazapis
204 (No Content)  The request succeeded
424 f2d7b5ab Antony Chazapis
================  ===============================
425 f2d7b5ab Antony Chazapis
426 f2d7b5ab Antony Chazapis
427 f2d7b5ab Antony Chazapis
GET
428 f2d7b5ab Antony Chazapis
"""
429 f2d7b5ab Antony Chazapis
430 f2d7b5ab Antony Chazapis
====================  ===========================
431 f2d7b5ab Antony Chazapis
Request Header Name   Value
432 f2d7b5ab Antony Chazapis
====================  ===========================
433 f2d7b5ab Antony Chazapis
If-Modified-Since     Retrieve if container has changed since provided timestamp
434 f2d7b5ab Antony Chazapis
If-Unmodified-Since   Retrieve if container has not changed since provided timestamp
435 f2d7b5ab Antony Chazapis
====================  ===========================
436 f2d7b5ab Antony Chazapis
437 f2d7b5ab Antony Chazapis
|
438 f2d7b5ab Antony Chazapis
439 f2d7b5ab Antony Chazapis
======================  ===================================
440 f2d7b5ab Antony Chazapis
Request Parameter Name  Value
441 f2d7b5ab Antony Chazapis
======================  ===================================
442 f2d7b5ab Antony Chazapis
limit                   The amount of results requested (default is 10000)
443 f2d7b5ab Antony Chazapis
marker                  Return containers with name lexicographically after marker
444 f2d7b5ab Antony Chazapis
prefix                  Return objects starting with prefix
445 f2d7b5ab Antony Chazapis
delimiter               Return objects up to the delimiter (discussion follows)
446 f2d7b5ab Antony Chazapis
path                    Assume ``prefix=path`` and ``delimiter=/``
447 f2d7b5ab Antony Chazapis
format                  Optional extended reply type (can be ``json`` or ``xml``)
448 4e5673a0 Antony Chazapis
meta                    Return objects that satisfy the key queries in the specified comma separated list (use ``<key>``, ``!<key>`` for existence queries, ``<key><op><value>`` for value queries, where ``<op>`` can be one of ``=``, ``!=``, ``<=``, ``>=``, ``<``, ``>``)
449 b18ef3ad Antony Chazapis
shared                  Show only shared objects (no value parameter)
450 c9af0703 Antony Chazapis
until                   Optional timestamp
451 f2d7b5ab Antony Chazapis
======================  ===================================
452 f2d7b5ab Antony Chazapis
453 f2d7b5ab Antony Chazapis
The ``path`` parameter overrides ``prefix`` and ``delimiter``. When using ``path``, results will include objects ending in ``delimiter``.
454 f2d7b5ab Antony Chazapis
455 f2d7b5ab Antony Chazapis
The keys given with ``meta`` will be matched with the strings after the ``X-Object-Meta-`` prefix.
456 f2d7b5ab Antony Chazapis
457 f2d7b5ab Antony Chazapis
The reply is a list of object names. Container headers (as in a ``HEAD`` request) will also be included.
458 f6c97079 Antony Chazapis
Cross-user requests are not allowed to use ``until`` and include the following limited set of headers in the reply:
459 f6c97079 Antony Chazapis
460 f6c97079 Antony Chazapis
===========================  ===============================
461 f6c97079 Antony Chazapis
Reply Header Name            Value
462 f6c97079 Antony Chazapis
===========================  ===============================
463 f6c97079 Antony Chazapis
X-Container-Block-Size       The block size used by the storage backend
464 f6c97079 Antony Chazapis
X-Container-Block-Hash       The hash algorithm used for block identifiers in object hashmaps
465 f6c97079 Antony Chazapis
X-Container-Object-Meta      A list with all meta keys used by allowed objects (**TBD**)
466 f6c97079 Antony Chazapis
Last-Modified                The last container modification date
467 f6c97079 Antony Chazapis
===========================  ===============================
468 f6c97079 Antony Chazapis
469 f2d7b5ab Antony Chazapis
If a ``format=xml`` or ``format=json`` argument is given, extended information on the objects will be returned, serialized in the chosen format.
470 82482e2c Antony Chazapis
For each object, the information will include all object metadata, except user-defined (names will be in lower case and with hyphens replaced with underscores). User-defined metadata includes ``X-Object-Meta-*``, ``X-Object-Manifest``, ``Content-Disposition`` and ``Content-Encoding`` keys. Also, sharing directives will only be included with the actual shared objects (inherited permissions are not calculated):
471 f2d7b5ab Antony Chazapis
472 c9af0703 Antony Chazapis
==========================  ======================================
473 c9af0703 Antony Chazapis
Name                        Description
474 c9af0703 Antony Chazapis
==========================  ======================================
475 c9af0703 Antony Chazapis
name                        The name of the object
476 c9af0703 Antony Chazapis
hash                        The ETag of the object
477 c9af0703 Antony Chazapis
bytes                       The size of the object
478 c9af0703 Antony Chazapis
content_type                The MIME content type of the object
479 c9af0703 Antony Chazapis
last_modified               The last object modification date (regardless of version)
480 4a1c29ea Antony Chazapis
x_object_hash               The Merkle hash
481 37bee317 Antony Chazapis
x_object_uuid               The object's UUID
482 c9af0703 Antony Chazapis
x_object_version            The object's version identifier
483 c9af0703 Antony Chazapis
x_object_version_timestamp  The object's version timestamp
484 104626e3 Antony Chazapis
x_object_modified_by        The user that committed the object's version
485 3ab38c43 Antony Chazapis
x_object_sharing            Object permissions (optional)
486 c9aba6cc Antony Chazapis
x_object_allowed_to         Allowed actions on object (optional)
487 3ab38c43 Antony Chazapis
x_object_public             Object's publicly accessible URI (optional)
488 c9af0703 Antony Chazapis
==========================  ======================================
489 f2d7b5ab Antony Chazapis
490 82482e2c Antony Chazapis
Sharing metadata and last modification timestamp will only be returned if there is no ``until`` parameter defined.
491 4cea11c6 Antony Chazapis
492 f2d7b5ab Antony Chazapis
Extended replies may also include virtual directory markers in separate sections of the ``json`` or ``xml`` results.
493 f2d7b5ab Antony Chazapis
Virtual directory markers are only included when ``delimiter`` is explicitly set. They correspond to the substrings up to and including the first occurrence of the delimiter.
494 4e5673a0 Antony Chazapis
In JSON results they appear as dictionaries with only a ``subdir`` key. In XML results they appear interleaved with ``<object>`` tags as ``<subdir name="..." />``.
495 f2d7b5ab Antony Chazapis
In case there is an object with the same name as a virtual directory marker, the object will be returned.
496 c9af0703 Antony Chazapis
497 690747fe Antony Chazapis
Example ``format=json`` reply:
498 690747fe Antony Chazapis
499 690747fe Antony Chazapis
::
500 690747fe Antony Chazapis
501 690747fe Antony Chazapis
  [{"name": "object",
502 690747fe Antony Chazapis
    "bytes": 0,
503 690747fe Antony Chazapis
    "hash": "d41d8cd98f00b204e9800998ecf8427e",
504 690747fe Antony Chazapis
    "content_type": "application/octet-stream",
505 690747fe Antony Chazapis
    "last_modified": "2011-12-02T08:10:41.565891+00:00",
506 690747fe Antony Chazapis
    "x_object_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
507 37bee317 Antony Chazapis
    "x_object_uuid": "8ed9af1b-c948-4bb6-82b0-48344f5c822c",
508 690747fe Antony Chazapis
    "x_object_version": 98,
509 690747fe Antony Chazapis
    "x_object_version_timestamp": "1322813441.565891",
510 690747fe Antony Chazapis
    "x_object_modified_by": "user"}, ...]
511 690747fe Antony Chazapis
512 690747fe Antony Chazapis
Example ``format=xml`` reply:
513 690747fe Antony Chazapis
514 690747fe Antony Chazapis
::
515 690747fe Antony Chazapis
516 690747fe Antony Chazapis
  <?xml version="1.0" encoding="UTF-8"?>
517 690747fe Antony Chazapis
  <container name="pithos">
518 690747fe Antony Chazapis
    <object>
519 690747fe Antony Chazapis
      <name>object</name>
520 690747fe Antony Chazapis
      <bytes>0</bytes>
521 690747fe Antony Chazapis
      <hash>d41d8cd98f00b204e9800998ecf8427e</hash>
522 690747fe Antony Chazapis
      <content_type>application/octet-stream</content_type>
523 690747fe Antony Chazapis
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
524 690747fe Antony Chazapis
      <x_object_hash>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</x_object_hash>
525 37bee317 Antony Chazapis
      <x_object_uuid>8ed9af1b-c948-4bb6-82b0-48344f5c822c</x_object_uuid>
526 690747fe Antony Chazapis
      <x_object_version>98</x_object_version>
527 690747fe Antony Chazapis
      <x_object_version_timestamp>1322813441.565891</x_object_version_timestamp>
528 690747fe Antony Chazapis
      <x_object_modified_by>chazapis</x_object_modified_by>
529 690747fe Antony Chazapis
    </object>
530 690747fe Antony Chazapis
    <object>...</object>
531 690747fe Antony Chazapis
  </container>
532 690747fe Antony Chazapis
533 82482e2c Antony Chazapis
For more examples of container details returned in JSON/XML formats refer to the OOS API documentation. In addition to the OOS API, Pithos returns more fields that should help with synchronization.
534 f2d7b5ab Antony Chazapis
535 6bc372a4 Antony Chazapis
===========================  ===============================
536 6bc372a4 Antony Chazapis
Return Code                  Description
537 6bc372a4 Antony Chazapis
===========================  ===============================
538 6bc372a4 Antony Chazapis
200 (OK)                     The request succeeded
539 6bc372a4 Antony Chazapis
204 (No Content)             The account has no containers (only for non-extended replies)
540 6bc372a4 Antony Chazapis
304 (Not Modified)           The container has not been modified
541 6bc372a4 Antony Chazapis
412 (Precondition Failed)    The condition set can not be satisfied
542 6bc372a4 Antony Chazapis
===========================  ===============================
543 f2d7b5ab Antony Chazapis
544 690747fe Antony Chazapis
Will use a ``200`` return code if the reply is of type JSON/XML.
545 f2d7b5ab Antony Chazapis
546 f2d7b5ab Antony Chazapis
547 f2d7b5ab Antony Chazapis
PUT
548 f2d7b5ab Antony Chazapis
"""
549 f2d7b5ab Antony Chazapis
550 f2d7b5ab Antony Chazapis
====================  ================================
551 f2d7b5ab Antony Chazapis
Request Header Name   Value
552 f2d7b5ab Antony Chazapis
====================  ================================
553 3ab38c43 Antony Chazapis
X-Container-Policy-*  Container behavior and limits
554 f2d7b5ab Antony Chazapis
X-Container-Meta-*    Optional user defined metadata
555 f2d7b5ab Antony Chazapis
====================  ================================
556 f2d7b5ab Antony Chazapis
 
557 f2d7b5ab Antony Chazapis
No reply content/headers.
558 3ab38c43 Antony Chazapis
559 3ab38c43 Antony Chazapis
If no policy is defined, the container will be created with the default values.
560 3ab38c43 Antony Chazapis
Available policy directives:
561 3ab38c43 Antony Chazapis
562 a46f7175 Antony Chazapis
* ``versioning``: Set to ``auto`` or ``none`` (default is ``auto``)
563 3ab38c43 Antony Chazapis
* ``quota``: Size limit in KB (default is ``0`` - unlimited)
564 c5d308c6 Antony Chazapis
565 c5d308c6 Antony Chazapis
If the container already exists, the operation is equal to a ``POST`` with ``update`` defined.
566 c5d308c6 Antony Chazapis
567 f2d7b5ab Antony Chazapis
================  ===============================
568 f2d7b5ab Antony Chazapis
Return Code       Description
569 f2d7b5ab Antony Chazapis
================  ===============================
570 f2d7b5ab Antony Chazapis
201 (Created)     The container has been created
571 f2d7b5ab Antony Chazapis
202 (Accepted)    The request has been accepted
572 f2d7b5ab Antony Chazapis
================  ===============================
573 f2d7b5ab Antony Chazapis
574 f2d7b5ab Antony Chazapis
575 f2d7b5ab Antony Chazapis
POST
576 f2d7b5ab Antony Chazapis
""""
577 f2d7b5ab Antony Chazapis
578 f2d7b5ab Antony Chazapis
====================  ================================
579 f2d7b5ab Antony Chazapis
Request Header Name   Value
580 f2d7b5ab Antony Chazapis
====================  ================================
581 6d897a63 Antony Chazapis
Content-Length        The size of the supplied data (optional, to upload)
582 6d897a63 Antony Chazapis
Content-Type          The MIME content type of the supplied data (optional, to upload)
583 6d897a63 Antony Chazapis
Transfer-Encoding     Set to ``chunked`` to specify incremental uploading (if used, ``Content-Length`` is ignored)
584 3ab38c43 Antony Chazapis
X-Container-Policy-*  Container behavior and limits
585 f2d7b5ab Antony Chazapis
X-Container-Meta-*    Optional user defined metadata
586 f2d7b5ab Antony Chazapis
====================  ================================
587 f2d7b5ab Antony Chazapis
588 a8326bef Antony Chazapis
|
589 a8326bef Antony Chazapis
590 a8326bef Antony Chazapis
======================  ============================================
591 a8326bef Antony Chazapis
Request Parameter Name  Value
592 a8326bef Antony Chazapis
======================  ============================================
593 af7bb62f Antony Chazapis
format                  Optional hash list reply type (can be ``json`` or ``xml``)
594 a8326bef Antony Chazapis
update                  Do not replace metadata/policy (no value parameter)
595 a8326bef Antony Chazapis
======================  ============================================
596 a8326bef Antony Chazapis
597 af7bb62f Antony Chazapis
No reply content/headers, except when uploading data, where the reply consists of a list of hashes for the blocks received (in the format specified).
598 f2d7b5ab Antony Chazapis
599 a6eb13e9 Antony Chazapis
The operation will overwrite all user defined metadata, except if ``update`` is defined.
600 3ab38c43 Antony Chazapis
To change policy, include an ``X-Container-Policy-*`` header with the name in the key. If no ``X-Container-Policy-*`` header is present, no changes will be applied to policy. The ``update`` parameter also applies to policy - deleted values will revert to defaults. To delete/revert a specific policy directive, use ``update`` and an empty header value. See container ``PUT`` for a reference of policy directives.
601 f2d7b5ab Antony Chazapis
602 6d897a63 Antony Chazapis
To upload blocks of data to the container, set ``Content-Type`` to ``application/octet-stream`` and ``Content-Length`` to a valid value (except if using ``chunked`` as the ``Transfer-Encoding``).
603 6d897a63 Antony Chazapis
604 f2d7b5ab Antony Chazapis
================  ===============================
605 f2d7b5ab Antony Chazapis
Return Code       Description
606 f2d7b5ab Antony Chazapis
================  ===============================
607 f2d7b5ab Antony Chazapis
202 (Accepted)    The request has been accepted
608 f2d7b5ab Antony Chazapis
================  ===============================
609 f2d7b5ab Antony Chazapis
610 f2d7b5ab Antony Chazapis
611 f2d7b5ab Antony Chazapis
DELETE
612 f2d7b5ab Antony Chazapis
""""""
613 f2d7b5ab Antony Chazapis
614 81f947fd Antony Chazapis
======================  ===================================
615 81f947fd Antony Chazapis
Request Parameter Name  Value
616 81f947fd Antony Chazapis
======================  ===================================
617 81f947fd Antony Chazapis
until                   Optional timestamp
618 81f947fd Antony Chazapis
======================  ===================================
619 81f947fd Antony Chazapis
620 81f947fd Antony Chazapis
If ``until`` is defined, the container is "purged" up to that time (the history of all objects up to then is deleted).
621 f2d7b5ab Antony Chazapis
622 f2d7b5ab Antony Chazapis
No reply content/headers.
623 f2d7b5ab Antony Chazapis
624 f2d7b5ab Antony Chazapis
================  ===============================
625 f2d7b5ab Antony Chazapis
Return Code       Description
626 f2d7b5ab Antony Chazapis
================  ===============================
627 f2d7b5ab Antony Chazapis
204 (No Content)  The request succeeded
628 f2d7b5ab Antony Chazapis
409 (Conflict)    The container is not empty
629 f2d7b5ab Antony Chazapis
================  ===============================
630 f2d7b5ab Antony Chazapis
631 f2d7b5ab Antony Chazapis
632 f2d7b5ab Antony Chazapis
Object Level
633 f2d7b5ab Antony Chazapis
^^^^^^^^^^^^
634 f2d7b5ab Antony Chazapis
635 f2d7b5ab Antony Chazapis
List of operations:
636 f2d7b5ab Antony Chazapis
637 f2d7b5ab Antony Chazapis
=========  =================================
638 f2d7b5ab Antony Chazapis
Operation  Description
639 f2d7b5ab Antony Chazapis
=========  =================================
640 f2d7b5ab Antony Chazapis
HEAD       Retrieve object metadata
641 f2d7b5ab Antony Chazapis
GET        Read object data
642 f2d7b5ab Antony Chazapis
PUT        Write object data or copy/move object
643 f2d7b5ab Antony Chazapis
COPY       Copy object
644 f2d7b5ab Antony Chazapis
MOVE       Move object
645 6bc372a4 Antony Chazapis
POST       Update object metadata/data
646 f2d7b5ab Antony Chazapis
DELETE     Delete object
647 f2d7b5ab Antony Chazapis
=========  =================================
648 f2d7b5ab Antony Chazapis
649 f2d7b5ab Antony Chazapis
650 f2d7b5ab Antony Chazapis
HEAD
651 f2d7b5ab Antony Chazapis
""""
652 f2d7b5ab Antony Chazapis
653 a8326bef Antony Chazapis
====================  ================================
654 a8326bef Antony Chazapis
Request Header Name   Value
655 a8326bef Antony Chazapis
====================  ================================
656 a8326bef Antony Chazapis
If-Match              Retrieve if ETags match
657 a8326bef Antony Chazapis
If-None-Match         Retrieve if ETags don't match
658 a8326bef Antony Chazapis
If-Modified-Since     Retrieve if object has changed since provided timestamp
659 a8326bef Antony Chazapis
If-Unmodified-Since   Retrieve if object has not changed since provided timestamp
660 a8326bef Antony Chazapis
====================  ================================
661 a8326bef Antony Chazapis
662 a8326bef Antony Chazapis
|
663 a8326bef Antony Chazapis
664 c9af0703 Antony Chazapis
======================  ===================================
665 c9af0703 Antony Chazapis
Request Parameter Name  Value
666 c9af0703 Antony Chazapis
======================  ===================================
667 c9af0703 Antony Chazapis
version                 Optional version identifier
668 c9af0703 Antony Chazapis
======================  ===================================
669 c9af0703 Antony Chazapis
670 c9af0703 Antony Chazapis
|
671 f2d7b5ab Antony Chazapis
672 f2d7b5ab Antony Chazapis
==========================  ===============================
673 f2d7b5ab Antony Chazapis
Reply Header Name           Value
674 f2d7b5ab Antony Chazapis
==========================  ===============================
675 e9285524 Antony Chazapis
ETag                        The ETag of the object
676 f2d7b5ab Antony Chazapis
Content-Length              The size of the object
677 f2d7b5ab Antony Chazapis
Content-Type                The MIME content type of the object
678 c9af0703 Antony Chazapis
Last-Modified               The last object modification date (regardless of version)
679 f2d7b5ab Antony Chazapis
Content-Encoding            The encoding of the object (optional)
680 f2d7b5ab Antony Chazapis
Content-Disposition         The presentation style of the object (optional)
681 4a1c29ea Antony Chazapis
X-Object-Hash               The Merkle hash
682 37bee317 Antony Chazapis
X-Object-UUID               The object's UUID
683 c9af0703 Antony Chazapis
X-Object-Version            The object's version identifier
684 c9af0703 Antony Chazapis
X-Object-Version-Timestamp  The object's version timestamp
685 104626e3 Antony Chazapis
X-Object-Modified-By        The user that comitted the object's version
686 6d817842 Antony Chazapis
X-Object-Manifest           Object parts prefix in ``<container>/<object>`` form (optional)
687 3ab38c43 Antony Chazapis
X-Object-Sharing            Object permissions (optional)
688 3ab38c43 Antony Chazapis
X-Object-Shared-By          Object inheriting permissions (optional)
689 067cf1fc Antony Chazapis
X-Object-Allowed-To         Allowed actions on object (optional)
690 3ab38c43 Antony Chazapis
X-Object-Public             Object's publicly accessible URI (optional)
691 f2d7b5ab Antony Chazapis
X-Object-Meta-*             Optional user defined metadata
692 f2d7b5ab Antony Chazapis
==========================  ===============================
693 f2d7b5ab Antony Chazapis
694 f2d7b5ab Antony Chazapis
|
695 f2d7b5ab Antony Chazapis
696 f2d7b5ab Antony Chazapis
================  ===============================
697 f2d7b5ab Antony Chazapis
Return Code       Description
698 f2d7b5ab Antony Chazapis
================  ===============================
699 cb146cf9 Antony Chazapis
200 (No Content)  The request succeeded
700 f2d7b5ab Antony Chazapis
================  ===============================
701 f2d7b5ab Antony Chazapis
702 f2d7b5ab Antony Chazapis
703 f2d7b5ab Antony Chazapis
GET
704 f2d7b5ab Antony Chazapis
"""
705 f2d7b5ab Antony Chazapis
706 f2d7b5ab Antony Chazapis
====================  ================================
707 f2d7b5ab Antony Chazapis
Request Header Name   Value
708 f2d7b5ab Antony Chazapis
====================  ================================
709 f2d7b5ab Antony Chazapis
Range                 Optional range of data to retrieve
710 7b0688a9 Sofia Papagiannaki
If-Range              Retrieve the missing part if entity is unchanged; otherwise, retrieve the entire new entity (used together with Range header)
711 f2d7b5ab Antony Chazapis
If-Match              Retrieve if ETags match
712 f2d7b5ab Antony Chazapis
If-None-Match         Retrieve if ETags don't match
713 f2d7b5ab Antony Chazapis
If-Modified-Since     Retrieve if object has changed since provided timestamp
714 f2d7b5ab Antony Chazapis
If-Unmodified-Since   Retrieve if object has not changed since provided timestamp
715 f2d7b5ab Antony Chazapis
====================  ================================
716 f2d7b5ab Antony Chazapis
717 e9285524 Antony Chazapis
|
718 e9285524 Antony Chazapis
719 e9285524 Antony Chazapis
======================  ===================================
720 e9285524 Antony Chazapis
Request Parameter Name  Value
721 e9285524 Antony Chazapis
======================  ===================================
722 e9285524 Antony Chazapis
format                  Optional extended reply type (can be ``json`` or ``xml``)
723 f9f15f92 Antony Chazapis
hashmap                 Optional request for hashmap (no value parameter)
724 c9af0703 Antony Chazapis
version                 Optional version identifier or ``list`` (specify a format if requesting a list)
725 e9285524 Antony Chazapis
======================  ===================================
726 e9285524 Antony Chazapis
727 f9f15f92 Antony Chazapis
The reply is the object's data (or part of it), except if a hashmap is requested with ``hashmap``, or a version list with ``version=list`` (in both cases an extended reply format must be specified). Object headers (as in a ``HEAD`` request) are always included.
728 e9285524 Antony Chazapis
729 dfb28993 chazapis
Hashmaps expose the underlying storage format of the object. Note that each hash is computed after trimming trailing null bytes of the corresponding block. The ``X-Object-Hash`` header reports the single Merkle hash of the object's hashmap (refer to http://bittorrent.org/beps/bep_0030.html for more information).
730 e9285524 Antony Chazapis
731 e9285524 Antony Chazapis
Example ``format=json`` reply:
732 e9285524 Antony Chazapis
733 e9285524 Antony Chazapis
::
734 e9285524 Antony Chazapis
735 c9af0703 Antony Chazapis
  {"block_hash": "sha1", "hashes": ["7295c41da03d7f916440b98e32c4a2a39351546c", ...], "block_size": 131072, "bytes": 242}
736 e9285524 Antony Chazapis
737 e9285524 Antony Chazapis
Example ``format=xml`` reply:
738 e9285524 Antony Chazapis
739 e9285524 Antony Chazapis
::
740 e9285524 Antony Chazapis
741 e9285524 Antony Chazapis
  <?xml version="1.0" encoding="UTF-8"?>
742 6bc372a4 Antony Chazapis
  <object name="file" bytes="24223726" block_size="131072" block_hash="sha1">
743 e9285524 Antony Chazapis
    <hash>7295c41da03d7f916440b98e32c4a2a39351546c</hash>
744 e9285524 Antony Chazapis
    <hash>...</hash>
745 e9285524 Antony Chazapis
  </object>
746 f2d7b5ab Antony Chazapis
747 104626e3 Antony Chazapis
Version lists include the version identifier and timestamp for each available object version. Version identifiers can be arbitrary strings, so use the timestamp to find newer versions.
748 c9af0703 Antony Chazapis
749 c9af0703 Antony Chazapis
Example ``format=json`` reply:
750 c9af0703 Antony Chazapis
751 c9af0703 Antony Chazapis
::
752 c9af0703 Antony Chazapis
753 690747fe Antony Chazapis
  {"versions": [[85, "1322734861.248469"], [86, "1322734905.009272"], ...]}
754 c9af0703 Antony Chazapis
755 c9af0703 Antony Chazapis
Example ``format=xml`` reply:
756 c9af0703 Antony Chazapis
757 c9af0703 Antony Chazapis
::
758 c9af0703 Antony Chazapis
759 c9af0703 Antony Chazapis
  <?xml version="1.0" encoding="UTF-8"?>
760 c9af0703 Antony Chazapis
  <object name="file">
761 690747fe Antony Chazapis
    <version timestamp="1322734861.248469">85</version>
762 690747fe Antony Chazapis
    <version timestamp="1322734905.009272">86</version>
763 c9af0703 Antony Chazapis
    <version timestamp="...">...</version>
764 c9af0703 Antony Chazapis
  </object>
765 c9af0703 Antony Chazapis
766 f2d7b5ab Antony Chazapis
The ``Range`` header may include multiple ranges, as outlined in RFC2616. Then the ``Content-Type`` of the reply will be ``multipart/byteranges`` and each part will include a ``Content-Range`` header.
767 f2d7b5ab Antony Chazapis
768 f2d7b5ab Antony Chazapis
==========================  ===============================
769 f2d7b5ab Antony Chazapis
Reply Header Name           Value
770 f2d7b5ab Antony Chazapis
==========================  ===============================
771 e9285524 Antony Chazapis
ETag                        The ETag of the object
772 f2d7b5ab Antony Chazapis
Content-Length              The size of the data returned
773 f2d7b5ab Antony Chazapis
Content-Type                The MIME content type of the object
774 f2d7b5ab Antony Chazapis
Content-Range               The range of data included (only on a single range request)
775 c9af0703 Antony Chazapis
Last-Modified               The last object modification date (regardless of version)
776 f2d7b5ab Antony Chazapis
Content-Encoding            The encoding of the object (optional)
777 f2d7b5ab Antony Chazapis
Content-Disposition         The presentation style of the object (optional)
778 4a1c29ea Antony Chazapis
X-Object-Hash               The Merkle hash
779 37bee317 Antony Chazapis
X-Object-UUID               The object's UUID
780 c9af0703 Antony Chazapis
X-Object-Version            The object's version identifier
781 c9af0703 Antony Chazapis
X-Object-Version-Timestamp  The object's version timestamp
782 104626e3 Antony Chazapis
X-Object-Modified-By        The user that comitted the object's version
783 6d817842 Antony Chazapis
X-Object-Manifest           Object parts prefix in ``<container>/<object>`` form (optional)
784 3ab38c43 Antony Chazapis
X-Object-Sharing            Object permissions (optional)
785 3ab38c43 Antony Chazapis
X-Object-Shared-By          Object inheriting permissions (optional)
786 067cf1fc Antony Chazapis
X-Object-Allowed-To         Allowed actions on object (optional)
787 3ab38c43 Antony Chazapis
X-Object-Public             Object's publicly accessible URI (optional)
788 f2d7b5ab Antony Chazapis
X-Object-Meta-*             Optional user defined metadata
789 f2d7b5ab Antony Chazapis
==========================  ===============================
790 f2d7b5ab Antony Chazapis
791 4cea11c6 Antony Chazapis
Sharing headers (``X-Object-Sharing``, ``X-Object-Shared-By`` and ``X-Object-Allowed-To``) are only included if the request is for the object's latest version (no specific ``version`` parameter is set).
792 f2d7b5ab Antony Chazapis
793 f2d7b5ab Antony Chazapis
===========================  ==============================
794 f2d7b5ab Antony Chazapis
Return Code                  Description
795 f2d7b5ab Antony Chazapis
===========================  ==============================
796 f2d7b5ab Antony Chazapis
200 (OK)                     The request succeeded
797 f2d7b5ab Antony Chazapis
206 (Partial Content)        The range request succeeded
798 f2d7b5ab Antony Chazapis
304 (Not Modified)           The object has not been modified
799 f2d7b5ab Antony Chazapis
412 (Precondition Failed)    The condition set can not be satisfied
800 f2d7b5ab Antony Chazapis
416 (Range Not Satisfiable)  The requested range is out of limits
801 f2d7b5ab Antony Chazapis
===========================  ==============================
802 f2d7b5ab Antony Chazapis
803 f2d7b5ab Antony Chazapis
804 f2d7b5ab Antony Chazapis
PUT
805 f2d7b5ab Antony Chazapis
"""
806 f2d7b5ab Antony Chazapis
807 f2d7b5ab Antony Chazapis
====================  ================================
808 f2d7b5ab Antony Chazapis
Request Header Name   Value
809 f2d7b5ab Antony Chazapis
====================  ================================
810 a8326bef Antony Chazapis
If-Match              Put if ETags match with current object
811 a8326bef Antony Chazapis
If-None-Match         Put if ETags don't match with current object
812 f2d7b5ab Antony Chazapis
ETag                  The MD5 hash of the object (optional to check written data)
813 f2d7b5ab Antony Chazapis
Content-Length        The size of the data written
814 f2d7b5ab Antony Chazapis
Content-Type          The MIME content type of the object
815 f2d7b5ab Antony Chazapis
Transfer-Encoding     Set to ``chunked`` to specify incremental uploading (if used, ``Content-Length`` is ignored)
816 f2d7b5ab Antony Chazapis
X-Copy-From           The source path in the form ``/<container>/<object>``
817 f2d7b5ab Antony Chazapis
X-Move-From           The source path in the form ``/<container>/<object>``
818 79bb41b7 Antony Chazapis
X-Source-Account      The source account to copy/move from
819 cb146cf9 Antony Chazapis
X-Source-Version      The source version to copy from
820 f2d7b5ab Antony Chazapis
Content-Encoding      The encoding of the object (optional)
821 f2d7b5ab Antony Chazapis
Content-Disposition   The presentation style of the object (optional)
822 6d817842 Antony Chazapis
X-Object-Manifest     Object parts prefix in ``<container>/<object>`` form (optional)
823 3ab38c43 Antony Chazapis
X-Object-Sharing      Object permissions (optional)
824 3ab38c43 Antony Chazapis
X-Object-Public       Object is publicly accessible (optional)
825 f2d7b5ab Antony Chazapis
X-Object-Meta-*       Optional user defined metadata
826 f2d7b5ab Antony Chazapis
====================  ================================
827 f2d7b5ab Antony Chazapis
828 f2d7b5ab Antony Chazapis
|
829 f2d7b5ab Antony Chazapis
830 7b0688a9 Sofia Papagiannaki
======================  ===================================
831 7b0688a9 Sofia Papagiannaki
Request Parameter Name  Value
832 7b0688a9 Sofia Papagiannaki
======================  ===================================
833 6b6b6c1e Antony Chazapis
format                  Optional extended request/conflict response type (can be ``json`` or ``xml``)
834 f9f15f92 Antony Chazapis
hashmap                 Optional hashmap provided instead of data (no value parameter)
835 7b0688a9 Sofia Papagiannaki
======================  ===================================
836 7b0688a9 Sofia Papagiannaki
837 6b6b6c1e Antony Chazapis
The request is the object's data (or part of it), except if a hashmap is provided (using ``hashmap`` and ``format`` parameters). If using a hashmap and all different parts are stored in the server, the object is created. Otherwise the server returns Conflict (409) with the list of the missing parts (in simple text format, with one hash per line, or in JSON/XML - depending on the ``format`` parameter).
838 7b0688a9 Sofia Papagiannaki
839 f9f15f92 Antony Chazapis
Hashmaps should be formatted as outlined in ``GET``.
840 7b0688a9 Sofia Papagiannaki
841 f2d7b5ab Antony Chazapis
==========================  ===============================
842 f2d7b5ab Antony Chazapis
Reply Header Name           Value
843 f2d7b5ab Antony Chazapis
==========================  ===============================
844 dfb28993 chazapis
ETag                        The MD5 hash of the object
845 7dd293a0 Antony Chazapis
X-Object-Version            The object's new version
846 f2d7b5ab Antony Chazapis
==========================  ===============================
847 f2d7b5ab Antony Chazapis
848 b0a2d1a6 Antony Chazapis
The ``X-Object-Sharing`` header may include either a ``read=...`` comma-separated user/group list, or a ``write=...`` comma-separated user/group list, or both separated by a semicolon (``;``). Groups are specified as ``<account>:<group>``. To publish the object, set ``X-Object-Public`` to ``true``. To unpublish, set to ``false``, or use an empty header value.
849 f2d7b5ab Antony Chazapis
850 5df6c6d1 Antony Chazapis
==============================  ==============================
851 5df6c6d1 Antony Chazapis
Return Code                     Description
852 5df6c6d1 Antony Chazapis
==============================  ==============================
853 5df6c6d1 Antony Chazapis
201 (Created)                   The object has been created
854 e809b989 Antony Chazapis
409 (Conflict)                  The object can not be created from the provided hashmap (a list of missing hashes will be included in the reply)
855 5df6c6d1 Antony Chazapis
411 (Length Required)           Missing ``Content-Length`` or ``Content-Type`` in the request
856 5df6c6d1 Antony Chazapis
413 (Request Entity Too Large)  Insufficient quota to complete the request
857 5df6c6d1 Antony Chazapis
422 (Unprocessable Entity)      The MD5 checksum of the data written to the storage system does not match the (optionally) supplied ETag value
858 5df6c6d1 Antony Chazapis
==============================  ==============================
859 f2d7b5ab Antony Chazapis
860 f2d7b5ab Antony Chazapis
861 f2d7b5ab Antony Chazapis
COPY
862 f2d7b5ab Antony Chazapis
""""
863 f2d7b5ab Antony Chazapis
864 f2d7b5ab Antony Chazapis
====================  ================================
865 f2d7b5ab Antony Chazapis
Request Header Name   Value
866 f2d7b5ab Antony Chazapis
====================  ================================
867 a8326bef Antony Chazapis
If-Match              Proceed if ETags match with object
868 a8326bef Antony Chazapis
If-None-Match         Proceed if ETags don't match with object
869 f2d7b5ab Antony Chazapis
Destination           The destination path in the form ``/<container>/<object>``
870 79bb41b7 Antony Chazapis
Destination-Account   The destination account to copy to
871 5bc1116c Antony Chazapis
Content-Type          The MIME content type of the object (optional :sup:`*`)
872 f2d7b5ab Antony Chazapis
Content-Encoding      The encoding of the object (optional)
873 f2d7b5ab Antony Chazapis
Content-Disposition   The presentation style of the object (optional)
874 cb146cf9 Antony Chazapis
X-Source-Version      The source version to copy from
875 6d817842 Antony Chazapis
X-Object-Manifest     Object parts prefix in ``<container>/<object>`` form (optional)
876 3ab38c43 Antony Chazapis
X-Object-Sharing      Object permissions (optional)
877 3ab38c43 Antony Chazapis
X-Object-Public       Object is publicly accessible (optional)
878 f2d7b5ab Antony Chazapis
X-Object-Meta-*       Optional user defined metadata
879 f2d7b5ab Antony Chazapis
====================  ================================
880 f2d7b5ab Antony Chazapis
881 53cff70c Antony Chazapis
:sup:`*` *When using django locally with the supplied web server, use the ignore_content_type parameter, or do provide a valid Content-Type, as a type of text/plain is applied by default to all requests. Client software should always state ignore_content_type, except when a Content-Type is explicitly defined by the user.*
882 5bc1116c Antony Chazapis
883 6b6b6c1e Antony Chazapis
======================  ===================================
884 6b6b6c1e Antony Chazapis
Request Parameter Name  Value
885 6b6b6c1e Antony Chazapis
======================  ===================================
886 6b6b6c1e Antony Chazapis
format                  Optional conflict response type (can be ``json`` or ``xml``)
887 6b6b6c1e Antony Chazapis
ignore_content_type     Ignore the supplied Content-Type
888 6b6b6c1e Antony Chazapis
======================  ===================================
889 6b6b6c1e Antony Chazapis
890 3ab38c43 Antony Chazapis
Refer to ``PUT``/``POST`` for a description of request headers. Metadata is also copied, updated with any values defined. Sharing/publishing options are not copied.
891 a6eb13e9 Antony Chazapis
892 7dd293a0 Antony Chazapis
==========================  ===============================
893 7dd293a0 Antony Chazapis
Reply Header Name           Value
894 7dd293a0 Antony Chazapis
==========================  ===============================
895 7dd293a0 Antony Chazapis
X-Object-Version            The object's new version
896 7dd293a0 Antony Chazapis
==========================  ===============================
897 7dd293a0 Antony Chazapis
898 7dd293a0 Antony Chazapis
|
899 f2d7b5ab Antony Chazapis
900 5df6c6d1 Antony Chazapis
==============================  ==============================
901 5df6c6d1 Antony Chazapis
Return Code                     Description
902 5df6c6d1 Antony Chazapis
==============================  ==============================
903 5df6c6d1 Antony Chazapis
201 (Created)                   The object has been created
904 5df6c6d1 Antony Chazapis
413 (Request Entity Too Large)  Insufficient quota to complete the request
905 5df6c6d1 Antony Chazapis
==============================  ==============================
906 f2d7b5ab Antony Chazapis
907 f2d7b5ab Antony Chazapis
908 f2d7b5ab Antony Chazapis
MOVE
909 f2d7b5ab Antony Chazapis
""""
910 f2d7b5ab Antony Chazapis
911 cb146cf9 Antony Chazapis
Same as ``COPY``, without the ``X-Source-Version`` request header. The ``MOVE`` operation is always applied on the latest version.
912 f2d7b5ab Antony Chazapis
913 f2d7b5ab Antony Chazapis
914 f2d7b5ab Antony Chazapis
POST
915 f2d7b5ab Antony Chazapis
""""
916 f2d7b5ab Antony Chazapis
917 f2d7b5ab Antony Chazapis
====================  ================================
918 f2d7b5ab Antony Chazapis
Request Header Name   Value
919 f2d7b5ab Antony Chazapis
====================  ================================
920 a8326bef Antony Chazapis
If-Match              Proceed if ETags match with object
921 a8326bef Antony Chazapis
If-None-Match         Proceed if ETags don't match with object
922 e9285524 Antony Chazapis
Content-Length        The size of the data written (optional, to update)
923 e9285524 Antony Chazapis
Content-Type          The MIME content type of the object (optional, to update)
924 e9285524 Antony Chazapis
Content-Range         The range of data supplied (optional, to update)
925 e9285524 Antony Chazapis
Transfer-Encoding     Set to ``chunked`` to specify incremental uploading (if used, ``Content-Length`` is ignored)
926 f2d7b5ab Antony Chazapis
Content-Encoding      The encoding of the object (optional)
927 f2d7b5ab Antony Chazapis
Content-Disposition   The presentation style of the object (optional)
928 ab2e317e Antony Chazapis
X-Source-Object       Update with data from the object at path ``/<container>/<object>`` (optional, to update)
929 2cd94d81 Antony Chazapis
X-Source-Account      The source account to update from
930 ab2e317e Antony Chazapis
X-Source-Version      The source version to update from (optional, to update)
931 1495b972 Antony Chazapis
X-Object-Bytes        The updated object's final size (optional, when updating)
932 6d817842 Antony Chazapis
X-Object-Manifest     Object parts prefix in ``<container>/<object>`` form (optional)
933 3ab38c43 Antony Chazapis
X-Object-Sharing      Object permissions (optional)
934 3ab38c43 Antony Chazapis
X-Object-Public       Object is publicly accessible (optional)
935 f2d7b5ab Antony Chazapis
X-Object-Meta-*       Optional user defined metadata
936 f2d7b5ab Antony Chazapis
====================  ================================
937 f2d7b5ab Antony Chazapis
938 a8326bef Antony Chazapis
|
939 a8326bef Antony Chazapis
940 a8326bef Antony Chazapis
======================  ============================================
941 a8326bef Antony Chazapis
Request Parameter Name  Value
942 a8326bef Antony Chazapis
======================  ============================================
943 6b6b6c1e Antony Chazapis
format                  Optional conflict response type (can be ``json`` or ``xml``)
944 a8326bef Antony Chazapis
update                  Do not replace metadata (no value parameter)
945 a8326bef Antony Chazapis
======================  ============================================
946 a8326bef Antony Chazapis
947 3ab38c43 Antony Chazapis
The ``Content-Encoding``, ``Content-Disposition``, ``X-Object-Manifest`` and ``X-Object-Meta-*`` headers are considered to be user defined metadata. An operation without the ``update`` parameter will overwrite all previous values and remove any keys not supplied. When using ``update`` any metadata with an empty value will be deleted.
948 3ab38c43 Antony Chazapis
949 3ab38c43 Antony Chazapis
To change permissions, include an ``X-Object-Sharing`` header (as defined in ``PUT``). To publish, include an ``X-Object-Public`` header, with a value of ``true``. If no such headers are defined, no changes will be applied to sharing/public. Use empty values to remove permissions/unpublish (unpublishing also works with ``false`` as a header value). Sharing options are applied to the object - not its versions.
950 e9285524 Antony Chazapis
951 a6eb13e9 Antony Chazapis
To update an object's data:
952 e9285524 Antony Chazapis
953 ab2e317e Antony Chazapis
* Either set ``Content-Type`` to ``application/octet-stream``, or provide an object with ``X-Source-Object``. If ``Content-Type`` has some other value, it will be ignored and only the metadata will be updated.
954 ab2e317e Antony Chazapis
* If the data is supplied in the request (using ``Content-Type`` instead of ``X-Source-Object``), a valid ``Content-Length`` header is required - except if using chunked transfers (set ``Transfer-Encoding`` to ``chunked``).
955 e9285524 Antony Chazapis
* Set ``Content-Range`` as specified in RFC2616, with the following differences:
956 e9285524 Antony Chazapis
957 e9285524 Antony Chazapis
  * Client software MAY omit ``last-byte-pos`` of if the length of the range being transferred is unknown or difficult to determine.
958 e9285524 Antony Chazapis
  * Client software SHOULD not specify the ``instance-length`` (use a ``*``), unless there is a reason for performing a size check at the server.
959 ab2e317e Antony Chazapis
* If ``Content-Range`` used has a ``byte-range-resp-spec = *``, data will be appended to the object.
960 e9285524 Antony Chazapis
961 1495b972 Antony Chazapis
Optionally, truncate the updated object to the desired length with the ``X-Object-Bytes`` header.
962 1495b972 Antony Chazapis
963 dfb28993 chazapis
A data update will trigger an ETag change. Updated ETags may happen asynchronously and appear at the server with a delay.
964 f2d7b5ab Antony Chazapis
965 e9285524 Antony Chazapis
No reply content. No reply headers if only metadata is updated.
966 e9285524 Antony Chazapis
967 e9285524 Antony Chazapis
==========================  ===============================
968 e9285524 Antony Chazapis
Reply Header Name           Value
969 e9285524 Antony Chazapis
==========================  ===============================
970 e9285524 Antony Chazapis
ETag                        The new ETag of the object (data updated)
971 7dd293a0 Antony Chazapis
X-Object-Version            The object's new version
972 e9285524 Antony Chazapis
==========================  ===============================
973 e9285524 Antony Chazapis
974 e9285524 Antony Chazapis
|
975 f2d7b5ab Antony Chazapis
976 5df6c6d1 Antony Chazapis
==============================  ==============================
977 5df6c6d1 Antony Chazapis
Return Code                     Description
978 5df6c6d1 Antony Chazapis
==============================  ==============================
979 5df6c6d1 Antony Chazapis
202 (Accepted)                  The request has been accepted (not a data update)
980 5df6c6d1 Antony Chazapis
204 (No Content)                The request succeeded (data updated)
981 5df6c6d1 Antony Chazapis
411 (Length Required)           Missing ``Content-Length`` in the request
982 5df6c6d1 Antony Chazapis
413 (Request Entity Too Large)  Insufficient quota to complete the request
983 5df6c6d1 Antony Chazapis
416 (Range Not Satisfiable)     The supplied range is invalid
984 5df6c6d1 Antony Chazapis
==============================  ==============================
985 f2d7b5ab Antony Chazapis
986 28486f26 Antony Chazapis
The ``POST`` method can also be used for creating an object via a standard HTML form. If the request ``Content-Type`` is ``multipart/form-data``, none of the above headers will be processed. The form should have an ``X-Object-Data`` field, as in the following example. The token is passed as a request parameter. ::
987 1d5c57d3 Antony Chazapis
988 28486f26 Antony Chazapis
  <form method="post" action="https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt?X-Auth-Token=0000" enctype="multipart/form-data">
989 1d5c57d3 Antony Chazapis
    <input type="file" name="X-Object-Data">
990 1d5c57d3 Antony Chazapis
    <input type="submit">
991 1d5c57d3 Antony Chazapis
  </form>
992 1d5c57d3 Antony Chazapis
993 3c4bb1a0 root
This will create/override the object with the given name, as if using ``PUT``. The ``Content-Type`` of the object will be set to the value of the corresponding header sent in the part of the request containing the data (usually, automatically handled by the browser). Metadata, sharing and other object attributes can not be set this way. The response will contain the object's ETag.
994 1d5c57d3 Antony Chazapis
995 1d5c57d3 Antony Chazapis
==========================  ===============================
996 1d5c57d3 Antony Chazapis
Reply Header Name           Value
997 1d5c57d3 Antony Chazapis
==========================  ===============================
998 1d5c57d3 Antony Chazapis
ETag                        The MD5 hash of the object
999 7dd293a0 Antony Chazapis
X-Object-Version            The object's new version
1000 1d5c57d3 Antony Chazapis
==========================  ===============================
1001 1d5c57d3 Antony Chazapis
1002 1d5c57d3 Antony Chazapis
|
1003 1d5c57d3 Antony Chazapis
1004 5df6c6d1 Antony Chazapis
==============================  ==============================
1005 5df6c6d1 Antony Chazapis
Return Code                     Description
1006 5df6c6d1 Antony Chazapis
==============================  ==============================
1007 5df6c6d1 Antony Chazapis
201 (Created)                   The object has been created
1008 5df6c6d1 Antony Chazapis
413 (Request Entity Too Large)  Insufficient quota to complete the request
1009 5df6c6d1 Antony Chazapis
==============================  ==============================
1010 1d5c57d3 Antony Chazapis
1011 f2d7b5ab Antony Chazapis
1012 f2d7b5ab Antony Chazapis
DELETE
1013 f2d7b5ab Antony Chazapis
""""""
1014 f2d7b5ab Antony Chazapis
1015 81f947fd Antony Chazapis
======================  ===================================
1016 81f947fd Antony Chazapis
Request Parameter Name  Value
1017 81f947fd Antony Chazapis
======================  ===================================
1018 81f947fd Antony Chazapis
until                   Optional timestamp
1019 81f947fd Antony Chazapis
======================  ===================================
1020 81f947fd Antony Chazapis
1021 81f947fd Antony Chazapis
If ``until`` is defined, the object is "purged" up to that time (the history up to then is deleted).
1022 f2d7b5ab Antony Chazapis
1023 f2d7b5ab Antony Chazapis
No reply content/headers.
1024 f2d7b5ab Antony Chazapis
1025 f2d7b5ab Antony Chazapis
===========================  ==============================
1026 f2d7b5ab Antony Chazapis
Return Code                  Description
1027 f2d7b5ab Antony Chazapis
===========================  ==============================
1028 f2d7b5ab Antony Chazapis
204 (No Content)             The request succeeded
1029 f2d7b5ab Antony Chazapis
===========================  ==============================
1030 f2d7b5ab Antony Chazapis
1031 3ab38c43 Antony Chazapis
Sharing and Public Objects
1032 3ab38c43 Antony Chazapis
^^^^^^^^^^^^^^^^^^^^^^^^^^
1033 3ab38c43 Antony Chazapis
1034 e809b989 Antony Chazapis
Read and write control in Pithos is managed by setting appropriate permissions with the ``X-Object-Sharing`` header. The permissions are applied using directory-based inheritance. A directory is an object with the corresponding content type. The default delimiter is ``/``. Thus, each set of authorization directives is applied to all objects in the directory object where the corresponding ``X-Object-Sharing`` header is defined. If there are nested/overlapping permissions, the closest to the object is applied. When retrieving an object, the ``X-Object-Shared-By`` header reports where it gets its permissions from. If not present, the object is the actual source of authorization directives.
1035 c9af0703 Antony Chazapis
1036 067cf1fc Antony Chazapis
A user may ``GET`` another account or container. The result will include a limited reply, containing only the allowed containers or objects respectively. A top-level request with an authentication token, will return a list of allowed accounts, so the user can easily find out which other users share objects. The ``X-Object-Allowed-To`` header lists the actions allowed on an object, if it does not belong to the requesting user.
1037 f6c97079 Antony Chazapis
1038 f6c97079 Antony Chazapis
Objects that are marked as public, via the ``X-Object-Public`` meta, are also available at the corresponding URI returned for ``HEAD`` or ``GET``. Requests for public objects do not need to include an ``X-Auth-Token``. Pithos will ignore request parameters and only include the following headers in the reply (all ``X-Object-*`` meta is hidden):
1039 c9af0703 Antony Chazapis
1040 c9af0703 Antony Chazapis
==========================  ===============================
1041 c9af0703 Antony Chazapis
Reply Header Name           Value
1042 c9af0703 Antony Chazapis
==========================  ===============================
1043 c9af0703 Antony Chazapis
ETag                        The ETag of the object
1044 c9af0703 Antony Chazapis
Content-Length              The size of the data returned
1045 c9af0703 Antony Chazapis
Content-Type                The MIME content type of the object
1046 c9af0703 Antony Chazapis
Content-Range               The range of data included (only on a single range request)
1047 c9af0703 Antony Chazapis
Last-Modified               The last object modification date (regardless of version)
1048 c9af0703 Antony Chazapis
Content-Encoding            The encoding of the object (optional)
1049 c9af0703 Antony Chazapis
Content-Disposition         The presentation style of the object (optional)
1050 c9af0703 Antony Chazapis
==========================  ===============================
1051 f2d7b5ab Antony Chazapis
1052 f6c97079 Antony Chazapis
Public objects are not included and do not influence cross-user listings. They are, however, readable by all users.
1053 f6c97079 Antony Chazapis
1054 f2d7b5ab Antony Chazapis
Summary
1055 f2d7b5ab Antony Chazapis
^^^^^^^
1056 f2d7b5ab Antony Chazapis
1057 f2d7b5ab Antony Chazapis
List of differences from the OOS API:
1058 f2d7b5ab Antony Chazapis
1059 f2d7b5ab Antony Chazapis
* Support for ``X-Account-Meta-*`` style headers at the account level. Use ``POST`` to update.
1060 3ab38c43 Antony Chazapis
* Support for ``X-Container-Meta-*`` style headers at the container level. Can be set when creating via ``PUT``. Use ``POST`` to update.
1061 f5ed44df Antony Chazapis
* Header ``X-Container-Object-Meta`` at the container level and parameter ``meta`` in container listings. (**TBD**)
1062 647a5f48 Antony Chazapis
* Account and container policies to manage behavior and limits. Container behavior overrides account settings. Account quota sets the maximum bytes limit, regardless of container values.
1063 6bc372a4 Antony Chazapis
* Headers ``X-Container-Block-*`` at the container level, exposing the underlying storage characteristics.
1064 f2d7b5ab Antony Chazapis
* All metadata replies, at all levels, include latest modification information.
1065 a8326bef Antony Chazapis
* At all levels, a ``HEAD`` or ``GET`` request may use ``If-Modified-Since`` and ``If-Unmodified-Since`` headers.
1066 82482e2c Antony Chazapis
* Container/object lists include more fields if the reply is of type JSON/XML. Some names are kept to their OOS API equivalents for compatibility.
1067 b18ef3ad Antony Chazapis
* Option to include only shared containers/objects in listings.
1068 3ab38c43 Antony Chazapis
* Object metadata allowed, in addition to ``X-Object-Meta-*``: ``Content-Encoding``, ``Content-Disposition``, ``X-Object-Manifest``. These are all replaced with every update operation, except if using the ``update`` parameter (in which case individual keys can also be deleted). Deleting meta by providing empty values also works when copying/moving an object.
1069 1d5c57d3 Antony Chazapis
* Multi-range object ``GET`` support as outlined in RFC2616.
1070 1d5c57d3 Antony Chazapis
* Object hashmap retrieval through ``GET`` and the ``format`` parameter.
1071 1d5c57d3 Antony Chazapis
* Object create via hashmap through ``PUT`` and the ``format`` parameter.
1072 4a1c29ea Antony Chazapis
* The object's Merkle hash is always returned in the ``X-Object-Hash`` header.
1073 37bee317 Antony Chazapis
* The object's UUID is always returned in the ``X-Object-UUID`` header. The UUID remains unchanged, even when the object's data or metadata changes, or the object is moved to another path (is renamed). A new UUID is assigned when creating or copying an object.
1074 1d5c57d3 Antony Chazapis
* Object create using ``POST`` to support standard HTML forms.
1075 dfb28993 chazapis
* Partial object updates through ``POST``, using the ``Content-Length``, ``Content-Type``, ``Content-Range`` and ``Transfer-Encoding`` headers. Use another object's data to update with ``X-Source-Object`` and ``X-Source-Version``. Truncate with ``X-Object-Bytes``.
1076 7dd293a0 Antony Chazapis
* Include new version identifier in replies for object replace/change requests.
1077 53cff70c Antony Chazapis
* Object ``MOVE`` support and ``ignore_content_type`` parameter in both ``COPY`` and ``MOVE``.
1078 a8326bef Antony Chazapis
* Conditional object create/update operations, using ``If-Match`` and ``If-None-Match`` headers.
1079 c9af0703 Antony Chazapis
* Time-variant account/container listings via the ``until`` parameter.
1080 1d5c57d3 Antony Chazapis
* Object versions - parameter ``version`` in ``HEAD``/``GET`` (list versions with ``GET``), ``X-Object-Version-*`` meta in replies, ``X-Source-Version`` in ``PUT``/``COPY``.
1081 067cf1fc Antony Chazapis
* Sharing/publishing with ``X-Object-Sharing``, ``X-Object-Public`` at the object level. Cross-user operations are allowed - controlled by sharing directives. Available actions in cross-user requests are reported with ``X-Object-Allowed-To``. Permissions may include groups defined with ``X-Account-Group-*`` at the account level. These apply to the object - not its versions.
1082 3be0f6c1 Antony Chazapis
* Support for directory-based inheritance when enforcing permissions. Parent object carrying the authorization directives is reported in ``X-Object-Shared-By``.
1083 79bb41b7 Antony Chazapis
* Copy and move between accounts with ``X-Source-Account`` and ``Destination-Account`` headers.
1084 8cb45c13 Antony Chazapis
* Large object support with ``X-Object-Manifest``.
1085 104626e3 Antony Chazapis
* Trace the user that created/modified an object with ``X-Object-Modified-By``.
1086 81f947fd Antony Chazapis
* Purge container/object history with the ``until`` parameter in ``DELETE``.
1087 f2d7b5ab Antony Chazapis
1088 f2d7b5ab Antony Chazapis
Clarifications/suggestions:
1089 f2d7b5ab Antony Chazapis
1090 88283e9e Antony Chazapis
* All non-ASCII characters in headers should be URL-encoded.
1091 f2d7b5ab Antony Chazapis
* Authentication is done by another system. The token is used in the same way, but it is obtained differently. The top level ``GET`` request is kept compatible with the OOS API and allows for guest/testing operations.
1092 f2d7b5ab Antony Chazapis
* Some processing is done in the variable part of all ``X-*-Meta-*`` headers. If it includes underscores, they will be converted to dashes and the first letter of all intra-dash strings will be capitalized.
1093 f2d7b5ab Antony Chazapis
* A ``GET`` reply for a level will include all headers of the corresponding ``HEAD`` request.
1094 f2d7b5ab Antony Chazapis
* To avoid conflicts between objects and virtual directory markers in container listings, it is recommended that object names do not end with the delimiter used.
1095 f9f15f92 Antony Chazapis
* The ``Accept`` header may be used in requests instead of the ``format`` parameter to specify the desired request/reply format. The parameter overrides the header.
1096 690747fe Antony Chazapis
* Container/object lists use a ``200`` return code if the reply is of type JSON/XML. The reply will include an empty JSON/XML.
1097 843d36d1 Antony Chazapis
* In headers, dates are formatted according to RFC 1123. In extended information listings, the ``last_modified`` field is formatted according to ISO 8601 (for OOS API compatibility). All other fields (Pithos extensions) use integer tiemstamps.
1098 c9af0703 Antony Chazapis
* The ``Last-Modified`` header value always reflects the actual latest change timestamp, regardless of time control parameters and version requests. Time precondition checks with ``If-Modified-Since`` and ``If-Unmodified-Since`` headers are applied to this value.
1099 a6eb13e9 Antony Chazapis
* A copy/move using ``PUT``/``COPY``/``MOVE`` will always update metadata, keeping all old values except the ones redefined in the request headers.
1100 8cb45c13 Antony Chazapis
* A ``HEAD`` or ``GET`` for an ``X-Object-Manifest`` object, will include modified ``Content-Length`` and ``ETag`` headers, according to the characteristics of the objects under the specified prefix. The ``Etag`` will be the MD5 hash of the corresponding ETags concatenated. In extended container listings there is no metadata processing.
1101 f2d7b5ab Antony Chazapis
1102 f2d7b5ab Antony Chazapis
The Pithos Client
1103 f2d7b5ab Antony Chazapis
-----------------
1104 f2d7b5ab Antony Chazapis
1105 f2d7b5ab Antony Chazapis
User Experience
1106 f2d7b5ab Antony Chazapis
^^^^^^^^^^^^^^^
1107 f2d7b5ab Antony Chazapis
1108 f2d7b5ab Antony Chazapis
Hopefully this API will allow for a multitude of client implementations, each supporting a different device or operating system. All clients will be able to manipulate containers and objects - even software only designed for OOS API compatibility. But a Pithos interface should not be only about showing containers and folders. There are some extra user interface elements and functionalities that should be common to all implementations.
1109 f2d7b5ab Antony Chazapis
1110 f2d7b5ab Antony Chazapis
Upon entrance to the service, a user is presented with the following elements - which can be represented as folders or with other related icons:
1111 f2d7b5ab Antony Chazapis
1112 f2d7b5ab Antony Chazapis
* The ``home`` element, which is used as the default entry point to the user's "files". Objects under ``home`` are represented in the usual hierarchical organization of folders and files.
1113 f2d7b5ab Antony Chazapis
* The ``trash`` element, which contains files that have been marked for deletion, but can still be recovered.
1114 f2d7b5ab Antony Chazapis
* The ``shared`` element, which contains all objects shared by the user to other users of the system.
1115 f2d7b5ab Antony Chazapis
* The ``others`` element, which contains all objects that other users share with the user.
1116 f2d7b5ab Antony Chazapis
* The ``groups`` element, which contains the names of groups the user has defined. Each group consists of a user list. Group creation, deletion, and manipulation is carried out by actions originating here.
1117 66f6dfc2 Antony Chazapis
* The ``history`` element, which allows browsing past instances of ``home`` and - optionally - ``trash``.
1118 f2d7b5ab Antony Chazapis
1119 f2d7b5ab Antony Chazapis
Objects in Pithos can be:
1120 f2d7b5ab Antony Chazapis
1121 f2d7b5ab Antony Chazapis
* Moved to trash and then deleted.
1122 f2d7b5ab Antony Chazapis
* Shared with specific permissions.
1123 f2d7b5ab Antony Chazapis
* Made public (shared with non-Pithos users).
1124 c9af0703 Antony Chazapis
* Restored from previous versions.
1125 f2d7b5ab Antony Chazapis
1126 66f6dfc2 Antony Chazapis
Some of these functions are performed by the client software and some by the Pithos server.
1127 f2d7b5ab Antony Chazapis
1128 f5ed44df Antony Chazapis
In the first version of Pithos, objects could also be assigned custom tags. This is no longer supported. Existing deployments can migrate tags into a specific metadata value, i.e. ``X-Object-Meta-Tags``.
1129 f5ed44df Antony Chazapis
1130 66f6dfc2 Antony Chazapis
Implementation Guidelines
1131 66f6dfc2 Antony Chazapis
^^^^^^^^^^^^^^^^^^^^^^^^^
1132 f2d7b5ab Antony Chazapis
1133 a8326bef Antony Chazapis
Pithos clients should use the ``pithos`` and ``trash`` containers for active and inactive objects respectively. If any of these containers is not found, the client software should create it, without interrupting the user's workflow. The ``home`` element corresponds to ``pithos`` and the ``trash`` element to ``trash``. Use ``PUT`` with the ``X-Move-From`` header, or ``MOVE`` to transfer objects from one container to the other. Use ``DELETE`` to remove from ``pithos`` without trashing, or to remove from ``trash``. When moving objects, detect naming conflicts with the ``If-Match`` or ``If-None-Match`` headers. Such conflicts should be resolved by the user.
1134 f2d7b5ab Antony Chazapis
1135 66f6dfc2 Antony Chazapis
Object names should use the ``/`` delimiter to impose a hierarchy of folders and files.
1136 f2d7b5ab Antony Chazapis
1137 66f6dfc2 Antony Chazapis
The ``shared`` element should be implemented as a read-only view of the ``pithos`` container, using the ``shared`` parameter when listing objects. The ``others`` element, should start with a top-level ``GET`` to retrieve the list of accounts accessible to the user. It is suggested that the client software hides the next step of navigation - the container - if it only includes ``pithos`` and forwards the user directly to the objects.
1138 f2d7b5ab Antony Chazapis
1139 66f6dfc2 Antony Chazapis
Public objects are not included in ``shared`` and ``others`` listings. It is suggested that they are marked in a visually distinctive way in ``pithos`` listings (for example using an icon overlay).
1140 66f6dfc2 Antony Chazapis
1141 66f6dfc2 Antony Chazapis
A special application menu, or a section in application preferences, should be devoted to managing groups (the ``groups`` element). All group-related actions are implemented at the account level.
1142 66f6dfc2 Antony Chazapis
1143 f5ed44df Antony Chazapis
Browsing past versions of objects should be available both at the object and the container level. At the object level, a list of past versions can be included in the screen showing details or more information on the object (metadata, permissions, etc.). At the container level, it is suggested that clients use a ``history`` element, which presents to the user a read-only, time-variable view of ``pithos`` contents. This can be accomplished via the ``until`` parameter in listings. Optionally, ``history`` may include ``trash``.
1144 288c1d55 Antony Chazapis
1145 8728b177 Antony Chazapis
Uploading and downloading data
1146 8728b177 Antony Chazapis
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1147 8728b177 Antony Chazapis
1148 8728b177 Antony Chazapis
By using hashmaps to upload and download objects the corresponding operations can complete much faster.
1149 8728b177 Antony Chazapis
1150 8728b177 Antony Chazapis
In the case of an upload, only the missing blocks will be submitted to the server:
1151 8728b177 Antony Chazapis
1152 8728b177 Antony Chazapis
* Calculate the hash value for each block of the object to be uploaded. Use the hash algorithm and block size of the destination container.
1153 8728b177 Antony Chazapis
* Send a hashmap ``PUT`` request for the object.
1154 8728b177 Antony Chazapis
1155 8728b177 Antony Chazapis
  * Server responds with status ``201`` (Created):
1156 8728b177 Antony Chazapis
1157 8728b177 Antony Chazapis
    * Blocks are already on the server. The object has been created. Done.
1158 8728b177 Antony Chazapis
1159 8728b177 Antony Chazapis
  * Server responds with status ``409`` (Conflict):
1160 8728b177 Antony Chazapis
1161 8728b177 Antony Chazapis
    * Server's response body contains the hashes of the blocks that do not exist on the server.
1162 6d897a63 Antony Chazapis
    * For each hash value in the server's response (or all hashes together):
1163 8728b177 Antony Chazapis
1164 6d897a63 Antony Chazapis
      * Send a ``POST`` request to the destination container with the corresponding data.
1165 8728b177 Antony Chazapis
1166 8728b177 Antony Chazapis
* Repeat hashmap ``PUT``. Fail if the server's response is not ``201``.
1167 8728b177 Antony Chazapis
1168 8728b177 Antony Chazapis
Consulting hashmaps when downloading allows for resuming partially transferred objects. The client should retrieve the hashmap from the server and compare it with the hashmap computed from the respective local file. Any missing parts can be downloaded with ``GET`` requests with the additional ``Range`` header.
1169 8728b177 Antony Chazapis
1170 c9aba6cc Antony Chazapis
Syncing
1171 c9aba6cc Antony Chazapis
^^^^^^^
1172 c9aba6cc Antony Chazapis
1173 c9aba6cc Antony Chazapis
Consider the following algorithm for synchronizing a local folder with the server. The "state" is the complete object listing, with the corresponding attributes.
1174 c9aba6cc Antony Chazapis
 
1175 c9aba6cc Antony Chazapis
::
1176 c9aba6cc Antony Chazapis
1177 c9aba6cc Antony Chazapis
  L: local state (stored state from last sync with the server)
1178 c9aba6cc Antony Chazapis
  C: current state (state computed right before sync)
1179 c9aba6cc Antony Chazapis
  S: server state
1180 c9aba6cc Antony Chazapis
1181 c9aba6cc Antony Chazapis
  if C == L:
1182 c9aba6cc Antony Chazapis
      # No local changes
1183 c9aba6cc Antony Chazapis
      if S == L:
1184 c9aba6cc Antony Chazapis
          # No remote changes, nothing to do
1185 c9aba6cc Antony Chazapis
      else:
1186 c9aba6cc Antony Chazapis
          # Update local state to match that of the server
1187 c9aba6cc Antony Chazapis
         L = S
1188 c9aba6cc Antony Chazapis
  else:
1189 c9aba6cc Antony Chazapis
      # We have local changes
1190 c9aba6cc Antony Chazapis
      if S == L:
1191 c9aba6cc Antony Chazapis
          # No remote changes, update the server
1192 c9aba6cc Antony Chazapis
          S = C
1193 c9aba6cc Antony Chazapis
          L = S
1194 c9aba6cc Antony Chazapis
      else:
1195 c9aba6cc Antony Chazapis
          # Both we and server have changes
1196 c9aba6cc Antony Chazapis
          if C == S:
1197 c9aba6cc Antony Chazapis
              # We were lucky, we did the same change
1198 c9aba6cc Antony Chazapis
              L = S
1199 c9aba6cc Antony Chazapis
          else:
1200 c9aba6cc Antony Chazapis
              # We have conflicting changes
1201 c9aba6cc Antony Chazapis
              resolve conflict
1202 c9aba6cc Antony Chazapis
1203 c9aba6cc Antony Chazapis
Notes:
1204 c9aba6cc Antony Chazapis
1205 dfb28993 chazapis
* States represent file hashes (it is suggested to use Merkle). Deleted or non-existing files are assumed to have a magic hash (e.g. empty string).
1206 c9aba6cc Antony Chazapis
* Updating a state (either local or remote) implies downloading, uploading or deleting the appropriate file.
1207 c9aba6cc Antony Chazapis
1208 288c1d55 Antony Chazapis
Recommended Practices and Examples
1209 288c1d55 Antony Chazapis
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1210 288c1d55 Antony Chazapis
1211 45c60f99 Antony Chazapis
Assuming an authentication token is obtained, the following high-level operations are available - shown with ``curl``:
1212 288c1d55 Antony Chazapis
1213 288c1d55 Antony Chazapis
* Get account information ::
1214 288c1d55 Antony Chazapis
1215 288c1d55 Antony Chazapis
    curl -X HEAD -D - \
1216 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1217 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user
1218 288c1d55 Antony Chazapis
1219 288c1d55 Antony Chazapis
* List available containers ::
1220 288c1d55 Antony Chazapis
1221 288c1d55 Antony Chazapis
    curl -X GET -D - \
1222 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1223 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user
1224 288c1d55 Antony Chazapis
1225 288c1d55 Antony Chazapis
* Get container information ::
1226 288c1d55 Antony Chazapis
1227 288c1d55 Antony Chazapis
    curl -X HEAD -D - \
1228 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1229 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos
1230 288c1d55 Antony Chazapis
1231 288c1d55 Antony Chazapis
* Add a new container ::
1232 288c1d55 Antony Chazapis
1233 288c1d55 Antony Chazapis
    curl -X PUT -D - \
1234 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1235 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/test
1236 288c1d55 Antony Chazapis
1237 288c1d55 Antony Chazapis
* Delete a container ::
1238 288c1d55 Antony Chazapis
1239 288c1d55 Antony Chazapis
    curl -X DELETE -D - \
1240 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1241 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/test
1242 288c1d55 Antony Chazapis
1243 288c1d55 Antony Chazapis
* List objects in a container ::
1244 288c1d55 Antony Chazapis
1245 288c1d55 Antony Chazapis
    curl -X GET -D - \
1246 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1247 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos
1248 288c1d55 Antony Chazapis
1249 288c1d55 Antony Chazapis
* List objects in a container (extended reply) ::
1250 288c1d55 Antony Chazapis
1251 288c1d55 Antony Chazapis
    curl -X GET -D - \
1252 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1253 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos?format=json
1254 288c1d55 Antony Chazapis
1255 a6eb13e9 Antony Chazapis
  It is recommended that extended replies are cached and subsequent requests utilize the ``If-Modified-Since`` header.
1256 a6eb13e9 Antony Chazapis
1257 288c1d55 Antony Chazapis
* List metadata keys used by objects in a container
1258 288c1d55 Antony Chazapis
1259 f5ed44df Antony Chazapis
  Will be in the ``X-Container-Object-Meta`` reply header, included in container information or object list (``HEAD`` or ``GET``). (**TBD**)
1260 288c1d55 Antony Chazapis
1261 288c1d55 Antony Chazapis
* List objects in a container having a specific meta defined ::
1262 288c1d55 Antony Chazapis
1263 288c1d55 Antony Chazapis
    curl -X GET -D - \
1264 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1265 ab2e317e Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos?meta=favorites
1266 288c1d55 Antony Chazapis
1267 288c1d55 Antony Chazapis
* Retrieve an object ::
1268 288c1d55 Antony Chazapis
1269 288c1d55 Antony Chazapis
    curl -X GET -D - \
1270 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1271 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos/README.txt
1272 288c1d55 Antony Chazapis
1273 288c1d55 Antony Chazapis
* Retrieve an object (specific ranges of data) ::
1274 288c1d55 Antony Chazapis
1275 288c1d55 Antony Chazapis
    curl -X GET -D - \
1276 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1277 288c1d55 Antony Chazapis
         -H "Range: bytes=0-9" \
1278 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos/README.txt
1279 288c1d55 Antony Chazapis
1280 288c1d55 Antony Chazapis
  This will return the first 10 bytes. To get the first 10, bytes 30-39 and the last 100 use ``Range: bytes=0-9,30-39,-100``.
1281 288c1d55 Antony Chazapis
1282 288c1d55 Antony Chazapis
* Add a new object (folder type) (**TBD**) ::
1283 288c1d55 Antony Chazapis
1284 288c1d55 Antony Chazapis
    curl -X PUT -D - \
1285 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1286 50f43df6 Antony Chazapis
         -H "Content-Type: application/directory" \
1287 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos/folder
1288 288c1d55 Antony Chazapis
1289 288c1d55 Antony Chazapis
* Add a new object ::
1290 288c1d55 Antony Chazapis
1291 288c1d55 Antony Chazapis
    curl -X PUT -D - \
1292 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1293 288c1d55 Antony Chazapis
         -H "Content-Type: text/plain" \
1294 288c1d55 Antony Chazapis
         -T EXAMPLE.txt
1295 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/pithos/folder/EXAMPLE.txt
1296 288c1d55 Antony Chazapis
1297 288c1d55 Antony Chazapis
* Update an object ::
1298 288c1d55 Antony Chazapis
1299 288c1d55 Antony Chazapis
    curl -X POST -D - \
1300 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1301 288c1d55 Antony Chazapis
         -H "Content-Length: 10" \
1302 288c1d55 Antony Chazapis
         -H "Content-Type: application/octet-stream" \
1303 288c1d55 Antony Chazapis
         -H "Content-Range: bytes 10-19/*" \
1304 288c1d55 Antony Chazapis
         -d "0123456789" \
1305 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt
1306 288c1d55 Antony Chazapis
1307 288c1d55 Antony Chazapis
  This will update bytes 10-19 with the data specified.
1308 288c1d55 Antony Chazapis
1309 288c1d55 Antony Chazapis
* Update an object (append) ::
1310 288c1d55 Antony Chazapis
1311 288c1d55 Antony Chazapis
    curl -X POST -D - \
1312 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1313 288c1d55 Antony Chazapis
         -H "Content-Length: 10" \
1314 288c1d55 Antony Chazapis
         -H "Content-Type: application/octet-stream" \
1315 288c1d55 Antony Chazapis
         -H "Content-Range: bytes */*" \
1316 288c1d55 Antony Chazapis
         -d "0123456789" \
1317 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt
1318 288c1d55 Antony Chazapis
1319 1495b972 Antony Chazapis
* Update an object (truncate) ::
1320 1495b972 Antony Chazapis
1321 1495b972 Antony Chazapis
    curl -X POST -D - \
1322 1495b972 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1323 1495b972 Antony Chazapis
         -H "X-Source-Object: /folder/EXAMPLE.txt" \
1324 1495b972 Antony Chazapis
         -H "Content-Range: bytes 0-0/*" \
1325 1495b972 Antony Chazapis
         -H "X-Object-Bytes: 0" \
1326 1495b972 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt
1327 1495b972 Antony Chazapis
1328 1495b972 Antony Chazapis
  This will truncate the object to 0 bytes.
1329 1495b972 Antony Chazapis
1330 288c1d55 Antony Chazapis
* Add object metadata ::
1331 288c1d55 Antony Chazapis
1332 288c1d55 Antony Chazapis
    curl -X POST -D - \
1333 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1334 288c1d55 Antony Chazapis
         -H "X-Object-Meta-First: first_meta_value" \
1335 288c1d55 Antony Chazapis
         -H "X-Object-Meta-Second: second_meta_value" \
1336 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt
1337 288c1d55 Antony Chazapis
1338 288c1d55 Antony Chazapis
* Delete object metadata ::
1339 288c1d55 Antony Chazapis
1340 288c1d55 Antony Chazapis
    curl -X POST -D - \
1341 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1342 288c1d55 Antony Chazapis
         -H "X-Object-Meta-First: first_meta_value" \
1343 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt
1344 288c1d55 Antony Chazapis
1345 288c1d55 Antony Chazapis
  Metadata can only be "set". To delete ``X-Object-Meta-Second``, reset all metadata.
1346 288c1d55 Antony Chazapis
1347 288c1d55 Antony Chazapis
* Delete an object ::
1348 288c1d55 Antony Chazapis
1349 288c1d55 Antony Chazapis
    curl -X DELETE -D - \
1350 288c1d55 Antony Chazapis
         -H "X-Auth-Token: 0000" \
1351 288c1d55 Antony Chazapis
         https://pithos.dev.grnet.gr/v1/user/folder/EXAMPLE.txt