root / api / functions.py @ 94195dd0
History | View | Annotate | Download (7.9 kB)
1 |
#
|
---|---|
2 |
# Copyright (c) 2011 Greek Research and Technology Network
|
3 |
#
|
4 |
|
5 |
from django.http import HttpResponse |
6 |
from django.template.loader import render_to_string |
7 |
from django.utils import simplejson as json |
8 |
|
9 |
from pithos.api.faults import Fault, BadRequest, Unauthorized |
10 |
from pithos.api.util import api_method |
11 |
|
12 |
from pithos.backends.dummy_debug import * |
13 |
|
14 |
import logging |
15 |
|
16 |
logging.basicConfig(level=logging.DEBUG) |
17 |
|
18 |
@api_method('GET') |
19 |
def authenticate(request): |
20 |
# Normal Response Codes: 204
|
21 |
# Error Response Codes: serviceUnavailable (503),
|
22 |
# unauthorized (401),
|
23 |
# badRequest (400)
|
24 |
|
25 |
x_auth_user = request.META.get('HTTP_X_AUTH_USER')
|
26 |
x_auth_key = request.META.get('HTTP_X_AUTH_KEY')
|
27 |
|
28 |
if not x_auth_user or not x_auth_key: |
29 |
raise BadRequest('Missing auth user or key.') |
30 |
|
31 |
response = HttpResponse(status = 204)
|
32 |
response['X-Auth-Token'] = 'eaaafd18-0fed-4b3a-81b4-663c99ec1cbb' |
33 |
# TODO: Do we support redirections?
|
34 |
#response['X-Storage-Url'] = 'https://storage.grnet.gr/pithos/v1.0/<some reference>'
|
35 |
return response
|
36 |
|
37 |
def account_demux(request, v_account): |
38 |
if request.method == 'HEAD': |
39 |
return account_meta(request, v_account)
|
40 |
elif request.method == 'GET': |
41 |
return container_list(request, v_account)
|
42 |
else:
|
43 |
return method_not_allowed(request)
|
44 |
|
45 |
def container_demux(request, v_account, v_container): |
46 |
if request.method == 'HEAD': |
47 |
return container_meta(request, v_account, v_container)
|
48 |
elif request.method == 'GET': |
49 |
return object_list(request, v_account, v_container)
|
50 |
elif request.method == 'PUT': |
51 |
return container_create(request, v_account, v_container)
|
52 |
elif request.method == 'DELETE': |
53 |
return container_delete(request, v_account, v_container)
|
54 |
else:
|
55 |
return method_not_allowed(request)
|
56 |
|
57 |
def object_demux(request, v_account, v_container, v_object): |
58 |
if request.method == 'HEAD': |
59 |
return object_meta(request, v_account, v_container, v_object)
|
60 |
elif request.method == 'GET': |
61 |
return object_read(request, v_account, v_container, v_object)
|
62 |
elif request.method == 'PUT': |
63 |
return object_write(request, v_account, v_container, v_object)
|
64 |
elif request.method == 'POST': |
65 |
return object_update(request, v_account, v_container, v_object)
|
66 |
elif request.method == 'DELETE': |
67 |
return object_delete(request, v_account, v_container, v_object)
|
68 |
else:
|
69 |
return method_not_allowed(request)
|
70 |
|
71 |
@api_method('HEAD') |
72 |
def account_meta(request, v_account): |
73 |
# Normal Response Codes: 204
|
74 |
# Error Response Codes: serviceUnavailable (503),
|
75 |
# itemNotFound (404),
|
76 |
# unauthorized (401),
|
77 |
# badRequest (400)
|
78 |
|
79 |
container_count, bytes_count = get_account_meta(request.user) |
80 |
|
81 |
response = HttpResponse(status = 204)
|
82 |
response['X-Account-Container-Count'] = container_count
|
83 |
response['X-Account-Total-Bytes-Used'] = bytes_count
|
84 |
return response
|
85 |
|
86 |
@api_method('GET', format_allowed = True) |
87 |
def container_list(request, v_account): |
88 |
# Normal Response Codes: 200, 204
|
89 |
# Error Response Codes: serviceUnavailable (503),
|
90 |
# unauthorized (401),
|
91 |
# badRequest (400)
|
92 |
|
93 |
marker = request.GET.get('marker')
|
94 |
limit = request.GET.get('limit')
|
95 |
if limit:
|
96 |
try:
|
97 |
limit = int(limit)
|
98 |
except ValueError: |
99 |
limit = None
|
100 |
|
101 |
containers = list_containers(request.user, marker, limit) |
102 |
if len(containers) == 0: |
103 |
return HttpResponse(status = 204) |
104 |
|
105 |
if request.serialization == 'xml': |
106 |
data = render_to_string('containers.xml', {'account': request.user, 'containers': containers}) |
107 |
elif request.serialization == 'json': |
108 |
data = json.dumps(containers) |
109 |
else:
|
110 |
data = '\n'.join(x['name'] for x in containers) |
111 |
|
112 |
return HttpResponse(data, status = 200) |
113 |
|
114 |
@api_method('HEAD') |
115 |
def container_meta(request, v_account, v_container): |
116 |
# Normal Response Codes: 204
|
117 |
# Error Response Codes: serviceUnavailable (503),
|
118 |
# itemNotFound (404),
|
119 |
# unauthorized (401),
|
120 |
# badRequest (400)
|
121 |
|
122 |
object_count, bytes_count = get_container_meta(request.user, v_container) |
123 |
|
124 |
response = HttpResponse(status = 204)
|
125 |
response['X-Container-Object-Count'] = object_count
|
126 |
response['X-Container-Bytes-Used'] = bytes_count
|
127 |
return response
|
128 |
|
129 |
@api_method('PUT') |
130 |
def container_create(request, v_account, v_container): |
131 |
# Normal Response Codes: 201, 202
|
132 |
# Error Response Codes: serviceUnavailable (503),
|
133 |
# itemNotFound (404),
|
134 |
# unauthorized (401),
|
135 |
# badRequest (400)
|
136 |
|
137 |
if create_container(request.user, v_container):
|
138 |
return HttpResponse(status = 201) |
139 |
else:
|
140 |
return HttpResponse(status = 202) |
141 |
|
142 |
@api_method('DELETE') |
143 |
def container_delete(request, v_account, v_container): |
144 |
# Normal Response Codes: 204
|
145 |
# Error Response Codes: serviceUnavailable (503),
|
146 |
# itemNotFound (404),
|
147 |
# unauthorized (401),
|
148 |
# badRequest (400)
|
149 |
|
150 |
object_count, bytes_count = get_container_meta(request.user, v_container) |
151 |
if object_count > 0: |
152 |
return HttpResponse(status = 409) |
153 |
|
154 |
delete_container(request.user, v_container) |
155 |
return HttpResponse(status = 204) |
156 |
|
157 |
@api_method('GET', format_allowed = True) |
158 |
def object_list(request, v_account, v_container): |
159 |
# Normal Response Codes: 200, 204
|
160 |
# Error Response Codes: serviceUnavailable (503),
|
161 |
# itemNotFound (404),
|
162 |
# unauthorized (401),
|
163 |
# badRequest (400)
|
164 |
|
165 |
path = request.GET.get('path')
|
166 |
prefix = request.GET.get('prefix')
|
167 |
delimiter = request.GET.get('delimiter')
|
168 |
logging.debug("path: %s", path)
|
169 |
|
170 |
# Path overrides prefix and delimiter.
|
171 |
if path:
|
172 |
prefix = path |
173 |
delimiter = '/'
|
174 |
# Naming policy.
|
175 |
if prefix and delimiter: |
176 |
prefix = prefix + delimiter |
177 |
|
178 |
marker = request.GET.get('marker')
|
179 |
limit = request.GET.get('limit')
|
180 |
if limit:
|
181 |
try:
|
182 |
limit = int(limit)
|
183 |
except ValueError: |
184 |
limit = None
|
185 |
|
186 |
objects = list_objects(request.user, v_container, prefix, delimiter, marker, limit) |
187 |
if len(objects) == 0: |
188 |
return HttpResponse(status = 204) |
189 |
|
190 |
if request.serialization == 'xml': |
191 |
data = render_to_string('objects.xml', {'container': v_container, 'objects': objects}) |
192 |
elif request.serialization == 'json': |
193 |
data = json.dumps(objects) |
194 |
else:
|
195 |
data = '\n'.join(x['name'] for x in objects) |
196 |
|
197 |
return HttpResponse(data, status = 200) |
198 |
|
199 |
@api_method('HEAD') |
200 |
def object_meta(request, v_account, v_container, v_object): |
201 |
return HttpResponse("object_meta: %s %s %s" % (v_account, v_container, v_object)) |
202 |
|
203 |
@api_method('GET') |
204 |
def object_read(request, v_account, v_container, v_object): |
205 |
return HttpResponse("object_read: %s %s %s" % (v_account, v_container, v_object)) |
206 |
|
207 |
@api_method('PUT') |
208 |
def object_write(request, v_account, v_container, v_object): |
209 |
return HttpResponse("object_write: %s %s %s" % (v_account, v_container, v_object)) |
210 |
|
211 |
@api_method('POST') |
212 |
def object_update(request, v_account, v_container, v_object): |
213 |
return HttpResponse("object_update: %s %s %s" % (v_account, v_container, v_object)) |
214 |
|
215 |
@api_method('DELETE') |
216 |
def object_delete(request, v_account, v_container, v_object): |
217 |
return HttpResponse("object_delete: %s %s %s" % (v_account, v_container, v_object)) |
218 |
|
219 |
@api_method()
|
220 |
def method_not_allowed(request): |
221 |
raise BadRequest('Method not allowed.') |