summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-01-21 23:16:29 +0000
committerGerrit Code Review <review@openstack.org>2014-01-21 23:16:29 +0000
commit7e4e859363bd87846323c17a40ea0718340cef71 (patch)
tree38d7a2d078ca1c4f616543cbc6eb4d9341fa125c
parent3af35b4093a07eb2a36a4493b0ff863aa95d3fed (diff)
parentec7ff7d4e232515b20026a002748c91d6af7dd7d (diff)
downloadironic-7e4e859363bd87846323c17a40ea0718340cef71.tar.gz
Merge "sync_power_states handles missing driver info"
-rw-r--r--ironic/conductor/manager.py13
-rw-r--r--ironic/tests/conductor/test_manager.py35
2 files changed, 47 insertions, 1 deletions
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index 71fe151d9..3d4f81283 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -367,7 +367,18 @@ class ConductorManager(service.PeriodicService):
try:
with task_manager.acquire(context, node_id) as task:
node = task.node
- power_state = task.driver.power.get_power_state(task, node)
+
+ try:
+ power_state = task.driver.power.get_power_state(task,
+ node)
+ except Exception as e:
+ #TODO(rloo): change to IronicException, after
+ # https://bugs.launchpad.net/ironic/+bug/1267693
+ LOG.debug(_("During sync_power_state, could not get "
+ "power state for node %(node)s. Error: %(err)s.") %
+ {'node': node.uuid, 'err': e})
+ continue
+
if power_state != node['power_state']:
# NOTE(deva): don't log a warning the first time we
# sync a node's power state
diff --git a/ironic/tests/conductor/test_manager.py b/ironic/tests/conductor/test_manager.py
index e68793518..8a2d1df7e 100644
--- a/ironic/tests/conductor/test_manager.py
+++ b/ironic/tests/conductor/test_manager.py
@@ -21,6 +21,7 @@
import mock
from oslo.config import cfg
+from testtools.matchers import HasLength
from ironic.common import driver_factory
from ironic.common import exception
@@ -147,6 +148,40 @@ class ManagerTestCase(base.DbTestCase):
self.assertEqual(n1['power_state'], states.POWER_OFF)
self.assertEqual(n3['power_state'], states.POWER_ON)
+ def test__sync_power_state_node_no_power_state(self):
+ self.service.start()
+
+ # create three nodes
+ nodes = []
+ for i in range(0, 3):
+ n = utils.get_test_node(id=i, uuid=ironic_utils.generate_uuid(),
+ driver='fake', power_state=states.POWER_OFF)
+ self.dbapi.create_node(n)
+ nodes.append(n['uuid'])
+
+ # cannot get power state of node 2; only nodes 1 & 3 have
+ # their power states changed.
+ with mock.patch.object(self.driver.power,
+ 'get_power_state') as get_power_mock:
+ returns = [states.POWER_ON,
+ exception.InvalidParameterValue("invalid"),
+ states.POWER_ON]
+
+ def side_effect(*args):
+ result = returns.pop(0)
+ if isinstance(result, Exception):
+ raise result
+ return result
+
+ get_power_mock.side_effect = side_effect
+ self.service._sync_power_states(self.context)
+ self.assertThat(returns, HasLength(0))
+
+ final = [states.POWER_ON, states.POWER_OFF, states.POWER_ON]
+ for i in range(0, 3):
+ n = self.dbapi.get_node(nodes[i])
+ self.assertEqual(n.power_state, final[i])
+
def test_get_power_state(self):
n = utils.get_test_node(driver='fake')
self.dbapi.create_node(n)