Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / tests / subnets.py @ 57c57b88

History | View | Annotate | Download (22.3 kB)

1 6a959c73 Dionysis Grigoropoulos
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 6a959c73 Dionysis Grigoropoulos
#
3 6a959c73 Dionysis Grigoropoulos
# Redistribution and use in source and binary forms, with or without
4 6a959c73 Dionysis Grigoropoulos
# modification, are permitted provided that the following conditions
5 6a959c73 Dionysis Grigoropoulos
# are met:
6 6a959c73 Dionysis Grigoropoulos
#
7 6a959c73 Dionysis Grigoropoulos
#   1. Redistributions of source code must retain the above copyright
8 6a959c73 Dionysis Grigoropoulos
#      notice, this list of conditions and the following disclaimer.
9 6a959c73 Dionysis Grigoropoulos
#
10 6a959c73 Dionysis Grigoropoulos
#  2. Redistributions in binary form must reproduce the above copyright
11 6a959c73 Dionysis Grigoropoulos
#     notice, this list of conditions and the following disclaimer in the
12 6a959c73 Dionysis Grigoropoulos
#     documentation and/or other materials provided with the distribution.
13 6a959c73 Dionysis Grigoropoulos
#
14 6a959c73 Dionysis Grigoropoulos
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 6a959c73 Dionysis Grigoropoulos
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 6a959c73 Dionysis Grigoropoulos
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 6a959c73 Dionysis Grigoropoulos
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 6a959c73 Dionysis Grigoropoulos
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 6a959c73 Dionysis Grigoropoulos
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 6a959c73 Dionysis Grigoropoulos
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 6a959c73 Dionysis Grigoropoulos
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 6a959c73 Dionysis Grigoropoulos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 6a959c73 Dionysis Grigoropoulos
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 6a959c73 Dionysis Grigoropoulos
# SUCH DAMAGE.
25 6a959c73 Dionysis Grigoropoulos
#
26 6a959c73 Dionysis Grigoropoulos
# The views and conclusions contained in the software and documentation are
27 6a959c73 Dionysis Grigoropoulos
# those of the authors and should not be interpreted as representing official
28 6a959c73 Dionysis Grigoropoulos
# policies, either expressed or implied, of GRNET S.A.
29 6a959c73 Dionysis Grigoropoulos
30 6a959c73 Dionysis Grigoropoulos
from snf_django.utils.testing import BaseAPITest
31 6a959c73 Dionysis Grigoropoulos
from django.utils import simplejson as json
32 6a959c73 Dionysis Grigoropoulos
from synnefo.cyclades_settings import cyclades_services
33 6a959c73 Dionysis Grigoropoulos
from synnefo.lib.services import get_service_path
34 6a959c73 Dionysis Grigoropoulos
from synnefo.lib import join_urls
35 6a959c73 Dionysis Grigoropoulos
from ipaddr import IPv4Network
36 6a959c73 Dionysis Grigoropoulos
import json
37 6a959c73 Dionysis Grigoropoulos
import synnefo.db.models_factory as mf
38 6a959c73 Dionysis Grigoropoulos
39 6a959c73 Dionysis Grigoropoulos
40 cdd6fc06 Christos Stavrakakis
NETWORK_URL = get_service_path(cyclades_services, 'network', version='v2.0')
41 cdd6fc06 Christos Stavrakakis
SUBNETS_URL = join_urls(NETWORK_URL, "subnets/")
42 6a959c73 Dionysis Grigoropoulos
43 6a959c73 Dionysis Grigoropoulos
44 6a959c73 Dionysis Grigoropoulos
class SubnetTest(BaseAPITest):
45 6a959c73 Dionysis Grigoropoulos
    def test_list_subnets(self):
46 6a959c73 Dionysis Grigoropoulos
        """Test list subnets without data"""
47 6a959c73 Dionysis Grigoropoulos
        response = self.get(SUBNETS_URL)
48 6a959c73 Dionysis Grigoropoulos
        self.assertSuccess(response)
49 6a959c73 Dionysis Grigoropoulos
        subnets = json.loads(response.content)
50 6a959c73 Dionysis Grigoropoulos
        self.assertEqual(subnets, {'subnets': []})
51 6a959c73 Dionysis Grigoropoulos
52 6a959c73 Dionysis Grigoropoulos
    def test_list_subnets_data(self):
