summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2021-04-12 13:31:48 +0200
committerDmitry Tantsur <dtantsur@protonmail.com>2021-04-29 07:44:04 +0000
commit033514ae7518d75dc66393432c19623d3f61c1b2 (patch)
tree5e59f5792b1a912f5bb9c970699dc7bf52b28e45
parent48c39dc8a9413e723d67a987cb90145b3627a392 (diff)
downloadironic-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.py23
-rw-r--r--ironic_python_agent/tests/unit/extensions/test_standby.py7
-rw-r--r--releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml5
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.