summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Fournier <bfournie@redhat.com>2021-03-31 14:58:26 -0400
committerDmitry Tantsur <dtantsur@protonmail.com>2021-04-01 08:50:18 +0000
commit4fd099345d662dc82a978e767c0b534de4e44e7d (patch)
treebb6c3eaca05218bb73fc30d999ff8cdf80cda54e
parent2466d5e36507a8a83e7937cf0fbf796c5fabc0ef (diff)
downloadironic-4fd099345d662dc82a978e767c0b534de4e44e7d.tar.gz
Restrict syncing of boot mode to Supermicro
The fix for https://storyboard.openstack.org/#!/story/2008252 synced the boot mode after changing the boot device, because Supermicro nodes reset the boot mode if not included in the boot device set. However this can cause a problem on Dell nodes when changing the mode uefi->bios or bios->uefi. Restrict the syncing of the boot mode to Supermicro. Story: 2008712 Task: 42046 Change-Id: I9f305cb3f33766c1c93cf4347368b1ce025fc635 (cherry picked from commit 8bd25a9882e64ae378974e974c39b874d4b9b0e8)
-rw-r--r--ironic/drivers/modules/redfish/management.py7
-rw-r--r--ironic/tests/unit/drivers/modules/redfish/test_management.py23
-rw-r--r--releasenotes/notes/restrict-sync-mode-after-device-to-supermicro-218e8cb57735c685.yaml11
3 files changed, 29 insertions, 12 deletions
diff --git a/ironic/drivers/modules/redfish/management.py b/ironic/drivers/modules/redfish/management.py
index 24713fc61..719e5b4f6 100644
--- a/ironic/drivers/modules/redfish/management.py
+++ b/ironic/drivers/modules/redfish/management.py
@@ -239,7 +239,12 @@ class RedfishManagement(base.ManagementInterface):
# 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)
+ # It should only be synced on these vendors as other vendor
+ # implementations will result in an error
+ # (see https://storyboard.openstack.org/#!/story/2008712)
+ vendor = task.node.properties.get('vendor', None)
+ if vendor and vendor.lower() == 'supermicro':
+ boot_mode_utils.sync_boot_mode(task)
def get_boot_device(self, task):
"""Get the current boot device for a node.
diff --git a/ironic/tests/unit/drivers/modules/redfish/test_management.py b/ironic/tests/unit/drivers/modules/redfish/test_management.py
index 1732e5f85..6b70c5037 100644
--- a/ironic/tests/unit/drivers/modules/redfish/test_management.py
+++ b/ironic/tests/unit/drivers/modules/redfish/test_management.py
@@ -104,8 +104,7 @@ class RedfishManagementTestCase(db_base.DbTestCase):
# Asserts
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)])
+ enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)])
mock_get_system.assert_called_with(task.node)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@@ -131,8 +130,7 @@ class RedfishManagementTestCase(db_base.DbTestCase):
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)])
+ enabled=expected)])
mock_get_system.assert_called_with(task.node)
self.assertNotIn('redfish_boot_device',
task.node.driver_internal_info)
@@ -159,8 +157,7 @@ class RedfishManagementTestCase(db_base.DbTestCase):
task, boot_devices.PXE, persistent=target)
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.call(sushy.BOOT_SOURCE_TARGET_PXE, enabled=None)])
mock_get_system.assert_called_with(task.node)
# Reset mocks
@@ -266,11 +263,15 @@ class RedfishManagementTestCase(db_base.DbTestCase):
shared=False) as task:
task.driver.management.set_boot_device(
task, boot_devices.PXE, persistent=True)
-
- 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)])
+ if vendor == 'SuperMicro':
+ 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)])
+ else:
+ fake_system.set_system_boot_options.assert_has_calls(
+ [mock.call(sushy.BOOT_SOURCE_TARGET_PXE,
+ enabled=expected)])
# Reset mocks
fake_system.set_system_boot_options.reset_mock()
diff --git a/releasenotes/notes/restrict-sync-mode-after-device-to-supermicro-218e8cb57735c685.yaml b/releasenotes/notes/restrict-sync-mode-after-device-to-supermicro-218e8cb57735c685.yaml
new file mode 100644
index 000000000..0436b81e6
--- /dev/null
+++ b/releasenotes/notes/restrict-sync-mode-after-device-to-supermicro-218e8cb57735c685.yaml
@@ -0,0 +1,11 @@
+---
+fixes:
+ - |
+ The fix for story
+ `2008252 <https://storyboard.openstack.org/#!/story/2008252>`_ synced
+ the boot mode after changing the boot device because Supermicro nodes
+ reset the boot mode if not included in the boot device set. However this
+ can cause a problem on Dell nodes when changing the mode uefi->bios or
+ bios->uefi, see `story 2008712
+ <https://storyboard.openstack.org/#!/story/2008712>`_ for details.
+ Restrict the syncing of the boot mode to Supermicro.