53 6a959c73 Dionysis Grigoropoulos
        """Test list subnets with data"""
54 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
55 6a959c73 Dionysis Grigoropoulos
        test_subnet_ipv4 = mf.IPv4SubnetFactory(network=test_net)
56 911a1bc1 Dionysis Grigoropoulos
        test_subnet_ipv6 = mf.IPv6SubnetFactory(network=test_net, ipversion=6,
57 6a959c73 Dionysis Grigoropoulos
                                                cidr=
58 6a959c73 Dionysis Grigoropoulos
                                                'fd4b:638e:fd7a:f998::/64')
59 6a959c73 Dionysis Grigoropoulos
        response = self.get(SUBNETS_URL, user=test_net.userid)
60 6a959c73 Dionysis Grigoropoulos
        self.assertSuccess(response)
61 6a959c73 Dionysis Grigoropoulos
62 6a959c73 Dionysis Grigoropoulos
    def test_get_subnet(self):
63 6a959c73 Dionysis Grigoropoulos
        """Test get info of a single subnet"""
64 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
65 6a959c73 Dionysis Grigoropoulos
        test_subnet = mf.IPv4SubnetFactory(network=test_net)
66 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_subnet.id))
67 6a959c73 Dionysis Grigoropoulos
        response = self.get(url, user=test_net.userid)
68 6a959c73 Dionysis Grigoropoulos
        self.assertSuccess(response)
69 6a959c73 Dionysis Grigoropoulos
70 6a959c73 Dionysis Grigoropoulos
    def test_get_subnet_404(self):
71 6a959c73 Dionysis Grigoropoulos
        """Test get info of a subnet that doesn't exist"""
72 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, '42')
73 6a959c73 Dionysis Grigoropoulos
        response = self.get(url)
74 6a959c73 Dionysis Grigoropoulos
        self.assertItemNotFound(response)
75 6a959c73 Dionysis Grigoropoulos
76 6a959c73 Dionysis Grigoropoulos
    def test_subnet_delete(self):
77 6a959c73 Dionysis Grigoropoulos
        """Test delete a subnet -- not supported"""
78 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, '42')
79 6a959c73 Dionysis Grigoropoulos
        response = self.delete(url)
