Revision 74653682

/dev/null
1
This is where the docs will be built.
/dev/null
1
Administrator Guide
2
===================
3

  
4
Simple Setup
5
------------
6

  
7
Assuming a clean debian squeeze (stable) installation, use the following steps to run the software.
8

  
9
Install packages::
10

  
11
  apt-get install git python-django python-setuptools python-sphinx
12
  apt-get install python-sqlalchemy python-mysqldb python-psycopg2
13
  apt-get install apache2 libapache2-mod-wsgi
14

  
15
Get the source::
16

  
17
  cd /
18
  git clone https://code.grnet.gr/git/pithos
19

  
20
Setup the files::
21

  
22
  cd /pithos/pithos
23
  python manage.py syncdb
24
  cd /pithos
25
  python setup.py build_sphinx
26

  
27
It is advised that you create a ``settings.local`` file to place any configuration overrides (at least change ``SECRET_KEY``).
28

  
29
Edit ``/etc/apache2/sites-available/pithos`` (change the ``ServerName`` directive)::
30

  
31
  <VirtualHost *:80>
32
    ServerAdmin webmaster@pithos.dev.grnet.gr
33
    ServerName pithos.dev.grnet.gr
34

  
35
    DocumentRoot /pithos/htdocs
36
    Alias /ui "/var/www/pithos_web_client"
37
    Alias /docs "/pithos/docs/build/html"
38

  
39
    <Directory />
40
        Options Indexes FollowSymLinks
41
        AllowOverride None
42
        Order allow,deny
43
        Allow from all
44
    </Directory>
45

  
46
    SetEnv no-gzip
47
    SetEnv dont-vary
48

  
49
    RewriteEngine On
50
    RewriteRule ^/v(.*) /api/v$1 [PT,NE]
51
    RewriteRule ^/public(.*) /api/public$1 [PT,NE]
52
    RewriteRule ^/tools(.*) /api/ui$1 [PT,NE]
53
    RewriteRule ^/im(.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE]
54
    RewriteRule ^/login(.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE]
55

  
56
    RequestHeader set X-Forwarded-Protocol "http"
57

  
58
    WSGIScriptAlias /api /pithos/pithos/wsgi/pithos.wsgi
59
    # WSGIDaemonProcess pithos
60
    # WSGIProcessGroup pithos
61

  
62
    LogLevel warn
63
    ErrorLog ${APACHE_LOG_DIR}/pithos.error.log
64
    CustomLog ${APACHE_LOG_DIR}/pithos.access.log combined
65
  </VirtualHost>
66

  
67
To disable non-SSL connections, ``/etc/apache2/sites-available/pithos`` should be::
68

  
69
  <VirtualHost *:80>
70
    ServerAdmin webmaster@pithos.dev.grnet.gr
71
    ServerName pithos.dev.grnet.gr
72

  
73
    RewriteEngine On
74
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
75
  </VirtualHost>
76

  
77
Edit ``/etc/apache2/sites-available/pithos-ssl`` (assuming files in ``/etc/ssl/private/pithos.dev.grnet.gr.key`` and ``/etc/ssl/certs/pithos.dev.grnet.gr.crt`` - change the ``ServerName`` directive)::
78

  
79
  <IfModule mod_ssl.c>
80
  <VirtualHost _default_:443>
81
    ServerAdmin webmaster@pithos.dev.grnet.gr
82
    ServerName pithos.dev.grnet.gr
83

  
84
    DocumentRoot /pithos/htdocs
85
    Alias /ui "/var/www/pithos_web_client"
86
    Alias /docs "/pithos/docs/build/html"
87

  
88
    <Directory />
89
        Options Indexes FollowSymLinks
90
        AllowOverride None
91
        Order allow,deny
92
        Allow from all
93
    </Directory>
94

  
95
    SetEnv no-gzip
96
    SetEnv dont-vary
97

  
98
    RewriteEngine On
99
    RewriteRule ^/v(.*) /api/v$1 [PT,NE]
100
    RewriteRule ^/public(.*) /api/public$1 [PT,NE]
101
    RewriteRule ^/tools(.*) /api/ui$1 [PT,NE]
102
    RewriteRule ^/im(.*) /api/im$1 [PT,NE]
103
    RewriteRule ^/login(.*) /api/im/login/dummy$1 [PT,NE]
104

  
105
    RequestHeader set X-Forwarded-Protocol "https"
106

  
107
    WSGIScriptAlias /api /pithos/pithos/wsgi/pithos.wsgi
108
    # WSGIDaemonProcess pithos
109
    # WSGIProcessGroup pithos
110

  
111
    LogLevel warn
112
    ErrorLog ${APACHE_LOG_DIR}/pithos.error.log
113
    CustomLog ${APACHE_LOG_DIR}/pithos.access.log combined
114

  
115
    SSLEngine on
116
    SSLCertificateFile    /etc/ssl/certs/pithos.dev.grnet.gr.crt
117
    SSLCertificateKeyFile /etc/ssl/private/pithos.dev.grnet.gr.key
118
  </VirtualHost>
119
  </IfModule>
120

  
121
Add in ``/etc/apache2/mods-available/wsgi.conf``::
122

  
123
  WSGIChunkedRequest On
124

  
125
Make sure the data folder is writable by the web server user::
126

  
127
  chown -R www-data:www-data /pithos/pithos/data
128

  
129
If using an SQLite database, the same goes for the database file and the containing folder::
130

  
131
  chown www-data:www-data /pithos/pithos/
132
  chown www-data:www-data /pithos/pithos/backend.db
133

  
134
Configure and run apache::
135

  
136
  a2enmod ssl
137
  a2enmod rewrite
138
  a2dissite default
139
  a2ensite pithos
140
  a2ensite pithos-ssl
141
  mkdir /var/www/pithos
142
  mkdir /var/www/pithos_web_client
143
  /etc/init.d/apache2 restart
144

  
145
Useful alias to add in ``~/.bashrc``::
146

  
147
  alias sync-pithos='cd /pithos && git pull && python setup.py build_sphinx && /etc/init.d/apache2 restart'
148

  
149
Gunicorn Setup
150
--------------
151

  
152
Add in ``/etc/apt/sources.list``::
153

  
154
  deb http://backports.debian.org/debian-backports squeeze-backports main
155

  
156
Then::
157

  
158
  apt-get update
