Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / subnets.py @ b5e0d5c9

History | View | Annotate | Download (10.2 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
37 6a959c73 Dionysis Grigoropoulos
from django.conf.urls import patterns
38 16f7d0d9 Dionysis Grigoropoulos
from django.http import HttpResponse
39 16f7d0d9 Dionysis Grigoropoulos
from django.utils import simplejson as json
40 16f7d0d9 Dionysis Grigoropoulos
41 16f7d0d9 Dionysis Grigoropoulos
from snf_django.lib.api import utils
42 b7311f3d Dionysis Grigoropoulos
from synnefo.db.models import Subnet
43 b7311f3d Dionysis Grigoropoulos
from synnefo.logic import subnets
44 24ea227b Dionysis Grigoropoulos
from synnefo.api import util
45 16f7d0d9 Dionysis Grigoropoulos
46 b7311f3d Dionysis Grigoropoulos
import ipaddr
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 5d83d2ff Dionysis Grigoropoulos
    subnet_list = subnets.list_subnets(request.user_uniq)
81 5d83d2ff Dionysis Grigoropoulos
    subnets_dict = [subnet_to_dict(sub)
82 5d83d2ff Dionysis Grigoropoulos
                    for sub in subnet_list.order_by('id')]
83 5d83d2ff Dionysis Grigoropoulos
84 16f7d0d9 Dionysis Grigoropoulos
    data = json.dumps({'subnets': subnets_dict})
85 16f7d0d9 Dionysis Grigoropoulos
86 16f7d0d9 Dionysis Grigoropoulos
    return HttpResponse(data, status=200)
87 16f7d0d9 Dionysis Grigoropoulos
88 16f7d0d9 Dionysis Grigoropoulos
89 16f7d0d9 Dionysis Grigoropoulos
@api.api_method(http_method='POST', user_required=True, logger=log)
90 16f7d0d9 Dionysis Grigoropoulos
def create_subnet(request):
91 316787ab Dionysis Grigoropoulos
    """Create a subnet
92 a996065e Dionysis Grigoropoulos
    network_id and the desired cidr are mandatory, everything else is optional
93 316787ab Dionysis Grigoropoulos

94 a996065e Dionysis Grigoropoulos
    """
95 16f7d0d9 Dionysis Grigoropoulos
    dictionary = utils.get_request_dict(request)
96 16f7d0d9 Dionysis Grigoropoulos
    log.info('create subnet %s', dictionary)
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
    allocation_pools = subnet.get('allocation_pools', None)
106 4445f97a Dionysis Grigoropoulos
    if allocation_pools is not None:
107 9cd6d7e9 Dionysis Grigoropoulos
        pool = parse_ip_pools(allocation_pools)
108 9cd6d7e9 Dionysis Grigoropoulos
        allocation_pools = string_to_ipaddr(pool)
109 9cd6d7e9 Dionysis Grigoropoulos
110 5d83d2ff Dionysis Grigoropoulos
    name = subnet.get('name', None)
111 5d83d2ff Dionysis Grigoropoulos
    ipversion = subnet.get('ip_version', 4)
112 b7311f3d Dionysis Grigoropoulos
113 99718617 Dionysis Grigoropoulos
    # If no gateway is specified, send an empty string, because None is used
114 99718617 Dionysis Grigoropoulos
    # if the user wants no gateway at all
115 99718617 Dionysis Grigoropoulos
    gateway = subnet.get('gateway_ip', "")
116 b7311f3d Dionysis Grigoropoulos
    try:
117 b7311f3d Dionysis Grigoropoulos
        cidr_ip = ipaddr.IPNetwork(cidr)
118 b7311f3d Dionysis Grigoropoulos
    except ValueError:
119 b7311f3d Dionysis Grigoropoulos
        raise api.faults.BadRequest("Malformed CIDR")
120 b7311f3d Dionysis Grigoropoulos
    potential_gateway = str(ipaddr.IPNetwork(cidr).network + 1)
121 b7311f3d Dionysis Grigoropoulos
122 b7311f3d Dionysis Grigoropoulos
    if gateway is "":
123 b7311f3d Dionysis Grigoropoulos
        gateway = potential_gateway
124 b7311f3d Dionysis Grigoropoulos
125 5d83d2ff Dionysis Grigoropoulos
    dhcp = subnet.get('enable_dhcp', True)
126 b7311f3d Dionysis Grigoropoulos
    slaac = subnet.get('enable_slaac', None)
127 b7311f3d Dionysis Grigoropoulos
128 b7311f3d Dionysis Grigoropoulos
    if ipversion == 6:
129 b7311f3d Dionysis Grigoropoulos
        if slaac is not None:
130 b7311f3d Dionysis Grigoropoulos
            dhcp = check_boolean_value(slaac, "enable_slaac")
131 b7311f3d Dionysis Grigoropoulos
        else:
132 b7311f3d Dionysis Grigoropoulos
            dhcp = check_boolean_value(dhcp, "dhcp")
133 b7311f3d Dionysis Grigoropoulos
    else:
134 b7311f3d Dionysis Grigoropoulos
        dhcp = check_boolean_value(dhcp, "dhcp")
135 b7311f3d Dionysis Grigoropoulos
136 5d83d2ff Dionysis Grigoropoulos
    dns = subnet.get('dns_nameservers', None)
137 5d83d2ff Dionysis Grigoropoulos
    hosts = subnet.get('host_routes', None)
138 5d83d2ff Dionysis Grigoropoulos
139 9cd6d7e9 Dionysis Grigoropoulos
    sub = subnets.create_subnet(network_id=network_id,
140 9cd6d7e9 Dionysis Grigoropoulos
                                cidr=cidr,
141 9cd6d7e9 Dionysis Grigoropoulos
                                name=name,
142 9cd6d7e9 Dionysis Grigoropoulos
                                ipversion=ipversion,
143 9cd6d7e9 Dionysis Grigoropoulos
                                gateway=gateway,
144 9cd6d7e9 Dionysis Grigoropoulos
                                dhcp=dhcp,
145 b7311f3d Dionysis Grigoropoulos
                                slaac=slaac,
146 9cd6d7e9 Dionysis Grigoropoulos
                                dns_nameservers=dns,
147 9cd6d7e9 Dionysis Grigoropoulos
                                allocation_pools=allocation_pools,
148 9cd6d7e9 Dionysis Grigoropoulos
                                host_routes=hosts,
149 9cd6d7e9 Dionysis Grigoropoulos
                                user_id=request.user_uniq)
150 16f7d0d9 Dionysis Grigoropoulos
151 16f7d0d9 Dionysis Grigoropoulos
    subnet_dict = subnet_to_dict(sub)
152 16f7d0d9 Dionysis Grigoropoulos
    data = json.dumps({'subnet': subnet_dict})
153 16f7d0d9 Dionysis Grigoropoulos
    return HttpResponse(data, status=200)
154 16f7d0d9 Dionysis Grigoropoulos
155 16f7d0d9 Dionysis Grigoropoulos
156 16f7d0d9 Dionysis Grigoropoulos
@api.api_method(http_method='GET', user_required=True, logger=log)
157 16f7d0d9 Dionysis Grigoropoulos
def get_subnet(request, sub_id):
158 16f7d0d9 Dionysis Grigoropoulos
    """Show info of a specific subnet"""
159 16f7d0d9 Dionysis Grigoropoulos
    user_id = request.user_uniq
160 9cd6d7e9 Dionysis Grigoropoulos
    subnet = subnets.get_subnet(sub_id)
161 16f7d0d9 Dionysis Grigoropoulos
162 16f7d0d9 Dionysis Grigoropoulos
    if subnet.network.userid != user_id:
163 cad4793e Dionysis Grigoropoulos
        raise api.faults.Unauthorized("You're not allowed to view this subnet")
164 16f7d0d9 Dionysis Grigoropoulos
165 5d83d2ff Dionysis Grigoropoulos
    subnet_dict = subnet_to_dict(subnet)
166 16f7d0d9 Dionysis Grigoropoulos
    data = json.dumps({'subnet': subnet_dict})
167 16f7d0d9 Dionysis Grigoropoulos
    return HttpResponse(data, status=200)
168 16f7d0d9 Dionysis Grigoropoulos
169 16f7d0d9 Dionysis Grigoropoulos
170 16f7d0d9 Dionysis Grigoropoulos
@api.api_method(http_method='DELETE', user_required=True, logger=log)
171 16f7d0d9 Dionysis Grigoropoulos
def delete_subnet(request, sub_id):
172 316787ab Dionysis Grigoropoulos
    """Delete a subnet, raises BadRequest
173 16f7d0d9 Dionysis Grigoropoulos
    A subnet is deleted ONLY when the network that it belongs to is deleted
174 316787ab Dionysis Grigoropoulos

175 16f7d0d9 Dionysis Grigoropoulos
    """
176 16f7d0d9 Dionysis Grigoropoulos
    raise api.faults.BadRequest("Deletion of a subnet is not supported")
177 16f7d0d9 Dionysis Grigoropoulos
178 16f7d0d9 Dionysis Grigoropoulos
179 16f7d0d9 Dionysis Grigoropoulos
@api.api_method(http_method='PUT', user_required=True, logger=log)
180 16f7d0d9 Dionysis Grigoropoulos
def update_subnet(request, sub_id):
181 316787ab Dionysis Grigoropoulos
    """Update the fields of a subnet
182 16f7d0d9 Dionysis Grigoropoulos
    Only the name can be updated, everything else returns BadRequest
183 316787ab Dionysis Grigoropoulos

184 16f7d0d9 Dionysis Grigoropoulos
    """
185 16f7d0d9 Dionysis Grigoropoulos
186 16f7d0d9 Dionysis Grigoropoulos
    dictionary = utils.get_request_dict(request)
187 16f7d0d9 Dionysis Grigoropoulos
    user_id = request.user_uniq
188 16f7d0d9 Dionysis Grigoropoulos
189 16f7d0d9 Dionysis Grigoropoulos
    try:
190 16f7d0d9 Dionysis Grigoropoulos
        subnet = dictionary['subnet']
191 16f7d0d9 Dionysis Grigoropoulos
    except KeyError:
192 16f7d0d9 Dionysis Grigoropoulos
        raise api.faults.BadRequest("Malformed request")
193 16f7d0d9 Dionysis Grigoropoulos
194 5d83d2ff Dionysis Grigoropoulos
    if len(subnet) != 1 or "name" not in subnet:
195 16f7d0d9 Dionysis Grigoropoulos
        raise api.faults.BadRequest("Only the name of subnet can be updated")
196 16f7d0d9 Dionysis Grigoropoulos
197 16f7d0d9 Dionysis Grigoropoulos
    name = subnet.get("name", None)
198 16f7d0d9 Dionysis Grigoropoulos
199 8646e606 Dionysis Grigoropoulos
    subnet_dict = subnet_to_dict(subnets.update_subnet(sub_id, name, user_id))
200 16f7d0d9 Dionysis Grigoropoulos
    data = json.dumps({'subnet': subnet_dict})
201 16f7d0d9 Dionysis Grigoropoulos
    return HttpResponse(data, status=200)
202 16f7d0d9 Dionysis Grigoropoulos
203 16f7d0d9 Dionysis Grigoropoulos
204 16f7d0d9 Dionysis Grigoropoulos
#Utility functions
205 16f7d0d9 Dionysis Grigoropoulos
def subnet_to_dict(subnet):
206 16f7d0d9 Dionysis Grigoropoulos
    """Returns a dictionary containing the info of a subnet"""
207 911a1bc1 Dionysis Grigoropoulos
    dns = check_empty_lists(subnet.dns_nameservers)
208 911a1bc1 Dionysis Grigoropoulos
    hosts = check_empty_lists(subnet.host_routes)
209 4445f97a Dionysis Grigoropoulos
    allocation_pools = subnet.ip_pools.all()
210 4445f97a Dionysis Grigoropoulos
    pools = list()
211 4445f97a Dionysis Grigoropoulos
212 4445f97a Dionysis Grigoropoulos
    if allocation_pools:
213 4445f97a Dionysis Grigoropoulos
        for pool in allocation_pools:
214 b7311f3d Dionysis Grigoropoulos
            cidr = ipaddr.IPNetwork(pool.base)
215 4445f97a Dionysis Grigoropoulos
            start = str(cidr.network + pool.offset)
216 4445f97a Dionysis Grigoropoulos
            end = str(cidr.network + pool.offset + pool.size - 1)
217 868e4ce0 Dionysis Grigoropoulos
            pools.append({"start": start, "end": end})
218 911a1bc1 Dionysis Grigoropoulos
219 911a1bc1 Dionysis Grigoropoulos
    dictionary = dict({'id': str(subnet.id),
220 911a1bc1 Dionysis Grigoropoulos
                       'network_id': str(subnet.network.id),
221 911a1bc1 Dionysis Grigoropoulos
                       'name': subnet.name if subnet.name is not None else "",
222 911a1bc1 Dionysis Grigoropoulos
                       'tenant_id': subnet.network.userid,
223 911a1bc1 Dionysis Grigoropoulos
                       'user_id': subnet.network.userid,
224 16f7d0d9 Dionysis Grigoropoulos
                       'gateway_ip': subnet.gateway,
225 911a1bc1 Dionysis Grigoropoulos
                       'ip_version': subnet.ipversion,
226 911a1bc1 Dionysis Grigoropoulos
                       'cidr': subnet.cidr,
227 16f7d0d9 Dionysis Grigoropoulos
                       'enable_dhcp': subnet.dhcp,
228 911a1bc1 Dionysis Grigoropoulos
                       'dns_nameservers': dns,
229 911a1bc1 Dionysis Grigoropoulos
                       'host_routes': hosts,
230 4445f97a Dionysis Grigoropoulos
                       'allocation_pools': pools if pools is not None else []})
231 97ca522f Dionysis Grigoropoulos
232 97ca522f Dionysis Grigoropoulos
    if subnet.ipversion == 6:
233 b7311f3d Dionysis Grigoropoulos
        dictionary['enable_slaac'] = subnet.dhcp
234 97ca522f Dionysis Grigoropoulos
235 24ea227b Dionysis Grigoropoulos
    dictionary['links'] = util.subnet_to_links(subnet.id)
236 16f7d0d9 Dionysis Grigoropoulos
    return dictionary
237 16f7d0d9 Dionysis Grigoropoulos
238 16f7d0d9 Dionysis Grigoropoulos
239 4445f97a Dionysis Grigoropoulos
def string_to_ipaddr(pools):
240 316787ab Dionysis Grigoropoulos
    """Convert [["192.168.42.1", "192.168.42.15"],
241 316787ab Dionysis Grigoropoulos
                ["192.168.42.30", "192.168.42.60"]]
242 4445f97a Dionysis Grigoropoulos
    to
243 316787ab Dionysis Grigoropoulos
                [[IPv4Address('192.168.42.1'), IPv4Address('192.168.42.15')],
244 316787ab Dionysis Grigoropoulos
                [IPv4Address('192.168.42.30'), IPv4Address('192.168.42.60')]]
245 4445f97a Dionysis Grigoropoulos
    and sort the output
246 316787ab Dionysis Grigoropoulos

247 4445f97a Dionysis Grigoropoulos
    """
248 b7311f3d Dionysis Grigoropoulos
    pool_list = [(map(lambda ip_str: ipaddr.IPAddress(ip_str), pool))
249 4445f97a Dionysis Grigoropoulos
                 for pool in pools]
250 4445f97a Dionysis Grigoropoulos
    pool_list.sort()
251 4445f97a Dionysis Grigoropoulos
    return pool_list
252 4445f97a Dionysis Grigoropoulos
253 4445f97a Dionysis Grigoropoulos
254 911a1bc1 Dionysis Grigoropoulos
def check_empty_lists(value):
255 911a1bc1 Dionysis Grigoropoulos
    """Check if value is Null/None, in which case we return an empty list"""
256 911a1bc1 Dionysis Grigoropoulos
    if value is None:
257 911a1bc1 Dionysis Grigoropoulos
        return []
258 911a1bc1 Dionysis Grigoropoulos
    return value
259 911a1bc1 Dionysis Grigoropoulos
260 911a1bc1 Dionysis Grigoropoulos
261 16f7d0d9 Dionysis Grigoropoulos
def check_name_length(name):
262 16f7d0d9 Dionysis Grigoropoulos
    """Check if the length of a name is within acceptable value"""
263 16f7d0d9 Dionysis Grigoropoulos
    if len(str(name)) > Subnet.SUBNET_NAME_LENGTH:
264 16f7d0d9 Dionysis Grigoropoulos
        raise api.faults.BadRequest("Subnet name too long")
265 16f7d0d9 Dionysis Grigoropoulos
    return name
266 16f7d0d9 Dionysis Grigoropoulos
267 16f7d0d9 Dionysis Grigoropoulos
268 16f7d0d9 Dionysis Grigoropoulos
def get_subnet_fromdb(subnet_id, user_id, for_update=False):
269 316787ab Dionysis Grigoropoulos
    """Return a Subnet instance or raise ItemNotFound.
270 16f7d0d9 Dionysis Grigoropoulos
    This is the same as util.get_network
271 316787ab Dionysis Grigoropoulos

272 16f7d0d9 Dionysis Grigoropoulos
    """
273 16f7d0d9 Dionysis Grigoropoulos
    try:
274 16f7d0d9 Dionysis Grigoropoulos
        subnet_id = int(subnet_id)
275 16f7d0d9 Dionysis Grigoropoulos
        if for_update:
276 16f7d0d9 Dionysis Grigoropoulos
            return Subnet.objects.select_for_update().get(id=subnet_id,
277 16f7d0d9 Dionysis Grigoropoulos
                                                          network__userid=
278 16f7d0d9 Dionysis Grigoropoulos
                                                          user_id)
279 16f7d0d9 Dionysis Grigoropoulos
        return Subnet.objects.get(id=subnet_id, network__userid=user_id)
280 16f7d0d9 Dionysis Grigoropoulos
    except (ValueError, Subnet.DoesNotExist):
281 911a1bc1 Dionysis Grigoropoulos
        raise api.faults.ItemNotFound('Subnet not found')
282 812a1114 Dionysis Grigoropoulos
283 812a1114 Dionysis Grigoropoulos
284 812a1114 Dionysis Grigoropoulos
def parse_ip_pools(pools):
285 316787ab Dionysis Grigoropoulos
    """Convert [{'start': '192.168.42.1', 'end': '192.168.42.15'},
286 812a1114 Dionysis Grigoropoulos
             {'start': '192.168.42.30', 'end': '192.168.42.60'}]
287 812a1114 Dionysis Grigoropoulos
    to
288 812a1114 Dionysis Grigoropoulos
            [["192.168.42.1", "192.168.42.15"],
289 812a1114 Dionysis Grigoropoulos
             ["192.168.42.30", "192.168.42.60"]]
290 316787ab Dionysis Grigoropoulos

291 812a1114 Dionysis Grigoropoulos
    """
292 812a1114 Dionysis Grigoropoulos
    pool_list = list()
293 812a1114 Dionysis Grigoropoulos
    for pool in pools:
294 911a1bc1 Dionysis Grigoropoulos
        parse = [pool["start"], pool["end"]]
295 911a1bc1 Dionysis Grigoropoulos
        pool_list.append(parse)
296 812a1114 Dionysis Grigoropoulos
    return pool_list
297 b7311f3d Dionysis Grigoropoulos
298 b7311f3d Dionysis Grigoropoulos
299 b7311f3d Dionysis Grigoropoulos
def check_boolean_value(value, key):
300 b7311f3d Dionysis Grigoropoulos
    """Check if dhcp value is in acceptable values"""
301 b7311f3d Dionysis Grigoropoulos
    if value not in [True, False]:
302 b7311f3d Dionysis Grigoropoulos
        raise api.faults.BadRequest("Malformed request, %s must "
303 b7311f3d Dionysis Grigoropoulos
                                    "be True or False" % key)
304 b7311f3d Dionysis Grigoropoulos
    return value