summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2021-12-09 14:57:51 +0100
committerDmitry Tantsur <dtantsur@protonmail.com>2021-12-09 14:57:51 +0100
commitd0f61e949320e1c281746f9f6b8974c085cbe46a (patch)
tree1e4aa06c852867758c2259341f818668187ec0dc
parentcdc3b9538f3e874dc7d76a90b116ecef3a3603c7 (diff)
downloadironic-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.py6
-rw-r--r--ironic/tests/unit/conductor/test_manager.py9
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)