diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-01-21 23:16:29 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-01-21 23:16:29 +0000 |
commit | 7e4e859363bd87846323c17a40ea0718340cef71 (patch) | |
tree | 38d7a2d078ca1c4f616543cbc6eb4d9341fa125c | |
parent | 3af35b4093a07eb2a36a4493b0ff863aa95d3fed (diff) | |
parent | ec7ff7d4e232515b20026a002748c91d6af7dd7d (diff) | |
download | ironic-7e4e859363bd87846323c17a40ea0718340cef71.tar.gz |
Merge "sync_power_states handles missing driver info"
-rw-r--r-- | ironic/conductor/manager.py | 13 | ||||
-rw-r--r-- | ironic/tests/conductor/test_manager.py | 35 |
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) |