Merge ~ack/maas:user-delete-check-resources into maas:2.3
- Git
- lp:~ack/maas
- user-delete-check-resources
- Merge into 2.3
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) |
||||
Related bugs: |
|
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 2c8be509e37f050
Description of the change
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: 43d9024c43773fa
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: 42003e84a58f14c
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: cdde8968f0e000c
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
MAAS Lander (maas-lander) wrote : | # |
LANDING
-b user-delete-
STATUS: FAILED BUILD
LOG: http://
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
1 | diff --git a/src/maasserver/api/tests/test_subnets.py b/src/maasserver/api/tests/test_subnets.py |
2 | index 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'}) |
24 | diff --git a/src/maasserver/api/tests/test_users.py b/src/maasserver/api/tests/test_users.py |
25 | index 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() |
46 | diff --git a/src/maasserver/models/tests/test_staticipaddress.py b/src/maasserver/models/tests/test_staticipaddress.py |
47 | index 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, |
59 | diff --git a/src/maasserver/models/tests/test_subnet.py b/src/maasserver/models/tests/test_subnet.py |
60 | index 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 |
161 | diff --git a/src/maasserver/models/tests/test_userprofile.py b/src/maasserver/models/tests/test_userprofile.py |
162 | index 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)) |
229 | diff --git a/src/maasserver/models/userprofile.py b/src/maasserver/models/userprofile.py |
230 | index 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. |
288 | diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py |
289 | index 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) |
338 | diff --git a/src/maasserver/triggers/tests/test_system_listener.py b/src/maasserver/triggers/tests/test_system_listener.py |
339 | index 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 | }) |
387 | diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py |
388 | index 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', |
+1