root / api / networks.py @ 5509b599
History | View | Annotate | Download (5.6 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 | b19653d1 | Giorgos Verigakis | (r'^/(\d+)(?:.json|.xml)?$', 'network_demux'), |
17 | b19653d1 | Giorgos Verigakis | (r'^/(\d+)/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 | b19653d1 | Giorgos Verigakis | def network_demux(request, network_id): |
30 | 0269afd6 | Giorgos Verigakis | if request.method == 'GET': |
31 | b19653d1 | Giorgos Verigakis | return get_network_details(request, network_id)
|
32 | 0269afd6 | Giorgos Verigakis | elif request.method == 'PUT': |
33 | b19653d1 | Giorgos Verigakis | return update_network_name(request, network_id)
|
34 | 0269afd6 | Giorgos Verigakis | elif request.method == 'DELETE': |
35 | b19653d1 | Giorgos Verigakis | return delete_network(request, network_id)
|
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 | b19653d1 | Giorgos Verigakis | d = {'id': network.id, '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 | aa197ee4 | Vangelis Koukis | |
63 | 0269afd6 | Giorgos Verigakis | since = isoparse(request.GET.get('changes-since'))
|
64 | aa197ee4 | Vangelis Koukis | |
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 | aa197ee4 | Vangelis Koukis | |
72 | 0269afd6 | Giorgos Verigakis | networks = [network_to_dict(network, detail) for network in user_networks] |
73 | aa197ee4 | Vangelis Koukis | |
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 | aa197ee4 | Vangelis Koukis | |
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 | aa197ee4 | Vangelis Koukis | |
91 | 0269afd6 | Giorgos Verigakis | req = get_request_dict(request) |
92 | aa197ee4 | Vangelis Koukis | |
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 | aa197ee4 | Vangelis Koukis | |
99 | b19653d1 | Giorgos Verigakis | network = Network.objects.create(name=name, owner=request.user) |
100 | 0269afd6 | Giorgos Verigakis | networkdict = network_to_dict(network) |
101 | 0269afd6 | Giorgos Verigakis | return render_network(request, networkdict, status=202) |
102 | 0269afd6 | Giorgos Verigakis | |
103 | 0269afd6 | Giorgos Verigakis | @api_method('GET') |
104 | b19653d1 | Giorgos Verigakis | def get_network_details(request, network_id): |
105 | 0269afd6 | Giorgos Verigakis | # Normal Response Codes: 200, 203
|
106 | 13b954b0 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
107 | 13b954b0 | Giorgos Verigakis | # serviceUnavailable (503),
|
108 | 13b954b0 | Giorgos Verigakis | # unauthorized (401),
|
109 | 13b954b0 | Giorgos Verigakis | # badRequest (400),
|
110 | 13b954b0 | Giorgos Verigakis | # itemNotFound (404),
|
111 | 13b954b0 | Giorgos Verigakis | # overLimit (413)
|
112 | aa197ee4 | Vangelis Koukis | |
113 | b19653d1 | Giorgos Verigakis | net = get_network(network_id, request.user) |
114 | 0269afd6 | Giorgos Verigakis | netdict = network_to_dict(net) |
115 | 0269afd6 | Giorgos Verigakis | return render_network(request, netdict)
|
116 | 0269afd6 | Giorgos Verigakis | |
117 | 0269afd6 | Giorgos Verigakis | @api_method('PUT') |
118 | b19653d1 | Giorgos Verigakis | def update_network_name(request, network_id): |
119 | 0269afd6 | Giorgos Verigakis | # Normal Response Code: 204
|
120 | 13b954b0 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
121 | 13b954b0 | Giorgos Verigakis | # serviceUnavailable (503),
|
122 | 13b954b0 | Giorgos Verigakis | # unauthorized (401),
|
123 | 13b954b0 | Giorgos Verigakis | # badRequest (400),
|
124 | 13b954b0 | Giorgos Verigakis | # badMediaType(415),
|
125 | 13b954b0 | Giorgos Verigakis | # itemNotFound (404),
|
126 | 13b954b0 | Giorgos Verigakis | # overLimit (413)
|
127 | aa197ee4 | Vangelis Koukis | |
128 | 0269afd6 | Giorgos Verigakis | req = get_request_dict(request) |
129 | 0269afd6 | Giorgos Verigakis | |
130 | 0269afd6 | Giorgos Verigakis | try:
|
131 | 0269afd6 | Giorgos Verigakis | name = req['network']['name'] |
132 | 0269afd6 | Giorgos Verigakis | except (TypeError, KeyError): |
133 | 0269afd6 | Giorgos Verigakis | raise BadRequest('Malformed request.') |
134 | 0269afd6 | Giorgos Verigakis | |
135 | b19653d1 | Giorgos Verigakis | net = get_network(network_id, request.user) |
136 | 0269afd6 | Giorgos Verigakis | net.name = name |
137 | 0269afd6 | Giorgos Verigakis | net.save() |
138 | 0269afd6 | Giorgos Verigakis | return HttpResponse(status=204) |
139 | 0269afd6 | Giorgos Verigakis | |
140 | 0269afd6 | Giorgos Verigakis | @api_method('DELETE') |
141 | b19653d1 | Giorgos Verigakis | def delete_network(request, network_id): |
142 | 0269afd6 | Giorgos Verigakis | # Normal Response Code: 204
|
143 | 13b954b0 | Giorgos Verigakis | # Error Response Codes: computeFault (400, 500),
|
144 | 13b954b0 | Giorgos Verigakis | # serviceUnavailable (503),
|
145 | 13b954b0 | Giorgos Verigakis | # unauthorized (401),
|
146 | 13b954b0 | Giorgos Verigakis | # itemNotFound (404),
|
147 | 13b954b0 | Giorgos Verigakis | # unauthorized (401),
|
148 | 13b954b0 | Giorgos Verigakis | # overLimit (413)
|
149 | aa197ee4 | Vangelis Koukis | |
150 | b19653d1 | Giorgos Verigakis | net = get_network(network_id, request.user) |
151 | 5509b599 | Giorgos Verigakis | for vm in net.machines.all(): |
152 | 5509b599 | Giorgos Verigakis | vm.save() |
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 | b19653d1 | Giorgos Verigakis | def network_action(request, network_id): |
158 | b19653d1 | Giorgos Verigakis | net = get_network(network_id, 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 | aa197ee4 | Vangelis Koukis | |
163 | 0269afd6 | Giorgos Verigakis | key = req.keys()[0]
|
164 | 0269afd6 | Giorgos Verigakis | val = req[key] |
165 | aa197ee4 | Vangelis Koukis | |
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.') |