summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-03-09 15:50:41 +0000
committerGerrit Code Review <review@openstack.org>2022-03-09 15:50:41 +0000
commite3221673eee64b7b2851cb99529a28f671a513a0 (patch)
treece06370b0d9f18941fbab4e57a60529c3fa68b61
parentcdf05bd0d7c339e14ceac8af3dcabf378d490544 (diff)
parentd0f61e949320e1c281746f9f6b8974c085cbe46a (diff)
downloadironic-e3221673eee64b7b2851cb99529a28f671a513a0.tar.gz
Merge "Ignore fake nodes in the power sync loop"
-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 9b1c20d9b..2c7dca18f 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -3653,7 +3653,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
@@ -3663,7 +3664,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 7016576b7..6102c3f71 100644
--- a/ironic/tests/unit/conductor/test_manager.py
+++ b/ironic/tests/unit/conductor/test_manager.py
@@ -4992,6 +4992,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)