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