Sync boot mode when changing the boot device via Redfish

After changing the boot device via Redfish, check that the boot mode being
reported matches what is configured and, if not, set it to the configured
value.  Some BMCs change the boot mode when the device is set via Redfish,
this will ensure the mode is set properly.

Change-Id: Ib077f7f32de029833e6bd936853c382305bce36e
Story: 2008252
Task: 41103
(cherry picked from commit 685131fd36)
(cherry picked from commit 861e91c861)
(cherry picked from commit a6f38ab05a)
This commit is contained in:
Bob Fournier 2020-10-19 14:28:15 -04:00 committed by Julia Kreger
parent 88f1058eee
commit 64bda92296
3 changed files with 36 additions and 14 deletions

View File

@ -25,6 +25,7 @@ from ironic.common.i18n import _
from ironic.common import utils
from ironic.conductor import task_manager
from ironic.drivers import base
from ironic.drivers.modules import boot_mode_utils
from ironic.drivers.modules.redfish import utils as redfish_utils
LOG = log.getLogger(__name__)
@ -215,6 +216,10 @@ class RedfishManagement(base.ManagementInterface):
LOG.error(error_msg)
raise exception.RedfishError(error=error_msg)
# Ensure that boot mode is synced with what is set.
# Some BMCs reset it to default (BIOS) when changing the boot device.
boot_mode_utils.sync_boot_mode(task)
def get_boot_device(self, task):
"""Get the current boot device for a node.

View File

@ -90,9 +90,13 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(task, target)
# Asserts
fake_system.set_system_boot_options.assert_called_once_with(
expected, enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
mock_get_system.assert_called_once_with(task.node)
fake_system.set_system_boot_options.assert_has_calls(
[mock.call(expected,
enabled=sushy.BOOT_SOURCE_ENABLED_ONCE),
mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
mock_get_system.assert_called_with(task.node)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
# Reset mocks
fake_system.set_system_boot_options.reset_mock()
@ -115,9 +119,10 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(task, target)
# Asserts
fake_system.set_system_boot_source.assert_called_once_with(
expected, enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
mock_get_system.assert_called_once_with(task.node)
fake_system.set_system_boot_source.assert_has_calls([
mock.call(expected,
enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)])
self.assertEqual(3, mock_get_system.call_count)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@ -140,9 +145,11 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(
task, boot_devices.PXE, persistent=target)
fake_system.set_system_boot_options.assert_called_once_with(
sushy.BOOT_SOURCE_TARGET_PXE, enabled=expected)
mock_get_system.assert_called_once_with(task.node)
fake_system.set_system_boot_options.assert_has_calls(
[mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
enabled=expected),
mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
mock_get_system.assert_called_with(task.node)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@ -167,9 +174,10 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task.driver.management.set_boot_device(
task, boot_devices.PXE, persistent=target)
fake_system.set_system_boot_options.assert_called_once_with(
sushy.BOOT_SOURCE_TARGET_PXE, enabled=None)
mock_get_system.assert_called_once_with(task.node)
fake_system.set_system_boot_options.assert_has_calls(
[mock.call(sushy.BOOT_SOURCE_TARGET_PXE, enabled=None),
mock.call(mode=sushy.BOOT_SOURCE_MODE_BIOS)])
mock_get_system.assert_called_with(task.node)
# Reset mocks
fake_system.set_system_boot_options.reset_mock()
@ -234,6 +242,7 @@ class RedfishManagementTestCase(db_base.DbTestCase):
fake_system.set_system_boot_options.side_effect = [
sushy.exceptions.SushyError(),
None,
None
]
mock_get_system.return_value = fake_system
with task_manager.acquire(self.context, self.node.uuid,
@ -244,9 +253,9 @@ class RedfishManagementTestCase(db_base.DbTestCase):
mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
enabled=sushy.BOOT_SOURCE_ENABLED_CONTINUOUS),
mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
enabled=sushy.BOOT_SOURCE_ENABLED_ONCE),
enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
])
mock_get_system.assert_called_once_with(task.node)
mock_get_system.assert_called_with(task.node)
task.node.refresh()
self.assertEqual(

View File

@ -0,0 +1,8 @@
---
fixes:
- |
After changing the boot device via Redfish, check that the boot mode being
reported matches what is configured and, if not, set it to the configured
value. Some BMCs change the boot mode when the device is
set via Redfish, see `story 2008252
<https://storyboard.openstack.org/#!/story/2008252>`__ for details.