From d5c72d122504a8d6684c9d464c1b7e3d3b4a192d Mon Sep 17 00:00:00 2001 From: Devananda van der Veen Date: Thu, 17 Oct 2013 12:45:55 -0700 Subject: [PATCH] Be more patient with IPMI and BMC Before the ipmitool driver called 'power status; power on' in a loop which made the IPMI/BMCs not behave well. Also the total time we would wait (5 seconds) wasn't always enough. So make sure power on/off is only called once and wait up to 10 seconds for the power state change to go into effect. This is a port of change-id I5a4d7c84ebdf9c1f7d8d0570dbc31764c31f1fc6 Change-Id: I50982b24e5443b34d5597581ea2947a0301d35c9 Closes-Bug: #1234479 --- ironic/drivers/modules/ipmitool.py | 14 +++++++++----- ironic/tests/drivers/test_ipmitool.py | 2 -- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ironic/drivers/modules/ipmitool.py b/ironic/drivers/modules/ipmitool.py index 0d4e4cb2a4..e478a7f142 100644 --- a/ironic/drivers/modules/ipmitool.py +++ b/ironic/drivers/modules/ipmitool.py @@ -49,7 +49,7 @@ opts = [ default=paths.state_path_def('baremetal/console'), help='path to directory stores pidfiles of baremetal_terminal'), cfg.IntOpt('ipmi_power_retry', - default=5, + default=10, help='Maximum seconds to retry IPMI operations'), ] @@ -132,8 +132,10 @@ def _power_on(driver_info): state[0] = states.ERROR raise loopingcall.LoopingCallDone() try: + # only issue "power on" once + if retries[0] == 0: + _exec_ipmitool(driver_info, "power on") retries[0] += 1 - _exec_ipmitool(driver_info, "power on") except Exception: # Log failures but keep trying LOG.warning(_("IPMI power on failed for node %s.") @@ -141,7 +143,7 @@ def _power_on(driver_info): timer = loopingcall.FixedIntervalLoopingCall(_wait_for_power_on, state, retries) - timer.start(interval=1).wait() + timer.start(interval=1.0).wait() return state[0] @@ -163,8 +165,10 @@ def _power_off(driver_info): state[0] = states.ERROR raise loopingcall.LoopingCallDone() try: + # only issue "power off" once + if retries[0] == 0: + _exec_ipmitool(driver_info, "power off") retries[0] += 1 - _exec_ipmitool(driver_info, "power off") except Exception: # Log failures but keep trying LOG.warning(_("IPMI power off failed for node %s.") @@ -172,7 +176,7 @@ def _power_off(driver_info): timer = loopingcall.FixedIntervalLoopingCall(_wait_for_power_off, state=state, retries=retries) - timer.start(interval=1).wait() + timer.start(interval=1.0).wait() return state[0] diff --git a/ironic/tests/drivers/test_ipmitool.py b/ironic/tests/drivers/test_ipmitool.py index 1235073a6e..46012dd68d 100644 --- a/ironic/tests/drivers/test_ipmitool.py +++ b/ironic/tests/drivers/test_ipmitool.py @@ -147,9 +147,7 @@ class IPMIToolPrivateMethodTestCase(base.TestCase): expected = [mock.call(self.info, "power status"), mock.call(self.info, "power on"), mock.call(self.info, "power status"), - mock.call(self.info, "power on"), mock.call(self.info, "power status"), - mock.call(self.info, "power on"), mock.call(self.info, "power status")] state = ipmi._power_on(self.info)