Revision cda71050 snf-cyclades-app/synnefo/plankton/views.py
b/snf-cyclades-app/synnefo/plankton/views.py | ||
---|---|---|
42 | 42 |
|
43 | 43 |
from snf_django.lib import api |
44 | 44 |
from snf_django.lib.api import faults |
45 |
from synnefo.plankton.utils import plankton_method
|
|
45 |
from synnefo.plankton.utils import image_backend
|
|
46 | 46 |
|
47 | 47 |
|
48 | 48 |
FILTERS = ('name', 'container_format', 'disk_format', 'status', 'size_min', |
... | ... | |
117 | 117 |
|
118 | 118 |
|
119 | 119 |
@api.api_method(http_method="POST", user_required=True, logger=log) |
120 |
@plankton_method |
|
121 | 120 |
def add_image(request): |
122 | 121 |
"""Add a new virtual machine image |
123 | 122 |
|
... | ... | |
146 | 145 |
location = params.pop('location', None) |
147 | 146 |
|
148 | 147 |
if location: |
149 |
image = request.backend.register(name, location, params) |
|
148 |
with image_backend(request.user_uniq) as backend: |
|
149 |
image = backend.register(name, location, params) |
|
150 | 150 |
else: |
151 | 151 |
#f = StringIO(request.raw_post_data) |
152 |
#image = request.backend.put(name, f, params)
|
|
152 |
#image = backend.put(name, f, params) |
|
153 | 153 |
return HttpResponse(status=501) # Not Implemented |
154 | 154 |
|
155 | 155 |
if not image: |
... | ... | |
159 | 159 |
|
160 | 160 |
|
161 | 161 |
@api.api_method(http_method="DELETE", user_required=True, logger=log) |
162 |
@plankton_method |
|
163 | 162 |
def delete_image(request, image_id): |
164 | 163 |
"""Delete an Image. |
165 | 164 |
|
... | ... | |
173 | 172 |
""" |
174 | 173 |
log.info("delete_image '%s'" % image_id) |
175 | 174 |
userid = request.user_uniq |
176 |
request.backend.unregister(image_id) |
|
175 |
with image_backend(userid) as backend: |
|
176 |
backend.unregister(image_id) |
|
177 | 177 |
log.info("User '%s' deleted image '%s'" % (userid, image_id)) |
178 | 178 |
return HttpResponse(status=204) |
179 | 179 |
|
180 | 180 |
|
181 | 181 |
@api.api_method(http_method="PUT", user_required=True, logger=log) |
182 |
@plankton_method |
|
183 | 182 |
def add_image_member(request, image_id, member): |
184 | 183 |
"""Add a member to an image |
185 | 184 |
|
... | ... | |
191 | 190 |
""" |
192 | 191 |
|
193 | 192 |
log.debug('add_image_member %s %s', image_id, member) |
194 |
request.backend.add_user(image_id, member) |
|
193 |
with image_backend(request.user_uniq) as backend: |
|
194 |
backend.add_user(image_id, member) |
|
195 | 195 |
return HttpResponse(status=204) |
196 | 196 |
|
197 | 197 |
|
198 | 198 |
@api.api_method(http_method="GET", user_required=True, logger=log) |
199 |
@plankton_method |
|
200 | 199 |
def get_image(request, image_id): |
201 | 200 |
"""Retrieve a virtual machine image |
202 | 201 |
|
... | ... | |
208 | 207 |
in memory. |
209 | 208 |
""" |
210 | 209 |
|
211 |
#image = request.backend.get_image(image_id)
|
|
210 |
#image = backend.get_image(image_id) |
|
212 | 211 |
#if not image: |
213 | 212 |
# return HttpResponseNotFound() |
214 | 213 |
# |
215 | 214 |
#response = _create_image_response(image) |
216 |
#data = request.backend.get_data(image)
|
|
215 |
#data = backend.get_data(image) |
|
217 | 216 |
#response.content = data |
218 | 217 |
#response['Content-Length'] = len(data) |
219 | 218 |
#response['Content-Type'] = 'application/octet-stream' |
... | ... | |
223 | 222 |
|
224 | 223 |
|
225 | 224 |
@api.api_method(http_method="HEAD", user_required=True, logger=log) |
226 |
@plankton_method |
|
227 | 225 |
def get_image_meta(request, image_id): |
228 | 226 |
"""Return detailed metadata on a specific image |
229 | 227 |
|
... | ... | |
231 | 229 |
3.4. Requesting Detailed Metadata on a Specific Image |
232 | 230 |
""" |
233 | 231 |
|
234 |
image = request.backend.get_image(image_id) |
|
235 |
if not image: |
|
236 |
raise faults.ItemNotFound() |
|
232 |
with image_backend(request.user_uniq) as backend: |
|
233 |
image = backend.get_image(image_id) |
|
237 | 234 |
return _create_image_response(image) |
238 | 235 |
|
239 | 236 |
|
240 | 237 |
@api.api_method(http_method="GET", user_required=True, logger=log) |
241 |
@plankton_method |
|
242 | 238 |
def list_image_members(request, image_id): |
243 | 239 |
"""List image memberships |
244 | 240 |
|
... | ... | |
246 | 242 |
3.7. Requesting Image Memberships |
247 | 243 |
""" |
248 | 244 |
|
249 |
members = [{'member_id': user, 'can_share': False} |
|
250 |
for user in request.backend.list_users(image_id)] |
|
245 |
with image_backend(request.user_uniq) as backend: |
|
246 |
users = backend.list_users(image_id) |
|
247 |
|
|
248 |
members = [{'member_id': u, 'can_share': False} for u in users] |
|
251 | 249 |
data = json.dumps({'members': members}, indent=settings.DEBUG) |
252 | 250 |
return HttpResponse(data) |
253 | 251 |
|
254 | 252 |
|
255 | 253 |
@api.api_method(http_method="GET", user_required=True, logger=log) |
256 |
@plankton_method |
|
257 | 254 |
def list_images(request, detail=False): |
258 | 255 |
"""Return a list of available images. |
259 | 256 |
|
... | ... | |
293 | 290 |
except ValueError: |
294 | 291 |
raise faults.BadRequest("Malformed request.") |
295 | 292 |
|
296 |
images = request.backend.list(filters, params) |
|
293 |
with image_backend(request.user_uniq) as backend: |
|
294 |
images = backend.list(filters, params) |
|
297 | 295 |
|
298 | 296 |
# Remove keys that should not be returned |
299 | 297 |
fields = DETAIL_FIELDS if detail else LIST_FIELDS |
... | ... | |
307 | 305 |
|
308 | 306 |
|
309 | 307 |
@api.api_method(http_method="GET", user_required=True, logger=log) |
310 |
@plankton_method |
|
311 | 308 |
def list_shared_images(request, member): |
312 | 309 |
"""Request shared images |
313 | 310 |
|
... | ... | |
322 | 319 |
log.debug('list_shared_images %s', member) |
323 | 320 |
|
324 | 321 |
images = [] |
325 |
for image in request.backend.iter_shared(member=member): |
|
326 |
image_id = image['id'] |
|
327 |
images.append({'image_id': image_id, 'can_share': False}) |
|
322 |
with image_backend(request.user_uniq) as backend: |
|
323 |
for image in backend.iter_shared(member=member): |
|
324 |
image_id = image['id'] |
|
325 |
images.append({'image_id': image_id, 'can_share': False}) |
|
328 | 326 |
|
329 | 327 |
data = json.dumps({'shared_images': images}, indent=settings.DEBUG) |
330 | 328 |
return HttpResponse(data) |
331 | 329 |
|
332 | 330 |
|
333 | 331 |
@api.api_method(http_method="DELETE", user_required=True, logger=log) |
334 |
@plankton_method |
|
335 | 332 |
def remove_image_member(request, image_id, member): |
336 | 333 |
"""Remove a member from an image |
337 | 334 |
|
... | ... | |
340 | 337 |
""" |
341 | 338 |
|
342 | 339 |
log.debug('remove_image_member %s %s', image_id, member) |
343 |
request.backend.remove_user(image_id, member) |
|
340 |
with image_backend(request.user_uniq) as backend: |
|
341 |
backend.remove_user(image_id, member) |
|
344 | 342 |
return HttpResponse(status=204) |
345 | 343 |
|
346 | 344 |
|
347 | 345 |
@api.api_method(http_method="PUT", user_required=True, logger=log) |
348 |
@plankton_method |
|
349 | 346 |
def update_image(request, image_id): |
350 | 347 |
"""Update an image |
351 | 348 |
|
... | ... | |
363 | 360 |
|
364 | 361 |
assert set(meta.keys()).issubset(set(UPDATE_FIELDS)) |
365 | 362 |
|
366 |
image = request.backend.update(image_id, meta) |
|
363 |
with image_backend(request.user_uniq) as backend: |
|
364 |
image = backend.update_metadata(image_id, meta) |
|
367 | 365 |
return _create_image_response(image) |
368 | 366 |
|
369 | 367 |
|
370 | 368 |
@api.api_method(http_method="PUT", user_required=True, logger=log) |
371 |
@plankton_method |
|
372 | 369 |
def update_image_members(request, image_id): |
373 | 370 |
"""Replace a membership list for an image |
374 | 371 |
|
... | ... | |
388 | 385 |
except (ValueError, KeyError, TypeError): |
389 | 386 |
return HttpResponse(status=400) |
390 | 387 |
|
391 |
request.backend.replace_users(image_id, members) |
|
388 |
with image_backend(request.user_uniq) as backend: |
|
389 |
backend.replace_users(image_id, members) |
|
392 | 390 |
return HttpResponse(status=204) |
Also available in: Unified diff