Revision b016b476 api/servers.py
b/api/servers.py | ||
---|---|---|
2 | 2 |
# Copyright (c) 2010 Greek Research and Technology Network |
3 | 3 |
# |
4 | 4 |
|
5 |
from synnefo.api.actions import server_actions |
|
5 | 6 |
from synnefo.api.errors import * |
6 | 7 |
from synnefo.api.util import * |
7 | 8 |
from synnefo.db.models import * |
8 | 9 |
from synnefo.util.rapi import GanetiRapiClient |
9 | 10 |
|
11 |
from django.conf import settings |
|
10 | 12 |
from django.conf.urls.defaults import * |
11 | 13 |
from django.http import HttpResponse |
12 | 14 |
from django.template.loader import render_to_string |
... | ... | |
23 | 25 |
(r'^(?:/|.json|.xml)?$', 'demux'), |
24 | 26 |
(r'^/detail(?:.json|.xml)?$', 'list_servers', {'detail': True}), |
25 | 27 |
(r'^/(\d+)(?:.json|.xml)?$', 'server_demux'), |
28 |
(r'^/(\d+)/action(?:.json|.xml)?$', 'server_action'), |
|
29 |
(r'^/(\d+)/ips(?:.json|.xml)?$', 'list_addresses'), |
|
30 |
(r'^/(\d+)/ips/(.+?)(?:.json|.xml)?$', 'list_addresses_by_network'), |
|
26 | 31 |
) |
27 | 32 |
|
28 | 33 |
|
... | ... | |
47 | 52 |
return render_fault(request, fault) |
48 | 53 |
|
49 | 54 |
|
55 |
def address_to_dict(ipfour, ipsix): |
|
56 |
return {'id': 'public', |
|
57 |
'values': [{'version': 4, 'addr': ipfour}, {'version': 6, 'addr': ipsix}]} |
|
58 |
|
|
50 | 59 |
def server_to_dict(server, detail=False): |
51 | 60 |
d = dict(id=server.id, name=server.name) |
52 | 61 |
if detail: |
... | ... | |
64 | 73 |
if metadata: |
65 | 74 |
d['metadata'] = dict(values=metadata) |
66 | 75 |
|
67 |
public_addrs = [dict(version=4, addr=server.ipfour), dict(version=6, addr=server.ipsix)] |
|
68 |
d['addresses'] = {'values': []} |
|
69 |
d['addresses']['values'].append({'id': 'public', 'values': public_addrs}) |
|
76 |
d['addresses'] = [address_to_dict(server.ipfour, server.ipsix)] |
|
70 | 77 |
return d |
71 | 78 |
|
72 | 79 |
def render_server(request, serverdict, status=200): |
... | ... | |
227 | 234 |
server.start_action('DESTROY') |
228 | 235 |
rapi.DeleteInstance(server.backend_id) |
229 | 236 |
return HttpResponse(status=204) |
237 |
|
|
238 |
@api_method('POST') |
|
239 |
def server_action(request, server_id): |
|
240 |
try: |
|
241 |
server_id = int(server_id) |
|
242 |
server = VirtualMachine.objects.get(id=server_id) |
|
243 |
except VirtualMachine.DoesNotExist: |
|
244 |
raise ItemNotFound |
|
245 |
|
|
246 |
req = get_request_dict(request) |
|
247 |
if len(req) != 1: |
|
248 |
raise BadRequest |
|
249 |
|
|
250 |
key = req.keys()[0] |
|
251 |
if key not in server_actions: |
|
252 |
raise BadRequest |
|
253 |
|
|
254 |
return server_actions[key](server, req[key]) |
|
255 |
|
|
256 |
@api_method('GET') |
|
257 |
def list_addresses(request, server_id): |
|
258 |
# Normal Response Codes: 200, 203 |
|
259 |
# Error Response Codes: computeFault (400, 500), |
|
260 |
# serviceUnavailable (503), |
|
261 |
# unauthorized (401), |
|
262 |
# badRequest (400), |
|
263 |
# overLimit (413) |
|
264 |
|
|
265 |
try: |
|
266 |
server_id = int(server_id) |
|
267 |
server = VirtualMachine.objects.get(id=server_id) |
|
268 |
except VirtualMachine.DoesNotExist: |
|
269 |
raise ItemNotFound |
|
270 |
|
|
271 |
addresses = [address_to_dict(server.ipfour, server.ipsix)] |
|
272 |
|
|
273 |
if request.type == 'xml': |
|
274 |
data = render_to_string('list_addresses.xml', {'addresses': addresses}) |
|
275 |
else: |
|
276 |
data = json.dumps({'addresses': {'values': addresses}}) |
|
277 |
|
|
278 |
return HttpResponse(data, status=200) |
|
279 |
|
|
280 |
@api_method('GET') |
|
281 |
def list_addresses_by_network(request, server_id, network_id): |
|
282 |
# Normal Response Codes: 200, 203 |
|
283 |
# Error Response Codes: computeFault (400, 500), |
|
284 |
# serviceUnavailable (503), |
|
285 |
# unauthorized (401), |
|
286 |
# badRequest (400), |
|
287 |
# itemNotFound (404), |
|
288 |
# overLimit (413) |
|
289 |
|
|
290 |
try: |
|
291 |
server_id = int(server_id) |
|
292 |
server = VirtualMachine.objects.get(id=server_id) |
|
293 |
except VirtualMachine.DoesNotExist: |
|
294 |
raise ItemNotFound |
|
295 |
|
|
296 |
if network_id != 'public': |
|
297 |
raise ItemNotFound |
|
298 |
|
|
299 |
address = address_to_dict(server.ipfour, server.ipsix) |
|
300 |
|
|
301 |
if request.type == 'xml': |
|
302 |
data = render_to_string('address.xml', {'address': address}) |
|
303 |
else: |
|
304 |
data = json.dumps({'network': address}) |
|
305 |
|
|
306 |
return HttpResponse(data, status=200) |
Also available in: Unified diff