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