80 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
81 6a959c73 Dionysis Grigoropoulos
82 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_success_ipv4(self):
83 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet successfully"""
84 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
85 6a959c73 Dionysis Grigoropoulos
        request = {
86 6a959c73 Dionysis Grigoropoulos
            'subnet': {
87 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
88 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
89 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4}
90 6a959c73 Dionysis Grigoropoulos
        }
91 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
92 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
93 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
94 411e5025 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
95 411e5025 Dionysis Grigoropoulos
        self.assertEqual("10.0.3.1", resp['gateway_ip'])
96 411e5025 Dionysis Grigoropoulos
        self.assertEqual([{"start": "10.0.3.2", "end": "10.0.3.254"}],
97 411e5025 Dionysis Grigoropoulos
                         resp['allocation_pools'])
98 411e5025 Dionysis Grigoropoulos
        self.assertEqual(True, resp['enable_dhcp'])
99 6a959c73 Dionysis Grigoropoulos
100 b7311f3d Dionysis Grigoropoulos
    def test_create_subnet_success_ipv4_with_slaac(self):
101 b7311f3d Dionysis Grigoropoulos
        """Test create an IPv4 subnet, with a slaac that will be ingored"""
102 97ca522f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
103 97ca522f Dionysis Grigoropoulos
        request = {
104 97ca522f Dionysis Grigoropoulos
            'subnet': {
105 97ca522f Dionysis Grigoropoulos
                'network_id': test_net.id,
106 97ca522f Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
107 97ca522f Dionysis Grigoropoulos
                'ip_version': 4,
108 b7311f3d Dionysis Grigoropoulos
                'enable_slaac': False}
109 97ca522f Dionysis Grigoropoulos
        }
110 97ca522f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
111 97ca522f Dionysis Grigoropoulos
                             json.dumps(request), "json")
112 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
113 97ca522f Dionysis Grigoropoulos
114 b7311f3d Dionysis Grigoropoulos
    def test_create_subnet_success_ipv6_with_slaac(self):
115 b7311f3d Dionysis Grigoropoulos
        """Test create a subnet with ipv6 and slaac"""
116 97ca522f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
117 97ca522f Dionysis Grigoropoulos
        request = {
118 97ca522f Dionysis Grigoropoulos
            'subnet': {
119 97ca522f Dionysis Grigoropoulos
                'network_id': test_net.id,
120 97ca522f Dionysis Grigoropoulos
                'cidr': 'fdc1:4992:1130:fc0b::/64',
121 97ca522f Dionysis Grigoropoulos
                'ip_version': 6,
122 b7311f3d Dionysis Grigoropoulos
                'enable_slaac': False}
123 97ca522f Dionysis Grigoropoulos
        }
124 97ca522f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
125 97ca522f Dionysis Grigoropoulos
                             json.dumps(request), "json")
126 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
127 411e5025 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
128 411e5025 Dionysis Grigoropoulos
        self.assertEqual("fdc1:4992:1130:fc0b::1", resp['gateway_ip'])
129 411e5025 Dionysis Grigoropoulos
        self.assertEqual([], resp['allocation_pools'])
130 b7311f3d Dionysis Grigoropoulos
        self.assertEqual(False, resp['enable_slaac'])
131 97ca522f Dionysis Grigoropoulos
132 b7311f3d Dionysis Grigoropoulos
    def test_create_subnet_with_malformed_slaac(self):
133 b7311f3d Dionysis Grigoropoulos
        """Test create a subnet with ipv6 and a malformed slaac"""
134 97ca522f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
135 97ca522f Dionysis Grigoropoulos
        request = {
136 97ca522f Dionysis Grigoropoulos
            'subnet': {
137 97ca522f Dionysis Grigoropoulos
                'network_id': test_net.id,
138 97ca522f Dionysis Grigoropoulos
                'cidr': 'fdc1:4992:1130:fc0b::/64',
139 97ca522f Dionysis Grigoropoulos
                'ip_version': 6,
140 b7311f3d Dionysis Grigoropoulos
                'enable_slaac': 'Random'}
141 97ca522f Dionysis Grigoropoulos
        }
142 97ca522f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
143 97ca522f Dionysis Grigoropoulos
                             json.dumps(request), "json")
144 97ca522f Dionysis Grigoropoulos
        self.assertBadRequest(response)
145 97ca522f Dionysis Grigoropoulos
146 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_success_ipv6(self):
147 6a959c73 Dionysis Grigoropoulos
        """Test create an IPv6 subnet successfully"""
148 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
149 6a959c73 Dionysis Grigoropoulos
        request = {
150 6a959c73 Dionysis Grigoropoulos
            'subnet': {
151 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
152 6a959c73 Dionysis Grigoropoulos
                'cidr': 'fdc1:4992:1130:fc0b::/64',
153 6a959c73 Dionysis Grigoropoulos
                'ip_version': 6}
154 6a959c73 Dionysis Grigoropoulos
        }
155 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
156 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
157 57c57b88 Dionysis Grigoropoulos
        self.assertSuccess201(response)
158 6a959c73 Dionysis Grigoropoulos
159 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_ip_pool_allocation(self):
160 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with an IP pool"""
161 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
162 6a959c73 Dionysis Grigoropoulos
        request = {
163 6a959c73 Dionysis Grigoropoulos
            'subnet': {
164 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
165 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
166 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4,
167 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
168 01adca6b Dionysis Grigoropoulos
                    'start': '10.0.3.2',
169 01adca6b Dionysis Grigoropoulos
                    'end': '10.0.3.252'}
170 6a959c73 Dionysis Grigoropoulos
                ]}
171 6a959c73 Dionysis Grigoropoulos
        }
