Merge lp:~newell-jensen/maas/fix-1617591 into lp:~maas-committers/maas/trunk

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: no longer in the source branch.
Merged at revision: 5339
Proposed branch: lp:~newell-jensen/maas/fix-1617591
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 84 lines (+30/-5)
2 files modified
src/provisioningserver/power/query.py (+4/-4)
src/provisioningserver/power/tests/test_query.py (+26/-1)
To merge this branch: bzr merge lp:~newell-jensen/maas/fix-1617591
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Review via email: mp+305371@code.launchpad.net

Commit message

Clean up power query messaging on provisioningserver so that all messages will have the hostname of the node in the message to help identify which node is experiencing the issue. Additionally catches PowerError's from the power drivers when doing a power query, which was missing before.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

lgtm!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/provisioningserver/power/query.py'
2--- src/provisioningserver/power/query.py 2016-07-30 01:17:54 +0000
3+++ src/provisioningserver/power/query.py 2016-09-09 18:37:28 +0000
4@@ -15,6 +15,7 @@
5 from provisioningserver.drivers.power import (
6 power_drivers_by_name,
7 PowerDriverRegistry,
8+ PowerError,
9 )
10 from provisioningserver.events import (
11 EVENT_TYPES,
12@@ -109,9 +110,8 @@
13 @inlineCallbacks
14 def power_query_failure(system_id, hostname, failure):
15 """Report a node that for which power querying has failed."""
16- message = "Power state could not be queried: %s"
17- message %= failure.getErrorMessage()
18- maaslog.error(message)
19+ maaslog.error("%s: Power state could not be queried: %s" % (
20+ hostname, failure.getErrorMessage()))
21 yield power.power_state_update(system_id, 'error')
22 yield send_event_node(
23 EVENT_TYPES.NODE_POWER_QUERY_FAILED,
24@@ -150,7 +150,7 @@
25
26 def maaslog_report_failure(node, failure):
27 """Log failure to query node."""
28- if failure.check(PowerActionFail):
29+ if failure.check(PowerActionFail, PowerError):
30 maaslog.error(
31 "%s: Could not query power state: %s.",
32 node['hostname'], failure.getErrorMessage())
33
34=== modified file 'src/provisioningserver/power/tests/test_query.py'
35--- src/provisioningserver/power/tests/test_query.py 2016-08-19 10:22:29 +0000
36+++ src/provisioningserver/power/tests/test_query.py 2016-09-09 18:37:28 +0000
37@@ -32,6 +32,7 @@
38 DEFAULT_WAITING_POLICY,
39 power_drivers_by_name,
40 PowerDriverRegistry,
41+ PowerError,
42 )
43 from provisioningserver.events import EVENT_TYPES
44 from provisioningserver.rpc import (
45@@ -308,7 +309,8 @@
46 self.assertThat(query, MockCallsMatch(*expected_calls))
47
48 expected_message = (
49- "Power state could not be queried: %s" % exception_message)
50+ "%s: Power state could not be queried: %s" % (
51+ hostname, exception_message))
52
53 # An attempt was made to report the failure to the region.
54 self.assertThat(
55@@ -470,6 +472,29 @@
56 maaslog.output)
57
58 @inlineCallbacks
59+ def test_query_all_nodes_swallows_PowerError(self):
60+ node1, node2 = self.make_nodes(2)
61+ new_state_2 = self.pick_alternate_state(node2['power_state'])
62+ get_power_state = self.patch(power.query, 'get_power_state')
63+ error_msg = factory.make_name("error")
64+ get_power_state.side_effect = [
65+ fail(PowerError(error_msg)),
66+ succeed(new_state_2),
67+ ]
68+ suppress_reporting(self)
69+
70+ with FakeLogger("maas.power", level=logging.DEBUG) as maaslog:
71+ yield power.query.query_all_nodes([node1, node2])
72+
73+ self.assertDocTestMatches(
74+ """\
75+ %s: Could not query power state: %s.
76+ %s: Power state has changed from %s to %s.
77+ """ % (node1['hostname'], error_msg,
78+ node2['hostname'], node2['power_state'], new_state_2),
79+ maaslog.output)
80+
81+ @inlineCallbacks
82 def test_query_all_nodes_swallows_NoSuchNode(self):
83 node1, node2 = self.make_nodes(2)
84 new_state_2 = self.pick_alternate_state(node2['power_state'])