Merge ~ack/maas:user-delete-check-resources into maas:2.3

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: 6e46c4ba7cb5a1cb880b11ad8070226e88c5daec
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:user-delete-check-resources
Merge into: maas:2.3
Diff against target: 435 lines (+96/-53)
9 files modified
src/maasserver/api/tests/test_subnets.py (+1/-4)
src/maasserver/api/tests/test_users.py (+11/-0)
src/maasserver/models/tests/test_staticipaddress.py (+1/-1)
src/maasserver/models/tests/test_subnet.py (+11/-11)
src/maasserver/models/tests/test_userprofile.py (+23/-8)
src/maasserver/models/userprofile.py (+18/-16)
src/maasserver/testing/factory.py (+15/-5)
src/maasserver/triggers/tests/test_system_listener.py (+5/-5)
src/maasserver/triggers/tests/test_websocket_listener.py (+11/-3)
Reviewer Review Type Date Requested Status
MAAS Lander Needs Fixing
Björn Tillenius Approve
Review via email: mp+336204@code.launchpad.net

Commit message

Backport 2c8be509e37f0509a4cd55b3f241b0b8000d20b1 - LP: #1642916: check if user has assigned resources before trying to remove

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

+1

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b user-delete-check-resources lp:~ack/maas/+git/maas into -b 2.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/1274/console
COMMIT: 43d9024c43773fad70ed474e2026b9fb940cb2ea

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b user-delete-check-resources lp:~ack/maas/+git/maas into -b 2.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/1275/console
COMMIT: 42003e84a58f14c6773f1d59e0e7f4cbbd16d528

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b user-delete-check-resources lp:~ack/maas/+git/maas into -b 2.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/1282/console
COMMIT: cdde8968f0e000c119a769afa7b958e2c775961e

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/api/tests/test_subnets.py b/src/maasserver/api/tests/test_subnets.py
2index b6ef174..f0a740a 100644
3--- a/src/maasserver/api/tests/test_subnets.py
4+++ b/src/maasserver/api/tests/test_subnets.py
5@@ -12,7 +12,6 @@ import random
6 from django.conf import settings
7 from maasserver.enum import (
8 IPADDRESS_TYPE,
9- IPRANGE_TYPE,
10 NODE_STATUS,
11 RDNS_MODE_CHOICES,
12 )
13@@ -443,9 +442,7 @@ class TestSubnetUnreservedIPRangesAPI(APITestCase.ForUser):
14 boilerplate that creates the requested range, then makes sure the
15 unreserved_ip_ranges API call successfully returns an empty list.
16 """
17- factory.make_IPRange(
18- subnet, first_address, last_address,
19- type=IPRANGE_TYPE.DYNAMIC)
20+ factory.make_IPRange(subnet, first_address, last_address)
21 response = self.client.get(
22 get_subnet_uri(subnet),
23 {'op': 'unreserved_ip_ranges'})
24diff --git a/src/maasserver/api/tests/test_users.py b/src/maasserver/api/tests/test_users.py
25index 2a2810e..ad83753 100644
26--- a/src/maasserver/api/tests/test_users.py
27+++ b/src/maasserver/api/tests/test_users.py
28@@ -293,6 +293,17 @@ class TestUser(APITestCase.ForUser):
29 self.assertIn(
30 b'1 static IP address(es) are still allocated', response.content)
31
32+ def test_DELETE_user_with_iprange_fails(self):
33+ self.become_admin()
34+ user = factory.make_User()
35+ factory.make_IPRange(user=user)
36+ response = self.client.delete(
37+ reverse('user_handler', args=[user.username]))
38+ self.assertEqual(
39+ http.client.BAD_REQUEST, response.status_code,
40+ response.status_code)
41+ self.assertIn(b'1 IP range(s) are still allocated', response.content)
42+
43 def test_DELETE_user_with_staticaddress_and_transfer(self):
44 self.become_admin()
45 user = factory.make_User()
46diff --git a/src/maasserver/models/tests/test_staticipaddress.py b/src/maasserver/models/tests/test_staticipaddress.py
47index a8a88f6..995bb7a 100644
48--- a/src/maasserver/models/tests/test_staticipaddress.py
49+++ b/src/maasserver/models/tests/test_staticipaddress.py
50@@ -276,7 +276,7 @@ class TestStaticIPAddressManager(MAASServerTestCase):
51 subnet = factory.make_Subnet(cidr=network)
52 factory.make_IPRange(
53 subnet, '192.168.230.1', '192.168.230.254',
54- type=IPRANGE_TYPE.RESERVED)
55+ alloc_type=IPRANGE_TYPE.RESERVED)
56 e = self.assertRaises(
57 StaticIPAddressExhaustion,
58 StaticIPAddress.objects.allocate_new,
59diff --git a/src/maasserver/models/tests/test_subnet.py b/src/maasserver/models/tests/test_subnet.py
60index 3e1c415..15f2810 100644
61--- a/src/maasserver/models/tests/test_subnet.py
62+++ b/src/maasserver/models/tests/test_subnet.py
63@@ -1056,7 +1056,7 @@ class TestSubnetGetLeastRecentlySeenUnknownNeighbour(MAASServerTestCase):
64 ip="10.0.0.2", interface=rackif, updated=yesterday)
65 factory.make_IPRange(
66 subnet, start_ip="10.0.0.2", end_ip="10.0.0.2",
67- type=IPRANGE_TYPE.RESERVED)
68+ alloc_type=IPRANGE_TYPE.RESERVED)
69 discovery = subnet.get_least_recently_seen_unknown_neighbour()
70 self.assertThat(discovery.ip, Equals("10.0.0.1"))
71
72@@ -1078,7 +1078,7 @@ class TestSubnetGetLeastRecentlySeenUnknownNeighbour(MAASServerTestCase):
73 ip="10.0.0.4", interface=rackif, updated=yesterday)
74 factory.make_IPRange(
75 subnet, start_ip="10.0.0.1", end_ip="10.0.0.2",
76- type=IPRANGE_TYPE.RESERVED)
77+ alloc_type=IPRANGE_TYPE.RESERVED)
78 discovery = subnet.get_least_recently_seen_unknown_neighbour()
79 self.assertThat(discovery.ip, Equals("10.0.0.2"))
80
81@@ -1112,7 +1112,7 @@ class TestSubnetGetNextIPForAllocation(MAASServerTestCase):
82 if not self.managed:
83 factory.make_IPRange(
84 subnet, start_ip=first, end_ip=last,
85- type=IPRANGE_TYPE.RESERVED)
86+ alloc_type=IPRANGE_TYPE.RESERVED)
87 subnet = reload_object(subnet)
88 return subnet
89
90@@ -1206,14 +1206,14 @@ class TestUnmanagedSubnets(MAASServerTestCase):
91 managed=False)
92 range1 = factory.make_IPRange(
93 subnet, start_ip='10.0.0.1', end_ip='10.0.0.1',
94- type=IPRANGE_TYPE.RESERVED)
95+ alloc_type=IPRANGE_TYPE.RESERVED)
96 subnet = reload_object(subnet)
97 ip = subnet.get_next_ip_for_allocation()
98 self.assertThat(ip, Equals("10.0.0.1"))
99 range1.delete()
100 factory.make_IPRange(
101 subnet, start_ip='10.0.0.6', end_ip='10.0.0.6',
102- type=IPRANGE_TYPE.RESERVED)
103+ alloc_type=IPRANGE_TYPE.RESERVED)
104 subnet = reload_object(subnet)
105 ip = subnet.get_next_ip_for_allocation()
106 self.assertThat(ip, Equals("10.0.0.6"))
107@@ -1225,7 +1225,7 @@ class TestUnmanagedSubnets(MAASServerTestCase):
108 managed=False)
109 factory.make_IPRange(
110 subnet, start_ip='10.0.0.3', end_ip='10.0.0.4',
111- type=IPRANGE_TYPE.RESERVED)
112+ alloc_type=IPRANGE_TYPE.RESERVED)
113 subnet = reload_object(subnet)
114 ip = subnet.get_next_ip_for_allocation()
115 self.assertThat(ip, Equals("10.0.0.3"))
116@@ -1355,7 +1355,7 @@ class TestSubnetIPExhaustionNotifications(MAASServerTestCase):
117 start_ip=str(IPAddress(range_start)),
118 end_ip=str(IPAddress(range_end)),
119 subnet=self.subnet,
120- type=IPRANGE_TYPE.RESERVED)
121+ alloc_type=IPRANGE_TYPE.RESERVED)
122 else:
123 # Dummy value so we allocate an IP below.
124 range_end = self.ipnetwork.first
125@@ -1387,7 +1387,7 @@ class TestSubnetIPExhaustionNotifications(MAASServerTestCase):
126 start_ip=str(IPAddress(range_start)),
127 end_ip=str(IPAddress(range_end)),
128 subnet=self.subnet,
129- type=IPRANGE_TYPE.RESERVED)
130+ alloc_type=IPRANGE_TYPE.RESERVED)
131 ident = 'ip_exhaustion__subnet_%d' % self.subnet.id
132 notification = get_one(Notification.objects.filter(ident=ident))
133 notification_exists = notification is not None
134@@ -1406,7 +1406,7 @@ class TestSubnetIPExhaustionNotifications(MAASServerTestCase):
135 start_ip=str(IPAddress(range_start)),
136 end_ip=str(IPAddress(range_end)),
137 subnet=self.subnet,
138- type=IPRANGE_TYPE.RESERVED)
139+ alloc_type=IPRANGE_TYPE.RESERVED)
140 ident = 'ip_exhaustion__subnet_%d' % self.subnet.id
141 notification = get_one(Notification.objects.filter(ident=ident))
142 notification_exists = notification is not None
143@@ -1430,7 +1430,7 @@ class TestSubnetIPExhaustionNotifications(MAASServerTestCase):
144 start_ip=str(IPAddress(range_start)),
145 end_ip=str(IPAddress(range_end)),
146 subnet=self.subnet,
147- type=IPRANGE_TYPE.RESERVED)
148+ alloc_type=IPRANGE_TYPE.RESERVED)
149 ident = 'ip_exhaustion__subnet_%d' % self.subnet.id
150 notification = get_one(Notification.objects.filter(ident=ident))
151 notification_exists = notification is not None
152@@ -1460,7 +1460,7 @@ class TestSubnetIPExhaustionNotifications(MAASServerTestCase):
153 start_ip=str(IPAddress(range_start)),
154 end_ip=str(IPAddress(range_end)),
155 subnet=self.subnet,
156- type=IPRANGE_TYPE.RESERVED)
157+ alloc_type=IPRANGE_TYPE.RESERVED)
158 else:
159 # Dummy value so we allocate an IP below.
160 range_end = self.ipnetwork.first
161diff --git a/src/maasserver/models/tests/test_userprofile.py b/src/maasserver/models/tests/test_userprofile.py
162index edb47bf..9fa2ba1 100644
163--- a/src/maasserver/models/tests/test_userprofile.py
164+++ b/src/maasserver/models/tests/test_userprofile.py
165@@ -9,8 +9,6 @@ from django.contrib.auth.models import User
166 from maasserver.exceptions import CannotDeleteUserException
167 from maasserver.models import (
168 FileStorage,
169- Node,
170- StaticIPAddress,
171 UserProfile,
172 )
173 from maasserver.models.user import (
174@@ -20,6 +18,7 @@ from maasserver.models.user import (
175 )
176 from maasserver.testing.factory import factory
177 from maasserver.testing.testcase import MAASServerTestCase
178+from maasserver.utils.orm import reload_object
179 from piston3.models import (
180 Consumer,
181 Token,
182@@ -105,24 +104,40 @@ class UserProfileTest(MAASServerTestCase):
183 # Cannot delete a user with nodes attached to it.
184 profile = factory.make_User().userprofile
185 factory.make_Node(owner=profile.user)
186- self.assertRaises(CannotDeleteUserException, profile.delete)
187+ error = self.assertRaises(CannotDeleteUserException, profile.delete)
188+ self.assertIn('1 node(s)', str(error))
189
190 def test_delete_attached_static_ip_addresses(self):
191 # Cannot delete a user with static IP address attached to it.
192 profile = factory.make_User().userprofile
193 factory.make_StaticIPAddress(user=profile.user)
194- self.assertRaises(CannotDeleteUserException, profile.delete)
195+ error = self.assertRaises(CannotDeleteUserException, profile.delete)
196+ self.assertIn('1 static IP address(es)', str(error))
197+
198+ def test_delete_attached_iprange(self):
199+ # Cannot delete a user with an IP range attached to it.
200+ profile = factory.make_User().userprofile
201+ factory.make_IPRange(user=profile.user)
202+ error = self.assertRaises(CannotDeleteUserException, profile.delete)
203+ self.assertIn('1 IP range(s)', str(error))
204+
205+ def test_delete_attached_multiple_resources(self):
206+ profile = factory.make_User().userprofile
207+ factory.make_Node(owner=profile.user)
208+ factory.make_StaticIPAddress(user=profile.user)
209+ error = self.assertRaises(CannotDeleteUserException, profile.delete)
210+ self.assertIn('1 static IP address(es), 1 node(s)', str(error))
211
212 def test_transfer_resources(self):
213 user = factory.make_User()
214 node = factory.make_Node(owner=user)
215 ipaddress = factory.make_StaticIPAddress(user=user)
216+ iprange = factory.make_IPRange(user=user)
217 new_user = factory.make_User()
218 user.userprofile.transfer_resources(new_user)
219- node = Node.objects.get(id=node.id)
220- self.assertEqual(node.owner, new_user)
221- ipaddress = StaticIPAddress.objects.get(id=ipaddress.id)
222- self.assertEqual(ipaddress.user, new_user)
223+ self.assertEqual(reload_object(node).owner, new_user)
224+ self.assertEqual(reload_object(ipaddress).user, new_user)
225+ self.assertEqual(reload_object(iprange).user, new_user)
226
227 def test_manager_all_users(self):
228 users = set(factory.make_User() for _ in range(3))
229diff --git a/src/maasserver/models/userprofile.py b/src/maasserver/models/userprofile.py
230index a610781..fcffb8d 100644
231--- a/src/maasserver/models/userprofile.py
232+++ b/src/maasserver/models/userprofile.py
233@@ -65,20 +65,21 @@ class UserProfile(CleanSave, Model):
234 completed_intro = BooleanField(default=False)
235
236 def delete(self):
237- addr_count = self.user.staticipaddress_set.count()
238- if addr_count:
239- msg = (
240- "User {} cannot be deleted: {} static IP address(es) "
241- "are still allocated to this user.").format(
242- self.user.username, addr_count)
243- raise CannotDeleteUserException(msg)
244- nb_nodes = self.user.node_set.count()
245- if nb_nodes:
246- msg = (
247- "User {} cannot be deleted: {} node(s) are still "
248- "allocated to this user.").format(
249- self.user.username, nb_nodes)
250- raise CannotDeleteUserException(msg)
251+ # check owned resources
252+ owned_resources = [
253+ ('staticipaddress', 'static IP address(es)'),
254+ ('iprange', 'IP range(s)'),
255+ ('node', 'node(s)')]
256+ messages = []
257+ for attr, title in owned_resources:
258+ count = getattr(self.user, attr + '_set').count()
259+ if count:
260+ messages.append('{} {}'.format(count, title))
261+
262+ if messages:
263+ raise CannotDeleteUserException(
264+ 'User {} cannot be deleted: {} are still allocated'.format(
265+ self.user.username, ', '.join(messages)))
266
267 if self.user.filestorage_set.exists():
268 self.user.filestorage_set.all().delete()
269@@ -89,8 +90,8 @@ class UserProfile(CleanSave, Model):
270 def transfer_resources(self, new_owner):
271 """Transfer owned resources to another user.
272
273- Nodes and static IP addresses owned by the user are transfered to the
274- new owner.
275+ Nodes, static IP addresses and IP ranges owned by the user are
276+ transfered to the new owner.
277
278 :param new_owner: the UserProfile to transfer ownership to.
279 :type new_owner: maasserver.models.UserProfile
280@@ -98,6 +99,7 @@ class UserProfile(CleanSave, Model):
281 """
282 self.user.node_set.update(owner=new_owner)
283 self.user.staticipaddress_set.update(user=new_owner)
284+ self.user.iprange_set.update(user=new_owner)
285
286 def get_authorisation_tokens(self):
287 """Fetches all the user's OAuth tokens.
288diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
289index ddbe633..861cff7 100644
290--- a/src/maasserver/testing/factory.py
291+++ b/src/maasserver/testing/factory.py
292@@ -1324,16 +1324,26 @@ class Factory(maastesting.factory.Factory):
293
294 def make_IPRange(
295 self, subnet=None, start_ip=None, end_ip=None, comment=None,
296- user=None, type=IPRANGE_TYPE.DYNAMIC):
297+ user=None, alloc_type=None):
298+ if alloc_type is None:
299+ alloc_type = (
300+ IPRANGE_TYPE.RESERVED if user else IPRANGE_TYPE.DYNAMIC)
301+
302 if subnet is None and start_ip is None and end_ip is None:
303 subnet = self.make_ipv4_Subnet_with_IPRanges()
304- return subnet.get_dynamic_ranges().first()
305+ iprange = subnet.get_dynamic_ranges().first()
306+ iprange.comment = comment
307+ iprange.user = user
308+ iprange.type = alloc_type
309+ iprange.save()
310+ return iprange
311+
312 # If any of these values are provided, they must all be provided.
313 assert subnet is not None
314 assert start_ip is not None
315 assert end_ip is not None
316 iprange = IPRange(
317- subnet=subnet, start_ip=start_ip, end_ip=end_ip, type=type,
318+ subnet=subnet, start_ip=start_ip, end_ip=end_ip, type=alloc_type,
319 comment=comment, user=user)
320 iprange.save()
321 return iprange
322@@ -1372,13 +1382,13 @@ class Factory(maastesting.factory.Factory):
323 subnet.vlan.dhcp_on = True
324 subnet.vlan.save()
325 self.make_IPRange(
326- subnet, type=IPRANGE_TYPE.DYNAMIC,
327+ subnet, alloc_type=IPRANGE_TYPE.DYNAMIC,
328 start_ip=str(IPAddress(network.first + 2)),
329 end_ip=str(IPAddress(network.first + range_size + 2)))
330 # Create a "static range" for this Subnet.
331 if not with_static_range:
332 self.make_IPRange(
333- subnet, type=IPRANGE_TYPE.RESERVED,
334+ subnet, alloc_type=IPRANGE_TYPE.RESERVED,
335 start_ip=str(IPAddress(network.last - range_size - 2)),
336 end_ip=str(IPAddress(network.last - 2)))
337 return reload_object(subnet)
338diff --git a/src/maasserver/triggers/tests/test_system_listener.py b/src/maasserver/triggers/tests/test_system_listener.py
339index 5e381e2..9124424 100644
340--- a/src/maasserver/triggers/tests/test_system_listener.py
341+++ b/src/maasserver/triggers/tests/test_system_listener.py
342@@ -1436,7 +1436,7 @@ class TestDHCPIPRangeListener(
343 end_ip = str(IPAddress(network.first + 3))
344 yield deferToDatabase(self.create_iprange, {
345 "subnet": subnet,
346- "type": IPRANGE_TYPE.DYNAMIC,
347+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
348 "start_ip": start_ip,
349 "end_ip": end_ip,
350 })
351@@ -1471,7 +1471,7 @@ class TestDHCPIPRangeListener(
352 end_ip = str(IPAddress(network.first + 3))
353 ip_range = yield deferToDatabase(self.create_iprange, {
354 "subnet": subnet,
355- "type": IPRANGE_TYPE.DYNAMIC,
356+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
357 "start_ip": start_ip,
358 "end_ip": end_ip,
359 })
360@@ -1522,7 +1522,7 @@ class TestDHCPIPRangeListener(
361 end_ip = str(IPAddress(network.first + 3))
362 ip_range = yield deferToDatabase(self.create_iprange, {
363 "subnet": subnet,
364- "type": IPRANGE_TYPE.DYNAMIC,
365+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
366 "start_ip": start_ip,
367 "end_ip": end_ip,
368 })
369@@ -1572,7 +1572,7 @@ class TestDHCPIPRangeListener(
370 end_ip = str(IPAddress(network.first + 3))
371 ip_range = yield deferToDatabase(self.create_iprange, {
372 "subnet": subnet,
373- "type": IPRANGE_TYPE.RESERVED,
374+ "alloc_type": IPRANGE_TYPE.RESERVED,
375 "start_ip": start_ip,
376 "end_ip": end_ip,
377 })
378@@ -1622,7 +1622,7 @@ class TestDHCPIPRangeListener(
379 end_ip = str(IPAddress(network.first + 3))
380 ip_range = yield deferToDatabase(self.create_iprange, {
381 "subnet": subnet,
382- "type": IPRANGE_TYPE.DYNAMIC,
383+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
384 "start_ip": start_ip,
385 "end_ip": end_ip,
386 })
387diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py
388index 2d13c57..eb43218 100644
389--- a/src/maasserver/triggers/tests/test_websocket_listener.py
390+++ b/src/maasserver/triggers/tests/test_websocket_listener.py
391@@ -31,6 +31,7 @@ from maasserver.triggers.websocket import register_websocket_triggers
392 from maasserver.utils.orm import transactional
393 from maasserver.utils.threads import deferToDatabase
394 from metadataserver.enum import SCRIPT_STATUS
395+from netaddr import IPAddress
396 from provisioningserver.utils.twisted import (
397 asynchronous,
398 DeferredValue,
399@@ -1695,10 +1696,17 @@ class TestIPRangeListener(
400 listener = self.make_listener_without_delay()
401 dv = DeferredValue()
402 listener.register("iprange", lambda *args: dv.set(args))
403+ network = factory.make_ipv4_network()
404+ subnet = yield deferToDatabase(
405+ self.create_subnet, {'cidr': str(network)})
406+ params = {
407+ 'subnet': subnet,
408+ 'start_ip': str(IPAddress(network.first + 2)),
409+ 'end_ip': str(IPAddress(network.last - 1))}
410 yield listener.startService()
411 try:
412 iprange = yield deferToDatabase(
413- self.create_iprange)
414+ self.create_iprange, params)
415 yield dv.get(timeout=2)
416 self.assertEqual(('create', '%s' % iprange.id), dv.value)
417 finally:
418@@ -3424,7 +3432,7 @@ class TestIPRangeSubnetListener(
419 try:
420 iprange = yield deferToDatabase(
421 self.create_iprange, {
422- "type": IPRANGE_TYPE.DYNAMIC,
423+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
424 "subnet": subnet,
425 "start_ip": '192.168.0.100',
426 "end_ip": '192.168.0.110',
427@@ -3472,7 +3480,7 @@ class TestIPRangeSubnetListener(
428 })
429 iprange = yield deferToDatabase(
430 self.create_iprange, {
431- "type": IPRANGE_TYPE.DYNAMIC,
432+ "alloc_type": IPRANGE_TYPE.DYNAMIC,
433 "subnet": old_subnet,
434 "start_ip": '192.168.0.100',
435 "end_ip": '192.168.0.110',

Subscribers

People subscribed via source and target branches