diff --git a/ironic/drivers/modules/deploy_utils.py b/ironic/drivers/modules/deploy_utils.py index e29b3668cb..98371cfcf7 100644 --- a/ironic/drivers/modules/deploy_utils.py +++ b/ironic/drivers/modules/deploy_utils.py @@ -867,10 +867,31 @@ def get_boot_option(node): :returns: A string representing the boot option type. Defaults to 'netboot'. """ + + # NOTE(TheJulia): Software raid always implies local deployment + if is_software_raid(node): + return 'local' capabilities = utils.parse_instance_info_capabilities(node) return capabilities.get('boot_option', get_default_boot_option()).lower() +def is_software_raid(node): + """Determine if software raid is in use for the deployment. + + :param node: A single Node. + :returns: A boolean value of True when software raid is in use, + otherwise False + """ + target_raid_config = node.target_raid_config + logical_disks = target_raid_config.get('logical_disks', []) + software_raid = False + for logical_disk in logical_disks: + if logical_disk.get('controller') == 'software': + software_raid = True + break + return software_raid + + def build_agent_options(node): """Build the options to be passed to the agent ramdisk. diff --git a/ironic/tests/unit/drivers/modules/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/test_deploy_utils.py index 7f448df304..9624286b57 100644 --- a/ironic/tests/unit/drivers/modules/test_deploy_utils.py +++ b/ironic/tests/unit/drivers/modules/test_deploy_utils.py @@ -1255,6 +1255,31 @@ class OtherFunctionTestCase(db_base.DbTestCase): result = utils.get_boot_option(self.node) self.assertEqual("netboot", result) + @mock.patch.object(utils, 'is_software_raid', autospec=True) + def test_get_boot_option_software_raid(self, mock_is_software_raid): + mock_is_software_raid.return_value = True + cfg.CONF.set_override('default_boot_option', 'netboot', 'deploy') + result = utils.get_boot_option(self.node) + self.assertEqual("local", result) + + def test_is_software_raid(self): + self.node.target_raid_config = { + "logical_disks": [ + { + "size_gb": 100, + "raid_level": "1", + "controller": "software", + } + ] + } + result = utils.is_software_raid(self.node) + self.assertTrue(result) + + def test_is_software_raid_false(self): + self.node.target_raid_config = {} + result = utils.is_software_raid(self.node) + self.assertFalse(result) + @mock.patch.object(image_cache, 'clean_up_caches', autospec=True) def test_fetch_images(self, mock_clean_up_caches): diff --git a/releasenotes/notes/fixes-get-boot-option-for-software-raid-baa2cffd95e1f624.yaml b/releasenotes/notes/fixes-get-boot-option-for-software-raid-baa2cffd95e1f624.yaml new file mode 100644 index 0000000000..849273ac81 --- /dev/null +++ b/releasenotes/notes/fixes-get-boot-option-for-software-raid-baa2cffd95e1f624.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixes a minor issue with ``get_boot_option`` logic that did not account + for Software RAID. This can erroniously cause the deployment to take the + the incorrect deployment path and attempt to install a boot loader.