172 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
173 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
174 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
175 6a959c73 Dionysis Grigoropoulos
176 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_multiple_ip_pools(self):
177 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with multiple IP pools"""
178 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
179 6a959c73 Dionysis Grigoropoulos
        request = {
180 6a959c73 Dionysis Grigoropoulos
            'subnet': {
181 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
182 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
183 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4,
184 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
185 01adca6b Dionysis Grigoropoulos
                    'start': '10.0.3.2',
186 6a959c73 Dionysis Grigoropoulos
                    'end': '10.0.3.100'}, {
187 6a959c73 Dionysis Grigoropoulos
                    'start': '10.0.3.200',
188 6a959c73 Dionysis Grigoropoulos
                    'end': '10.0.3.220'}
189 6a959c73 Dionysis Grigoropoulos
                ]}
190 6a959c73 Dionysis Grigoropoulos
        }
191 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
192 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
193 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
194 411e5025 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
195 411e5025 Dionysis Grigoropoulos
        self.assertEqual([{"start": "10.0.3.2", "end": "10.0.3.100"},
196 411e5025 Dionysis Grigoropoulos
                          {"start": "10.0.3.200", "end": "10.0.3.220"}],
197 411e5025 Dionysis Grigoropoulos
                         resp['allocation_pools'])
198 6a959c73 Dionysis Grigoropoulos
199 fef04862 Dionysis Grigoropoulos
    def test_create_subnet_with_gateway(self):
200 fef04862 Dionysis Grigoropoulos
        """Test create a subnet with a gateway"""
201 fef04862 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
202 fef04862 Dionysis Grigoropoulos
        request = {
203 fef04862 Dionysis Grigoropoulos
            'subnet': {
204 fef04862 Dionysis Grigoropoulos
                'network_id': test_net.id,
205 fef04862 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
206 fef04862 Dionysis Grigoropoulos
                'ip_version': 4,
207 fef04862 Dionysis Grigoropoulos
                'gateway_ip': '10.0.3.150'}
208 fef04862 Dionysis Grigoropoulos
        }
209 fef04862 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
210 fef04862 Dionysis Grigoropoulos
                             json.dumps(request), "json")
211 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
212 fef04862 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
213 fef04862 Dionysis Grigoropoulos
        self.assertEqual("10.0.3.150", resp['gateway_ip'])
214 fef04862 Dionysis Grigoropoulos
        self.assertEqual([{"start": "10.0.3.1", "end": "10.0.3.149"},
215 fef04862 Dionysis Grigoropoulos
                          {"start": "10.0.3.151", "end": "10.0.3.254"}],
216 fef04862 Dionysis Grigoropoulos
                         resp['allocation_pools'])
217 fef04862 Dionysis Grigoropoulos
218 01adca6b Dionysis Grigoropoulos
    def test_create_subnet_with_gateway_inside_of_ip_pool_range(self):
219 fef04862 Dionysis Grigoropoulos
        """Test create a subnet with a gateway IP inside the IP pool range"""
220 01adca6b Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
221 01adca6b Dionysis Grigoropoulos
        request = {
222 01adca6b Dionysis Grigoropoulos
            'subnet': {
223 01adca6b Dionysis Grigoropoulos
                'network_id': test_net.id,
224 01adca6b Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
225 01adca6b Dionysis Grigoropoulos
                'ip_version': 4,
226 01adca6b Dionysis Grigoropoulos
                'gateway_ip': '10.0.3.1',
227 01adca6b Dionysis Grigoropoulos
                'allocation_pools': [{
228 01adca6b Dionysis Grigoropoulos
                    'start': '10.0.3.0',
229 01adca6b Dionysis Grigoropoulos
                    'end': '10.0.3.255'}
230 01adca6b Dionysis Grigoropoulos
                ]}
231 01adca6b Dionysis Grigoropoulos
        }
232 01adca6b Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
233 01adca6b Dionysis Grigoropoulos
                             json.dumps(request), "json")
234 01adca6b Dionysis Grigoropoulos
        self.assertConflict(response)
235 01adca6b Dionysis Grigoropoulos
236 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_ip_pool_outside_of_network_range(self):
237 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with an IP pool outside of network range"""
238 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
239 6a959c73 Dionysis Grigoropoulos
        request = {
240 6a959c73 Dionysis Grigoropoulos
            'subnet': {
241 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
242 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
243 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4,
244 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
245 6a959c73 Dionysis Grigoropoulos
                    'start': '10.0.8.0',
246 01adca6b Dionysis Grigoropoulos
                    'end': '10.0.1.250'}
247 6a959c73 Dionysis Grigoropoulos
                ]}
248 6a959c73 Dionysis Grigoropoulos
        }
249 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
250 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
251 01adca6b Dionysis Grigoropoulos
        self.assertConflict(response)
252 6a959c73 Dionysis Grigoropoulos
253 eb5f7eb0 Dionysis Grigoropoulos
    def test_create_subnet_with_gateway_as_the_last_ip_of_subnet(self):
