root / api / images.py @ 92c53da1
History | View | Annotate | Download (4.8 kB)
1 | c36934a7 | Giorgos Verigakis | #
|
---|---|---|---|
2 | c36934a7 | Giorgos Verigakis | # Copyright (c) 2010 Greek Research and Technology Network
|
3 | c36934a7 | Giorgos Verigakis | #
|
4 | c36934a7 | Giorgos Verigakis | |
5 | c36934a7 | Giorgos Verigakis | from synnefo.api.util import * |
6 | c36934a7 | Giorgos Verigakis | from synnefo.db.models import Image |
7 | c36934a7 | Giorgos Verigakis | |
8 | c36934a7 | Giorgos Verigakis | from django.conf.urls.defaults import * |
9 | c36934a7 | Giorgos Verigakis | from django.http import HttpResponse |
10 | c36934a7 | Giorgos Verigakis | from django.template.loader import render_to_string |
11 | c36934a7 | Giorgos Verigakis | |
12 | c36934a7 | Giorgos Verigakis | |
13 | c36934a7 | Giorgos Verigakis | urlpatterns = patterns('synnefo.api.images',
|
14 | c36934a7 | Giorgos Verigakis | (r'^(?:/|.json|.xml)?$', 'demux'), |
15 | c36934a7 | Giorgos Verigakis | (r'^/detail(?:.json|.xml)?$', 'list_images', {'detail': True}), |
16 | c36934a7 | Giorgos Verigakis | (r'^/(\d+)(?:.json|.xml)?$', 'image_demux'), |
17 | c36934a7 | Giorgos Verigakis | ) |
18 | c36934a7 | Giorgos Verigakis | |
19 | c36934a7 | Giorgos Verigakis | def demux(request): |
20 | c36934a7 | Giorgos Verigakis | if request.method == 'GET': |
21 | c36934a7 | Giorgos Verigakis | return list_images(request)
|
22 | c36934a7 | Giorgos Verigakis | elif request.method == 'POST': |
23 | c36934a7 | Giorgos Verigakis | return create_image(request)
|
24 | c36934a7 | Giorgos Verigakis | else:
|
25 | c36934a7 | Giorgos Verigakis | fault = BadRequest() |
26 | c36934a7 | Giorgos Verigakis | return render_fault(request, fault)
|
27 | c36934a7 | Giorgos Verigakis | |
28 | c36934a7 | Giorgos Verigakis | def image_demux(request, image_id): |
29 | c36934a7 | Giorgos Verigakis | if request.method == 'GET': |
30 | c36934a7 | Giorgos Verigakis | return get_image_details(request, image_id)
|
31 | c36934a7 | Giorgos Verigakis | elif request.method == 'DELETE': |
32 | c36934a7 | Giorgos Verigakis | return delete_image(request, image_id)
|
33 | c36934a7 | Giorgos Verigakis | else:
|
34 | c36934a7 | Giorgos Verigakis | fault = BadRequest() |
35 | c36934a7 | Giorgos Verigakis | return render_fault(request, fault)
|
36 | c36934a7 | Giorgos Verigakis | |
37 | c36934a7 | Giorgos Verigakis | |
38 | c36934a7 | Giorgos Verigakis | def image_to_dict(image, detail=True): |
39 | c36934a7 | Giorgos Verigakis | d = {'id': image.id, 'name': image.name} |
40 | c36934a7 | Giorgos Verigakis | if detail:
|
41 | c36934a7 | Giorgos Verigakis | d['updated'] = image.updated.isoformat()
|
42 | c36934a7 | Giorgos Verigakis | d['created'] = image.created.isoformat()
|
43 | c36934a7 | Giorgos Verigakis | d['status'] = image.state
|
44 | c36934a7 | Giorgos Verigakis | d['progress'] = 100 if image.state == 'ACTIVE' else 0 |
45 | c36934a7 | Giorgos Verigakis | d['description'] = image.description
|
46 | c36934a7 | Giorgos Verigakis | if image.sourcevm:
|
47 | c36934a7 | Giorgos Verigakis | d['serverRef'] = image.sourcevm.id
|
48 | c36934a7 | Giorgos Verigakis | return d
|
49 | c36934a7 | Giorgos Verigakis | |
50 | c36934a7 | Giorgos Verigakis | |
51 | c36934a7 | Giorgos Verigakis | @api_method('GET') |
52 | c36934a7 | Giorgos Verigakis | def list_images(request, detail=False): |
53 | c36934a7 | Giorgos Verigakis | # Normal Response Codes: 200, 203
|
54 | c36934a7 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
55 | c36934a7 | Giorgos Verigakis | # serviceUnavailable (503),
|
56 | c36934a7 | Giorgos Verigakis | # unauthorized (401),
|
57 | c36934a7 | Giorgos Verigakis | # badRequest (400),
|
58 | c36934a7 | Giorgos Verigakis | # overLimit (413)
|
59 | c36934a7 | Giorgos Verigakis | |
60 | c36934a7 | Giorgos Verigakis | all_images = Image.objects.all() |
61 | c36934a7 | Giorgos Verigakis | images = [image_to_dict(image, detail) for image in all_images] |
62 | c36934a7 | Giorgos Verigakis | |
63 | c36934a7 | Giorgos Verigakis | if request.type == 'xml': |
64 | c36934a7 | Giorgos Verigakis | mimetype = 'application/xml'
|
65 | c36934a7 | Giorgos Verigakis | data = render_to_string('list_images.xml', {'images': images, 'detail': detail}) |
66 | c36934a7 | Giorgos Verigakis | else:
|
67 | c36934a7 | Giorgos Verigakis | mimetype = 'application/json'
|
68 | c36934a7 | Giorgos Verigakis | data = json.dumps({'images': {'values': images}}) |
69 | c36934a7 | Giorgos Verigakis | |
70 | c36934a7 | Giorgos Verigakis | return HttpResponse(data, mimetype=mimetype, status=200) |
71 | c36934a7 | Giorgos Verigakis | |
72 | c36934a7 | Giorgos Verigakis | @api_method('POST') |
73 | c36934a7 | Giorgos Verigakis | def create_image(request): |
74 | c36934a7 | Giorgos Verigakis | # Normal Response Code: 202
|
75 | c36934a7 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
76 | c36934a7 | Giorgos Verigakis | # serviceUnavailable (503),
|
77 | c36934a7 | Giorgos Verigakis | # unauthorized (401),
|
78 | c36934a7 | Giorgos Verigakis | # badMediaType(415),
|
79 | c36934a7 | Giorgos Verigakis | # itemNotFound (404),
|
80 | c36934a7 | Giorgos Verigakis | # badRequest (400),
|
81 | c36934a7 | Giorgos Verigakis | # serverCapacityUnavailable (503),
|
82 | c36934a7 | Giorgos Verigakis | # buildInProgress (409),
|
83 | c36934a7 | Giorgos Verigakis | # resizeNotAllowed (403),
|
84 | c36934a7 | Giorgos Verigakis | # backupOrResizeInProgress (409),
|
85 | c36934a7 | Giorgos Verigakis | # overLimit (413)
|
86 | c36934a7 | Giorgos Verigakis | |
87 | c36934a7 | Giorgos Verigakis | req = get_request_dict(request) |
88 | c36934a7 | Giorgos Verigakis | owner = get_user() |
89 | c36934a7 | Giorgos Verigakis | |
90 | c36934a7 | Giorgos Verigakis | try:
|
91 | c36934a7 | Giorgos Verigakis | d = req['image']
|
92 | c36934a7 | Giorgos Verigakis | server_id = int(d['serverRef']) |
93 | c36934a7 | Giorgos Verigakis | vm = VirtualMachine.objects.get(id=server_id) |
94 | c36934a7 | Giorgos Verigakis | image = Image.objects.create(name=d['name'], size=0, owner=owner, sourcevm=vm) |
95 | c36934a7 | Giorgos Verigakis | image.save() |
96 | c36934a7 | Giorgos Verigakis | except KeyError: |
97 | c36934a7 | Giorgos Verigakis | raise BadRequest
|
98 | c36934a7 | Giorgos Verigakis | except ValueError: |
99 | c36934a7 | Giorgos Verigakis | raise BadRequest
|
100 | c36934a7 | Giorgos Verigakis | except VirtualMachine.DoesNotExist:
|
101 | c36934a7 | Giorgos Verigakis | raise ItemNotFound
|
102 | c36934a7 | Giorgos Verigakis | |
103 | c36934a7 | Giorgos Verigakis | imagedict = image_to_dict(image) |
104 | c36934a7 | Giorgos Verigakis | if request.type == 'xml': |
105 | c36934a7 | Giorgos Verigakis | data = render_to_string('image.xml', {'image': imagedict}) |
106 | c36934a7 | Giorgos Verigakis | else:
|
107 | c36934a7 | Giorgos Verigakis | data = json.dumps({'image': imagedict})
|
108 | c36934a7 | Giorgos Verigakis | |
109 | c36934a7 | Giorgos Verigakis | return HttpResponse(data, status=202) |
110 | c36934a7 | Giorgos Verigakis | |
111 | c36934a7 | Giorgos Verigakis | @api_method('GET') |
112 | c36934a7 | Giorgos Verigakis | def get_image_details(request, image_id): |
113 | c36934a7 | Giorgos Verigakis | # Normal Response Codes: 200, 203
|
114 | c36934a7 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
115 | c36934a7 | Giorgos Verigakis | # serviceUnavailable (503),
|
116 | c36934a7 | Giorgos Verigakis | # unauthorized (401),
|
117 | c36934a7 | Giorgos Verigakis | # badRequest (400),
|
118 | c36934a7 | Giorgos Verigakis | # itemNotFound (404),
|
119 | c36934a7 | Giorgos Verigakis | # overLimit (413)
|
120 | c36934a7 | Giorgos Verigakis | |
121 | c36934a7 | Giorgos Verigakis | try:
|
122 | c36934a7 | Giorgos Verigakis | image_id = int(image_id)
|
123 | c36934a7 | Giorgos Verigakis | imagedict = image_to_dict(Image.objects.get(id=image_id)) |
124 | c36934a7 | Giorgos Verigakis | except Image.DoesNotExist:
|
125 | c36934a7 | Giorgos Verigakis | raise ItemNotFound
|
126 | c36934a7 | Giorgos Verigakis | |
127 | c36934a7 | Giorgos Verigakis | if request.type == 'xml': |
128 | c36934a7 | Giorgos Verigakis | data = render_to_string('image.xml', {'image': imagedict}) |
129 | c36934a7 | Giorgos Verigakis | else:
|
130 | c36934a7 | Giorgos Verigakis | data = json.dumps({'image': imagedict})
|
131 | c36934a7 | Giorgos Verigakis | |
132 | c36934a7 | Giorgos Verigakis | return HttpResponse(data, status=200) |
133 | c36934a7 | Giorgos Verigakis | |
134 | c36934a7 | Giorgos Verigakis | @api_method('DELETE') |
135 | c36934a7 | Giorgos Verigakis | def delete_image(request, image_id): |
136 | c36934a7 | Giorgos Verigakis | # Normal Response Code: 204
|
137 | c36934a7 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
138 | c36934a7 | Giorgos Verigakis | # serviceUnavailable (503),
|
139 | c36934a7 | Giorgos Verigakis | # unauthorized (401),
|
140 | c36934a7 | Giorgos Verigakis | # itemNotFound (404),
|
141 | c36934a7 | Giorgos Verigakis | # overLimit (413)
|
142 | c36934a7 | Giorgos Verigakis | |
143 | c36934a7 | Giorgos Verigakis | try:
|
144 | c36934a7 | Giorgos Verigakis | image_id = int(image_id)
|
145 | c36934a7 | Giorgos Verigakis | image = Image.objects.get(id=image_id) |
146 | c36934a7 | Giorgos Verigakis | except Image.DoesNotExist:
|
147 | c36934a7 | Giorgos Verigakis | raise ItemNotFound
|
148 | c36934a7 | Giorgos Verigakis | |
149 | c36934a7 | Giorgos Verigakis | if image.owner != get_user():
|
150 | c36934a7 | Giorgos Verigakis | raise Unauthorized()
|
151 | c36934a7 | Giorgos Verigakis | image.delete() |
152 | c36934a7 | Giorgos Verigakis | return HttpResponse(status=204) |