root / snf-cyclades-app / synnefo / api / subnets.py @ fde2c1f7
History | View | Annotate | Download (11.3 kB)
1 | 16f7d0d9 | Dionysis Grigoropoulos | # Copyright 2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
3 | 16f7d0d9 | Dionysis Grigoropoulos | # Redistribution and use in source and binary forms, with or
|
4 | 16f7d0d9 | Dionysis Grigoropoulos | # without modification, are permitted provided that the following
|
5 | 16f7d0d9 | Dionysis Grigoropoulos | # conditions are met:
|
6 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
7 | 16f7d0d9 | Dionysis Grigoropoulos | # 1. Redistributions of source code must retain the above
|
8 | 16f7d0d9 | Dionysis Grigoropoulos | # copyright notice, this list of conditions and the following
|
9 | 16f7d0d9 | Dionysis Grigoropoulos | # disclaimer.
|
10 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
11 | 16f7d0d9 | Dionysis Grigoropoulos | # 2. Redistributions in binary form must reproduce the above
|
12 | 16f7d0d9 | Dionysis Grigoropoulos | # copyright notice, this list of conditions and the following
|
13 | 16f7d0d9 | Dionysis Grigoropoulos | # disclaimer in the documentation and/or other materials
|
14 | 16f7d0d9 | Dionysis Grigoropoulos | # provided with the distribution.
|
15 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
16 | 16f7d0d9 | Dionysis Grigoropoulos | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 16f7d0d9 | Dionysis Grigoropoulos | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 16f7d0d9 | Dionysis Grigoropoulos | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 16f7d0d9 | Dionysis Grigoropoulos | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 16f7d0d9 | Dionysis Grigoropoulos | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 16f7d0d9 | Dionysis Grigoropoulos | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 16f7d0d9 | Dionysis Grigoropoulos | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 16f7d0d9 | Dionysis Grigoropoulos | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 16f7d0d9 | Dionysis Grigoropoulos | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 16f7d0d9 | Dionysis Grigoropoulos | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 16f7d0d9 | Dionysis Grigoropoulos | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 16f7d0d9 | Dionysis Grigoropoulos | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
29 | 16f7d0d9 | Dionysis Grigoropoulos | # The views and conclusions contained in the software and
|
30 | 16f7d0d9 | Dionysis Grigoropoulos | # documentation are those of the authors and should not be
|
31 | 16f7d0d9 | Dionysis Grigoropoulos | # interpreted as representing official policies, either expressed
|
32 | 16f7d0d9 | Dionysis Grigoropoulos | # or implied, of GRNET S.A.
|
33 | 16f7d0d9 | Dionysis Grigoropoulos | |
34 | 16f7d0d9 | Dionysis Grigoropoulos | from logging import getLogger |
35 | 16f7d0d9 | Dionysis Grigoropoulos | from snf_django.lib import api |
36 | 16f7d0d9 | Dionysis Grigoropoulos | from snf_django.lib.api import faults |
37 | 16f7d0d9 | Dionysis Grigoropoulos | |
38 | 6a959c73 | Dionysis Grigoropoulos | from django.conf.urls import patterns |
39 | 16f7d0d9 | Dionysis Grigoropoulos | from django.http import HttpResponse |
40 | 16f7d0d9 | Dionysis Grigoropoulos | from django.utils import simplejson as json |
41 | 16f7d0d9 | Dionysis Grigoropoulos | |
42 | 16f7d0d9 | Dionysis Grigoropoulos | from snf_django.lib.api import utils |
43 | 6a959c73 | Dionysis Grigoropoulos | from synnefo.db.models import Subnet, Network |
44 | 16f7d0d9 | Dionysis Grigoropoulos | from synnefo.logic import networks |
45 | 16f7d0d9 | Dionysis Grigoropoulos | |
46 | 6a959c73 | Dionysis Grigoropoulos | from ipaddr import IPv4Network, IPv6Network, IPv4Address, IPAddress |
47 | 16f7d0d9 | Dionysis Grigoropoulos | |
48 | 16f7d0d9 | Dionysis Grigoropoulos | log = getLogger(__name__) |
49 | 16f7d0d9 | Dionysis Grigoropoulos | |
50 | 16f7d0d9 | Dionysis Grigoropoulos | |
51 | 6a959c73 | Dionysis Grigoropoulos | urlpatterns = patterns( |
52 | 6a959c73 | Dionysis Grigoropoulos | 'synnefo.api.subnets',
|
53 | 6a959c73 | Dionysis Grigoropoulos | (r'^(?:/|.json|.xml)?$', 'demux'), |
54 | 6a959c73 | Dionysis Grigoropoulos | (r'^/([-\w]+)(?:/|.json|.xml)?$', 'subnet_demux')) |
55 | 6a959c73 | Dionysis Grigoropoulos | |
56 | 6a959c73 | Dionysis Grigoropoulos | |
57 | 16f7d0d9 | Dionysis Grigoropoulos | def demux(request): |
58 | 16f7d0d9 | Dionysis Grigoropoulos | if request.method == 'GET': |
59 | 16f7d0d9 | Dionysis Grigoropoulos | return list_subnets(request)
|
60 | 16f7d0d9 | Dionysis Grigoropoulos | elif request.method == 'POST': |
61 | 16f7d0d9 | Dionysis Grigoropoulos | return create_subnet(request)
|
62 | 16f7d0d9 | Dionysis Grigoropoulos | else:
|
63 | 16f7d0d9 | Dionysis Grigoropoulos | return api.api_method_not_allowed(request)
|
64 | 16f7d0d9 | Dionysis Grigoropoulos | |
65 | 16f7d0d9 | Dionysis Grigoropoulos | |
66 | 16f7d0d9 | Dionysis Grigoropoulos | def subnet_demux(request, sub_id): |
67 | 16f7d0d9 | Dionysis Grigoropoulos | if request.method == 'GET': |
68 | 16f7d0d9 | Dionysis Grigoropoulos | return get_subnet(request, sub_id)
|
69 | 16f7d0d9 | Dionysis Grigoropoulos | elif request.method == 'DELETE': |
70 | 16f7d0d9 | Dionysis Grigoropoulos | return delete_subnet(request, sub_id)
|
71 | 16f7d0d9 | Dionysis Grigoropoulos | elif request.method == 'PUT': |
72 | 16f7d0d9 | Dionysis Grigoropoulos | return update_subnet(request, sub_id)
|
73 | 16f7d0d9 | Dionysis Grigoropoulos | else:
|
74 | 16f7d0d9 | Dionysis Grigoropoulos | return api.api_method_not_allowed(request)
|
75 | 16f7d0d9 | Dionysis Grigoropoulos | |
76 | 16f7d0d9 | Dionysis Grigoropoulos | |
77 | 16f7d0d9 | Dionysis Grigoropoulos | @api.api_method(http_method='GET', user_required=True, logger=log) |
78 | 16f7d0d9 | Dionysis Grigoropoulos | def list_subnets(request): |
79 | 16f7d0d9 | Dionysis Grigoropoulos | """List all subnets of a user"""
|
80 | 16f7d0d9 | Dionysis Grigoropoulos | log.debug('list_subnets')
|
81 | 16f7d0d9 | Dionysis Grigoropoulos | |
82 | 16f7d0d9 | Dionysis Grigoropoulos | user_subnets = Subnet.objects.filter(network__userid=request.user_uniq) |
83 | 16f7d0d9 | Dionysis Grigoropoulos | subnets_dict = [subnet_to_dict(sub) |
84 | 16f7d0d9 | Dionysis Grigoropoulos | for sub in user_subnets.order_by('id')] |
85 | 16f7d0d9 | Dionysis Grigoropoulos | data = json.dumps({'subnets': subnets_dict})
|
86 | 16f7d0d9 | Dionysis Grigoropoulos | |
87 | 16f7d0d9 | Dionysis Grigoropoulos | return HttpResponse(data, status=200) |
88 | 16f7d0d9 | Dionysis Grigoropoulos | |
89 | 16f7d0d9 | Dionysis Grigoropoulos | |
90 | 16f7d0d9 | Dionysis Grigoropoulos | @api.api_method(http_method='POST', user_required=True, logger=log) |
91 | 16f7d0d9 | Dionysis Grigoropoulos | def create_subnet(request): |
92 | 16f7d0d9 | Dionysis Grigoropoulos | """Create a subnet"""
|
93 | 16f7d0d9 | Dionysis Grigoropoulos | |
94 | 16f7d0d9 | Dionysis Grigoropoulos | dictionary = utils.get_request_dict(request) |
95 | 16f7d0d9 | Dionysis Grigoropoulos | log.info('create subnet %s', dictionary)
|
96 | 16f7d0d9 | Dionysis Grigoropoulos | user_id = request.user_uniq |
97 | 16f7d0d9 | Dionysis Grigoropoulos | |
98 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
99 | 16f7d0d9 | Dionysis Grigoropoulos | subnet = dictionary['subnet']
|
100 | 16f7d0d9 | Dionysis Grigoropoulos | network_id = subnet['network_id']
|
101 | 16f7d0d9 | Dionysis Grigoropoulos | cidr = subnet['cidr']
|
102 | 16f7d0d9 | Dionysis Grigoropoulos | except KeyError: |
103 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Malformed request") |
104 | 16f7d0d9 | Dionysis Grigoropoulos | |
105 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
106 | 16f7d0d9 | Dionysis Grigoropoulos | network = Network.objects.get(id=network_id) |
107 | 16f7d0d9 | Dionysis Grigoropoulos | except Network.DoesNotExist:
|
108 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.ItemNotFound("No networks found with that id") |
109 | 16f7d0d9 | Dionysis Grigoropoulos | |
110 | 16f7d0d9 | Dionysis Grigoropoulos | if user_id != network.userid:
|
111 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.Unauthorized("Unauthorized operation") |
112 | 16f7d0d9 | Dionysis Grigoropoulos | |
113 | 16f7d0d9 | Dionysis Grigoropoulos | ipversion = subnet.get('ip_version', 4) |
114 | 16f7d0d9 | Dionysis Grigoropoulos | if ipversion not in [4, 6]: |
115 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Malformed IP version type") |
116 | 16f7d0d9 | Dionysis Grigoropoulos | |
117 | 16f7d0d9 | Dionysis Grigoropoulos | # Returns the first available IP in the subnet
|
118 | 16f7d0d9 | Dionysis Grigoropoulos | if ipversion == 6: |
119 | 16f7d0d9 | Dionysis Grigoropoulos | potential_gateway = str(IPv6Network(cidr).network + 1) |
120 | 16f7d0d9 | Dionysis Grigoropoulos | check_number_of_subnets(network, 6)
|
121 | 16f7d0d9 | Dionysis Grigoropoulos | else:
|
122 | 16f7d0d9 | Dionysis Grigoropoulos | potential_gateway = str(IPv4Network(cidr).network + 1) |
123 | 16f7d0d9 | Dionysis Grigoropoulos | check_number_of_subnets(network, 4)
|
124 | 16f7d0d9 | Dionysis Grigoropoulos | |
125 | 16f7d0d9 | Dionysis Grigoropoulos | gateway = subnet.get('gateway_ip', potential_gateway)
|
126 | 16f7d0d9 | Dionysis Grigoropoulos | |
127 | 16f7d0d9 | Dionysis Grigoropoulos | if ipversion == 6: |
128 | 16f7d0d9 | Dionysis Grigoropoulos | networks.validate_network_params(None, None, cidr, gateway) |
129 | 16f7d0d9 | Dionysis Grigoropoulos | else:
|
130 | 16f7d0d9 | Dionysis Grigoropoulos | networks.validate_network_params(cidr, gateway) |
131 | 16f7d0d9 | Dionysis Grigoropoulos | |
132 | 16f7d0d9 | Dionysis Grigoropoulos | allocation_pools = subnet.get('allocation_pools', None) |
133 | 16f7d0d9 | Dionysis Grigoropoulos | |
134 | 16f7d0d9 | Dionysis Grigoropoulos | if allocation_pools:
|
135 | 16f7d0d9 | Dionysis Grigoropoulos | if ipversion == 6: |
136 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Can't allocate an IP Pool in IPv6") |
137 | 16f7d0d9 | Dionysis Grigoropoulos | for pool in allocation_pools: |
138 | 16f7d0d9 | Dionysis Grigoropoulos | start = pool['start']
|
139 | 16f7d0d9 | Dionysis Grigoropoulos | end = pool['end']
|
140 | 16f7d0d9 | Dionysis Grigoropoulos | networks.validate_network_params(cidr, start) |
141 | 16f7d0d9 | Dionysis Grigoropoulos | networks.validate_network_params(cidr, end) |
142 | 16f7d0d9 | Dionysis Grigoropoulos | start = IPv4Address(start) |
143 | 16f7d0d9 | Dionysis Grigoropoulos | end = IPv4Address(end) |
144 | 16f7d0d9 | Dionysis Grigoropoulos | if start >= end:
|
145 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Invalid IP pool range") |
146 | 16f7d0d9 | Dionysis Grigoropoulos | else:
|
147 | 16f7d0d9 | Dionysis Grigoropoulos | # FIX ME
|
148 | 16f7d0d9 | Dionysis Grigoropoulos | pass
|
149 | 16f7d0d9 | Dionysis Grigoropoulos | |
150 | 16f7d0d9 | Dionysis Grigoropoulos | dhcp = check_dhcp_value(subnet.get('enable_dhcp', True)) |
151 | 16f7d0d9 | Dionysis Grigoropoulos | name = check_name_length(subnet.get('name', None)) |
152 | 16f7d0d9 | Dionysis Grigoropoulos | |
153 | 16f7d0d9 | Dionysis Grigoropoulos | dns = subnet.get('dns_nameservers', None) |
154 | 16f7d0d9 | Dionysis Grigoropoulos | hosts = subnet.get('host_routes', None) |
155 | 16f7d0d9 | Dionysis Grigoropoulos | |
156 | 16f7d0d9 | Dionysis Grigoropoulos | # FIX ME
|
157 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
158 | 16f7d0d9 | Dionysis Grigoropoulos | sub = Subnet.objects.create(name=name, network=network, cidr=cidr, |
159 | 16f7d0d9 | Dionysis Grigoropoulos | ipversion=ipversion, gateway=gateway, |
160 | 16f7d0d9 | Dionysis Grigoropoulos | dhcp=dhcp, host_routes=hosts, |
161 | 16f7d0d9 | Dionysis Grigoropoulos | dns_nameservers=dns) |
162 | 16f7d0d9 | Dionysis Grigoropoulos | except:
|
163 | 16f7d0d9 | Dionysis Grigoropoulos | raise
|
164 | 16f7d0d9 | Dionysis Grigoropoulos | return "Error" |
165 | 16f7d0d9 | Dionysis Grigoropoulos | |
166 | 16f7d0d9 | Dionysis Grigoropoulos | subnet_dict = subnet_to_dict(sub) |
167 | 16f7d0d9 | Dionysis Grigoropoulos | data = json.dumps({'subnet': subnet_dict})
|
168 | 16f7d0d9 | Dionysis Grigoropoulos | return HttpResponse(data, status=200) |
169 | 16f7d0d9 | Dionysis Grigoropoulos | |
170 | 16f7d0d9 | Dionysis Grigoropoulos | |
171 | 16f7d0d9 | Dionysis Grigoropoulos | @api.api_method(http_method='GET', user_required=True, logger=log) |
172 | 16f7d0d9 | Dionysis Grigoropoulos | def get_subnet(request, sub_id): |
173 | 16f7d0d9 | Dionysis Grigoropoulos | """Show info of a specific subnet"""
|
174 | 16f7d0d9 | Dionysis Grigoropoulos | log.debug('get_subnet %s', sub_id)
|
175 | 16f7d0d9 | Dionysis Grigoropoulos | user_id = request.user_uniq |
176 | 16f7d0d9 | Dionysis Grigoropoulos | |
177 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
178 | 16f7d0d9 | Dionysis Grigoropoulos | subnet = Subnet.objects.get(id=sub_id) |
179 | 16f7d0d9 | Dionysis Grigoropoulos | except Subnet.DoesNotExist:
|
180 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.ItemNotFound("Subnet not found") |
181 | 16f7d0d9 | Dionysis Grigoropoulos | |
182 | 16f7d0d9 | Dionysis Grigoropoulos | if subnet.network.userid != user_id:
|
183 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.failts.Unauthorized("You're not allowed to view this subnet") |
184 | 16f7d0d9 | Dionysis Grigoropoulos | |
185 | 16f7d0d9 | Dionysis Grigoropoulos | subnet_dict = subnet_to_dict(subnet) |
186 | 16f7d0d9 | Dionysis Grigoropoulos | data = json.dumps({'subnet': subnet_dict})
|
187 | 16f7d0d9 | Dionysis Grigoropoulos | return HttpResponse(data, status=200) |
188 | 16f7d0d9 | Dionysis Grigoropoulos | |
189 | 16f7d0d9 | Dionysis Grigoropoulos | |
190 | 16f7d0d9 | Dionysis Grigoropoulos | @api.api_method(http_method='DELETE', user_required=True, logger=log) |
191 | 16f7d0d9 | Dionysis Grigoropoulos | def delete_subnet(request, sub_id): |
192 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
193 | 16f7d0d9 | Dionysis Grigoropoulos | Delete a subnet, raises BadRequest
|
194 | 16f7d0d9 | Dionysis Grigoropoulos | A subnet is deleted ONLY when the network that it belongs to is deleted
|
195 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
196 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Deletion of a subnet is not supported") |
197 | 16f7d0d9 | Dionysis Grigoropoulos | |
198 | 16f7d0d9 | Dionysis Grigoropoulos | |
199 | 16f7d0d9 | Dionysis Grigoropoulos | @api.api_method(http_method='PUT', user_required=True, logger=log) |
200 | 16f7d0d9 | Dionysis Grigoropoulos | def update_subnet(request, sub_id): |
201 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
202 | 16f7d0d9 | Dionysis Grigoropoulos | Update the fields of a subnet
|
203 | 16f7d0d9 | Dionysis Grigoropoulos | Only the name can be updated, everything else returns BadRequest
|
204 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
205 | 16f7d0d9 | Dionysis Grigoropoulos | |
206 | 16f7d0d9 | Dionysis Grigoropoulos | dictionary = utils.get_request_dict(request) |
207 | 16f7d0d9 | Dionysis Grigoropoulos | log.info('Update subnet %s', dictionary)
|
208 | 16f7d0d9 | Dionysis Grigoropoulos | user_id = request.user_uniq |
209 | 16f7d0d9 | Dionysis Grigoropoulos | |
210 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
211 | 16f7d0d9 | Dionysis Grigoropoulos | subnet = dictionary['subnet']
|
212 | 16f7d0d9 | Dionysis Grigoropoulos | except KeyError: |
213 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Malformed request") |
214 | 16f7d0d9 | Dionysis Grigoropoulos | |
215 | 16f7d0d9 | Dionysis Grigoropoulos | original_subnet = get_subnet_fromdb(sub_id, user_id) |
216 | 16f7d0d9 | Dionysis Grigoropoulos | original_dict = subnet_to_dict(original_subnet) |
217 | 16f7d0d9 | Dionysis Grigoropoulos | |
218 | 16f7d0d9 | Dionysis Grigoropoulos | if len(subnet) != 1: |
219 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Only the name of subnet can be updated") |
220 | 16f7d0d9 | Dionysis Grigoropoulos | |
221 | 16f7d0d9 | Dionysis Grigoropoulos | name = subnet.get("name", None) |
222 | 16f7d0d9 | Dionysis Grigoropoulos | |
223 | 16f7d0d9 | Dionysis Grigoropoulos | if not name: |
224 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Only the name of subnet can be updated") |
225 | 16f7d0d9 | Dionysis Grigoropoulos | |
226 | 16f7d0d9 | Dionysis Grigoropoulos | #if subnet.get('ip_version', None):
|
227 | 16f7d0d9 | Dionysis Grigoropoulos | # raise api.faults.BadRequest("Malformed request, ip_version cannot be "
|
228 | 16f7d0d9 | Dionysis Grigoropoulos | # "updated")
|
229 | 16f7d0d9 | Dionysis Grigoropoulos | #if subnet.get('cidr', None):
|
230 | 16f7d0d9 | Dionysis Grigoropoulos | # raise api.faults.BadRequest("Malformed request, cidr cannot be "
|
231 | 16f7d0d9 | Dionysis Grigoropoulos | # "updated")
|
232 | 16f7d0d9 | Dionysis Grigoropoulos | #if subnet.get('allocation_pools', None):
|
233 | 16f7d0d9 | Dionysis Grigoropoulos | # raise api.faults.BadRequest("Malformed request, allocation pools "
|
234 | 16f7d0d9 | Dionysis Grigoropoulos | # "cannot be updated")
|
235 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
236 | 16f7d0d9 | Dionysis Grigoropoulos | # Check if request contained host/dns information
|
237 | 16f7d0d9 | Dionysis Grigoropoulos | #check_for_hosts_dns(subnet)
|
238 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
239 | 16f7d0d9 | Dionysis Grigoropoulos | #name = subnet.get('name', original_dict['name'])
|
240 | 16f7d0d9 | Dionysis Grigoropoulos | check_name_length(name) |
241 | 16f7d0d9 | Dionysis Grigoropoulos | |
242 | 16f7d0d9 | Dionysis Grigoropoulos | #dhcp = subnet.get('enable_dhcp', original_dict['enable_dhcp'])
|
243 | 16f7d0d9 | Dionysis Grigoropoulos | #check_dhcp_value(dhcp)
|
244 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
245 | 16f7d0d9 | Dionysis Grigoropoulos | #gateway = subnet.get('gateway_ip', original_dict['gateway_ip'])
|
246 | 16f7d0d9 | Dionysis Grigoropoulos | #FIX ME, check if IP is in use
|
247 | 16f7d0d9 | Dionysis Grigoropoulos | #if original_dict['ip_version'] == 6:
|
248 | 16f7d0d9 | Dionysis Grigoropoulos | # networks.validate_network_params(None, None, original_dict['cidr'],
|
249 | 16f7d0d9 | Dionysis Grigoropoulos | # gateway)
|
250 | 16f7d0d9 | Dionysis Grigoropoulos | #else:
|
251 | 16f7d0d9 | Dionysis Grigoropoulos | # networks.validate_network_params(original_dict['cidr'], gateway)
|
252 | 16f7d0d9 | Dionysis Grigoropoulos | #
|
253 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
254 | 16f7d0d9 | Dionysis Grigoropoulos | #original_subnet.gateway = gateway
|
255 | 16f7d0d9 | Dionysis Grigoropoulos | original_subnet.name = name |
256 | 16f7d0d9 | Dionysis Grigoropoulos | #original_subnet.dhcp = dhcp
|
257 | 16f7d0d9 | Dionysis Grigoropoulos | original_subnet.save() |
258 | 16f7d0d9 | Dionysis Grigoropoulos | except:
|
259 | 16f7d0d9 | Dionysis Grigoropoulos | #Fix me
|
260 | 16f7d0d9 | Dionysis Grigoropoulos | return "Unknown Error" |
261 | 16f7d0d9 | Dionysis Grigoropoulos | |
262 | 16f7d0d9 | Dionysis Grigoropoulos | subnet_dict = subnet_to_dict(original_subnet) |
263 | 16f7d0d9 | Dionysis Grigoropoulos | data = json.dumps({'subnet': subnet_dict})
|
264 | 16f7d0d9 | Dionysis Grigoropoulos | return HttpResponse(data, status=200) |
265 | 16f7d0d9 | Dionysis Grigoropoulos | |
266 | 16f7d0d9 | Dionysis Grigoropoulos | |
267 | 16f7d0d9 | Dionysis Grigoropoulos | #Utility functions
|
268 | 16f7d0d9 | Dionysis Grigoropoulos | def subnet_to_dict(subnet): |
269 | 16f7d0d9 | Dionysis Grigoropoulos | """Returns a dictionary containing the info of a subnet"""
|
270 | 16f7d0d9 | Dionysis Grigoropoulos | # FIX ME, allocation pools
|
271 | 16f7d0d9 | Dionysis Grigoropoulos | dictionary = dict({'id': subnet.id, 'network_id': subnet.network.id, |
272 | 16f7d0d9 | Dionysis Grigoropoulos | 'name': subnet.name, 'tenant_id': subnet.network.userid, |
273 | 16f7d0d9 | Dionysis Grigoropoulos | 'gateway_ip': subnet.gateway,
|
274 | 16f7d0d9 | Dionysis Grigoropoulos | 'ip_version': subnet.ipversion, 'cidr': subnet.cidr, |
275 | 16f7d0d9 | Dionysis Grigoropoulos | 'enable_dhcp': subnet.dhcp,
|
276 | 16f7d0d9 | Dionysis Grigoropoulos | 'dns_nameservers': subnet.dns_nameservers,
|
277 | 16f7d0d9 | Dionysis Grigoropoulos | 'host_routes': subnet.host_routes,
|
278 | 16f7d0d9 | Dionysis Grigoropoulos | 'allocation_pools': []})
|
279 | 16f7d0d9 | Dionysis Grigoropoulos | return dictionary
|
280 | 16f7d0d9 | Dionysis Grigoropoulos | |
281 | 16f7d0d9 | Dionysis Grigoropoulos | |
282 | 16f7d0d9 | Dionysis Grigoropoulos | def check_number_of_subnets(network, version): |
283 | 16f7d0d9 | Dionysis Grigoropoulos | """Check if a user can add a subnet in a network"""
|
284 | 6a959c73 | Dionysis Grigoropoulos | if network.subnets.filter(ipversion=version):
|
285 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Only one subnet of IPv4/IPv6 per " |
286 | 16f7d0d9 | Dionysis Grigoropoulos | "network is allowed")
|
287 | 16f7d0d9 | Dionysis Grigoropoulos | |
288 | 16f7d0d9 | Dionysis Grigoropoulos | |
289 | 16f7d0d9 | Dionysis Grigoropoulos | def check_dhcp_value(dhcp): |
290 | 16f7d0d9 | Dionysis Grigoropoulos | """Check if dhcp value is in acceptable values"""
|
291 | 16f7d0d9 | Dionysis Grigoropoulos | if dhcp not in [True, False]: |
292 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Malformed request, enable_dhcp must be " |
293 | 16f7d0d9 | Dionysis Grigoropoulos | "True or False")
|
294 | 16f7d0d9 | Dionysis Grigoropoulos | return dhcp
|
295 | 16f7d0d9 | Dionysis Grigoropoulos | |
296 | 16f7d0d9 | Dionysis Grigoropoulos | |
297 | 16f7d0d9 | Dionysis Grigoropoulos | def check_name_length(name): |
298 | 16f7d0d9 | Dionysis Grigoropoulos | """Check if the length of a name is within acceptable value"""
|
299 | 16f7d0d9 | Dionysis Grigoropoulos | if len(str(name)) > Subnet.SUBNET_NAME_LENGTH: |
300 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Subnet name too long") |
301 | 16f7d0d9 | Dionysis Grigoropoulos | return name
|
302 | 16f7d0d9 | Dionysis Grigoropoulos | |
303 | 16f7d0d9 | Dionysis Grigoropoulos | |
304 | 16f7d0d9 | Dionysis Grigoropoulos | def check_for_hosts_dns(subnet): |
305 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
306 | 16f7d0d9 | Dionysis Grigoropoulos | Check if a request contains host_routes or dns_nameservers options
|
307 | 16f7d0d9 | Dionysis Grigoropoulos | Expects the request in a dictionary format
|
308 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
309 | 16f7d0d9 | Dionysis Grigoropoulos | if subnet.get('host_routes', None): |
310 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Setting host routes isn't supported") |
311 | 16f7d0d9 | Dionysis Grigoropoulos | if subnet.get('dns_nameservers', None): |
312 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.BadRequest("Setting dns nameservers isn't supported") |
313 | 16f7d0d9 | Dionysis Grigoropoulos | |
314 | 16f7d0d9 | Dionysis Grigoropoulos | |
315 | 16f7d0d9 | Dionysis Grigoropoulos | def get_subnet_fromdb(subnet_id, user_id, for_update=False): |
316 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
317 | 16f7d0d9 | Dionysis Grigoropoulos | Return a Subnet instance or raise ItemNotFound.
|
318 | 16f7d0d9 | Dionysis Grigoropoulos | This is the same as util.get_network
|
319 | 16f7d0d9 | Dionysis Grigoropoulos | """
|
320 | 16f7d0d9 | Dionysis Grigoropoulos | try:
|
321 | 16f7d0d9 | Dionysis Grigoropoulos | subnet_id = int(subnet_id)
|
322 | 16f7d0d9 | Dionysis Grigoropoulos | if for_update:
|
323 | 16f7d0d9 | Dionysis Grigoropoulos | return Subnet.objects.select_for_update().get(id=subnet_id,
|
324 | 16f7d0d9 | Dionysis Grigoropoulos | network__userid= |
325 | 16f7d0d9 | Dionysis Grigoropoulos | user_id) |
326 | 16f7d0d9 | Dionysis Grigoropoulos | return Subnet.objects.get(id=subnet_id, network__userid=user_id)
|
327 | 16f7d0d9 | Dionysis Grigoropoulos | except (ValueError, Subnet.DoesNotExist): |
328 | 16f7d0d9 | Dionysis Grigoropoulos | raise api.faults.ItemNotFound('Subnet not found.') |