254 eb5f7eb0 Dionysis Grigoropoulos
        """Test create a subnet with a gateway, as the last IP of the subnet"""
255 eb5f7eb0 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
256 eb5f7eb0 Dionysis Grigoropoulos
        request = {
257 eb5f7eb0 Dionysis Grigoropoulos
            'subnet': {
258 eb5f7eb0 Dionysis Grigoropoulos
                'network_id': test_net.id,
259 eb5f7eb0 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
260 eb5f7eb0 Dionysis Grigoropoulos
                'ip_version': 4,
261 57c57b88 Dionysis Grigoropoulos
                'gateway_ip': '10.0.3.254'}
262 eb5f7eb0 Dionysis Grigoropoulos
        }
263 eb5f7eb0 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
264 eb5f7eb0 Dionysis Grigoropoulos
                             json.dumps(request), "json")
265 57c57b88 Dionysis Grigoropoulos
        self.assertSuccess201(response)
266 eb5f7eb0 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
267 eb5f7eb0 Dionysis Grigoropoulos
        self.assertEqual("10.0.3.254", resp['gateway_ip'])
268 eb5f7eb0 Dionysis Grigoropoulos
        self.assertEqual([{"start": "10.0.3.1", "end": "10.0.3.253"}],
269 eb5f7eb0 Dionysis Grigoropoulos
                         resp['allocation_pools'])
270 eb5f7eb0 Dionysis Grigoropoulos
271 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_ip_pool_end_lower_than_start(self):
272 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with a pool where end is lower than start"""
273 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
274 6a959c73 Dionysis Grigoropoulos
        request = {
275 6a959c73 Dionysis Grigoropoulos
            'subnet': {
276 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
277 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
278 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4,
279 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
280 6a959c73 Dionysis Grigoropoulos
                    'start': '10.0.1.10',
281 6a959c73 Dionysis Grigoropoulos
                    'end': '10.0.1.5'}
282 6a959c73 Dionysis Grigoropoulos
                ]}
283 6a959c73 Dionysis Grigoropoulos
        }
284 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
285 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
286 01adca6b Dionysis Grigoropoulos
        self.assertConflict(response)
287 6a959c73 Dionysis Grigoropoulos
288 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_ip_pool_in_a_ipv6_subnet(self):
289 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with an ip pool, in an IPv6 subnet """
290 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
291 6a959c73 Dionysis Grigoropoulos
        request = {
292 6a959c73 Dionysis Grigoropoulos
            'subnet': {
293 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
294 6a959c73 Dionysis Grigoropoulos
                'cidr': 'fd4b:638e:fd7a:f998::/64',
295 6a959c73 Dionysis Grigoropoulos
                'ip_version': 6,
296 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
297 6a959c73 Dionysis Grigoropoulos
                    'start': '10.0.1.10',
298 6a959c73 Dionysis Grigoropoulos
                    'end': '10.0.1.5'}
299 6a959c73 Dionysis Grigoropoulos
                ]}
300 6a959c73 Dionysis Grigoropoulos
        }
301 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid,
302 6a959c73 Dionysis Grigoropoulos
                             json.dumps(request), "json")
303 01adca6b Dionysis Grigoropoulos
        self.assertConflict(response)
304 6a959c73 Dionysis Grigoropoulos
305 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_network_id(self):
306 6a959c73 Dionysis Grigoropoulos
        """Test create a subnet with a network id that doesn't exist"""
307 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
308 6a959c73 Dionysis Grigoropoulos
        request = {
309 6a959c73 Dionysis Grigoropoulos
            'subnet': {
310 6a959c73 Dionysis Grigoropoulos
                'network_id': '420000',
311 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
312 6a959c73 Dionysis Grigoropoulos
                'ip_version': 4}
313 6a959c73 Dionysis Grigoropoulos
        }
314 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
315 6a959c73 Dionysis Grigoropoulos
                             "json")
316 6a959c73 Dionysis Grigoropoulos
        self.assertItemNotFound(response)
