Merge lp:~newell-jensen/maas/fix-1611999 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: 5604
Proposed branch: lp:~newell-jensen/maas/fix-1611999
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 121 lines (+13/-43)
2 files modified
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/fix-1611999
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+313020@code.launchpad.net

Commit message

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
Blake Rouse (blake-rouse) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/provisioningserver/drivers/hardware/tests/test_ucsm.py'
--- src/provisioningserver/drivers/hardware/tests/test_ucsm.py 2016-05-12 19:07:37 +0000
+++ src/provisioningserver/drivers/hardware/tests/test_ucsm.py 2016-12-12 14:04:24 +0000
@@ -92,8 +92,10 @@
92 return factory.make_name('dn')92 return factory.make_name('dn')
9393
9494
95def make_server():95def make_server(power_state=None):
96 return factory.make_name('server')96 return {
97 'operPower': power_state,
98 }
9799
98100
99class TestUCSMXMLAPIError(MAASTestCase):101class TestUCSMXMLAPIError(MAASTestCase):
@@ -547,19 +549,10 @@
547 api = Mock()549 api = Mock()
548 self.patch(ucsm, 'UCSM_XML_API').return_value = api550 self.patch(ucsm, 'UCSM_XML_API').return_value = api
549 get_servers_mock = self.patch(ucsm, 'get_servers')551 get_servers_mock = self.patch(ucsm, 'get_servers')
550 server = make_server()552 get_servers_mock.return_value = [make_server("off")]
551 current_state = 'down'
552 power_control = Element('lsPower', {'state': current_state})
553 get_servers_mock.return_value = [server]
554 get_server_power_control_mock = self.patch(
555 ucsm, 'get_server_power_control')
556 get_server_power_control_mock.return_value = power_control
557553
558 power_state = power_state_ucsm(url, username, password, uuid)554 power_state = power_state_ucsm(url, username, password, uuid)
559 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))555 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))
560 self.expectThat(
561 get_server_power_control_mock,
562 MockCalledOnceWith(api, server))
563 self.expectThat(power_state, Equals('off'))556 self.expectThat(power_state, Equals('off'))
564557
565 def test_power_state_get_on(self):558 def test_power_state_get_on(self):
@@ -570,19 +563,10 @@
570 api = Mock()563 api = Mock()
571 self.patch(ucsm, 'UCSM_XML_API').return_value = api564 self.patch(ucsm, 'UCSM_XML_API').return_value = api
572 get_servers_mock = self.patch(ucsm, 'get_servers')565 get_servers_mock = self.patch(ucsm, 'get_servers')
573 server = make_server()566 get_servers_mock.return_value = [make_server("on")]
574 current_state = 'up'
575 power_control = Element('lsPower', {'state': current_state})
576 get_servers_mock.return_value = [server]
577 get_server_power_control_mock = self.patch(
578 ucsm, 'get_server_power_control')
579 get_server_power_control_mock.return_value = power_control
580567
581 power_state = power_state_ucsm(url, username, password, uuid)568 power_state = power_state_ucsm(url, username, password, uuid)
582 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))569 self.expectThat(get_servers_mock, MockCalledOnceWith(api, uuid))
583 self.expectThat(
584 get_server_power_control_mock,
585 MockCalledOnceWith(api, server))
586 self.expectThat(power_state, Equals('on'))570 self.expectThat(power_state, Equals('on'))
587571
588 def test_power_state_error_on_unknown_state(self):572 def test_power_state_error_on_unknown_state(self):
@@ -593,13 +577,7 @@
593 api = Mock()577 api = Mock()
594 self.patch(ucsm, 'UCSM_XML_API').return_value = api578 self.patch(ucsm, 'UCSM_XML_API').return_value = api
595 get_servers_mock = self.patch(ucsm, 'get_servers')579 get_servers_mock = self.patch(ucsm, 'get_servers')
596 server = make_server()580 get_servers_mock.return_value = [make_server()]
597 current_state = factory.make_name('error')
598 power_control = Element('lsPower', {'state': current_state})
599 get_servers_mock.return_value = [server]
600 get_server_power_control_mock = self.patch(
601 ucsm, 'get_server_power_control')
602 get_server_power_control_mock.return_value = power_control
603581
604 self.assertRaises(582 self.assertRaises(
605 UCSM_XML_API_Error, power_state_ucsm, url,583 UCSM_XML_API_Error, power_state_ucsm, url,
606584
=== modified file 'src/provisioningserver/drivers/hardware/ucsm.py'
--- src/provisioningserver/drivers/hardware/ucsm.py 2016-05-12 19:07:37 +0000
+++ src/provisioningserver/drivers/hardware/ucsm.py 2016-12-12 14:04:24 +0000
@@ -85,15 +85,10 @@
85from provisioningserver.utils.twisted import synchronous85from provisioningserver.utils.twisted import synchronous
8686
8787
88class UCSMState:
89 DOWN = "down"
90 UP = "up"
91
92
93class UCSM_XML_API_Error(Exception):88class UCSM_XML_API_Error(Exception):
94 """Failure talking to a Cisco UCS Manager."""89 """Failure talking to a Cisco UCS Manager."""
9590
96 def __init__(self, msg, code):91 def __init__(self, msg, code=None):
97 super(UCSM_XML_API_Error, self).__init__(msg)92 super(UCSM_XML_API_Error, self).__init__(msg)
98 self.code = code93 self.code = code
9994
@@ -410,8 +405,8 @@
410 # servers for a given UUID.405 # servers for a given UUID.
411 [server] = get_servers(api, uuid)406 [server] = get_servers(api, uuid)
412 power_control = get_server_power_control(api, server)407 power_control = get_server_power_control(api, server)
413 command = get_power_command(maas_power_mode,408 command = get_power_command(
414 power_control.get('state'))409 maas_power_mode, server.get('operPower'))
415 set_server_power_control(api, power_control, command)410 set_server_power_control(api, power_control, command)
416411
417412
@@ -421,13 +416,10 @@
421 # UUIDs are unique per server, so we get either one or zero416 # UUIDs are unique per server, so we get either one or zero
422 # servers for a given UUID.417 # servers for a given UUID.
423 [server] = get_servers(api, uuid)418 [server] = get_servers(api, uuid)
424 power_control = get_server_power_control(api, server)419 power_state = server.get('operPower')
425 power_state = power_control.get('state')
426420
427 if power_state == UCSMState.DOWN:421 if power_state in ('on', 'off'):
428 return 'off'422 return power_state
429 elif power_state == UCSMState.UP:
430 return 'on'
431 raise UCSM_XML_API_Error(423 raise UCSM_XML_API_Error(
432 'Unknown power state: %s' % power_state, None)424 'Unknown power state: %s' % power_state, None)
433425