Merge ~ack/maas:user-delete-resources-check into maas:master
- Git
- lp:~ack/maas
- user-delete-resources-check
- Merge into master
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Alberto Donato | ||||
Approved revision: | e3c6187c084e6db5b5318254dfaf7c1de9ec7ed4 | ||||
Merge reported by: | MAAS Lander | ||||
Merged at revision: | not available | ||||
Proposed branch: | ~ack/maas:user-delete-resources-check | ||||
Merge into: | maas:master | ||||
Diff against target: |
436 lines (+96/-54) 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 (+22/-8) src/maasserver/models/userprofile.py (+18/-16) src/maasserver/testing/factory.py (+16/-6) 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 |
---|---|---|---|
Mike Pontillo (community) | Approve | ||
MAAS Lander | Approve | ||
Review via email: mp+336139@code.launchpad.net |
Commit message
LP: #1642916: check if user has assigned resources before trying to remove
Description of the change
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: 54fed589841ab53
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: 0a50a6f25bfe7f9
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: FAILED
LOG: http://
COMMIT: 184ed63e1781544
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: SUCCESS
COMMIT: 5e0610bc3218936
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b user-delete-
STATUS: SUCCESS
COMMIT: e3c6187c084e6db
Mike Pontillo (mpontillo) wrote : | # |
Looks good; thanks for the fixes to the tests!
See a couple of minor non-blocking comments below.
Alberto Donato (ack) : | # |
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 76cd268..7e292f6 100644 |
26 | --- a/src/maasserver/api/tests/test_users.py |
27 | +++ b/src/maasserver/api/tests/test_users.py |
28 | @@ -300,6 +300,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 4f96cf3..8a0efac 100644 |
163 | --- a/src/maasserver/models/tests/test_userprofile.py |
164 | +++ b/src/maasserver/models/tests/test_userprofile.py |
165 | @@ -10,8 +10,6 @@ from django.core.exceptions import ValidationError |
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 | @@ -107,24 +105,40 @@ class UserProfileTest(MAASServerTestCase): |
175 | # Cannot delete a user with nodes attached to it. |
176 | profile = factory.make_User().userprofile |
177 | factory.make_Node(owner=profile.user) |
178 | - self.assertRaises(CannotDeleteUserException, profile.delete) |
179 | + error = self.assertRaises(CannotDeleteUserException, profile.delete) |
180 | + self.assertIn('1 node(s)', str(error)) |
181 | |
182 | def test_delete_attached_static_ip_addresses(self): |
183 | # Cannot delete a user with static IP address attached to it. |
184 | profile = factory.make_User().userprofile |
185 | factory.make_StaticIPAddress(user=profile.user) |
186 | - self.assertRaises(CannotDeleteUserException, profile.delete) |
187 | + error = self.assertRaises(CannotDeleteUserException, profile.delete) |
188 | + self.assertIn('1 static IP address(es)', str(error)) |
189 | + |
190 | + def test_delete_attached_iprange(self): |
191 | + # Cannot delete a user with an IP range attached to it. |
192 | + profile = factory.make_User().userprofile |
193 | + factory.make_IPRange(user=profile.user) |
194 | + error = self.assertRaises(CannotDeleteUserException, profile.delete) |
195 | + self.assertIn('1 IP range(s)', str(error)) |
196 | + |
197 | + def test_delete_attached_multiple_resources(self): |
198 | + profile = factory.make_User().userprofile |
199 | + factory.make_Node(owner=profile.user) |
200 | + factory.make_StaticIPAddress(user=profile.user) |
201 | + error = self.assertRaises(CannotDeleteUserException, profile.delete) |
202 | + self.assertIn('1 static IP address(es), 1 node(s)', str(error)) |
203 | |
204 | def test_transfer_resources(self): |
205 | user = factory.make_User() |
206 | node = factory.make_Node(owner=user) |
207 | ipaddress = factory.make_StaticIPAddress(user=user) |
208 | + iprange = factory.make_IPRange(user=user) |
209 | new_user = factory.make_User() |
210 | user.userprofile.transfer_resources(new_user) |
211 | - node = Node.objects.get(id=node.id) |
212 | - self.assertEqual(node.owner, new_user) |
213 | - ipaddress = StaticIPAddress.objects.get(id=ipaddress.id) |
214 | - self.assertEqual(ipaddress.user, new_user) |
215 | + self.assertEqual(reload_object(node).owner, new_user) |
216 | + self.assertEqual(reload_object(ipaddress).user, new_user) |
217 | + self.assertEqual(reload_object(iprange).user, new_user) |
218 | |
219 | def test_transfer_resources_missing_target_access(self): |
220 | user = factory.make_User() |
221 | diff --git a/src/maasserver/models/userprofile.py b/src/maasserver/models/userprofile.py |
222 | index d5c5d74..4fa024c 100644 |
223 | --- a/src/maasserver/models/userprofile.py |
224 | +++ b/src/maasserver/models/userprofile.py |
225 | @@ -67,20 +67,21 @@ class UserProfile(CleanSave, Model): |
226 | completed_intro = BooleanField(default=False) |
227 | |
228 | def delete(self): |
229 | - addr_count = self.user.staticipaddress_set.count() |
230 | - if addr_count: |
231 | - msg = ( |
232 | - "User {} cannot be deleted: {} static IP address(es) " |
233 | - "are still allocated to this user.").format( |
234 | - self.user.username, addr_count) |
235 | - raise CannotDeleteUserException(msg) |
236 | - nb_nodes = self.user.node_set.count() |
237 | - if nb_nodes: |
238 | - msg = ( |
239 | - "User {} cannot be deleted: {} node(s) are still " |
240 | - "allocated to this user.").format( |
241 | - self.user.username, nb_nodes) |
242 | - raise CannotDeleteUserException(msg) |
243 | + # check owned resources |
244 | + owned_resources = { |
245 | + 'staticipaddress': 'static IP address(es)', |
246 | + 'iprange': 'IP range(s)', |
247 | + 'node': 'node(s)'} |
248 | + messages = [] |
249 | + for attr, title in owned_resources.items(): |
250 | + count = getattr(self.user, attr + '_set').count() |
251 | + if count: |
252 | + messages.append('{} {}'.format(count, title)) |
253 | + |
254 | + if messages: |
255 | + raise CannotDeleteUserException( |
256 | + 'User {} cannot be deleted: {} are still allocated'.format( |
257 | + self.user.username, ', '.join(messages))) |
258 | |
259 | if self.user.filestorage_set.exists(): |
260 | self.user.filestorage_set.all().delete() |
261 | @@ -91,8 +92,8 @@ class UserProfile(CleanSave, Model): |
262 | def transfer_resources(self, new_owner): |
263 | """Transfer owned resources to another user. |
264 | |
265 | - Nodes and static IP addresses owned by the user are transfered to the |
266 | - new owner. |
267 | + Nodes, static IP addresses and IP ranges owned by the user are |
268 | + transfered to the new owner. |
269 | |
270 | :param new_owner: the UserProfile to transfer ownership to. |
271 | :type new_owner: maasserver.models.UserProfile |
272 | @@ -106,6 +107,7 @@ class UserProfile(CleanSave, Model): |
273 | " user missing access target resource pool(s)") |
274 | self.user.node_set.update(owner=new_owner) |
275 | self.user.staticipaddress_set.update(user=new_owner) |
276 | + self.user.iprange_set.update(user=new_owner) |
277 | |
278 | def get_authorisation_tokens(self): |
279 | """Fetches all the user's OAuth tokens. |
280 | diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py |
281 | index e29cbe5..eb22ff0 100644 |
282 | --- a/src/maasserver/testing/factory.py |
283 | +++ b/src/maasserver/testing/factory.py |
284 | @@ -720,7 +720,7 @@ class Factory(maastesting.factory.Factory): |
285 | domain=domain) |
286 | dnsrr.save() |
287 | if ip_addresses: |
288 | - dnsrr.ip_addresses = ip_addresses |
289 | + dnsrr.ip_addresses.set(ip_addresses) |
290 | dnsrr.save() |
291 | return dnsrr |
292 | |
293 | @@ -1364,16 +1364,26 @@ class Factory(maastesting.factory.Factory): |
294 | |
295 | def make_IPRange( |
296 | self, subnet=None, start_ip=None, end_ip=None, comment=None, |
297 | - user=None, type=IPRANGE_TYPE.DYNAMIC): |
298 | + user=None, alloc_type=None): |
299 | + if alloc_type is None: |
300 | + alloc_type = ( |
301 | + IPRANGE_TYPE.RESERVED if user else IPRANGE_TYPE.DYNAMIC) |
302 | + |
303 | if subnet is None and start_ip is None and end_ip is None: |
304 | subnet = self.make_ipv4_Subnet_with_IPRanges() |
305 | - return subnet.get_dynamic_ranges().first() |
306 | + iprange = subnet.get_dynamic_ranges().first() |
307 | + iprange.comment = comment |
308 | + iprange.user = user |
309 | + iprange.type = alloc_type |
310 | + iprange.save() |
311 | + return iprange |
312 | + |
313 | # If any of these values are provided, they must all be provided. |
314 | assert subnet is not None |
315 | assert start_ip is not None |
316 | assert end_ip is not None |
317 | iprange = IPRange( |
318 | - subnet=subnet, start_ip=start_ip, end_ip=end_ip, type=type, |
319 | + subnet=subnet, start_ip=start_ip, end_ip=end_ip, type=alloc_type, |
320 | comment=comment, user=user) |
321 | iprange.save() |
322 | return iprange |
323 | @@ -1412,13 +1422,13 @@ class Factory(maastesting.factory.Factory): |
324 | subnet.vlan.dhcp_on = True |
325 | subnet.vlan.save() |
326 | self.make_IPRange( |
327 | - subnet, type=IPRANGE_TYPE.DYNAMIC, |
328 | + subnet, alloc_type=IPRANGE_TYPE.DYNAMIC, |
329 | start_ip=str(IPAddress(network.first + 2)), |
330 | end_ip=str(IPAddress(network.first + range_size + 2))) |
331 | # Create a "static range" for this Subnet. |
332 | if not with_static_range: |
333 | self.make_IPRange( |
334 | - subnet, type=IPRANGE_TYPE.RESERVED, |
335 | + subnet, alloc_type=IPRANGE_TYPE.RESERVED, |
336 | start_ip=str(IPAddress(network.last - range_size - 2)), |
337 | end_ip=str(IPAddress(network.last - 2))) |
338 | return reload_object(subnet) |
339 | diff --git a/src/maasserver/triggers/tests/test_system_listener.py b/src/maasserver/triggers/tests/test_system_listener.py |
340 | index 5e381e2..9124424 100644 |
341 | --- a/src/maasserver/triggers/tests/test_system_listener.py |
342 | +++ b/src/maasserver/triggers/tests/test_system_listener.py |
343 | @@ -1436,7 +1436,7 @@ class TestDHCPIPRangeListener( |
344 | end_ip = str(IPAddress(network.first + 3)) |
345 | yield deferToDatabase(self.create_iprange, { |
346 | "subnet": subnet, |
347 | - "type": IPRANGE_TYPE.DYNAMIC, |
348 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
349 | "start_ip": start_ip, |
350 | "end_ip": end_ip, |
351 | }) |
352 | @@ -1471,7 +1471,7 @@ class TestDHCPIPRangeListener( |
353 | end_ip = str(IPAddress(network.first + 3)) |
354 | ip_range = yield deferToDatabase(self.create_iprange, { |
355 | "subnet": subnet, |
356 | - "type": IPRANGE_TYPE.DYNAMIC, |
357 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
358 | "start_ip": start_ip, |
359 | "end_ip": end_ip, |
360 | }) |
361 | @@ -1522,7 +1522,7 @@ class TestDHCPIPRangeListener( |
362 | end_ip = str(IPAddress(network.first + 3)) |
363 | ip_range = yield deferToDatabase(self.create_iprange, { |
364 | "subnet": subnet, |
365 | - "type": IPRANGE_TYPE.DYNAMIC, |
366 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
367 | "start_ip": start_ip, |
368 | "end_ip": end_ip, |
369 | }) |
370 | @@ -1572,7 +1572,7 @@ class TestDHCPIPRangeListener( |
371 | end_ip = str(IPAddress(network.first + 3)) |
372 | ip_range = yield deferToDatabase(self.create_iprange, { |
373 | "subnet": subnet, |
374 | - "type": IPRANGE_TYPE.RESERVED, |
375 | + "alloc_type": IPRANGE_TYPE.RESERVED, |
376 | "start_ip": start_ip, |
377 | "end_ip": end_ip, |
378 | }) |
379 | @@ -1622,7 +1622,7 @@ class TestDHCPIPRangeListener( |
380 | end_ip = str(IPAddress(network.first + 3)) |
381 | ip_range = yield deferToDatabase(self.create_iprange, { |
382 | "subnet": subnet, |
383 | - "type": IPRANGE_TYPE.DYNAMIC, |
384 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
385 | "start_ip": start_ip, |
386 | "end_ip": end_ip, |
387 | }) |
388 | diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py |
389 | index 1251af9..176002d 100644 |
390 | --- a/src/maasserver/triggers/tests/test_websocket_listener.py |
391 | +++ b/src/maasserver/triggers/tests/test_websocket_listener.py |
392 | @@ -31,6 +31,7 @@ from maasserver.triggers.websocket import register_websocket_triggers |
393 | from maasserver.utils.orm import transactional |
394 | from maasserver.utils.threads import deferToDatabase |
395 | from metadataserver.enum import SCRIPT_STATUS |
396 | +from netaddr import IPAddress |
397 | from provisioningserver.utils.twisted import ( |
398 | asynchronous, |
399 | DeferredValue, |
400 | @@ -1695,10 +1696,17 @@ class TestIPRangeListener( |
401 | listener = self.make_listener_without_delay() |
402 | dv = DeferredValue() |
403 | listener.register("iprange", lambda *args: dv.set(args)) |
404 | + network = factory.make_ipv4_network() |
405 | + subnet = yield deferToDatabase( |
406 | + self.create_subnet, {'cidr': str(network)}) |
407 | + params = { |
408 | + 'subnet': subnet, |
409 | + 'start_ip': IPAddress(network.first + 2), |
410 | + 'end_ip': IPAddress(network.last - 1)} |
411 | yield listener.startService() |
412 | try: |
413 | iprange = yield deferToDatabase( |
414 | - self.create_iprange) |
415 | + self.create_iprange, params) |
416 | yield dv.get(timeout=2) |
417 | self.assertEqual(('create', '%s' % iprange.id), dv.value) |
418 | finally: |
419 | @@ -3424,7 +3432,7 @@ class TestIPRangeSubnetListener( |
420 | try: |
421 | iprange = yield deferToDatabase( |
422 | self.create_iprange, { |
423 | - "type": IPRANGE_TYPE.DYNAMIC, |
424 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
425 | "subnet": subnet, |
426 | "start_ip": '192.168.0.100', |
427 | "end_ip": '192.168.0.110', |
428 | @@ -3472,7 +3480,7 @@ class TestIPRangeSubnetListener( |
429 | }) |
430 | iprange = yield deferToDatabase( |
431 | self.create_iprange, { |
432 | - "type": IPRANGE_TYPE.DYNAMIC, |
433 | + "alloc_type": IPRANGE_TYPE.DYNAMIC, |
434 | "subnet": old_subnet, |
435 | "start_ip": '192.168.0.100', |
436 | "end_ip": '192.168.0.110', |
UNIT TESTS resources- check lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas
-b user-delete-
STATUS: FAILED maas-ci- jenkins. internal: 8080/job/ maas/job/ branch- tester/ 1252/console 936d113fb97cc46 f9528b63fb
LOG: http://
COMMIT: 71dc8adbab0ba6d