317 6a959c73 Dionysis Grigoropoulos
318 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_malformed_ipversion(self):
319 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with a malformed ip_version type"""
320 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
321 6a959c73 Dionysis Grigoropoulos
        request = {
322 6a959c73 Dionysis Grigoropoulos
            'subnet': {
323 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
324 6a959c73 Dionysis Grigoropoulos
                'cidr': '10.0.3.0/24',
325 6a959c73 Dionysis Grigoropoulos
                'ip_version': 8}
326 6a959c73 Dionysis Grigoropoulos
        }
327 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
328 6a959c73 Dionysis Grigoropoulos
                             "json")
329 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
330 6a959c73 Dionysis Grigoropoulos
331 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_cidr(self):
332 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with an invalid cidr"""
333 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
334 6a959c73 Dionysis Grigoropoulos
        request = {
335 6a959c73 Dionysis Grigoropoulos
            'subnet': {
336 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
337 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/8'}
338 6a959c73 Dionysis Grigoropoulos
        }
339 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
340 6a959c73 Dionysis Grigoropoulos
                             "json")
341 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
342 6a959c73 Dionysis Grigoropoulos
343 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_gateway(self):
344 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with a gateway outside of the subnet range"""
345 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
346 6a959c73 Dionysis Grigoropoulos
        request = {
347 6a959c73 Dionysis Grigoropoulos
            'subnet': {
348 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
349 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
350 6a959c73 Dionysis Grigoropoulos
                'gateway_ip': '192.168.0.1'}
351 6a959c73 Dionysis Grigoropoulos
        }
352 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
353 6a959c73 Dionysis Grigoropoulos
                             "json")
354 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
355 6a959c73 Dionysis Grigoropoulos
356 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_name(self):
357 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with an invalid subnet name"""
358 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
359 6a959c73 Dionysis Grigoropoulos
        request = {
360 6a959c73 Dionysis Grigoropoulos
            'subnet': {
361 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
362 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
363 6a959c73 Dionysis Grigoropoulos
                'name': 'a' * 300}
364 6a959c73 Dionysis Grigoropoulos
        }
365 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
366 6a959c73 Dionysis Grigoropoulos
                             "json")
367 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
368 6a959c73 Dionysis Grigoropoulos
369 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_invalid_dhcp(self):
370 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with an invalid dhcp value"""
371 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
372 6a959c73 Dionysis Grigoropoulos
        request = {
373 6a959c73 Dionysis Grigoropoulos
            'subnet': {
374 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
375 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
376 6a959c73 Dionysis Grigoropoulos
                'enable_dhcp': 'None'}
377 6a959c73 Dionysis Grigoropoulos
        }
378 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
379 6a959c73 Dionysis Grigoropoulos
                             "json")
380 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
381 6a959c73 Dionysis Grigoropoulos
382 97ca522f Dionysis Grigoropoulos
    def test_create_subnet_with_dhcp_set_to_false(self):
383 97ca522f Dionysis Grigoropoulos
        """Create a subnet with a dhcp set to false"""
384 97ca522f Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
385 97ca522f Dionysis Grigoropoulos
        request = {
386 97ca522f Dionysis Grigoropoulos
            'subnet': {
387 97ca522f Dionysis Grigoropoulos
                'network_id': test_net.id,
388 97ca522f Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
389 97ca522f Dionysis Grigoropoulos
                'enable_dhcp': False}
390 97ca522f Dionysis Grigoropoulos
        }
391 97ca522f Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
392 97ca522f Dionysis Grigoropoulos
                             "json")
393 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
394 97ca522f Dionysis Grigoropoulos
395 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_dns_nameservers(self):
396 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with dns nameservers"""
397 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
398 6a959c73 Dionysis Grigoropoulos
        request = {
399 6a959c73 Dionysis Grigoropoulos
            'subnet': {
400 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
401 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
402 6a959c73 Dionysis Grigoropoulos
                'dns_nameservers': ['8.8.8.8', '1.1.1.1']}
403 6a959c73 Dionysis Grigoropoulos
        }
404 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
405 6a959c73 Dionysis Grigoropoulos
                             "json")
406 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
407 6a959c73 Dionysis Grigoropoulos
408 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_host_routes(self):
409 6a959c73 Dionysis Grigoropoulos
        """Create a subnet with dns nameservers"""
410 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
411 6a959c73 Dionysis Grigoropoulos
        request = {
412 6a959c73 Dionysis Grigoropoulos
            'subnet': {
413 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
414 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24',
415 6a959c73 Dionysis Grigoropoulos
                'host_routes': ['8.8.8.8', '1.1.1.1']}
416 6a959c73 Dionysis Grigoropoulos
        }
