Merge lp:~newell-jensen/maas/2.1-fix-1611999 into lp:maas/2.1

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: no longer in the source branch.
Merged at revision: 5568
Proposed branch: lp:~newell-jensen/maas/2.1-fix-1611999
Merge into: lp:maas/2.1
Diff against target: 134 lines (+15/-43)
3 files modified
docs/changelog.rst (+2/-0)
src/provisioningserver/drivers/hardware/tests/test_ucsm.py (+7/-29)
src/provisioningserver/drivers/hardware/ucsm.py (+6/-14)
To merge this branch: bzr merge lp:~newell-jensen/maas/2.1-fix-1611999
Reviewer Review Type Date Requested Status
Newell Jensen (community) Approve
Review via email: mp+313117@code.launchpad.net

Commit message

Backport trunk r5604: Update how UCSM power driver is querying the power state of the blade.

To post a comment you must log in.
Revision history for this message
Newell Jensen (newell-jensen) wrote :

Self approved backport.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'docs/changelog.rst'
2--- docs/changelog.rst 2016-12-08 13:45:40 +0000
3+++ docs/changelog.rst 2016-12-13 10:51:37 +0000
4@@ -8,6 +8,8 @@
5 Bugs fixed in this release
6 --------------------------
7
8+LP: #1611999 [2.1] MAAS cannot power query with Cisco UCSM power driver.
9+
10 LP: #1604962 node set to "failed deployment" for no visible reason
11
12 LP: #1614584 MAAS fails to start when gethostname returns an FQDN.
13
14=== modified file 'src/provisioningserver/drivers/hardware/tests/test_ucsm.py'
15--- src/provisioningserver/drivers/hardware/tests/test_ucsm.py 2016-05-12 19:07:37 +0000
16+++ src/provisioningserver/drivers/hardware/tests/test_ucsm.py 2016-12-13 10:51:37 +0000
17@@ -92,8 +92,10 @@
18 return factory.make_name('dn')
19
20
21-def make_server():
22- return factory.make_name('server')
23+def make_server(power_state=None):
24+ return {
25+ 'operPower': power_state,
26+ }
27
28
29 class TestUCSMXMLAPIError(MAASTestCase):
30@@ -547,19 +549,10 @@
31 api = Mock()
32 self.patch(ucsm, 'UCSM_XML_API').return_value = api
33 get_servers_mock = self.patch(ucsm, 'get_servers')
34- server = make_server()
35- current_state = 'down'
36- power_control = Element('lsPower', {'state': current_state})
37- get_servers_mock.return_value = [server]
38- get_server_power_control_mock = self.patch(
39- ucsm, 'get_server_power_control')
40- get_server_power_control_mock.return_value = power_control
41+ get_servers_mock.return_value = [make_server("off")]
42
43 power_state = power_state_ucsm(url, username, password, uuid)
44 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))
45- self.expectThat(
46- get_server_power_control_mock,
47- MockCalledOnceWith(api, server))
48 self.expectThat(power_state, Equals('off'))
49
50 def test_power_state_get_on(self):
51@@ -570,19 +563,10 @@
52 api = Mock()
53 self.patch(ucsm, 'UCSM_XML_API').return_value = api
54 get_servers_mock = self.patch(ucsm, 'get_servers')
55- server = make_server()
56- current_state = 'up'
57- power_control = Element('lsPower', {'state': current_state})
58- get_servers_mock.return_value = [server]
59- get_server_power_control_mock = self.patch(
60- ucsm, 'get_server_power_control')
61- get_server_power_control_mock.return_value = power_control
62+ get_servers_mock.return_value = [make_server("on")]
63
64 power_state = power_state_ucsm(url, username, password, uuid)
65 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))
66- self.expectThat(
67- get_server_power_control_mock,
68- MockCalledOnceWith(api, server))
69 self.expectThat(power_state, Equals('on'))
70
71 def test_power_state_error_on_unknown_state(self):
72@@ -593,13 +577,7 @@
73 api = Mock()
74 self.patch(ucsm, 'UCSM_XML_API').return_value = api
75 get_servers_mock = self.patch(ucsm, 'get_servers')
76- server = make_server()
77- current_state = factory.make_name('error')
78- power_control = Element('lsPower', {'state': current_state})
79- get_servers_mock.return_value = [server]
80- get_server_power_control_mock = self.patch(
81- ucsm, 'get_server_power_control')
82- get_server_power_control_mock.return_value = power_control
83+ get_servers_mock.return_value = [make_server()]
84
85 self.assertRaises(
86 UCSM_XML_API_Error, power_state_ucsm, url,
87
88=== modified file 'src/provisioningserver/drivers/hardware/ucsm.py'
89--- src/provisioningserver/drivers/hardware/ucsm.py 2016-05-12 19:07:37 +0000
90+++ src/provisioningserver/drivers/hardware/ucsm.py 2016-12-13 10:51:37 +0000
91@@ -85,15 +85,10 @@
92 from provisioningserver.utils.twisted import synchronous
93
94
95-class UCSMState:
96- DOWN = "down"
97- UP = "up"
98-
99-
100 class UCSM_XML_API_Error(Exception):
101 """Failure talking to a Cisco UCS Manager."""
102
103- def __init__(self, msg, code):
104+ def __init__(self, msg, code=None):
105 super(UCSM_XML_API_Error, self).__init__(msg)
106 self.code = code
107
108@@ -410,8 +405,8 @@
109 # servers for a given UUID.
110 [server] = get_servers(api, uuid)
111 power_control = get_server_power_control(api, server)
112- command = get_power_command(maas_power_mode,
113- power_control.get('state'))
114+ command = get_power_command(
115+ maas_power_mode, server.get('operPower'))
116 set_server_power_control(api, power_control, command)
117
118
119@@ -421,13 +416,10 @@
120 # UUIDs are unique per server, so we get either one or zero
121 # servers for a given UUID.
122 [server] = get_servers(api, uuid)
123- power_control = get_server_power_control(api, server)
124- power_state = power_control.get('state')
125+ power_state = server.get('operPower')
126
127- if power_state == UCSMState.DOWN:
128- return 'off'
129- elif power_state == UCSMState.UP:
130- return 'on'
131+ if power_state in ('on', 'off'):
132+ return power_state
133 raise UCSM_XML_API_Error(
134 'Unknown power state: %s' % power_state, None)
135

Subscribers

People subscribed via source and target branches

to all changes: