diff options
author | Zuul <zuul@review.opendev.org> | 2023-01-25 18:00:11 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2023-01-25 18:00:11 +0000 |
commit | 3e2fb276a92fcb9fb72aeb96a4bac4917a34dd90 (patch) | |
tree | 59619feb32173d0954930e8ba8a17d0d3b556e41 | |
parent | 601e178c9174f00f89c66c8b136cae024d925c4c (diff) | |
parent | 0ebc995e5f0c19dcb595ba3cdd282347c872def9 (diff) | |
download | ironic-3e2fb276a92fcb9fb72aeb96a4bac4917a34dd90.tar.gz |
Merge "Prevent pxe retry when agent token exists" into bugfix/20.2
-rw-r--r-- | ironic/drivers/modules/pxe_base.py | 6 | ||||
-rw-r--r-- | ironic/tests/unit/drivers/modules/test_pxe.py | 12 | ||||
-rw-r--r-- | releasenotes/notes/prevent-pxe-retry-when-token-exists-a4f38f7da56c1397.yaml | 7 |
3 files changed, 25 insertions, 0 deletions
diff --git a/ironic/drivers/modules/pxe_base.py b/ironic/drivers/modules/pxe_base.py index 317b65b85..78d7b5987 100644 --- a/ironic/drivers/modules/pxe_base.py +++ b/ironic/drivers/modules/pxe_base.py @@ -490,6 +490,12 @@ class PXEBaseMixin(object): def _should_retry_boot(node): # NOTE(dtantsur): this assumes IPA, do we need to make it generic? for field in ('agent_last_heartbeat', 'last_power_state_change'): + if node.driver_internal_info.get('agent_secret_token', False): + LOG.debug('Not retrying PXE boot for node %(node)s; an agent ' + 'token has been identified, meaning the agent ' + 'has started.', + {'node': node.uuid}) + return False if manager_utils.value_within_timeout( node.driver_internal_info.get(field), CONF.pxe.boot_retry_timeout): diff --git a/ironic/tests/unit/drivers/modules/test_pxe.py b/ironic/tests/unit/drivers/modules/test_pxe.py index d999a8f7a..be48f890e 100644 --- a/ironic/tests/unit/drivers/modules/test_pxe.py +++ b/ironic/tests/unit/drivers/modules/test_pxe.py @@ -1277,6 +1277,18 @@ class PXEBootRetryTestCase(db_base.DbTestCase): mock_boot_dev.assert_called_once_with(task, 'pxe', persistent=False) + def test_check_boot_status_not_retry_with_token(self, mock_power, + mock_boot_dev): + with task_manager.acquire(self.context, self.node.uuid, + shared=True) as task: + task.node.driver_internal_info = { + 'agent_secret_token': 'xyz' + } + task.driver.boot._check_boot_status(task) + self.assertTrue(task.shared) + mock_power.assert_not_called() + mock_boot_dev.assert_not_called() + class iPXEBootRetryTestCase(PXEBootRetryTestCase): diff --git a/releasenotes/notes/prevent-pxe-retry-when-token-exists-a4f38f7da56c1397.yaml b/releasenotes/notes/prevent-pxe-retry-when-token-exists-a4f38f7da56c1397.yaml new file mode 100644 index 000000000..5db6db6ec --- /dev/null +++ b/releasenotes/notes/prevent-pxe-retry-when-token-exists-a4f38f7da56c1397.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes a race condition in PXE initialization where logic to retry + what we suspect as potentially failed PXE boot operations was not + consulting if an ``agent token`` had been established, which is the + very first step in agent initialization. |