417 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
418 6a959c73 Dionysis Grigoropoulos
                             "json")
419 83157287 Dionysis Grigoropoulos
        self.assertSuccess201(response)
420 411e5025 Dionysis Grigoropoulos
        resp = json.loads(response.content)['subnet']
421 411e5025 Dionysis Grigoropoulos
        self.assertEqual(["8.8.8.8", "1.1.1.1"], resp["host_routes"])
422 6a959c73 Dionysis Grigoropoulos
423 6a959c73 Dionysis Grigoropoulos
    def test_create_subnet_with_same_ipversion(self):
424 6a959c73 Dionysis Grigoropoulos
        """
425 6a959c73 Dionysis Grigoropoulos
        Create a subnet in a network with another subnet of the same
426 6a959c73 Dionysis Grigoropoulos
        ipversion type
427 6a959c73 Dionysis Grigoropoulos
        """
428 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
429 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
430 6a959c73 Dionysis Grigoropoulos
        request = {
431 6a959c73 Dionysis Grigoropoulos
            'subnet': {
432 6a959c73 Dionysis Grigoropoulos
                'network_id': test_net.id,
433 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.3.0/24'}
434 6a959c73 Dionysis Grigoropoulos
        }
435 6a959c73 Dionysis Grigoropoulos
        response = self.post(SUBNETS_URL, test_net.userid, json.dumps(request),
436 6a959c73 Dionysis Grigoropoulos
                             "json")
437 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
438 6a959c73 Dionysis Grigoropoulos
439 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_ip_version(self):
440 6a959c73 Dionysis Grigoropoulos
        """Update the IP version of a subnet, raises 400 BadRequest"""
441 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
442 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
443 6a959c73 Dionysis Grigoropoulos
        request = {
444 6a959c73 Dionysis Grigoropoulos
            'subnet': {
445 6a959c73 Dionysis Grigoropoulos
                'ip_version': '6'}
446 6a959c73 Dionysis Grigoropoulos
        }
447 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
448 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
449 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
450 6a959c73 Dionysis Grigoropoulos
451 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_cidr(self):
452 6a959c73 Dionysis Grigoropoulos
        """Update the cidr of a subnet, raises 400 BadRequest"""
453 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
454 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
455 6a959c73 Dionysis Grigoropoulos
        request = {
456 6a959c73 Dionysis Grigoropoulos
            'subnet': {
457 6a959c73 Dionysis Grigoropoulos
                'cidr': '192.168.42.0/24'}
458 6a959c73 Dionysis Grigoropoulos
        }
459 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
460 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
461 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
462 6a959c73 Dionysis Grigoropoulos
463 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_allocation_pools(self):
464 6a959c73 Dionysis Grigoropoulos
        """Update the allocation pools of a subnet, raises 400 BadRequest"""
465 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
466 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
467 6a959c73 Dionysis Grigoropoulos
        request = {
468 6a959c73 Dionysis Grigoropoulos
            'subnet': {
469 6a959c73 Dionysis Grigoropoulos
                'allocation_pools': [{
470 6a959c73 Dionysis Grigoropoulos
                    'start': '10.0.3.0',
471 6a959c73 Dionysis Grigoropoulos
                    'end': '10.0.3.255'}
472 6a959c73 Dionysis Grigoropoulos
                ]}
473 6a959c73 Dionysis Grigoropoulos
        }
474 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
475 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
476 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
477 6a959c73 Dionysis Grigoropoulos
478 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_add_dns(self):
479 6a959c73 Dionysis Grigoropoulos
        """Update the dns nameservers of a subnet, raises 400 BadRequest"""
480 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
481 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
482 6a959c73 Dionysis Grigoropoulos
        request = {
483 6a959c73 Dionysis Grigoropoulos
            'subnet': {
484 6a959c73 Dionysis Grigoropoulos
                'dns_nameservers': ['8.8.8.8']}
485 6a959c73 Dionysis Grigoropoulos
        }
486 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
487 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
488 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
489 6a959c73 Dionysis Grigoropoulos
490 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_add_host_routes(self):
491 6a959c73 Dionysis Grigoropoulos
        """Update the host routes of a subnet, raises 400 BadRequest"""
492 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
493 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
494 6a959c73 Dionysis Grigoropoulos
        request = {
495 6a959c73 Dionysis Grigoropoulos
            'subnet': {
496 6a959c73 Dionysis Grigoropoulos
                'host_routes': ['8.8.8.8']}
497 6a959c73 Dionysis Grigoropoulos
        }
498 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
499 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
500 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
501 6a959c73 Dionysis Grigoropoulos
502 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_with_invalid_dhcp_value(self):
503 6a959c73 Dionysis Grigoropoulos
        """Update a subnet with an invalid dhcp value"""
504 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
505 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
506 6a959c73 Dionysis Grigoropoulos
        request = {
507 6a959c73 Dionysis Grigoropoulos
            'subnet': {
508 6a959c73 Dionysis Grigoropoulos
                'enable_dhcp': 'Random'}
509 6a959c73 Dionysis Grigoropoulos
        }
510 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
511 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
512 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
513 6a959c73 Dionysis Grigoropoulos
514 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_with_invalid_name(self):
515 6a959c73 Dionysis Grigoropoulos
        """Update a subnet with an invalid name value"""
516 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
517 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
518 6a959c73 Dionysis Grigoropoulos
        request = {
519 6a959c73 Dionysis Grigoropoulos
            'subnet': {
520 6a959c73 Dionysis Grigoropoulos
                'name': 'a' * 300}
521 6a959c73 Dionysis Grigoropoulos
        }
522 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
523 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
524 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
525 6a959c73 Dionysis Grigoropoulos
526 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_with_invalid_gateway(self):
527 6a959c73 Dionysis Grigoropoulos
        """Update a subnet with an invalid gateway value"""
528 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
529 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
530 6a959c73 Dionysis Grigoropoulos
        request = {
531 6a959c73 Dionysis Grigoropoulos
            'subnet': {
532 6a959c73 Dionysis Grigoropoulos
                'gateway_ip': '192.168.200.0/24'}
533 6a959c73 Dionysis Grigoropoulos
        }
534 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
535 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
536 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
537 6a959c73 Dionysis Grigoropoulos
538 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_gateway(self):
539 6a959c73 Dionysis Grigoropoulos
        """Update the gateway of a subnet"""
540 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
541 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
542 6a959c73 Dionysis Grigoropoulos
        request = {
543 6a959c73 Dionysis Grigoropoulos
            'subnet': {
544 6a959c73 Dionysis Grigoropoulos
                'gateway_ip': str(IPv4Network(test_sub.gateway).network + 1)}
545 6a959c73 Dionysis Grigoropoulos
        }
546 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
547 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
548 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)
549 6a959c73 Dionysis Grigoropoulos
550 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_name(self):
551 6a959c73 Dionysis Grigoropoulos
        """Update the name of a subnet"""
