Statistics
| Branch: | Tag: | Revision:

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.')