Statistics
| Branch: | Tag: | Revision:

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.')