Reboot and Poweroff fails with coreos IPA image
The CoreOS IPA images do not support poweroff/reboot due to running in a chroot. For this case, we fall back to forcing poweroff or reboot via sysrq commands Change-Id: I75d68b6308beba299d043e43a5fa1671b6ef3ada Closes-Bug: #1628367
This commit is contained in:
		@@ -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.
 | 
			
		||||
		Reference in New Issue
	
	Block a user