552 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
553 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
554 6a959c73 Dionysis Grigoropoulos
        request = {
555 6a959c73 Dionysis Grigoropoulos
            'subnet': {
556 6a959c73 Dionysis Grigoropoulos
                'name': 'Updated Name'}
557 6a959c73 Dionysis Grigoropoulos
        }
558 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
559 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
560 6a959c73 Dionysis Grigoropoulos
        self.assertSuccess(response)
561 6a959c73 Dionysis Grigoropoulos
562 6a959c73 Dionysis Grigoropoulos
    def test_update_subnet_dhcp(self):
563 6a959c73 Dionysis Grigoropoulos
        """Update the dhcp flag of a subnet"""
564 6a959c73 Dionysis Grigoropoulos
        test_net = mf.NetworkFactory()
565 6a959c73 Dionysis Grigoropoulos
        test_sub = mf.IPv4SubnetFactory(network=test_net)
566 6a959c73 Dionysis Grigoropoulos
        request = {
567 6a959c73 Dionysis Grigoropoulos
            'subnet': {
568 6a959c73 Dionysis Grigoropoulos
                'enable_dhcp': False}
569 6a959c73 Dionysis Grigoropoulos
        }
570 6a959c73 Dionysis Grigoropoulos
        url = join_urls(SUBNETS_URL, str(test_sub.id))
571 6a959c73 Dionysis Grigoropoulos
        response = self.put(url, test_net.userid, json.dumps(request), "json")
572 6a959c73 Dionysis Grigoropoulos
        self.assertBadRequest(response)