Statistics
| Branch: | Tag: | Revision:

root / api / networks.py @ b19653d1

History | View | Annotate | Download (5.6 kB)

1
from synnefo.api.actions import network_actions
2
from synnefo.api.common import method_not_allowed
3
from synnefo.api.faults import BadRequest, Unauthorized
4
from synnefo.api.util import (isoformat, isoparse, get_network,
5
                                get_request_dict, api_method)
6
from synnefo.db.models import Network
7

    
8
from django.conf.urls.defaults import patterns
9
from django.http import HttpResponse
10
from django.utils import simplejson as json
11

    
12

    
13
urlpatterns = patterns('synnefo.api.networks',
14
    (r'^(?:/|.json|.xml)?$', 'demux'),
15
    (r'^/detail(?:.json|.xml)?$', 'list_networks', {'detail': True}),
16
    (r'^/(\d+)(?:.json|.xml)?$', 'network_demux'),
17
    (r'^/(\d+)/action(?:.json|.xml)?$', 'network_action'),
18
)
19

    
20

    
21
def demux(request):
22
    if request.method == 'GET':
23
        return list_networks(request)
24
    elif request.method == 'POST':
25
        return create_network(request)
26
    else:
27
        return method_not_allowed(request)
28

    
29
def network_demux(request, network_id):
30
    if request.method == 'GET':
31
        return get_network_details(request, network_id)
32
    elif request.method == 'PUT':
33
        return update_network_name(request, network_id)
34
    elif request.method == 'DELETE':
35
        return delete_network(request, network_id)
36
    else:
37
        return method_not_allowed(request)
38

    
39

    
40
def network_to_dict(network, detail=True):
41
    d = {'id': network.id, 'name': network.name}
42
    if detail:
43
        d['servers'] = {'values': [vm.id for vm in network.machines.all()]}
44
    return d
45

    
46
def render_network(request, networkdict, status=200):
47
    if request.serialization == 'xml':
48
        data = render_to_string('network.xml', {'network': networkdict})
49
    else:
50
        data = json.dumps({'network': networkdict})
51
    return HttpResponse(data, status=status)
52

    
53

    
54
@api_method('GET')
55
def list_networks(request, detail=False):
56
    # Normal Response Codes: 200, 203
57
    # Error Response Codes: computeFault (400, 500),
58
    #                       serviceUnavailable (503),
59
    #                       unauthorized (401),
60
    #                       badRequest (400),
61
    #                       overLimit (413)
62
    
63
    since = isoparse(request.GET.get('changes-since'))
64
    
65
    if since:
66
        user_networks = Network.objects.filter(owner=request.user, updated__gte=since)
67
        if not user_networks:
68
            return HttpResponse(status=304)
69
    else:
70
        user_networks = Network.objects.filter(owner=request.user)
71
    
72
    networks = [network_to_dict(network, detail) for network in user_networks]
73
    
74
    if request.serialization == 'xml':
75
        data = render_to_string('list_networks.xml', {'networks': networks, 'detail': detail})
76
    else:
77
        data = json.dumps({'networks': {'values': networks}})
78
    
79
    return HttpResponse(data, status=200)
80

    
81
@api_method('POST')
82
def create_network(request):
83
    # Normal Response Code: 202
84
    # Error Response Codes: computeFault (400, 500),
85
    #                       serviceUnavailable (503),
86
    #                       unauthorized (401),
87
    #                       badMediaType(415),
88
    #                       badRequest (400),
89
    #                       overLimit (413)
90
    
91
    req = get_request_dict(request)
92
    
93
    try:
94
        d = req['network']
95
        name = d['name']
96
    except (KeyError, ValueError):
97
        raise BadRequest('Malformed request.')
98
    
99
    network = Network.objects.create(name=name, owner=request.user)
100
    networkdict = network_to_dict(network)
101
    return render_network(request, networkdict, status=202)
102

    
103
@api_method('GET')
104
def get_network_details(request, network_id):
105
    # Normal Response Codes: 200, 203
106
    # Error Response Codes: computeFault (400, 500),
107
    #                       serviceUnavailable (503),
108
    #                       unauthorized (401),
109
    #                       badRequest (400),
110
    #                       itemNotFound (404),
111
    #                       overLimit (413)
112
    
113
    net = get_network(network_id, request.user)
114
    netdict = network_to_dict(net)
115
    return render_network(request, netdict)
116

    
117
@api_method('PUT')
118
def update_network_name(request, network_id):
119
    # Normal Response Code: 204
120
    # Error Response Codes: computeFault (400, 500),
121
    #                       serviceUnavailable (503),
122
    #                       unauthorized (401),
123
    #                       badRequest (400),
124
    #                       badMediaType(415),
125
    #                       itemNotFound (404),
126
    #                       overLimit (413)
127
    
128
    req = get_request_dict(request)
129

    
130
    try:
131
        name = req['network']['name']
132
    except (TypeError, KeyError):
133
        raise BadRequest('Malformed request.')
134

    
135
    net = get_network(network_id, request.user)
136
    net.name = name
137
    net.save()
138
    return HttpResponse(status=204)
139

    
140
@api_method('DELETE')
141
def delete_network(request, network_id):
142
    # Normal Response Code: 204
143
    # Error Response Codes: computeFault (400, 500),
144
    #                       serviceUnavailable (503),
145
    #                       unauthorized (401),
146
    #                       itemNotFound (404),
147
    #                       unauthorized (401),
148
    #                       overLimit (413)
149
    
150
    net = get_network(network_id, request.user)
151
    net.delete()
152
    return HttpResponse(status=204)
153

    
154
@api_method('POST')
155
def network_action(request, network_id):
156
    net = get_network(network_id, request.user)
157
    req = get_request_dict(request)
158
    if len(req) != 1:
159
        raise BadRequest('Malformed request.')
160
    
161
    key = req.keys()[0]
162
    val = req[key]
163
    
164
    try:
165
        assert isinstance(val, dict)
166
        return network_actions[key](request, net, req[key])
167
    except KeyError:
168
        raise BadRequest('Unknown action.')
169
    except AssertionError:
170
        raise BadRequest('Invalid argument.')