159
  apt-get -t squeeze-backports install gunicorn
160
  apt-get -t squeeze-backports install python-gevent
161

  
162
Create ``/etc/gunicorn.d/pithos``::
163

  
164
  CONFIG = {
165
   'mode': 'django',
166
   'working_dir': '/pithos/pithos',
167
   'user': 'www-data',
168
   'group': 'www-data',
169
   'args': (
170
        '--bind=[::]:8080',
171
        '--worker-class=egg:gunicorn#gevent',
172
        '--workers=4',
173
        '--log-level=debug',
174
        '/pithos/pithos/settings.py',
175
   ),
176
  }
177

  
178
Replace the ``WSGI*`` directives in ``/etc/apache2/sites-available/pithos`` and ``/etc/apache2/sites-available/pithos-ssl`` with::
179

  
180
  <Proxy *>
181
    Order allow,deny
182
    Allow from all
183
  </Proxy>
184

  
185
  SetEnv                proxy-sendchunked
186
  SSLProxyEngine        off
187
  ProxyErrorOverride    off
188

  
189
  ProxyPass        /api http://localhost:8080 retry=0
190
  ProxyPassReverse /api http://localhost:8080
191

  
192
Make sure that in ``settings.local``::
193

  
194
  USE_X_FORWARDED_HOST = True
195

  
196
Configure and run::
197

  
198
  /etc/init.d/gunicorn restart
199
  a2enmod proxy
200
  a2enmod proxy_http
201
  /etc/init.d/apache2 restart
202

  
203
If experiencing timeout problems, try adding to ``/etc/gunicorn.d/pithos``::
204

  
205
        ...
206
        '--timeout=43200',
207
        ...
208

  
209
Shibboleth Setup
210
----------------
211

  
212
Install package::
213

  
214
  apt-get install libapache2-mod-shib2
215

  
216
Setup the files in ``/etc/shibboleth``.
217

  
218
Add in ``/etc/apache2/sites-available/pithos-ssl``::
219

  
220
  ShibConfig /etc/shibboleth/shibboleth2.xml
221
  Alias      /shibboleth-sp /usr/share/shibboleth 
222

  
223
  <Location /api/im/login/shibboleth>
224
    AuthType shibboleth
225
    ShibRequireSession On
226
    ShibUseHeaders On
227
    require valid-user
228
  </Location>
229

  
230
Configure and run apache::
231

  
232
  a2enmod shib2
233
  /etc/init.d/apache2 restart
234
  /etc/init.d/shibd restart
235

  
236
The following tokens should be available at the destination, after passing through the apache module::
237

  
238
  eppn # eduPersonPrincipalName
239
  Shib-InetOrgPerson-givenName
240
  Shib-Person-surname
241
  Shib-Person-commonName
242
  Shib-InetOrgPerson-displayName
243
  Shib-EP-Affiliation
244
  Shib-Session-ID
245

  
246
MySQL Setup
247
-----------
248

  
249
If using MySQL instead of SQLite for the database engine, consider the following.
250

  
251
Server side::
252

  
253
  apt-get install mysql-server
254

  
255
Add in ``/etc/mysql/conf.d/pithos.cnf``::
256

  
257
  [mysqld]
258
  sql-mode="NO_AUTO_VALUE_ON_ZERO"
259

  
260
Edit ``/etc/mysql/my.cnf`` to allow network connections and restart the server.
261

  
262
Create database and user::
263

  
264
  CREATE DATABASE pithos CHARACTER SET utf8 COLLATE utf8_bin;
265
  GRANT ALL ON pithos.* TO pithos@localhost IDENTIFIED BY 'password';
266
  GRANT ALL ON pithos.* TO pithos@'%' IDENTIFIED BY 'password';
267

  
268
Client side::
269

  
270
  apt-get install mysql-client
271

  
272
It helps to create a ``~/.my.cnf`` file, for automatically connecting to the server::
273

  
274
  [client]
275
  user = pithos
276
  password = 'password'
277
  host = pithos-storage.dev.grnet.gr
278

  
279
  [mysql]
280
  database = pithos
281

  
282
PostgreSQL Setup
283
----------------
284

  
285
If using PostgreSQL instead of SQLite for the database engine, consider the following.
286

  
287
Server side::
288

  
289
  apt-get install postgresql
290

  
291
Edit ``/etc/postgresql/8.4/main/postgresql.conf`` and ``/etc/postgresql/8.4/main/pg_hba.conf`` to allow network connections and restart the server.
292

  
293
Create database and user::
294

  
295
  CREATE DATABASE pithos WITH ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0;
296
  CREATE USER pithos WITH PASSWORD 'password';
297
  GRANT ALL PRIVILEGES ON DATABASE pithos TO pithos;
298

  
299
Client side::
300

  
301
  apt-get install postgresql-client
302

  
303
It helps to create a ``~/.pgpass`` file, for automatically passing the password to the server::
304

  
305
  pithos-storage.dev.grnet.gr:5432:pithos:pithos:password
306

  
307
Connect with::
308

  
309
  psql -h pithos-storage.dev.grnet.gr -U pithos
310

  
/dev/null
1
Backends
2
========
3

  
4
.. toctree::
5
   :maxdepth: 3
6
   
7
BaseBackend
8
-----------
9

  
10
.. autoclass:: pithos.backends.base.BaseBackend
11

  
12
ModularBackend
13
--------------
14

  
15
.. autoclass:: pithos.backends.modular.ModularBackend
16
   :show-inheritance:
17
   :members:
18
   :inherited-members:
19

  
20
Node
21
~~~~
22

  
23
.. automodule:: pithos.backends.lib.sqlalchemy.node
24
   :show-inheritance:
25
   :members:
26
   :undoc-members:
27

  
28
Permissions
29
~~~~~~~~~~~
30

  
31
.. automodule:: pithos.backends.lib.sqlalchemy.permissions
32
   :show-inheritance:
33
   :members:
34
   :undoc-members:
35

  
36
Store
37
~~~~~
38

  
39
.. automodule:: pithos.backends.lib.hashfiler.store
40
   :show-inheritance:
41
   :members:
42
   :undoc-members:
/dev/null
1
Client Library
2
==============
3

  
4
.. automodule:: pithos.tools.lib.client
5
   :show-inheritance:
6
   :members:
7
   :undoc-members:
