Merge ~ltrager/maas:lp1840181_2.6 into maas:2.6

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 6049734dac9ae76bd973ea75fb5247fb16d2e7a0
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1840181_2.6
Merge into: maas:2.6
Diff against target: 299 lines (+65/-45)
7 files modified
src/maasserver/api/tests/test_machines.py (+4/-0)
src/maasserver/api/tests/test_tag.py (+13/-2)
src/maasserver/models/signals/scriptresult.py (+17/-15)
src/maasserver/models/signals/tests/test_scriptresult.py (+16/-23)
src/maasserver/models/tests/test_blockdevice.py (+3/-2)
src/maasserver/testing/factory.py (+10/-1)
src/maasserver/websockets/handlers/tests/test_machine.py (+2/-2)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
MAAS Lander unittests Pending
Review via email: mp+371489@code.launchpad.net

Commit message

Backport of df8ae4e LP: #1840181 - Use model to get device name for ScriptResult events

To post a comment you must log in.
~ltrager/maas:lp1840181_2.6 updated
6049734... by Lee Trager

Fix merge conflict

Revision history for this message
Lee Trager (ltrager) wrote :
review: Approve

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_machines.py b/src/maasserver/api/tests/test_machines.py
2index 1ec635c..7849678 100644
3--- a/src/maasserver/api/tests/test_machines.py
4+++ b/src/maasserver/api/tests/test_machines.py
5@@ -397,6 +397,8 @@ class TestMachinesAPI(APITestCase.ForUser):
6 for _ in range(10):
7 node = factory.make_Node_with_Interface_on_Subnet()
8 factory.make_VirtualBlockDevice(node=node)
9+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
10+ Node.objects.update(boot_disk=None)
11
12 num_queries1, response1 = count_queries(
13 self.client.get, reverse('machines_handler'))
14@@ -404,6 +406,8 @@ class TestMachinesAPI(APITestCase.ForUser):
15 for _ in range(10):
16 node = factory.make_Node_with_Interface_on_Subnet()
17 factory.make_VirtualBlockDevice(node=node)
18+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
19+ Node.objects.update(boot_disk=None)
20 num_queries2, response2 = count_queries(
21 self.client.get, reverse('machines_handler'))
22
23diff --git a/src/maasserver/api/tests/test_tag.py b/src/maasserver/api/tests/test_tag.py
24index 682721c..a489be0 100644
25--- a/src/maasserver/api/tests/test_tag.py
26+++ b/src/maasserver/api/tests/test_tag.py
27@@ -1,4 +1,4 @@
28-# Copyright 2013-2016 Canonical Ltd. This software is licensed under the
29+# Copyright 2013-2019 Canonical Ltd. This software is licensed under the
30 # GNU Affero General Public License version 3 (see the file LICENSE).
31
32 """Tests for the Tags API."""
33@@ -16,7 +16,10 @@ from apiclient.creds import convert_tuple_to_string
34 from django.conf import settings
35 from maasserver import middleware
36 from maasserver.enum import NODE_STATUS
37-from maasserver.models import Tag
38+from maasserver.models import (
39+ Node,
40+ Tag,
41+)
42 from maasserver.models.node import generate_node_system_id
43 from maasserver.models.user import (
44 create_auth_token,
45@@ -167,6 +170,8 @@ class TestTagAPI(APITestCase.ForUser):
46 for _ in range(3):
47 machine = factory.make_Node_with_Interface_on_Subnet()
48 machine.tags.add(tag)
49+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
50+ Node.objects.update(boot_disk=None)
51 for _ in range(3):
52 device = factory.make_Device()
53 device.tags.add(tag)
54@@ -176,6 +181,8 @@ class TestTagAPI(APITestCase.ForUser):
55 for _ in range(3):
56 machine = factory.make_Node_with_Interface_on_Subnet()
57 machine.tags.add(tag)
58+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
59+ Node.objects.update(boot_disk=None)
60 for _ in range(3):
61 device = factory.make_Device()
62 device.tags.add(tag)
63@@ -234,12 +241,16 @@ class TestTagAPI(APITestCase.ForUser):
64 for _ in range(3):
65 machine = factory.make_Node_with_Interface_on_Subnet()
66 machine.tags.add(tag)
67+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
68+ Node.objects.update(boot_disk=None)
69 num_queries1, response1 = count_queries(
70 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})
71
72 for _ in range(3):
73 machine = factory.make_Node_with_Interface_on_Subnet()
74 machine.tags.add(tag)
75+ # XXX ltrager 2019-08-16 - Work around for LP:1840491
76+ Node.objects.update(boot_disk=None)
77 num_queries2, response2 = count_queries(
78 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})
79
80diff --git a/src/maasserver/models/signals/scriptresult.py b/src/maasserver/models/signals/scriptresult.py
81index a3295de..4a82e71 100644
82--- a/src/maasserver/models/signals/scriptresult.py
83+++ b/src/maasserver/models/signals/scriptresult.py
84@@ -22,30 +22,32 @@ from provisioningserver.events import EVENT_TYPES
85 signals = SignalsManager()
86
87
88-def emit_script_result_status_transition_event(instance, old_values, **kwargs):
89+def emit_script_result_status_transition_event(
90+ script_result, old_values, **kwargs):
91 """Send a status transition event."""
92- script_result = instance
93 [old_status] = old_values
94
95+ if script_result.physical_blockdevice:
96+ script_name = '%s on %s' % (
97+ script_result.name, script_result.physical_blockdevice.name)
98+ else:
99+ script_name = script_result.name
100+
101 if (script_result.script_set.result_type == RESULT_TYPE.TESTING and
102- old_status == SCRIPT_STATUS.PENDING and script_result.status in (
103- SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING)):
104- storage_name = script_result.parameters.get(
105- 'storage', {}).get('value', {}).get('name')
106+ old_status == SCRIPT_STATUS.PENDING and (
107+ script_result.status in [
108+ SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])):
109 Event.objects.create_node_event(
110 script_result.script_set.node, EVENT_TYPES.RUNNING_TEST,
111- event_description="%s on %s" % (
112- script_result.name, storage_name) if storage_name else
113- script_result.name)
114-
115- elif script_result.status in (
116- SCRIPT_STATUS.FAILED, SCRIPT_STATUS.TIMEDOUT,
117- SCRIPT_STATUS.ABORTED):
118+ event_description=script_name)
119+ elif script_result.status in [
120+ SCRIPT_STATUS.FAILED, SCRIPT_STATUS.FAILED_INSTALLING,
121+ SCRIPT_STATUS.TIMEDOUT, SCRIPT_STATUS.ABORTED]:
122 Event.objects.create_node_event(
123 script_result.script_set.node,
124 EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE,
125 event_description="%s %s" % (
126- script_result.name, SCRIPT_STATUS_CHOICES[
127+ script_name, SCRIPT_STATUS_CHOICES[
128 script_result.status][1].lower()))
129 else:
130 old_status_name = None
131@@ -59,7 +61,7 @@ def emit_script_result_status_transition_event(instance, old_values, **kwargs):
132 script_result.script_set.node,
133 EVENT_TYPES.SCRIPT_RESULT_CHANGED_STATUS,
134 event_description="%s changed status from '%s' to '%s'" % (
135- script_result.name, old_status_name, new_status_name))
136+ script_name, old_status_name, new_status_name))
137 if (CURTIN_INSTALL_LOG == script_result.name and not
138 script_result.script_set.node.netboot):
139 Event.objects.create_node_event(
140diff --git a/src/maasserver/models/signals/tests/test_scriptresult.py b/src/maasserver/models/signals/tests/test_scriptresult.py
141index f49e8e6..d538f89 100644
142--- a/src/maasserver/models/signals/tests/test_scriptresult.py
143+++ b/src/maasserver/models/signals/tests/test_scriptresult.py
144@@ -6,7 +6,6 @@
145 __all__ = []
146
147
148-import json
149 import random
150
151 from maasserver.models import Event
152@@ -17,6 +16,7 @@ from metadataserver.enum import (
153 RESULT_TYPE,
154 SCRIPT_STATUS,
155 SCRIPT_STATUS_CHOICES,
156+ SCRIPT_TYPE,
157 )
158 from provisioningserver.events import (
159 EVENT_DETAILS,
160@@ -26,22 +26,20 @@ from provisioningserver.events import (
161
162 class TestStatusTransitionEvent(MAASServerTestCase):
163
164- def test__running_or_installing_emits_event_empty_storage_parameters(self):
165-
166+ def test__running_or_installing_emits_event(self):
167+ script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
168 script_result = factory.make_ScriptResult(
169- status=SCRIPT_STATUS.PENDING, script_set=factory.make_ScriptSet(
170- result_type=RESULT_TYPE.TESTING), script=factory.make_Script())
171+ status=SCRIPT_STATUS.PENDING, script=script)
172+
173 script_result.status = random.choice([
174 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])
175- script_result.parameters = json.dumps({})
176 script_result.save()
177
178 latest_event = Event.objects.last()
179 self.assertEqual(
180 (
181 EVENT_TYPES.RUNNING_TEST,
182- EVENT_DETAILS[
183- EVENT_TYPES.RUNNING_TEST].description,
184+ EVENT_DETAILS[EVENT_TYPES.RUNNING_TEST].description,
185 script_result.name,
186 ),
187 (
188@@ -50,30 +48,25 @@ class TestStatusTransitionEvent(MAASServerTestCase):
189 latest_event.description,
190 ))
191
192- def test__running_or_installing_emits_event_with_storage_parameters(self):
193-
194+ def test__running_or_installing_emits_event_with_storage_parameter(self):
195+ node = factory.make_Node()
196+ script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
197+ script_set = factory.make_ScriptSet(
198+ result_type=RESULT_TYPE.TESTING, node=node)
199 script_result = factory.make_ScriptResult(
200- status=SCRIPT_STATUS.PENDING, script_set=factory.make_ScriptSet(
201- result_type=RESULT_TYPE.TESTING), script=factory.make_Script())
202+ status=SCRIPT_STATUS.PENDING, script=script, script_set=script_set,
203+ physical_blockdevice=node.boot_disk)
204+
205 script_result.status = random.choice([
206 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])
207- script_result.parameters = json.dumps({
208- 'storage': {
209- 'value': {
210- 'name': factory.make_name('name')
211- }
212- }
213- })
214 script_result.save()
215
216 latest_event = Event.objects.last()
217 self.assertEqual(
218 (
219 EVENT_TYPES.RUNNING_TEST,
220- EVENT_DETAILS[
221- EVENT_TYPES.RUNNING_TEST].description,
222- "%s on %s" % (script_result.name, script_result.parameters.get(
223- 'storage').get('value').get('name')),
224+ EVENT_DETAILS[EVENT_TYPES.RUNNING_TEST].description,
225+ '%s on %s' % (script_result.name, node.boot_disk.name)
226 ),
227 (
228 latest_event.type.name,
229diff --git a/src/maasserver/models/tests/test_blockdevice.py b/src/maasserver/models/tests/test_blockdevice.py
230index 7d5ab6a..5a0969f 100644
231--- a/src/maasserver/models/tests/test_blockdevice.py
232+++ b/src/maasserver/models/tests/test_blockdevice.py
233@@ -1,4 +1,4 @@
234-# Copyright 2014-2016 Canonical Ltd. This software is licensed under the
235+# Copyright 2014-2019 Canonical Ltd. This software is licensed under the
236 # GNU Affero General Public License version 3 (see the file LICENSE).
237
238 """Tests for `BlockDevice`."""
239@@ -338,7 +338,8 @@ class TestBlockDevice(MAASServerTestCase):
240 mock_get_effective_filesystem = self.patch_autospec(
241 blockdevice_module, "get_effective_filesystem")
242 mock_get_effective_filesystem.return_value = sentinel.filesystem
243- block_device = factory.make_BlockDevice()
244+ node = factory.make_Node(with_boot_disk=False)
245+ block_device = factory.make_BlockDevice(node=node)
246 self.assertEqual(
247 sentinel.filesystem, block_device.get_effective_filesystem())
248
249diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
250index ec327a4..c28f600 100644
251--- a/src/maasserver/testing/factory.py
252+++ b/src/maasserver/testing/factory.py
253@@ -473,6 +473,8 @@ class Factory(maastesting.factory.Factory):
254 self.make_Filesystem(
255 fstype=fstype, partition=root_partition, mount_point='/',
256 acquired=acquired)
257+ node.boot_disk = root_partition.partition_table.block_device
258+ node.save()
259
260 # Setup the BMC connected to rack controller if a BMC is created.
261 if bmc_connected_to is not None:
262@@ -803,7 +805,14 @@ class Factory(maastesting.factory.Factory):
263 stdout=None, stderr=None, result=None, started=None, ended=None,
264 suppressed=False, **kwargs):
265 if script_set is None:
266- script_set = self.make_ScriptSet()
267+ if script is not None:
268+ script_set_type = (
269+ RESULT_TYPE.TESTING
270+ if script.script_type == SCRIPT_TYPE.TESTING else
271+ RESULT_TYPE.COMMISSIONING)
272+ else:
273+ script_set_type = None
274+ script_set = self.make_ScriptSet(result_type=script_set_type)
275 if script is None and script_name is None:
276 if script_set.result_type == RESULT_TYPE.COMMISSIONING:
277 script = self.make_Script(
278diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
279index d73ed3c..5cd28fd 100644
280--- a/src/maasserver/websockets/handlers/tests/test_machine.py
281+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
282@@ -210,7 +210,7 @@ class TestMachineHandler(MAASServerTestCase):
283 "actions": list(compile_node_actions(node, handler.user).keys()),
284 "architecture": node.architecture,
285 "bmc": node.bmc_id,
286- "boot_disk": node.boot_disk,
287+ "boot_disk": node.boot_disk.id if node.boot_disk else None,
288 "bios_boot_method": node.bios_boot_method,
289 "commissioning_script_count": commissioning_scripts.count(),
290 "commissioning_status": get_status_from_qs(
291@@ -618,7 +618,7 @@ class TestMachineHandler(MAASServerTestCase):
292 # number means regiond has to do more work slowing down its process
293 # and slowing down the client waiting for the response.
294 self.assertEqual(
295- queries, 49,
296+ queries, 50,
297 "Number of queries has changed; make sure this is expected.")
298
299 def test_trigger_update_updates_script_result_cache(self):

Subscribers

People subscribed via source and target branches