diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-12-09 14:57:51 +0100 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-12-09 14:57:51 +0100 |
commit | d0f61e949320e1c281746f9f6b8974c085cbe46a (patch) | |
tree | 1e4aa06c852867758c2259341f818668187ec0dc | |
parent | cdc3b9538f3e874dc7d76a90b116ecef3a3603c7 (diff) | |
download | ironic-d0f61e949320e1c281746f9f6b8974c085cbe46a.tar.gz |
Ignore fake nodes in the power sync loop
Fake nodes have power_state None and the power interface returns None as
well. Currently we make an update every loop, even though the values are
the same. This change fixes it.
Change-Id: I5227c058f3f6e1583b54a1cbc7edc6d42e20ae53
-rw-r--r-- | ironic/conductor/manager.py | 6 | ||||
-rw-r--r-- | ironic/tests/unit/conductor/test_manager.py | 9 |
2 files changed, 13 insertions, 2 deletions
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index 4935c5110..24305915a 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -3656,7 +3656,8 @@ def do_sync_power_state(task, count): # Also make sure to cache the current boot_mode and secure_boot states utils.node_cache_boot_mode(task) - if node.power_state and node.power_state == power_state: + if ((node.power_state and node.power_state == power_state) + or (node.power_state is None and power_state is None)): # No action is needed return 0 @@ -3666,7 +3667,8 @@ def do_sync_power_state(task, count): node = task.node # Repeat all checks with exclusive lock to avoid races - if node.power_state and node.power_state == power_state: + if ((node.power_state and node.power_state == power_state) + or (node.power_state is None and power_state is None)): # Node power state was updated to the correct value return 0 elif node.provision_state in SYNC_EXCLUDED_STATES or node.maintenance: diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index da1d7574d..542f224bf 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -4985,6 +4985,15 @@ class ManagerDoSyncPowerStateTestCase(db_base.DbTestCase): self.assertFalse(node_power_action.called) self.assertFalse(self.task.upgrade_lock.called) + def test_state_unchanged_for_fake_node(self, node_power_action): + self._do_sync_power_state(None, None) + + self.power.validate.assert_called_once_with(self.task) + self.power.get_power_state.assert_called_once_with(self.task) + self.assertIsNone(self.node.power_state) + self.assertFalse(node_power_action.called) + self.assertFalse(self.task.upgrade_lock.called) + @mock.patch.object(nova, 'power_update', autospec=True) def test_state_not_set(self, mock_power_update, node_power_action): self._do_sync_power_state(None, states.POWER_ON) |