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
diff --git a/src/maasserver/api/tests/test_machines.py b/src/maasserver/api/tests/test_machines.py
index 1ec635c..7849678 100644
--- a/src/maasserver/api/tests/test_machines.py
+++ b/src/maasserver/api/tests/test_machines.py
@@ -397,6 +397,8 @@ class TestMachinesAPI(APITestCase.ForUser):
397 for _ in range(10):397 for _ in range(10):
398 node = factory.make_Node_with_Interface_on_Subnet()398 node = factory.make_Node_with_Interface_on_Subnet()
399 factory.make_VirtualBlockDevice(node=node)399 factory.make_VirtualBlockDevice(node=node)
400 # XXX ltrager 2019-08-16 - Work around for LP:1840491
401 Node.objects.update(boot_disk=None)
400402
401 num_queries1, response1 = count_queries(403 num_queries1, response1 = count_queries(
402 self.client.get, reverse('machines_handler'))404 self.client.get, reverse('machines_handler'))
@@ -404,6 +406,8 @@ class TestMachinesAPI(APITestCase.ForUser):
404 for _ in range(10):406 for _ in range(10):
405 node = factory.make_Node_with_Interface_on_Subnet()407 node = factory.make_Node_with_Interface_on_Subnet()
406 factory.make_VirtualBlockDevice(node=node)408 factory.make_VirtualBlockDevice(node=node)
409 # XXX ltrager 2019-08-16 - Work around for LP:1840491
410 Node.objects.update(boot_disk=None)
407 num_queries2, response2 = count_queries(411 num_queries2, response2 = count_queries(
408 self.client.get, reverse('machines_handler'))412 self.client.get, reverse('machines_handler'))
409413
diff --git a/src/maasserver/api/tests/test_tag.py b/src/maasserver/api/tests/test_tag.py
index 682721c..a489be0 100644
--- a/src/maasserver/api/tests/test_tag.py
+++ b/src/maasserver/api/tests/test_tag.py
@@ -1,4 +1,4 @@
1# Copyright 2013-2016 Canonical Ltd. This software is licensed under the1# Copyright 2013-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Tests for the Tags API."""4"""Tests for the Tags API."""
@@ -16,7 +16,10 @@ from apiclient.creds import convert_tuple_to_string
16from django.conf import settings16from django.conf import settings
17from maasserver import middleware17from maasserver import middleware
18from maasserver.enum import NODE_STATUS18from maasserver.enum import NODE_STATUS
19from maasserver.models import Tag19from maasserver.models import (
20 Node,
21 Tag,
22)
20from maasserver.models.node import generate_node_system_id23from maasserver.models.node import generate_node_system_id
21from maasserver.models.user import (24from maasserver.models.user import (
22 create_auth_token,25 create_auth_token,
@@ -167,6 +170,8 @@ class TestTagAPI(APITestCase.ForUser):
167 for _ in range(3):170 for _ in range(3):
168 machine = factory.make_Node_with_Interface_on_Subnet()171 machine = factory.make_Node_with_Interface_on_Subnet()
169 machine.tags.add(tag)172 machine.tags.add(tag)
173 # XXX ltrager 2019-08-16 - Work around for LP:1840491
174 Node.objects.update(boot_disk=None)
170 for _ in range(3):175 for _ in range(3):
171 device = factory.make_Device()176 device = factory.make_Device()
172 device.tags.add(tag)177 device.tags.add(tag)
@@ -176,6 +181,8 @@ class TestTagAPI(APITestCase.ForUser):
176 for _ in range(3):181 for _ in range(3):
177 machine = factory.make_Node_with_Interface_on_Subnet()182 machine = factory.make_Node_with_Interface_on_Subnet()
178 machine.tags.add(tag)183 machine.tags.add(tag)
184 # XXX ltrager 2019-08-16 - Work around for LP:1840491
185 Node.objects.update(boot_disk=None)
179 for _ in range(3):186 for _ in range(3):
180 device = factory.make_Device()187 device = factory.make_Device()
181 device.tags.add(tag)188 device.tags.add(tag)
@@ -234,12 +241,16 @@ class TestTagAPI(APITestCase.ForUser):
234 for _ in range(3):241 for _ in range(3):
235 machine = factory.make_Node_with_Interface_on_Subnet()242 machine = factory.make_Node_with_Interface_on_Subnet()
236 machine.tags.add(tag)243 machine.tags.add(tag)
244 # XXX ltrager 2019-08-16 - Work around for LP:1840491
245 Node.objects.update(boot_disk=None)
237 num_queries1, response1 = count_queries(246 num_queries1, response1 = count_queries(
238 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})247 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})
239248
240 for _ in range(3):249 for _ in range(3):
241 machine = factory.make_Node_with_Interface_on_Subnet()250 machine = factory.make_Node_with_Interface_on_Subnet()
242 machine.tags.add(tag)251 machine.tags.add(tag)
252 # XXX ltrager 2019-08-16 - Work around for LP:1840491
253 Node.objects.update(boot_disk=None)
243 num_queries2, response2 = count_queries(254 num_queries2, response2 = count_queries(
244 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})255 self.client.get, self.get_tag_uri(tag), {'op': 'machines'})
245256
diff --git a/src/maasserver/models/signals/scriptresult.py b/src/maasserver/models/signals/scriptresult.py
index a3295de..4a82e71 100644
--- a/src/maasserver/models/signals/scriptresult.py
+++ b/src/maasserver/models/signals/scriptresult.py
@@ -22,30 +22,32 @@ from provisioningserver.events import EVENT_TYPES
22signals = SignalsManager()22signals = SignalsManager()
2323
2424
25def emit_script_result_status_transition_event(instance, old_values, **kwargs):25def emit_script_result_status_transition_event(
26 script_result, old_values, **kwargs):
26 """Send a status transition event."""27 """Send a status transition event."""
27 script_result = instance
28 [old_status] = old_values28 [old_status] = old_values
2929
30 if script_result.physical_blockdevice:
31 script_name = '%s on %s' % (
32 script_result.name, script_result.physical_blockdevice.name)
33 else:
34 script_name = script_result.name
35
30 if (script_result.script_set.result_type == RESULT_TYPE.TESTING and36 if (script_result.script_set.result_type == RESULT_TYPE.TESTING and
31 old_status == SCRIPT_STATUS.PENDING and script_result.status in (37 old_status == SCRIPT_STATUS.PENDING and (
32 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING)):38 script_result.status in [
33 storage_name = script_result.parameters.get(39 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])):
34 'storage', {}).get('value', {}).get('name')
35 Event.objects.create_node_event(40 Event.objects.create_node_event(
36 script_result.script_set.node, EVENT_TYPES.RUNNING_TEST,41 script_result.script_set.node, EVENT_TYPES.RUNNING_TEST,
37 event_description="%s on %s" % (42 event_description=script_name)
38 script_result.name, storage_name) if storage_name else43 elif script_result.status in [
39 script_result.name)44 SCRIPT_STATUS.FAILED, SCRIPT_STATUS.FAILED_INSTALLING,
4045 SCRIPT_STATUS.TIMEDOUT, SCRIPT_STATUS.ABORTED]:
41 elif script_result.status in (
42 SCRIPT_STATUS.FAILED, SCRIPT_STATUS.TIMEDOUT,
43 SCRIPT_STATUS.ABORTED):
44 Event.objects.create_node_event(46 Event.objects.create_node_event(
45 script_result.script_set.node,47 script_result.script_set.node,
46 EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE,48 EVENT_TYPES.SCRIPT_DID_NOT_COMPLETE,
47 event_description="%s %s" % (49 event_description="%s %s" % (
48 script_result.name, SCRIPT_STATUS_CHOICES[50 script_name, SCRIPT_STATUS_CHOICES[
49 script_result.status][1].lower()))51 script_result.status][1].lower()))
50 else:52 else:
51 old_status_name = None53 old_status_name = None
@@ -59,7 +61,7 @@ def emit_script_result_status_transition_event(instance, old_values, **kwargs):
59 script_result.script_set.node,61 script_result.script_set.node,
60 EVENT_TYPES.SCRIPT_RESULT_CHANGED_STATUS,62 EVENT_TYPES.SCRIPT_RESULT_CHANGED_STATUS,
61 event_description="%s changed status from '%s' to '%s'" % (63 event_description="%s changed status from '%s' to '%s'" % (
62 script_result.name, old_status_name, new_status_name))64 script_name, old_status_name, new_status_name))
63 if (CURTIN_INSTALL_LOG == script_result.name and not65 if (CURTIN_INSTALL_LOG == script_result.name and not
64 script_result.script_set.node.netboot):66 script_result.script_set.node.netboot):
65 Event.objects.create_node_event(67 Event.objects.create_node_event(
diff --git a/src/maasserver/models/signals/tests/test_scriptresult.py b/src/maasserver/models/signals/tests/test_scriptresult.py
index f49e8e6..d538f89 100644
--- a/src/maasserver/models/signals/tests/test_scriptresult.py
+++ b/src/maasserver/models/signals/tests/test_scriptresult.py
@@ -6,7 +6,6 @@
6__all__ = []6__all__ = []
77
88
9import json
10import random9import random
1110
12from maasserver.models import Event11from maasserver.models import Event
@@ -17,6 +16,7 @@ from metadataserver.enum import (
17 RESULT_TYPE,16 RESULT_TYPE,
18 SCRIPT_STATUS,17 SCRIPT_STATUS,
19 SCRIPT_STATUS_CHOICES,18 SCRIPT_STATUS_CHOICES,
19 SCRIPT_TYPE,
20)20)
21from provisioningserver.events import (21from provisioningserver.events import (
22 EVENT_DETAILS,22 EVENT_DETAILS,
@@ -26,22 +26,20 @@ from provisioningserver.events import (
2626
27class TestStatusTransitionEvent(MAASServerTestCase):27class TestStatusTransitionEvent(MAASServerTestCase):
2828
29 def test__running_or_installing_emits_event_empty_storage_parameters(self):29 def test__running_or_installing_emits_event(self):
3030 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
31 script_result = factory.make_ScriptResult(31 script_result = factory.make_ScriptResult(
32 status=SCRIPT_STATUS.PENDING, script_set=factory.make_ScriptSet(32 status=SCRIPT_STATUS.PENDING, script=script)
33 result_type=RESULT_TYPE.TESTING), script=factory.make_Script())33
34 script_result.status = random.choice([34 script_result.status = random.choice([
35 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])35 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])
36 script_result.parameters = json.dumps({})
37 script_result.save()36 script_result.save()
3837
39 latest_event = Event.objects.last()38 latest_event = Event.objects.last()
40 self.assertEqual(39 self.assertEqual(
41 (40 (
42 EVENT_TYPES.RUNNING_TEST,41 EVENT_TYPES.RUNNING_TEST,
43 EVENT_DETAILS[42 EVENT_DETAILS[EVENT_TYPES.RUNNING_TEST].description,
44 EVENT_TYPES.RUNNING_TEST].description,
45 script_result.name,43 script_result.name,
46 ),44 ),
47 (45 (
@@ -50,30 +48,25 @@ class TestStatusTransitionEvent(MAASServerTestCase):
50 latest_event.description,48 latest_event.description,
51 ))49 ))
5250
53 def test__running_or_installing_emits_event_with_storage_parameters(self):51 def test__running_or_installing_emits_event_with_storage_parameter(self):
5452 node = factory.make_Node()
53 script = factory.make_Script(script_type=SCRIPT_TYPE.TESTING)
54 script_set = factory.make_ScriptSet(
55 result_type=RESULT_TYPE.TESTING, node=node)
55 script_result = factory.make_ScriptResult(56 script_result = factory.make_ScriptResult(
56 status=SCRIPT_STATUS.PENDING, script_set=factory.make_ScriptSet(57 status=SCRIPT_STATUS.PENDING, script=script, script_set=script_set,
57 result_type=RESULT_TYPE.TESTING), script=factory.make_Script())58 physical_blockdevice=node.boot_disk)
59
58 script_result.status = random.choice([60 script_result.status = random.choice([
59 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])61 SCRIPT_STATUS.INSTALLING, SCRIPT_STATUS.RUNNING])
60 script_result.parameters = json.dumps({
61 'storage': {
62 'value': {
63 'name': factory.make_name('name')
64 }
65 }
66 })
67 script_result.save()62 script_result.save()
6863
69 latest_event = Event.objects.last()64 latest_event = Event.objects.last()
70 self.assertEqual(65 self.assertEqual(
71 (66 (
72 EVENT_TYPES.RUNNING_TEST,67 EVENT_TYPES.RUNNING_TEST,
73 EVENT_DETAILS[68 EVENT_DETAILS[EVENT_TYPES.RUNNING_TEST].description,
74 EVENT_TYPES.RUNNING_TEST].description,69 '%s on %s' % (script_result.name, node.boot_disk.name)
75 "%s on %s" % (script_result.name, script_result.parameters.get(
76 'storage').get('value').get('name')),
77 ),70 ),
78 (71 (
79 latest_event.type.name,72 latest_event.type.name,
diff --git a/src/maasserver/models/tests/test_blockdevice.py b/src/maasserver/models/tests/test_blockdevice.py
index 7d5ab6a..5a0969f 100644
--- a/src/maasserver/models/tests/test_blockdevice.py
+++ b/src/maasserver/models/tests/test_blockdevice.py
@@ -1,4 +1,4 @@
1# Copyright 2014-2016 Canonical Ltd. This software is licensed under the1# Copyright 2014-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""Tests for `BlockDevice`."""4"""Tests for `BlockDevice`."""
@@ -338,7 +338,8 @@ class TestBlockDevice(MAASServerTestCase):
338 mock_get_effective_filesystem = self.patch_autospec(338 mock_get_effective_filesystem = self.patch_autospec(
339 blockdevice_module, "get_effective_filesystem")339 blockdevice_module, "get_effective_filesystem")
340 mock_get_effective_filesystem.return_value = sentinel.filesystem340 mock_get_effective_filesystem.return_value = sentinel.filesystem
341 block_device = factory.make_BlockDevice()341 node = factory.make_Node(with_boot_disk=False)
342 block_device = factory.make_BlockDevice(node=node)
342 self.assertEqual(343 self.assertEqual(
343 sentinel.filesystem, block_device.get_effective_filesystem())344 sentinel.filesystem, block_device.get_effective_filesystem())
344345
diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
index ec327a4..c28f600 100644
--- a/src/maasserver/testing/factory.py
+++ b/src/maasserver/testing/factory.py
@@ -473,6 +473,8 @@ class Factory(maastesting.factory.Factory):
473 self.make_Filesystem(473 self.make_Filesystem(
474 fstype=fstype, partition=root_partition, mount_point='/',474 fstype=fstype, partition=root_partition, mount_point='/',
475 acquired=acquired)475 acquired=acquired)
476 node.boot_disk = root_partition.partition_table.block_device
477 node.save()
476478
477 # Setup the BMC connected to rack controller if a BMC is created.479 # Setup the BMC connected to rack controller if a BMC is created.
478 if bmc_connected_to is not None:480 if bmc_connected_to is not None:
@@ -803,7 +805,14 @@ class Factory(maastesting.factory.Factory):
803 stdout=None, stderr=None, result=None, started=None, ended=None,805 stdout=None, stderr=None, result=None, started=None, ended=None,
804 suppressed=False, **kwargs):806 suppressed=False, **kwargs):
805 if script_set is None:807 if script_set is None:
806 script_set = self.make_ScriptSet()808 if script is not None:
809 script_set_type = (
810 RESULT_TYPE.TESTING
811 if script.script_type == SCRIPT_TYPE.TESTING else
812 RESULT_TYPE.COMMISSIONING)
813 else:
814 script_set_type = None
815 script_set = self.make_ScriptSet(result_type=script_set_type)
807 if script is None and script_name is None:816 if script is None and script_name is None:
808 if script_set.result_type == RESULT_TYPE.COMMISSIONING:817 if script_set.result_type == RESULT_TYPE.COMMISSIONING:
809 script = self.make_Script(818 script = self.make_Script(
diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
index d73ed3c..5cd28fd 100644
--- a/src/maasserver/websockets/handlers/tests/test_machine.py
+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
@@ -210,7 +210,7 @@ class TestMachineHandler(MAASServerTestCase):
210 "actions": list(compile_node_actions(node, handler.user).keys()),210 "actions": list(compile_node_actions(node, handler.user).keys()),
211 "architecture": node.architecture,211 "architecture": node.architecture,
212 "bmc": node.bmc_id,212 "bmc": node.bmc_id,
213 "boot_disk": node.boot_disk,213 "boot_disk": node.boot_disk.id if node.boot_disk else None,
214 "bios_boot_method": node.bios_boot_method,214 "bios_boot_method": node.bios_boot_method,
215 "commissioning_script_count": commissioning_scripts.count(),215 "commissioning_script_count": commissioning_scripts.count(),
216 "commissioning_status": get_status_from_qs(216 "commissioning_status": get_status_from_qs(
@@ -618,7 +618,7 @@ class TestMachineHandler(MAASServerTestCase):
618 # number means regiond has to do more work slowing down its process618 # number means regiond has to do more work slowing down its process
619 # and slowing down the client waiting for the response.619 # and slowing down the client waiting for the response.
620 self.assertEqual(620 self.assertEqual(
621 queries, 49,621 queries, 50,
622 "Number of queries has changed; make sure this is expected.")622 "Number of queries has changed; make sure this is expected.")
623623
624 def test_trigger_update_updates_script_result_cache(self):624 def test_trigger_update_updates_script_result_cache(self):

Subscribers

People subscribed via source and target branches