root / snf-cyclades-app / synnefo / neutron / port_views.py @ 633f6952
History | View | Annotate | Download (5.4 kB)
1 | d6b24130 | Marios Kogias | from django.http import HttpResponse |
---|---|---|---|
2 | d6b24130 | Marios Kogias | from django.utils import simplejson as json |
3 | d6b24130 | Marios Kogias | from django.db import transaction |
4 | d6b24130 | Marios Kogias | from django.db.models import Q |
5 | d6b24130 | Marios Kogias | from synnefo.db.pools import EmptyPool |
6 | d6b24130 | Marios Kogias | from synnefo.db.utils import validate_mac |
7 | d6b24130 | Marios Kogias | from django.conf import settings |
8 | d6b24130 | Marios Kogias | from snf_django.lib import api |
9 | d6b24130 | Marios Kogias | from snf_django.lib.api import utils |
10 | d6b24130 | Marios Kogias | from synnefo.logic import backend |
11 | d6b24130 | Marios Kogias | from django.template.loader import render_to_string |
12 | d6b24130 | Marios Kogias | from synnefo.api import util |
13 | 633f6952 | Marios Kogias | from models import NetworkInterface, SecurityGroup |
14 | d6b24130 | Marios Kogias | |
15 | d6b24130 | Marios Kogias | from logging import getLogger |
16 | d6b24130 | Marios Kogias | |
17 | d6b24130 | Marios Kogias | log = getLogger(__name__) |
18 | d6b24130 | Marios Kogias | |
19 | d6e16760 | Marios Kogias | |
20 | d6b24130 | Marios Kogias | def demux(request): |
21 | d6b24130 | Marios Kogias | if request.method == 'GET': |
22 | 633f6952 | Marios Kogias | #return HttpResponse("list ports")
|
23 | 633f6952 | Marios Kogias | return list_ports(request)
|
24 | d6b24130 | Marios Kogias | elif request.method == 'POST': |
25 | d6b24130 | Marios Kogias | #return create_port(request)
|
26 | d6b24130 | Marios Kogias | return HttpResponse("create port") |
27 | d6b24130 | Marios Kogias | else:
|
28 | d6b24130 | Marios Kogias | return api.api_method_not_allowed(request)
|
29 | d6b24130 | Marios Kogias | |
30 | d6e16760 | Marios Kogias | |
31 | d6e16760 | Marios Kogias | def port_demux(request, offset): |
32 | d6b24130 | Marios Kogias | |
33 | d6b24130 | Marios Kogias | if request.method == 'GET': |
34 | 633f6952 | Marios Kogias | #return HttpResponse("get single port")
|
35 | 633f6952 | Marios Kogias | return get_port(request,offset)
|
36 | d6b24130 | Marios Kogias | elif request.method == 'DELETE': |
37 | 633f6952 | Marios Kogias | #return HttpResponse("delete port")
|
38 | 633f6952 | Marios Kogias | return delete_port(request,offset)
|
39 | d6b24130 | Marios Kogias | elif request.method == 'PUT': |
40 | 633f6952 | Marios Kogias | #return HttpResponse("put port")
|
41 | 633f6952 | Marios Kogias | return update_port(request,offset)
|
42 | d6b24130 | Marios Kogias | else:
|
43 | d6b24130 | Marios Kogias | return api.api_method_not_allowed(request)
|
44 | 633f6952 | Marios Kogias | |
45 | 633f6952 | Marios Kogias | |
46 | 633f6952 | Marios Kogias | @api.api_method(http_method='GET', user_required=True, logger=log) |
47 | 633f6952 | Marios Kogias | def list_ports(request, detail=False): |
48 | 633f6952 | Marios Kogias | |
49 | 633f6952 | Marios Kogias | log.debug('list_ports detail=%s', detail)
|
50 | 633f6952 | Marios Kogias | |
51 | 633f6952 | Marios Kogias | user_ports = NetworkInterface.objects.filter(network__userid=request.user_uniq) |
52 | 633f6952 | Marios Kogias | |
53 | 633f6952 | Marios Kogias | user_ports = utils.filter_modified_since(request, objects=user_ports) |
54 | 633f6952 | Marios Kogias | |
55 | 633f6952 | Marios Kogias | ports = [port_to_dict(network, detail) |
56 | 633f6952 | Marios Kogias | for port in user_ports.order_by('id')] |
57 | 633f6952 | Marios Kogias | |
58 | 633f6952 | Marios Kogias | if request.serialization == 'xml': |
59 | 633f6952 | Marios Kogias | data = render_to_string('list_networks.xml', {
|
60 | 633f6952 | Marios Kogias | "ports": ports})
|
61 | 633f6952 | Marios Kogias | else:
|
62 | 633f6952 | Marios Kogias | data = json.dumps({'ports': ports})
|
63 | 633f6952 | Marios Kogias | |
64 | 633f6952 | Marios Kogias | return HttpResponse(data, status=200) |
65 | 633f6952 | Marios Kogias | |
66 | 633f6952 | Marios Kogias | |
67 | 633f6952 | Marios Kogias | @api.api_method(http_method='GET', user_required=True, logger=log) |
68 | 633f6952 | Marios Kogias | def get_port(request, port_id): |
69 | 633f6952 | Marios Kogias | log.debug('get_port_details %s', port_id)
|
70 | 633f6952 | Marios Kogias | port = get_port_fromdb(port_id, request.user_uniq) |
71 | 633f6952 | Marios Kogias | |
72 | 633f6952 | Marios Kogias | #needs discussion
|
73 | 633f6952 | Marios Kogias | if port.deleted:
|
74 | 633f6952 | Marios Kogias | raise api.faults.BadRequest("Port has been deleted.") |
75 | 633f6952 | Marios Kogias | else:
|
76 | 633f6952 | Marios Kogias | portdict = port_to_dict(port) |
77 | 633f6952 | Marios Kogias | return render_port(request, portdict)
|
78 | 633f6952 | Marios Kogias | |
79 | 633f6952 | Marios Kogias | |
80 | 633f6952 | Marios Kogias | |
81 | 633f6952 | Marios Kogias | @api.api_method(http_method='DELETE', user_required=True, logger=log) |
82 | 633f6952 | Marios Kogias | @transaction.commit_on_success
|
83 | 633f6952 | Marios Kogias | def delete_port(request, port_id): |
84 | 633f6952 | Marios Kogias | log.info('delete_port %s', port_id)
|
85 | 633f6952 | Marios Kogias | port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
|
86 | 633f6952 | Marios Kogias | |
87 | 633f6952 | Marios Kogias | |
88 | 633f6952 | Marios Kogias | if port.deleted:
|
89 | 633f6952 | Marios Kogias | raise api.faults.BadRequest("Network has been deleted.") |
90 | 633f6952 | Marios Kogias | |
91 | 633f6952 | Marios Kogias | |
92 | 633f6952 | Marios Kogias | '''
|
93 | 633f6952 | Marios Kogias | skip the backend part...
|
94 | 633f6952 | Marios Kogias | release the ips associated with the port
|
95 | 633f6952 | Marios Kogias | '''
|
96 | 633f6952 | Marios Kogias | |
97 | 633f6952 | Marios Kogias | #the following has to leave when fix the backend thing
|
98 | 633f6952 | Marios Kogias | port.deleted = True
|
99 | 633f6952 | Marios Kogias | port.save() |
100 | 633f6952 | Marios Kogias | |
101 | 633f6952 | Marios Kogias | return HttpResponse(status=204) |
102 | 633f6952 | Marios Kogias | |
103 | 633f6952 | Marios Kogias | |
104 | 633f6952 | Marios Kogias | @api.api_method(http_method='PUT', user_required=True, logger=log) |
105 | 633f6952 | Marios Kogias | def update_port(request, port_id): |
106 | 633f6952 | Marios Kogias | '''
|
107 | 633f6952 | Marios Kogias | You can update only name, admin_state_up, security_groups
|
108 | 633f6952 | Marios Kogias | '''
|
109 | 633f6952 | Marios Kogias | port = get_port_fromdb(port_id, request.user_uniq, for_update=True)
|
110 | 633f6952 | Marios Kogias | info = utils.get_request_dict(request) |
111 | 633f6952 | Marios Kogias | try:
|
112 | 633f6952 | Marios Kogias | info = info["port"]
|
113 | 633f6952 | Marios Kogias | except KeyError: |
114 | 633f6952 | Marios Kogias | raise api.faults.BadRequest("Malformed request") |
115 | 633f6952 | Marios Kogias | |
116 | 633f6952 | Marios Kogias | try:
|
117 | 633f6952 | Marios Kogias | name = info['name']
|
118 | 633f6952 | Marios Kogias | port.name = name |
119 | 633f6952 | Marios Kogias | except KeyError: |
120 | 633f6952 | Marios Kogias | pass
|
121 | 633f6952 | Marios Kogias | sg_list = [] |
122 | 633f6952 | Marios Kogias | try:
|
123 | 633f6952 | Marios Kogias | s_groups = info['security_groups']
|
124 | 633f6952 | Marios Kogias | #validate security groups
|
125 | 633f6952 | Marios Kogias | # like get security group from db
|
126 | 633f6952 | Marios Kogias | for gid in s_groups: |
127 | 633f6952 | Marios Kogias | try:
|
128 | 633f6952 | Marios Kogias | sg = SecurityGroup.objects.get(id=int(gid))
|
129 | 633f6952 | Marios Kogias | sg_list.append(sg) |
130 | 633f6952 | Marios Kogias | except (ValueError, SecurityGroup.DoesNotExist): |
131 | 633f6952 | Marios Kogias | raise api.faults.ItemNotFound("Not valid security group") |
132 | 633f6952 | Marios Kogias | |
133 | 633f6952 | Marios Kogias | #clear the old security groups
|
134 | 633f6952 | Marios Kogias | port.security_groups.clear() |
135 | 633f6952 | Marios Kogias | |
136 | 633f6952 | Marios Kogias | #add the new groups
|
137 | 633f6952 | Marios Kogias | for group in sg_list: |
138 | 633f6952 | Marios Kogias | port.security_groups.add(group) |
139 | 633f6952 | Marios Kogias | except KeyError: |
140 | 633f6952 | Marios Kogias | pass
|
141 | 633f6952 | Marios Kogias | |
142 | 633f6952 | Marios Kogias | port.save() |
143 | 633f6952 | Marios Kogias | portdict = port_to_dict(port) |
144 | 633f6952 | Marios Kogias | return render_port(request, portdict, 200) |
145 | 633f6952 | Marios Kogias | |
146 | 633f6952 | Marios Kogias | |
147 | 633f6952 | Marios Kogias | |
148 | 633f6952 | Marios Kogias | #util functions
|
149 | 633f6952 | Marios Kogias | |
150 | 633f6952 | Marios Kogias | |
151 | 633f6952 | Marios Kogias | def port_to_dict(port, detail=True): |
152 | 633f6952 | Marios Kogias | d = {'id': str(port.id), 'name': port.name} |
153 | 633f6952 | Marios Kogias | if detail:
|
154 | 633f6952 | Marios Kogias | d['user_id'] = port.network.userid
|
155 | 633f6952 | Marios Kogias | d['tenant_id'] = port.network.userid
|
156 | 633f6952 | Marios Kogias | d['device_id'] = port.machine.id
|
157 | 633f6952 | Marios Kogias | d['admin_state_up'] = "true" |
158 | 633f6952 | Marios Kogias | d['mac_address'] = port.mac
|
159 | 633f6952 | Marios Kogias | d['status'] = port.state
|
160 | 633f6952 | Marios Kogias | if port.subnet:
|
161 | 633f6952 | Marios Kogias | d['fixed_ips'] = [{"ip_address" :port.ipv4, "subnet" :port.subnet.id}] |
162 | 633f6952 | Marios Kogias | else:
|
163 | 633f6952 | Marios Kogias | d['fixed_ips'] = []
|
164 | 633f6952 | Marios Kogias | d['security_groups'] = [str(sg.id) for sg in port.security_groups.all()] |
165 | 633f6952 | Marios Kogias | return d
|
166 | 633f6952 | Marios Kogias | |
167 | 633f6952 | Marios Kogias | |
168 | 633f6952 | Marios Kogias | |
169 | 633f6952 | Marios Kogias | def render_port(request, portdict, status=200): |
170 | 633f6952 | Marios Kogias | if request.serialization == 'xml': |
171 | 633f6952 | Marios Kogias | data = render_to_string('network.xml', {'port': portdict}) |
172 | 633f6952 | Marios Kogias | else:
|
173 | 633f6952 | Marios Kogias | data = json.dumps({'port': portdict})
|
174 | 633f6952 | Marios Kogias | return HttpResponse(data, status=status)
|
175 | 633f6952 | Marios Kogias | |
176 | 633f6952 | Marios Kogias | def get_port_fromdb(port_id, user_id, for_update=False): |
177 | 633f6952 | Marios Kogias | """
|
178 | 633f6952 | Marios Kogias | Return a NetworkInteface instance or raise ItemNotFound.
|
179 | 633f6952 | Marios Kogias | This is the same as util.get_network
|
180 | 633f6952 | Marios Kogias | """
|
181 | 633f6952 | Marios Kogias | try:
|
182 | 633f6952 | Marios Kogias | port_id = int(port_id)
|
183 | 633f6952 | Marios Kogias | objects = NetworkInterface.objects |
184 | 633f6952 | Marios Kogias | if for_update:
|
185 | 633f6952 | Marios Kogias | objects = objects.select_for_update() |
186 | 633f6952 | Marios Kogias | |
187 | 633f6952 | Marios Kogias | return objects.get(network__userid=user_id, id=port_id)
|
188 | 633f6952 | Marios Kogias | except (ValueError, NetworkInterface.DoesNotExist): |
189 | 633f6952 | Marios Kogias | raise api.faults.ItemNotFound('Port not found.') |