Browse Source

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 b395181b1b)
changes/02/788602/1
Dmitry Tantsur 1 month ago
parent
commit
033514ae75
3 changed files with 25 additions and 10 deletions
  1. +16
    -7
      ironic_python_agent/extensions/standby.py
  2. +4
    -3
      ironic_python_agent/tests/unit/extensions/test_standby.py
  3. +5
    -0
      releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml

+ 16
- 7
ironic_python_agent/extensions/standby.py View File

@ -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)


+ 4
- 3
ironic_python_agent/tests/unit/extensions/test_standby.py View File

@ -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'),


+ 5
- 0
releasenotes/notes/container-poweroff-d9ffb637cf1cee6c.yaml View File

@ -0,0 +1,5 @@
---
fixes:
- |
Fixes fall-back to sysrq when powering off or rebooting the node from
inside a container.

Loading…
Cancel
Save