diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-04-12 13:31:48 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2021-04-29 07:44:04 +0000 |
commit | 033514ae7518d75dc66393432c19623d3f61c1b2 (patch) | |
tree | 5e59f5792b1a912f5bb9c970699dc7bf52b28e45 | |
parent | 48c39dc8a9413e723d67a987cb90145b3627a392 (diff) | |
download | ironic-python-agent-033514ae7518d75dc66393432c19623d3f61c1b2.tar.gz |
Always fall back to sysrq when power off fails
The line we're looking for is not there when IPA is in a container, at least
for CentOS based containers. Just fall back to sysrq on errors.
Change-Id: Ie4ee605ad9c6cda58808512a563247175859c71e
(cherry picked from commit b395181b1b1381ff0802744807a981df8453bc40)
-rw-r--r-- | ironic_python_agent/extensions/standby.py | 23 | ||||
-rw-r--r-- | ironic_python_agent/tests/unit/extensions/test_standby.py | 7 | ||||
-rw-r--r-- | releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml | 5 |
3 files changed, 25 insertions, 10 deletions
diff --git a/ironic_python_agent/extensions/standby.py b/ironic_python_agent/extensions/standby.py index 5f1b9945..496833a9 100644 --- a/ironic_python_agent/extensions/standby.py +++ b/ironic_python_agent/extensions/standby.py @@ -748,15 +748,24 @@ class StandbyExtension(base.BaseAgentExtension): self.sync() except errors.CommandExecutionError as e: LOG.warning('Failed to sync file system buffers: % s', e) + try: _, stderr = utils.execute(command, use_standard_locale=True) - if 'ignoring request.' in stderr: - LOG.debug('%s command failed with error %s, ' - 'falling back to sysrq-trigger.', command, stderr) - if command == 'poweroff': - utils.execute("echo o > /proc/sysrq-trigger", shell=True) - elif command == 'reboot': - utils.execute("echo b > /proc/sysrq-trigger", shell=True) + except processutils.ProcessExecutionError as e: + LOG.warning('%s command failed with error %s, ' + 'falling back to sysrq-trigger', command, e) + else: + if 'ignoring request' in stderr: + LOG.warning('%s command has been ignored, ' + 'falling back to sysrq-trigger', command) + else: + return + + try: + if command == 'poweroff': + utils.execute("echo o > /proc/sysrq-trigger", shell=True) + elif command == 'reboot': + utils.execute("echo b > /proc/sysrq-trigger", shell=True) except processutils.ProcessExecutionError as e: raise errors.SystemRebootError(e.exit_code, e.stdout, e.stderr) diff --git a/ironic_python_agent/tests/unit/extensions/test_standby.py b/ironic_python_agent/tests/unit/extensions/test_standby.py index 9f138e47..79b4a6ca 100644 --- a/ironic_python_agent/tests/unit/extensions/test_standby.py +++ b/ironic_python_agent/tests/unit/extensions/test_standby.py @@ -1049,9 +1049,10 @@ class TestStandbyExtension(base.IronicAgentTest): @mock.patch('ironic_python_agent.utils.execute', autospec=True) def test_run_shutdown_command_valid_poweroff_sysrq(self, execute_mock): - execute_mock.side_effect = [('', ''), ('', ''), ('', - 'Running in chroot, ignoring request.'), - ('', '')] + execute_mock.side_effect = [ + ('', ''), ('', ''), + processutils.ProcessExecutionError(''), + ('', '')] self.agent_extension._run_shutdown_command('poweroff') calls = [mock.call('hwclock', '-v', '--systohc'), diff --git a/releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml b/releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml new file mode 100644 index 00000000..8b2e68a6 --- /dev/null +++ b/releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixes fall-back to sysrq when powering off or rebooting the node from + inside a container. |