Merge "Reboot and Poweroff fails with coreos IPA image"

This commit is contained in:
Jenkins 2017-01-20 22:53:36 +00:00 committed by Gerrit Code Review
commit 465687940b
3 changed files with 46 additions and 4 deletions
ironic_python_agent
extensions
tests/unit/extensions
releasenotes/notes

@ -499,7 +499,15 @@ class StandbyExtension(base.BaseAgentExtension):
except errors.CommandExecutionError as e:
LOG.warning('Failed to sync file system buffers: % s', e)
try:
utils.execute(command, check_exit_code=[0])
_, stderr = utils.execute(command, use_standard_locale=True,
check_exit_code=[0])
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:
raise errors.SystemRebootError(e.exit_code, e.stdout, e.stderr)

@ -679,7 +679,34 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.agent_extension._run_shutdown_command('poweroff')
calls = [mock.call('sync'),
mock.call('poweroff', check_exit_code=[0])]
mock.call('poweroff', use_standard_locale=True,
check_exit_code=[0])]
execute_mock.assert_has_calls(calls)
@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.'),
('', '')]
self.agent_extension._run_shutdown_command('poweroff')
calls = [mock.call('sync'),
mock.call('poweroff', use_standard_locale=True,
check_exit_code=[0]),
mock.call("echo o > /proc/sysrq-trigger", shell=True)]
execute_mock.assert_has_calls(calls)
@mock.patch('ironic_python_agent.utils.execute', autospec=True)
def test_run_shutdown_command_valid_reboot_sysrq(self, execute_mock):
execute_mock.side_effect = [('', ''), ('',
'Running in chroot, ignoring request.'),
('', '')]
self.agent_extension._run_shutdown_command('reboot')
calls = [mock.call('sync'),
mock.call('reboot', use_standard_locale=True,
check_exit_code=[0]),
mock.call("echo b > /proc/sysrq-trigger", shell=True)]
execute_mock.assert_has_calls(calls)
@mock.patch('ironic_python_agent.utils.execute', autospec=True)
@ -689,7 +716,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
success_result = self.agent_extension.run_image()
success_result.join()
calls = [mock.call('sync'),
mock.call('reboot', check_exit_code=[0])]
mock.call('reboot', use_standard_locale=True,
check_exit_code=[0])]
execute_mock.assert_has_calls(calls)
self.assertEqual('SUCCEEDED', success_result.command_status)
@ -711,7 +739,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
success_result.join()
calls = [mock.call('sync'),
mock.call('poweroff', check_exit_code=[0])]
mock.call('poweroff', use_standard_locale=True,
check_exit_code=[0])]
execute_mock.assert_has_calls(calls)
self.assertEqual('SUCCEEDED', success_result.command_status)

@ -0,0 +1,5 @@
---
fixes:
- Fixes a bug in the CoreOS IPA images (where IPA runs in a chroot), where
IPA could not power off or reboot properly. In this case, it will now use
SYSRQ commands to forcefully reboot or power off.