/dev/null
1
# -*- coding: utf-8 -*-
2
#
3
# Pithos documentation build configuration file, created by
4
# sphinx-quickstart on Wed May 18 12:42:48 2011.
5
#
6
# This file is execfile()d with the current directory set to its containing dir.
7
#
8
# Note that not all possible configuration values are present in this
9
# autogenerated file.
10
#
11
# All configuration values have a default; values that are commented out
12
# serve to show the default.
13

  
14
import sys, os
15

  
16
# If extensions (or modules to document with autodoc) are in another directory,
17
# add these directories to sys.path here. If the directory is relative to the
18
# documentation root, use os.path.abspath to make it absolute, like shown here.
19
sys.path.insert(0, os.path.abspath('../..'))
20

  
21
from synnefo import settings
22
from django.core.management import setup_environ
23
setup_environ(settings)
24

  
25
# -- General configuration -----------------------------------------------------
26

  
27
# If your documentation needs a minimal Sphinx version, state it here.
28
#needs_sphinx = '1.0'
29

  
30
# Add any Sphinx extension module names here, as strings. They can be extensions
31
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
32
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo']
33

  
34
# Add any paths that contain templates here, relative to this directory.
35
templates_path = ['_templates']
36

  
37
# The suffix of source filenames.
38
source_suffix = '.rst'
39

  
40
# The encoding of source files.
41
#source_encoding = 'utf-8-sig'
42

  
43
# The master toctree document.
44
master_doc = 'index'
45

  
46
# General information about the project.
47
project = u'Pithos'
48
copyright = u'2011, Pithos Storage Team'
49

  
50
# The version info for the project you're documenting, acts as replacement for
51
# |version| and |release|, also used in various other places throughout the
52
# built documents.
53
#
54
# The short X.Y version.
55
version = '2'
56
# The full version, including alpha/beta/rc tags.
57
release = '2'
58

  
59
# The language for content autogenerated by Sphinx. Refer to documentation
60
# for a list of supported languages.
61
#language = None
62

  
63
# There are two options for replacing |today|: either, you set today to some
64
# non-false value, then it is used:
65
#today = ''
66
# Else, today_fmt is used as the format for a strftime call.
67
#today_fmt = '%B %d, %Y'
68

  
69
# List of patterns, relative to source directory, that match files and
70
# directories to ignore when looking for source files.
71
exclude_patterns = ['_build']
72

  
73
# The reST default role (used for this markup: `text`) to use for all documents.
74
#default_role = None
75

  
76
# If true, '()' will be appended to :func: etc. cross-reference text.
77
#add_function_parentheses = True
78

  
79
# If true, the current module name will be prepended to all description
80
# unit titles (such as .. function::).
81
#add_module_names = True
82

  
83
# If true, sectionauthor and moduleauthor directives will be shown in the
84
# output. They are ignored by default.
85
#show_authors = False
86

  
87
# The name of the Pygments (syntax highlighting) style to use.
88
pygments_style = 'sphinx'
89

  
90
# A list of ignored prefixes for module index sorting.
91
#modindex_common_prefix = []
92

  
93

  
94
# -- Options for HTML output ---------------------------------------------------
95

  
96
# The theme to use for HTML and HTML Help pages.  See the documentation for
97
# a list of builtin themes.
98
html_theme = 'default'
99

  
100
# Theme options are theme-specific and customize the look and feel of a theme
101
# further.  For a list of options available for each theme, see the
102
# documentation.
103
#html_theme_options = {}
104

  
105
# Add any paths that contain custom themes here, relative to this directory.
106
#html_theme_path = []
107

  
108
# The name for this set of Sphinx documents.  If None, it defaults to
109
# "<project> v<release> documentation".
110
#html_title = None
111

  
112
# A shorter title for the navigation bar.  Default is the same as html_title.
113
#html_short_title = None
114

  
115
# The name of an image file (relative to this directory) to place at the top
116
# of the sidebar.
117
#html_logo = None
118

  
119
# The name of an image file (within the static path) to use as favicon of the
120
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
121
# pixels large.
122
#html_favicon = None
123

  
124
# Add any paths that contain custom static files (such as style sheets) here,
125
# relative to this directory. They are copied after the builtin static files,
126
# so a file named "default.css" will overwrite the builtin "default.css".
127
#html_static_path = ['_static']
128

  
129
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
130
# using the given strftime format.
131
#html_last_updated_fmt = '%b %d, %Y'
132

  
133
# If true, SmartyPants will be used to convert quotes and dashes to
134
# typographically correct entities.
135
#html_use_smartypants = True
136

  
137
# Custom sidebar templates, maps document names to template names.
138
#html_sidebars = {}
139

  
140
# Additional templates that should be rendered to pages, maps page names to
141
# template names.
142
#html_additional_pages = {}
143

  
144
# If false, no module index is generated.
145
#html_domain_indices = True
146

  
147
# If false, no index is generated.
148
#html_use_index = True
149

  
150
# If true, the index is split into individual pages for each letter.
151
#html_split_index = False
152

  
153
# If true, links to the reST sources are added to the pages.
154
#html_show_sourcelink = True
155

  
156
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
157
#html_show_sphinx = True
158

  
159
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
160
#html_show_copyright = True
161

  
162
# If true, an OpenSearch description file will be output, and all pages will
163
# contain a <link> tag referring to it.  The value of this option must be the
164
# base URL from which the finished HTML is served.
165
#html_use_opensearch = ''
166

  
167
# This is the file name suffix for HTML files (e.g. ".xhtml").
168
#html_file_suffix = None
169

  
170
# Output file base name for HTML help builder.
171
htmlhelp_basename = 'Pithosdoc'
172

  
173

  
174
# -- Options for LaTeX output --------------------------------------------------
175

  
176
# The paper size ('letter' or 'a4').
177
#latex_paper_size = 'letter'
178

  
179
# The font size ('10pt', '11pt' or '12pt').
180
#latex_font_size = '10pt'
181

  
182
# Grouping the document tree into LaTeX files. List of tuples
183
# (source start file, target name, title, author, documentclass [howto/manual]).
184
latex_documents = [
185
  ('index', 'Pithos.tex', u'Pithos Documentation',
186
   u'Pithos Storage Team', 'manual'),
187
]
188

  
189
# The name of an image file (relative to this directory) to place at the top of
190
# the title page.
191
#latex_logo = None
192

  
193
# For "manual" documents, if this is true, then toplevel headings are parts,
194
# not chapters.
195
#latex_use_parts = False
196

  
197
# If true, show page references after internal links.
198
#latex_show_pagerefs = False
199

  
200
# If true, show URL addresses after external links.
201
#latex_show_urls = False
202

  
203
# Additional stuff for the LaTeX preamble.
204
#latex_preamble = ''
205

  
206
# Documents to append as an appendix to all manuals.
207
#latex_appendices = []
208

  
209
# If false, no module index is generated.
210
#latex_domain_indices = True
211

  
212

  
213
# -- Options for manual page output --------------------------------------------
214

  
215
# One entry per manual page. List of tuples
216
# (source start file, name, description, authors, manual section).
217
man_pages = [
218
    ('index', 'pithos', u'Pithos Documentation',
219
     [u'Pithos Storage Team'], 1)
220
]
221

  
222

  
223
autodoc_default_flags = ['members']
/dev/null
1
Pithos v2 Developer Guide
2
=========================
3

  
4
Introduction
5
------------
6

  
7
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

  
9
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

  
11
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

  
13
This document's goals are:
14

  
15
* Define the Pithos ReST API that allows the storage and retrieval of data and metadata via HTTP calls
16
* Specify metadata semantics and user interface guidelines for a common experience across client software implementations
17

  
18
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

  
20
Whatever marked as to be determined (**TBD**), should not be considered by implementors.
21

  
22
More info about Pithos can be found here: https://code.grnet.gr/projects/pithos
23

  
24
Document Revisions
25
^^^^^^^^^^^^^^^^^^
26

  
27
=========================  ================================
28
Revision                   Description
29
=========================  ================================
30
0.9 (Feb 17, 2012)         Change permissions model.
31
\                          Do not include user-defined metadata in account/container/object listings.
32
0.8 (Jan 24, 2012)         Update allowed versioning values.
33
\                          Change policy/meta formatting in JSON/XML replies.
34
\                          Document that all non-ASCII characters in headers should be URL-encoded.
35
\                          Support metadata-based queries when listing objects at the container level.
36
\                          Note Content-Type issue when using the internal django web server.
37
\                          Add object UUID field.
38
\                          Always reply with the MD5 in the ETag.
39
\                          Note that ``/login`` will only work if an external authentication system is defined.
40
\                          Include option to ignore Content-Type on ``COPY``/``MOVE``.
41
\                          Use format parameter for conflict (409) and uploaded hash list (container level) replies.
42
0.7 (Nov 21, 2011)         Suggest upload/download methods using hashmaps.
43
\                          Propose syncing algorithm.
44
\                          Support cross-account object copy and move.
45
\                          Pass token as a request parameter when using ``POST`` via an HTML form.
46
\                          Optionally use source account to update object from another object.
47
\                          Use container ``POST`` to upload missing blocks of data.
48
\                          Report policy in account headers.
49
\                          Add insufficient quota reply.
50
\                          Use special meta to always report Merkle hash.
51
0.6 (Sept 13, 2011)        Reply with Merkle hash as the ETag when updating objects.
52
\                          Include version id in object replace/change replies.
53
\                          Change conflict (409) replies format to text.
54
\                          Tags should be migrated to a meta value.
55
\                          Container ``PUT`` updates metadata/policy.
56
\                          Report allowed actions in shared object replies.
57
\                          Provide ``https://hostname/login`` for Shibboleth authentication.
58
\                          Use ``hashmap`` parameter in object ``GET``/``PUT`` to use hashmaps.
59
0.5 (July 22, 2011)        Object update from another object's data.
60
\                          Support object truncate.
61
\                          Create object using a standard HTML form.
62
\                          Purge container/object history.
63
\                          List other accounts that share objects with a user.
64
\                          List shared containers/objects.
65
\                          Update implementation guidelines.
66
\                          Check preconditions when creating/updating objects.
67
0.4 (July 01, 2011)        Object permissions and account groups.
68
\                          Control versioning behavior and container quotas with container policy directives.
69
\                          Support updating/deleting individual metadata with ``POST``.
70
\                          Create object using hashmap.
71
0.3 (June 14, 2011)        Large object support with ``X-Object-Manifest``.
72
\                          Allow for publicly available objects via ``https://hostname/public``.
73
\                          Support time-variant account/container listings. 
74
\                          Add source version when duplicating with ``PUT``/``COPY``.
75
\                          Request version in object ``HEAD``/``GET`` requests (list versions with ``GET``).
76
0.2 (May 31, 2011)         Add object meta listing and filtering in containers.
77
\                          Include underlying storage characteristics in container meta.
78
\                          Support for partial object updates through ``POST``.
79
\                          Expose object hashmaps through ``GET``.
80
\                          Support for multi-range object ``GET`` requests.
81
0.1 (May 17, 2011)         Initial release. Based on OpenStack Object Storage Developer Guide API v1 (Apr. 15, 2011).
82
=========================  ================================
83

  
84
Pithos Users and Authentication
85
-------------------------------
86

  
87
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

  
89
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

  
91
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

  
93
The login URI accepts the following parameters:
94

  
95
======================  =========================
96
Request Parameter Name  Value
97
======================  =========================
98
next                    The URI to redirect to when the process is finished
99
renew                   Force token renewal (no value parameter)
100
force                   Force logout current user (no value parameter)
101
======================  =========================
102

  
103
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

  
105
A user management service that implements a login URI according to these conventions is Astakos (https://code.grnet.gr/projects/astakos), by GRNET.
106

  
107
The Pithos API
108
--------------
109

  
110
The URI requests supported by the Pithos API follow one of the following forms:
111

  
112
* Top level: ``https://hostname/v1/``
113
* Account level: ``https://hostname/v1/<account>``
114
* Container level: ``https://hostname/v1/<account>/<container>``
115
* Object level: ``https://hostname/v1/<account>/<container>/<object>``
116

  
117
All requests must include an ``X-Auth-Token`` - as a header, or a parameter.
118

  
119
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

  
121
=========================  ================================
122
Return Code                Description
123
=========================  ================================
124
400 (Bad Request)          The request is invalid
125
401 (Unauthorized)         Missing or invalid token
126
403 (Forbidden)            Request not allowed
127
404 (Not Found)            The requested resource was not found
128
503 (Service Unavailable)  The request cannot be completed because of an internal error
129
=========================  ================================
130

  
131
Top Level
132
^^^^^^^^^
133

  
134
List of operations:
135

  
136
=========  ==================
137
Operation  Description
138
=========  ==================
139
GET        Authentication (for compatibility with the OOS API) or list allowed accounts
140
=========  ==================
141

  
142
GET
143
"""
144

  
145
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

  
147
================  =====================
148
Return Code       Description
149
================  =====================
150
204 (No Content)  The request succeeded
151
================  =====================
152

  
153
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

  
155
======================  =========================
156
Request Parameter Name  Value
157
======================  =========================
158
limit                   The amount of results requested (default is 10000)
159
marker                  Return containers with name lexicographically after marker
160
format                  Optional extended reply type (can be ``json`` or ``xml``)
161
======================  =========================
162

  
163
The reply is a list of account names.
164
If a ``format=xml`` or ``format=json`` argument is given, extended information on the accounts will be returned, serialized in the chosen format.
165
For each account, the information will include the following (names will be in lower case and with hyphens replaced with underscores):
166

  
167
===========================  ============================
168
Name                         Description
169
===========================  ============================
170
name                         The name of the account
171
last_modified                The last account modification date (regardless of ``until``)
172
===========================  ============================
173

  
174
Example ``format=json`` reply:
175

  
176
::
177

  
178
  [{"name": "user", "last_modified": "2011-12-02T08:10:41.565891+00:00"}, ...]
179

  
180
Example ``format=xml`` reply:
181

  
182
::
183

  
184
  <?xml version="1.0" encoding="UTF-8"?>
185
  <accounts>
186
    <account>
187
      <name>user</name>
188
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
189
    </account>
190
    <account>...</account>
191
  </accounts>
192

  
193
===========================  =====================
194
Return Code                  Description
195
===========================  =====================
196
200 (OK)                     The request succeeded
197
204 (No Content)             The user has no access to other accounts (only for non-extended replies)
198
===========================  =====================
199

  
200
Will use a ``200`` return code if the reply is of type JSON/XML.
201

  
202
Account Level
203
^^^^^^^^^^^^^
204

  
205
List of operations:
206

  
207
=========  ==================
208
Operation  Description
209
=========  ==================
210
HEAD       Retrieve account metadata
211
GET        List containers
212
POST       Update account metadata
213
=========  ==================
214

  
215
HEAD
216
""""
217

  
218
====================  ===========================
219
Request Header Name   Value
220
====================  ===========================
221
If-Modified-Since     Retrieve if account has changed since provided timestamp
222
If-Unmodified-Since   Retrieve if account has not changed since provided timestamp
223
====================  ===========================
224

  
225
|
226

  
227
======================  ===================================
228
Request Parameter Name  Value
229
======================  ===================================
230
until                   Optional timestamp
231
======================  ===================================
232

  
233
Cross-user requests are not allowed to use ``until`` and only include the account modification date in the reply.
234

  
235
==========================  =====================
236
Reply Header Name           Value
237
==========================  =====================
238
X-Account-Container-Count   The total number of containers
239
X-Account-Bytes-Used        The total number of bytes stored
240
X-Account-Until-Timestamp   The last account modification date until the timestamp provided
241
X-Account-Group-*           Optional user defined groups
242
X-Account-Policy-*          Account behavior and limits
243
X-Account-Meta-*            Optional user defined metadata
244
Last-Modified               The last account modification date (regardless of ``until``)
245
==========================  =====================
246

  
247
|
248

  
249
================  =====================
250
Return Code       Description
251
================  =====================
252
204 (No Content)  The request succeeded
253
================  =====================
254

  
255

  
256
GET
257
"""
258

  
259
====================  ===========================
260
Request Header Name   Value
261
====================  ===========================
262
If-Modified-Since     Retrieve if account has changed since provided timestamp
263
If-Unmodified-Since   Retrieve if account has not changed since provided timestamp
264
====================  ===========================
265

  
266
|
267

  
268
======================  =========================
269
Request Parameter Name  Value
270
======================  =========================
271
limit                   The amount of results requested (default is 10000)
272
marker                  Return containers with name lexicographically after marker
273
format                  Optional extended reply type (can be ``json`` or ``xml``)
274
shared                  Show only shared containers (no value parameter)
275
until                   Optional timestamp
276
======================  =========================
277

  
278
The reply is a list of container names. Account headers (as in a ``HEAD`` request) will also be included.
279
Cross-user requests are not allowed to use ``until`` and only include the account/container modification dates in the reply.
280

  
281
If a ``format=xml`` or ``format=json`` argument is given, extended information on the containers will be returned, serialized in the chosen format.
282
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

  
284
===========================  ============================
285
Name                         Description
286
===========================  ============================
287
name                         The name of the container
288
count                        The number of objects inside the container
289
bytes                        The total size of the objects inside the container
290
last_modified                The last container modification date (regardless of ``until``)
291
x_container_until_timestamp  The last container modification date until the timestamp provided
292
x_container_policy           Container behavior and limits
293
===========================  ============================
294

  
295
Example ``format=json`` reply:
296

  
297
::
298

  
299
  [{"name": "pithos",
300
    "bytes": 62452,
301
    "count": 8374,
302
    "last_modified": "2011-12-02T08:10:41.565891+00:00",
303
    "x_container_policy": {"quota": "53687091200", "versioning": "auto"}}, ...]
304

  
305
Example ``format=xml`` reply:
306

  
307
::
308

  
309
  <?xml version="1.0" encoding="UTF-8"?>
310
  <account name="user">
311
    <container>
312
      <name>pithos</name>
313
      <bytes>62452</bytes>
314
      <count>8374</count>
315
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
316
      <x_container_policy>
317
        <key>quota</key><value>53687091200</value>
318
        <key>versioning</key><value>auto</value>
319
      </x_container_policy>
320
    </container>
321
    <container>...</container>
322
  </account>
323

  
324
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

  
326
===========================  =====================
327
Return Code                  Description
328
===========================  =====================
329
200 (OK)                     The request succeeded
330
204 (No Content)             The account has no containers (only for non-extended replies)
331
304 (Not Modified)           The account has not been modified
332
412 (Precondition Failed)    The condition set can not be satisfied
333
===========================  =====================
334

  
335
Will use a ``200`` return code if the reply is of type JSON/XML.
336

  
337

  
338
POST
339
""""
340

  
341
====================  ===========================
342
Request Header Name   Value
343
====================  ===========================
344
X-Account-Group-*     Optional user defined groups
345
X-Account-Meta-*      Optional user defined metadata
346
====================  ===========================
347

  
348
|
349

  
350
======================  ============================================
351
Request Parameter Name  Value
352
======================  ============================================
353
update                  Do not replace metadata/groups (no value parameter)
354
======================  ============================================
355

  
356
No reply content/headers.
357

  
358
The operation will overwrite all user defined metadata, except if ``update`` is defined.
359
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

  
361
================  ===============================
362
Return Code       Description
363
================  ===============================
364
202 (Accepted)    The request has been accepted
365
================  ===============================
366

  
367

  
368
Container Level
369
^^^^^^^^^^^^^^^
370

  
371
List of operations:
372

  
373
=========  ============================
374
Operation  Description
375
=========  ============================
376
HEAD       Retrieve container metadata
377
GET        List objects
378
PUT        Create/update container
379
POST       Update container metadata
380
DELETE     Delete container
381
=========  ============================
382

  
383

  
384
HEAD
385
""""
386

  
387
====================  ===========================
388
Request Header Name   Value
389
====================  ===========================
390
If-Modified-Since     Retrieve if container has changed since provided timestamp
391
If-Unmodified-Since   Retrieve if container has not changed since provided timestamp
392
====================  ===========================
393

  
394
|
395

  
396
======================  ===================================
397
Request Parameter Name  Value
398
======================  ===================================
399
until                   Optional timestamp
400
======================  ===================================
401

  
402
Cross-user requests are not allowed to use ``until`` and only include the container modification date in the reply.
403

  
404
===========================  ===============================
405
Reply Header Name            Value
406
===========================  ===============================
407
X-Container-Object-Count     The total number of objects in the container
408
X-Container-Bytes-Used       The total number of bytes of all objects stored
409
X-Container-Block-Size       The block size used by the storage backend
410
X-Container-Block-Hash       The hash algorithm used for block identifiers in object hashmaps
411
X-Container-Until-Timestamp  The last container modification date until the timestamp provided
412
X-Container-Object-Meta      A list with all meta keys used by objects (**TBD**)
413
X-Container-Policy-*         Container behavior and limits
414
X-Container-Meta-*           Optional user defined metadata
415
Last-Modified                The last container modification date (regardless of ``until``)
416
===========================  ===============================
417

  
418
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

  
420
================  ===============================
421
Return Code       Description
422
================  ===============================
423
204 (No Content)  The request succeeded
424
================  ===============================
425

  
426

  
427
GET
428
"""
429

  
430
====================  ===========================
431
Request Header Name   Value
432
====================  ===========================
433
If-Modified-Since     Retrieve if container has changed since provided timestamp
434
If-Unmodified-Since   Retrieve if container has not changed since provided timestamp
435
====================  ===========================
436

  
437
|
438

  
439
======================  ===================================
440
Request Parameter Name  Value
441
======================  ===================================
442
limit                   The amount of results requested (default is 10000)
443
marker                  Return containers with name lexicographically after marker
444
prefix                  Return objects starting with prefix
445
delimiter               Return objects up to the delimiter (discussion follows)
446
path                    Assume ``prefix=path`` and ``delimiter=/``
447
format                  Optional extended reply type (can be ``json`` or ``xml``)
448
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
shared                  Show only shared objects (no value parameter)
450
until                   Optional timestamp
451
======================  ===================================
452

  
453
The ``path`` parameter overrides ``prefix`` and ``delimiter``. When using ``path``, results will include objects ending in ``delimiter``.
454

  
455
The keys given with ``meta`` will be matched with the strings after the ``X-Object-Meta-`` prefix.
456

  
457
The reply is a list of object names. Container headers (as in a ``HEAD`` request) will also be included.
458
Cross-user requests are not allowed to use ``until`` and include the following limited set of headers in the reply:
459

  
460
===========================  ===============================
461
Reply Header Name            Value
462
===========================  ===============================
463
X-Container-Block-Size       The block size used by the storage backend
464
X-Container-Block-Hash       The hash algorithm used for block identifiers in object hashmaps
465
X-Container-Object-Meta      A list with all meta keys used by allowed objects (**TBD**)
466
Last-Modified                The last container modification date
467
===========================  ===============================
468

  
469
If a ``format=xml`` or ``format=json`` argument is given, extended information on the objects will be returned, serialized in the chosen format.
470
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

  
472
==========================  ======================================
473
Name                        Description
474
==========================  ======================================
475
name                        The name of the object
476
hash                        The ETag of the object
477
bytes                       The size of the object
478
content_type                The MIME content type of the object
479
last_modified               The last object modification date (regardless of version)
480
x_object_hash               The Merkle hash
481
x_object_uuid               The object's UUID
482
x_object_version            The object's version identifier
483
x_object_version_timestamp  The object's version timestamp
484
x_object_modified_by        The user that committed the object's version
485
x_object_sharing            Object permissions (optional)
486
x_object_allowed_to         Allowed actions on object (optional)
487
x_object_public             Object's publicly accessible URI (optional)
488
==========================  ======================================
489

  
490
Sharing metadata and last modification timestamp will only be returned if there is no ``until`` parameter defined.
491

  
492
Extended replies may also include virtual directory markers in separate sections of the ``json`` or ``xml`` results.
493
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
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
In case there is an object with the same name as a virtual directory marker, the object will be returned.
496

  
497
Example ``format=json`` reply:
498

  
499
::
500

  
501
  [{"name": "object",
502
    "bytes": 0,
503
    "hash": "d41d8cd98f00b204e9800998ecf8427e",
504
    "content_type": "application/octet-stream",
505
    "last_modified": "2011-12-02T08:10:41.565891+00:00",
506
    "x_object_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
507
    "x_object_uuid": "8ed9af1b-c948-4bb6-82b0-48344f5c822c",
508
    "x_object_version": 98,
509
    "x_object_version_timestamp": "1322813441.565891",
510
    "x_object_modified_by": "user"}, ...]
511

  
512
Example ``format=xml`` reply:
513

  
514
::
515

  
516
  <?xml version="1.0" encoding="UTF-8"?>
517
  <container name="pithos">
518
    <object>
519
      <name>object</name>
520
      <bytes>0</bytes>
521
      <hash>d41d8cd98f00b204e9800998ecf8427e</hash>
522
      <content_type>application/octet-stream</content_type>
523
      <last_modified>2011-12-02T08:10:41.565891+00:00</last_modified>
524
      <x_object_hash>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</x_object_hash>
525
      <x_object_uuid>8ed9af1b-c948-4bb6-82b0-48344f5c822c</x_object_uuid>
526
      <x_object_version>98</x_object_version>
527
      <x_object_version_timestamp>1322813441.565891</x_object_version_timestamp>
528
      <x_object_modified_by>chazapis</x_object_modified_by>
529
    </object>
530
    <object>...</object>
531
  </container>
532

  
533
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

  
535
===========================  ===============================
536
Return Code                  Description
537
===========================  ===============================
538
200 (OK)                     The request succeeded
539
204 (No Content)             The account has no containers (only for non-extended replies)
540
304 (Not Modified)           The container has not been modified
541
412 (Precondition Failed)    The condition set can not be satisfied
542
===========================  ===============================
543

  
544
Will use a ``200`` return code if the reply is of type JSON/XML.
545

  
546

  
547
PUT
548
"""
549

  
550
====================  ================================
551
Request Header Name   Value
552
====================  ================================
553
X-Container-Policy-*  Container behavior and limits
554
X-Container-Meta-*    Optional user defined metadata
555
====================  ================================
556
 
557
No reply content/headers.
558

  
559
If no policy is defined, the container will be created with the default values.
560
Available policy directives:
561

  
562
* ``versioning``: Set to ``auto`` or ``none`` (default is ``auto``)
563
* ``quota``: Size limit in KB (default is ``0`` - unlimited)
564

  
565
If the container already exists, the operation is equal to a ``POST`` with ``update`` defined.
566

  
567
================  ===============================
568
Return Code       Description
569
================  ===============================
570
201 (Created)     The container has been created
571
202 (Accepted)    The request has been accepted
572
================  ===============================
573

  
574

  
575
POST
576
""""
577

  
578
====================  ================================
579
Request Header Name   Value
580
====================  ================================
581
Content-Length        The size of the supplied data (optional, to upload)
582
Content-Type          The MIME content type of the supplied data (optional, to upload)
583
Transfer-Encoding     Set to ``chunked`` to specify incremental uploading (if used, ``Content-Length`` is ignored)
584
X-Container-Policy-*  Container behavior and limits
585
X-Container-Meta-*    Optional user defined metadata
586
====================  ================================
587

  
588
|
589

  
590
======================  ============================================
591
Request Parameter Name  Value
592
======================  ============================================
593
format                  Optional hash list reply type (can be ``json`` or ``xml``)
594
update                  Do not replace metadata/policy (no value parameter)
595
======================  ============================================
596

  
597
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

  
599
The operation will overwrite all user defined metadata, except if ``update`` is defined.
600
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

  
602
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

  
604
================  ===============================
605
Return Code       Description
606
================  ===============================
607
202 (Accepted)    The request has been accepted
608
================  ===============================
609

  
610

  
611
DELETE
612
""""""
613

  
614
======================  ===================================
615
Request Parameter Name  Value
616
======================  ===================================
617
until                   Optional timestamp
618
======================  ===================================
619

  
620
If ``until`` is defined, the container is "purged" up to that time (the history of all objects up to then is deleted).
621

  
622
No reply content/headers.
623

  
624
================  ===============================
625
Return Code       Description
626
================  ===============================
627
204 (No Content)  The request succeeded
628
409 (Conflict)    The container is not empty
629
================  ===============================
630

  
631

  
632
Object Level
633
^^^^^^^^^^^^
634

  
635
List of operations:
636

  
637
=========  =================================
638
Operation  Description
639
=========  =================================
640
HEAD       Retrieve object metadata
641
GET        Read object data
642
PUT        Write object data or copy/move object
643
COPY       Copy object
644
MOVE       Move object
645
POST       Update object metadata/data
646
DELETE     Delete object
647
=========  =================================
648

  
649

  
650
HEAD
651
""""
652

  
653
====================  ================================
654
Request Header Name   Value
655
====================  ================================
656
If-Match              Retrieve if ETags match
657
If-None-Match         Retrieve if ETags don't match
658
If-Modified-Since     Retrieve if object has changed since provided timestamp
659
If-Unmodified-Since   Retrieve if object has not changed since provided timestamp
660
====================  ================================
661

  
662
|
663

  
664
======================  ===================================
665
Request Parameter Name  Value
666
======================  ===================================
667
version                 Optional version identifier
668
======================  ===================================
669

  
670
|
671

  
672
==========================  ===============================
673
Reply Header Name           Value
674
==========================  ===============================
675
ETag                        The ETag of the object
676
Content-Length              The size of the object
677
Content-Type                The MIME content type of the object
678
Last-Modified               The last object modification date (regardless of version)
679
Content-Encoding            The encoding of the object (optional)
680
Content-Disposition         The presentation style of the object (optional)
681
X-Object-Hash               The Merkle hash
682
X-Object-UUID               The object's UUID
683
X-Object-Version            The object's version identifier
684
X-Object-Version-Timestamp  The object's version timestamp
685
X-Object-Modified-By        The user that comitted the object's version
686
X-Object-Manifest           Object parts prefix in ``<container>/<object>`` form (optional)
687
X-Object-Sharing            Object permissions (optional)
688
X-Object-Shared-By          Object inheriting permissions (optional)
689
X-Object-Allowed-To         Allowed actions on object (optional)
690
X-Object-Public             Object's publicly accessible URI (optional)
691
X-Object-Meta-*             Optional user defined metadata
692
==========================  ===============================
693

  
694
|
695

  
696
================  ===============================
697
Return Code       Description
698
================  ===============================
699
200 (No Content)  The request succeeded
700
================  ===============================
701

  
702

  
703
GET
704
"""
705

  
706
====================  ================================
707
Request Header Name   Value
708
====================  ================================
709
Range                 Optional range of data to retrieve
710
If-Range              Retrieve the missing part if entity is unchanged; otherwise, retrieve the entire new entity (used together with Range header)
711
If-Match              Retrieve if ETags match
712
If-None-Match         Retrieve if ETags don't match
713
If-Modified-Since     Retrieve if object has changed since provided timestamp
714
If-Unmodified-Since   Retrieve if object has not changed since provided timestamp
715
====================  ================================
716

  
717
|
718

  
719
======================  ===================================
720
Request Parameter Name  Value
721
======================  ===================================
722
format                  Optional extended reply type (can be ``json`` or ``xml``)
723
hashmap                 Optional request for hashmap (no value parameter)
724
version                 Optional version identifier or ``list`` (specify a format if requesting a list)
725
======================  ===================================
726

  
727
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

  
729
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

  
731
Example ``format=json`` reply:
732

  
733
::
734

  
735
  {"block_hash": "sha1", "hashes": ["7295c41da03d7f916440b98e32c4a2a39351546c", ...], "block_size": 131072, "bytes": 242}
736

  
737
Example ``format=xml`` reply:
738

  
739
::
740

  
741
  <?xml version="1.0" encoding="UTF-8"?>
742
  <object name="file" bytes="24223726" block_size="131072" block_hash="sha1">
743
    <hash>7295c41da03d7f916440b98e32c4a2a39351546c</hash>
744
    <hash>...</hash>
745
  </object>
746

  
747
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

  
749
Example ``format=json`` reply:
750

  
751
::
752

  
753
  {"versions": [[85, "1322734861.248469"], [86, "1322734905.009272"], ...]}
754

  
755
Example ``format=xml`` reply:
756

  
757
::
758

  
759
  <?xml version="1.0" encoding="UTF-8"?>
760
  <object name="file">
761
    <version timestamp="1322734861.248469">85</version>
762
    <version timestamp="1322734905.009272">86</version>
763
    <version timestamp="...">...</version>
764
  </object>
765

  
766
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

  
768
==========================  ===============================
769
Reply Header Name           Value
770
==========================  ===============================
771
ETag                        The ETag of the object
772
Content-Length              The size of the data returned
773
Content-Type                The MIME content type of the object
774
Content-Range               The range of data included (only on a single range request)
775
Last-Modified               The last object modification date (regardless of version)
776
Content-Encoding            The encoding of the object (optional)
777
Content-Disposition         The presentation style of the object (optional)
778
X-Object-Hash               The Merkle hash
779
X-Object-UUID               The object's UUID
780
X-Object-Version            The object's version identifier
781
X-Object-Version-Timestamp  The object's version timestamp
782
X-Object-Modified-By        The user that comitted the object's version
783
X-Object-Manifest           Object parts prefix in ``<container>/<object>`` form (optional)
784
X-Object-Sharing            Object permissions (optional)
785
X-Object-Shared-By          Object inheriting permissions (optional)
786
X-Object-Allowed-To         Allowed actions on object (optional)
787
X-Object-Public             Object's publicly accessible URI (optional)
788
X-Object-Meta-*             Optional user defined metadata
789
==========================  ===============================
790

  
791
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

  
793
===========================  ==============================
794
Return Code                  Description
795
===========================  ==============================
796
200 (OK)                     The request succeeded
797
206 (Partial Content)        The range request succeeded
798
304 (Not Modified)           The object has not been modified
799
412 (Precondition Failed)    The condition set can not be satisfied
800
416 (Range Not Satisfiable)  The requested range is out of limits
801
===========================  ==============================
802

  
803

  
804
PUT
805
"""
806

  
807
====================  ================================
808
Request Header Name   Value
809
====================  ================================
810
If-Match              Put if ETags match with current object
811
If-None-Match         Put if ETags don't match with current object
812
ETag                  The MD5 hash of the object (optional to check written data)
813
Content-Length        The size of the data written
814
Content-Type          The MIME content type of the object
815
Transfer-Encoding     Set to ``chunked`` to specify incremental uploading (if used, ``Content-Length`` is ignored)
816
X-Copy-From           The source path in the form ``/<container>/<object>``
817
X-Move-From           The source path in the form ``/<container>/<object>``
818
X-Source-Account      The source account to copy/move from
819
X-Source-Version      The source version to copy from
820
Content-Encoding      The encoding of the object (optional)
821
Content-Disposition   The presentation style of the object (optional)
822
X-Object-Manifest     Object parts prefix in ``<container>/<object>`` form (optional)
823
X-Object-Sharing      Object permissions (optional)
824
X-Object-Public       Object is publicly accessible (optional)
825
X-Object-Meta-*       Optional user defined metadata
826
====================  ================================
827

  
828
|
829

  
830
======================  ===================================
831
Request Parameter Name  Value
832
======================  ===================================
833
format                  Optional extended request/conflict response type (can be ``json`` or ``xml``)
834
hashmap                 Optional hashmap provided instead of data (no value parameter)
835
======================  ===================================
836

  
837
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

  
839
Hashmaps should be formatted as outlined in ``GET``.
840

  
841
==========================  ===============================
842
Reply Header Name           Value
843
==========================  ===============================
844
ETag                        The MD5 hash of the object
845
X-Object-Version            The object's new version
846
==========================  ===============================
847

  
848
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

  
850
==============================  ==============================
851
Return Code                     Description
852
==============================  ==============================
853
201 (Created)                   The object has been created
854
409 (Conflict)                  The object can not be created from the provided hashmap (a list of missing hashes will be included in the reply)
855
411 (Length Required)           Missing ``Content-Length`` or ``Content-Type`` in the request
856
413 (Request Entity Too Large)  Insufficient quota to complete the request
857
422 (Unprocessable Entity)      The MD5 checksum of the data written to the storage system does not match the (optionally) supplied ETag value
858
==============================  ==============================
859

  
860

  
861
COPY
862
""""
863

  
864
====================  ================================
865
Request Header Name   Value
866
====================  ================================
867
If-Match              Proceed if ETags match with object
868
If-None-Match         Proceed if ETags don't match with object
869
Destination           The destination path in the form ``/<container>/<object>``
870
Destination-Account   The destination account to copy to
871
Content-Type          The MIME content type of the object (optional :sup:`*`)
872
Content-Encoding      The encoding of the object (optional)
873
Content-Disposition   The presentation style of the object (optional)
874
X-Source-Version      The source version to copy from
875
X-Object-Manifest     Object parts prefix in ``<container>/<object>`` form (optional)
876
X-Object-Sharing      Object permissions (optional)
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff