Statistics
| Branch: | Tag: | Revision:

root / api / networks.py @ 13b954b0

History | View | Annotate | Download (5.7 kB)

1 0269afd6 Giorgos Verigakis
from synnefo.api.actions import network_actions
2 0269afd6 Giorgos Verigakis
from synnefo.api.common import method_not_allowed
3 0269afd6 Giorgos Verigakis
from synnefo.api.faults import BadRequest, Unauthorized
4 0269afd6 Giorgos Verigakis
from synnefo.api.util import (isoformat, isoparse, get_network,
5 0269afd6 Giorgos Verigakis
                                get_request_dict, api_method)
6 0269afd6 Giorgos Verigakis
from synnefo.db.models import Network
7 0269afd6 Giorgos Verigakis
8 0269afd6 Giorgos Verigakis
from django.conf.urls.defaults import patterns
9 0269afd6 Giorgos Verigakis
from django.http import HttpResponse
10 0269afd6 Giorgos Verigakis
from django.utils import simplejson as json
11 0269afd6 Giorgos Verigakis
12 0269afd6 Giorgos Verigakis
13 0269afd6 Giorgos Verigakis
urlpatterns = patterns('synnefo.api.networks',
14 0269afd6 Giorgos Verigakis
    (r'^(?:/|.json|.xml)?$', 'demux'),
15 0269afd6 Giorgos Verigakis
    (r'^/detail(?:.json|.xml)?$', 'list_networks', {'detail': True}),
16 0269afd6 Giorgos Verigakis
    (r'^/(\w+)(?:.json|.xml)?$', 'network_demux'),
17 0269afd6 Giorgos Verigakis
    (r'^/(\w+)/action(?:.json|.xml)?$', 'network_action'),
18 0269afd6 Giorgos Verigakis
)
19 0269afd6 Giorgos Verigakis
20 0269afd6 Giorgos Verigakis
21 0269afd6 Giorgos Verigakis
def demux(request):
22 0269afd6 Giorgos Verigakis
    if request.method == 'GET':
23 0269afd6 Giorgos Verigakis
        return list_networks(request)
24 0269afd6 Giorgos Verigakis
    elif request.method == 'POST':
25 0269afd6 Giorgos Verigakis
        return create_network(request)
26 0269afd6 Giorgos Verigakis
    else:
27 0269afd6 Giorgos Verigakis
        return method_not_allowed(request)
28 0269afd6 Giorgos Verigakis
29 0269afd6 Giorgos Verigakis
def network_demux(request, network):
30 0269afd6 Giorgos Verigakis
    if request.method == 'GET':
31 0269afd6 Giorgos Verigakis
        return get_network_details(request, network)
32 0269afd6 Giorgos Verigakis
    elif request.method == 'PUT':
33 0269afd6 Giorgos Verigakis
        return update_network_name(request, network)
34 0269afd6 Giorgos Verigakis
    elif request.method == 'DELETE':
35 0269afd6 Giorgos Verigakis
        return delete_network(request, network)
36 0269afd6 Giorgos Verigakis
    else:
37 0269afd6 Giorgos Verigakis
        return method_not_allowed(request)
38 0269afd6 Giorgos Verigakis
39 0269afd6 Giorgos Verigakis
40 0269afd6 Giorgos Verigakis
def network_to_dict(network, detail=True):
41 0269afd6 Giorgos Verigakis
    d = {'name': network.name}
42 0269afd6 Giorgos Verigakis
    if detail:
43 0269afd6 Giorgos Verigakis
        d['servers'] = {'values': [vm.id for vm in network.machines.all()]}
44 0269afd6 Giorgos Verigakis
    return d
45 0269afd6 Giorgos Verigakis
46 0269afd6 Giorgos Verigakis
def render_network(request, networkdict, status=200):
47 0269afd6 Giorgos Verigakis
    if request.serialization == 'xml':
48 0269afd6 Giorgos Verigakis
        data = render_to_string('network.xml', {'network': networkdict})
49 0269afd6 Giorgos Verigakis
    else:
50 0269afd6 Giorgos Verigakis
        data = json.dumps({'network': networkdict})
51 0269afd6 Giorgos Verigakis
    return HttpResponse(data, status=status)
52 0269afd6 Giorgos Verigakis
53 0269afd6 Giorgos Verigakis
54 0269afd6 Giorgos Verigakis
@api_method('GET')
55 0269afd6 Giorgos Verigakis
def list_networks(request, detail=False):
56 0269afd6 Giorgos Verigakis
    # Normal Response Codes: 200, 203
57 0269afd6 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
58 0269afd6 Giorgos Verigakis
    #                       serviceUnavailable (503),
59 0269afd6 Giorgos Verigakis
    #                       unauthorized (401),
60 0269afd6 Giorgos Verigakis
    #                       badRequest (400),
61 0269afd6 Giorgos Verigakis
    #                       overLimit (413)
62 0269afd6 Giorgos Verigakis
    
63 0269afd6 Giorgos Verigakis
    since = isoparse(request.GET.get('changes-since'))
64 0269afd6 Giorgos Verigakis
    
65 0269afd6 Giorgos Verigakis
    if since:
66 0269afd6 Giorgos Verigakis
        user_networks = Network.objects.filter(owner=request.user, updated__gte=since)
67 0269afd6 Giorgos Verigakis
        if not user_networks:
68 0269afd6 Giorgos Verigakis
            return HttpResponse(status=304)
69 0269afd6 Giorgos Verigakis
    else:
70 0269afd6 Giorgos Verigakis
        user_networks = Network.objects.filter(owner=request.user)
71 0269afd6 Giorgos Verigakis
    
72 0269afd6 Giorgos Verigakis
    networks = [network_to_dict(network, detail) for network in user_networks]
73 0269afd6 Giorgos Verigakis
    
74 0269afd6 Giorgos Verigakis
    if request.serialization == 'xml':
75 0269afd6 Giorgos Verigakis
        data = render_to_string('list_networks.xml', {'networks': networks, 'detail': detail})
76 0269afd6 Giorgos Verigakis
    else:
77 0269afd6 Giorgos Verigakis
        data = json.dumps({'networks': {'values': networks}})
78 0269afd6 Giorgos Verigakis
    
79 0269afd6 Giorgos Verigakis
    return HttpResponse(data, status=200)
80 0269afd6 Giorgos Verigakis
81 0269afd6 Giorgos Verigakis
@api_method('POST')
82 0269afd6 Giorgos Verigakis
def create_network(request):
83 0269afd6 Giorgos Verigakis
    # Normal Response Code: 202
84 0269afd6 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
85 0269afd6 Giorgos Verigakis
    #                       serviceUnavailable (503),
86 0269afd6 Giorgos Verigakis
    #                       unauthorized (401),
87 13b954b0 Giorgos Verigakis
    #                       badMediaType(415),
88 0269afd6 Giorgos Verigakis
    #                       badRequest (400),
89 0269afd6 Giorgos Verigakis
    #                       overLimit (413)
90 0269afd6 Giorgos Verigakis
    
91 0269afd6 Giorgos Verigakis
    req = get_request_dict(request)
92 0269afd6 Giorgos Verigakis
    
93 0269afd6 Giorgos Verigakis
    try:
94 0269afd6 Giorgos Verigakis
        d = req['network']
95 0269afd6 Giorgos Verigakis
        name = d['name']
96 0269afd6 Giorgos Verigakis
    except (KeyError, ValueError):
97 0269afd6 Giorgos Verigakis
        raise BadRequest('Malformed request.')
98 0269afd6 Giorgos Verigakis
    
99 0269afd6 Giorgos Verigakis
    network, created = Network.objects.get_or_create(name=name, owner=request.user)
100 0269afd6 Giorgos Verigakis
    if not created:
101 0269afd6 Giorgos Verigakis
        raise BadRequest('Network already exists.')
102 0269afd6 Giorgos Verigakis
    networkdict = network_to_dict(network)
103 0269afd6 Giorgos Verigakis
    return render_network(request, networkdict, status=202)
104 0269afd6 Giorgos Verigakis
105 0269afd6 Giorgos Verigakis
@api_method('GET')
106 0269afd6 Giorgos Verigakis
def get_network_details(request, network):
107 0269afd6 Giorgos Verigakis
    # Normal Response Codes: 200, 203
108 13b954b0 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
109 13b954b0 Giorgos Verigakis
    #                       serviceUnavailable (503),
110 13b954b0 Giorgos Verigakis
    #                       unauthorized (401),
111 13b954b0 Giorgos Verigakis
    #                       badRequest (400),
112 13b954b0 Giorgos Verigakis
    #                       itemNotFound (404),
113 13b954b0 Giorgos Verigakis
    #                       overLimit (413)
114 0269afd6 Giorgos Verigakis
    
115 0269afd6 Giorgos Verigakis
    net = get_network(network, request.user)
116 0269afd6 Giorgos Verigakis
    netdict = network_to_dict(net)
117 0269afd6 Giorgos Verigakis
    return render_network(request, netdict)
118 0269afd6 Giorgos Verigakis
119 0269afd6 Giorgos Verigakis
@api_method('PUT')
120 0269afd6 Giorgos Verigakis
def update_network_name(request, network):
121 0269afd6 Giorgos Verigakis
    # Normal Response Code: 204
122 13b954b0 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
123 13b954b0 Giorgos Verigakis
    #                       serviceUnavailable (503),
124 13b954b0 Giorgos Verigakis
    #                       unauthorized (401),
125 13b954b0 Giorgos Verigakis
    #                       badRequest (400),
126 13b954b0 Giorgos Verigakis
    #                       badMediaType(415),
127 13b954b0 Giorgos Verigakis
    #                       itemNotFound (404),
128 13b954b0 Giorgos Verigakis
    #                       overLimit (413)
129 13b954b0 Giorgos Verigakis
    
130 0269afd6 Giorgos Verigakis
    req = get_request_dict(request)
131 0269afd6 Giorgos Verigakis
132 0269afd6 Giorgos Verigakis
    try:
133 0269afd6 Giorgos Verigakis
        name = req['network']['name']
134 0269afd6 Giorgos Verigakis
    except (TypeError, KeyError):
135 0269afd6 Giorgos Verigakis
        raise BadRequest('Malformed request.')
136 0269afd6 Giorgos Verigakis
137 0269afd6 Giorgos Verigakis
    net = get_network(network, request.user)
138 0269afd6 Giorgos Verigakis
    net.name = name
139 0269afd6 Giorgos Verigakis
    net.save()
140 0269afd6 Giorgos Verigakis
    return HttpResponse(status=204)
141 0269afd6 Giorgos Verigakis
142 0269afd6 Giorgos Verigakis
@api_method('DELETE')
143 0269afd6 Giorgos Verigakis
def delete_network(request, network):
144 0269afd6 Giorgos Verigakis
    # Normal Response Code: 204
145 13b954b0 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
146 13b954b0 Giorgos Verigakis
    #                       serviceUnavailable (503),
147 13b954b0 Giorgos Verigakis
    #                       unauthorized (401),
148 13b954b0 Giorgos Verigakis
    #                       itemNotFound (404),
149 13b954b0 Giorgos Verigakis
    #                       unauthorized (401),
150 13b954b0 Giorgos Verigakis
    #                       overLimit (413)
151 0269afd6 Giorgos Verigakis
    
152 0269afd6 Giorgos Verigakis
    net = get_network(network, request.user)
153 0269afd6 Giorgos Verigakis
    net.delete()
154 0269afd6 Giorgos Verigakis
    return HttpResponse(status=204)
155 0269afd6 Giorgos Verigakis
156 0269afd6 Giorgos Verigakis
@api_method('POST')
157 0269afd6 Giorgos Verigakis
def network_action(request, network):
158 0269afd6 Giorgos Verigakis
    net = get_network(network, request.user)
159 0269afd6 Giorgos Verigakis
    req = get_request_dict(request)
160 0269afd6 Giorgos Verigakis
    if len(req) != 1:
161 0269afd6 Giorgos Verigakis
        raise BadRequest('Malformed request.')
162 0269afd6 Giorgos Verigakis
    
163 0269afd6 Giorgos Verigakis
    key = req.keys()[0]
164 0269afd6 Giorgos Verigakis
    val = req[key]
165 0269afd6 Giorgos Verigakis
    
166 0269afd6 Giorgos Verigakis
    try:
167 0269afd6 Giorgos Verigakis
        assert isinstance(val, dict)
168 0269afd6 Giorgos Verigakis
        return network_actions[key](request, net, req[key])
169 0269afd6 Giorgos Verigakis
    except KeyError:
170 0269afd6 Giorgos Verigakis
        raise BadRequest('Unknown action.')
171 0269afd6 Giorgos Verigakis
    except AssertionError:
172 0269afd6 Giorgos Verigakis
        raise BadRequest('Invalid argument.')