diff --git a/doc/source/admin/drivers/redfish.rst b/doc/source/admin/drivers/redfish.rst index b0f5c7ea85..cff72a48ff 100644 --- a/doc/source/admin/drivers/redfish.rst +++ b/doc/source/admin/drivers/redfish.rst @@ -193,10 +193,21 @@ place into on a FAT image, then insert the image into node's virtual floppy drive. When booting over PXE or virtual media, and user instance requires some -specific kernel configuration, ``[instance_info]/kernel_append_params`` -property can be used to pass user-specified kernel command line parameters. -For ramdisk kernel, ``[instance_info]/kernel_append_params`` property serves -the same purpose. +specific kernel configuration, the node's +``instance_info[kernel_append_params]`` or +``driver_info[kernel_append_params]`` properties can be used to pass +user-specified kernel command line parameters. + +.. code-block:: bash + + baremetal node set node-0 \ + --driver-info kernel_append_params="nofb nomodeset vga=normal" + +.. note:: + The ``driver_info`` field is supported starting with the Xena release. + +For ramdisk boot, the ``instance_info[ramdisk_kernel_arguments]`` property +serves the same purpose. Pre-built ISO images ~~~~~~~~~~~~~~~~~~~~ diff --git a/ironic/drivers/modules/ilo/boot.py b/ironic/drivers/modules/ilo/boot.py index 0452418fac..86f7d7006e 100644 --- a/ironic/drivers/modules/ilo/boot.py +++ b/ironic/drivers/modules/ilo/boot.py @@ -79,12 +79,12 @@ OPTIONAL_PROPERTIES = { "iLO.") } KERNEL_PARAM_PROPERTIES = { - 'ilo_kernel_append_params': _("Additional kernel parameters to pass down " - "to instance kernel. These parameters can " - "be consumed by the kernel or by the " - "applications by reading /proc/cmdline. " - "Mind severe cmdline size limit. Overrides " - "[ilo]/kernel_append_params ironic option.") + 'kernel_append_params': _("Additional kernel parameters to pass down " + "to instance kernel. These parameters can " + "be consumed by the kernel or by the " + "applications by reading /proc/cmdline. " + "Mind severe cmdline size limit. Overrides " + "[ilo]/kernel_append_params ironic option.") } COMMON_PROPERTIES = REQUIRED_PROPERTIES VMEDIA_OPTIONAL_PROPERTIES = OPTIONAL_PROPERTIES.copy() diff --git a/ironic/drivers/modules/image_utils.py b/ironic/drivers/modules/image_utils.py index 37c59ecc34..250449ea41 100644 --- a/ironic/drivers/modules/image_utils.py +++ b/ironic/drivers/modules/image_utils.py @@ -33,6 +33,7 @@ from ironic.common import utils from ironic.conf import CONF from ironic.drivers.modules import boot_mode_utils from ironic.drivers.modules import deploy_utils +from ironic.drivers import utils as driver_utils LOG = log.getLogger(__name__) @@ -433,7 +434,6 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href, {"boot_iso": base_iso}) img_handler = ImageHandler(task.node.driver) - k_param = img_handler.kernel_params i_info = task.node.instance_info @@ -447,7 +447,8 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href, kernel_params = None else: - kernel_params = i_info.get('kernel_append_params', k_param) + kernel_params = driver_utils.get_kernel_append_params( + task.node, default=img_handler.kernel_params) if params and not base_iso: kernel_params = ' '.join( diff --git a/ironic/tests/unit/drivers/modules/ilo/test_boot.py b/ironic/tests/unit/drivers/modules/ilo/test_boot.py index 81047956f5..6b7cfe7c8b 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_boot.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_boot.py @@ -54,9 +54,9 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): def test_parse_driver_info_deploy_iso(self): self.node.driver_info['ilo_deploy_iso'] = 'deploy-iso' - self.node.driver_info['ilo_kernel_append_params'] = 'kernel-param' + self.node.driver_info['kernel_append_params'] = 'kernel-param' expected_driver_info = {'ilo_bootloader': None, - 'ilo_kernel_append_params': 'kernel-param', + 'kernel_append_params': 'kernel-param', 'ilo_deploy_iso': 'deploy-iso'} actual_driver_info = ilo_boot.parse_driver_info(self.node) @@ -65,7 +65,7 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): def test_parse_driver_info_rescue_iso(self): self.node.driver_info['ilo_rescue_iso'] = 'rescue-iso' expected_driver_info = {'ilo_bootloader': None, - 'ilo_kernel_append_params': None, + 'kernel_append_params': None, 'ilo_rescue_iso': 'rescue-iso'} actual_driver_info = ilo_boot.parse_driver_info(self.node, 'rescue') @@ -75,11 +75,11 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): self.node.driver_info['ilo_deploy_kernel'] = 'kernel' self.node.driver_info['ilo_deploy_ramdisk'] = 'ramdisk' self.node.driver_info['ilo_bootloader'] = 'bootloader' - self.node.driver_info['ilo_kernel_append_params'] = 'kernel-param' + self.node.driver_info['kernel_append_params'] = 'kernel-param' expected_driver_info = {'ilo_deploy_kernel': 'kernel', 'ilo_deploy_ramdisk': 'ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': 'kernel-param'} + 'kernel_append_params': 'kernel-param'} actual_driver_info = ilo_boot.parse_driver_info(self.node) self.assertEqual(expected_driver_info, actual_driver_info) @@ -91,7 +91,7 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): expected_driver_info = {'ilo_rescue_kernel': 'kernel', 'ilo_rescue_ramdisk': 'ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': None} + 'kernel_append_params': None} actual_driver_info = ilo_boot.parse_driver_info(self.node, 'rescue') self.assertEqual(expected_driver_info, actual_driver_info) @@ -103,7 +103,7 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): expected_driver_info = {'ilo_deploy_kernel': 'kernel', 'ilo_deploy_ramdisk': 'ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': None} + 'kernel_append_params': None} actual_driver_info = ilo_boot.parse_driver_info(self.node) self.assertEqual(expected_driver_info, actual_driver_info) @@ -116,7 +116,7 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): expected_driver_info = {'ilo_rescue_kernel': 'kernel', 'ilo_rescue_ramdisk': 'ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': None} + 'kernel_append_params': None} actual_driver_info = ilo_boot.parse_driver_info(self.node, 'rescue') self.assertEqual(expected_driver_info, actual_driver_info) @@ -128,7 +128,7 @@ class IloBootCommonMethodsTestCase(test_common.BaseIloTest): expected_driver_info = {'ilo_deploy_kernel': 'kernel', 'ilo_deploy_ramdisk': 'ramdisk', 'ilo_bootloader': None, - 'ilo_kernel_append_params': None} + 'kernel_append_params': None} actual_driver_info = ilo_boot.parse_driver_info(self.node) self.assertEqual(expected_driver_info, actual_driver_info) @@ -1546,7 +1546,7 @@ class IloUefiHttpsBootTestCase(db_base.DbTestCase): 'ilo_deploy_kernel': 'deploy-kernel', 'ilo_deploy_ramdisk': 'deploy-ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': 'nofb nomodeset vga=normal' + 'kernel_append_params': 'nofb nomodeset vga=normal' } deploy_info.update({'ilo_username': 'admin', @@ -1577,7 +1577,7 @@ class IloUefiHttpsBootTestCase(db_base.DbTestCase): driver_info['ilo_rescue_ramdisk'] = 'rescue-ramdisk' driver_info['ilo_bootloader'] = 'bootloader' driver_info['ilo_add_certificates'] = 'false' - driver_info['ilo_kernel_append_params'] = 'kernel-param' + driver_info['kernel_append_params'] = 'kernel-param' driver_info['dummy_key'] = 'dummy-value' self.node.driver_info = driver_info self.node.save() @@ -1588,7 +1588,7 @@ class IloUefiHttpsBootTestCase(db_base.DbTestCase): 'ilo_rescue_kernel': 'rescue-kernel', 'ilo_rescue_ramdisk': 'rescue-ramdisk', 'ilo_bootloader': 'bootloader', - 'ilo_kernel_append_params': 'kernel-param' + 'kernel_append_params': 'kernel-param' } deploy_info.update({'ilo_username': 'admin', diff --git a/ironic/tests/unit/drivers/modules/test_image_utils.py b/ironic/tests/unit/drivers/modules/test_image_utils.py index c527c53dcb..1e105a08ff 100644 --- a/ironic/tests/unit/drivers/modules/test_image_utils.py +++ b/ironic/tests/unit/drivers/modules/test_image_utils.py @@ -553,6 +553,29 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase): root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123', base_iso='/path/to/baseiso', inject_files=None) + @mock.patch.object(image_utils.ImageHandler, 'publish_image', + autospec=True) + @mock.patch.object(images, 'create_boot_iso', autospec=True) + def test__prepare_iso_image_kernel_params_driver_info( + self, mock_create_boot_iso, mock_publish_image): + with task_manager.acquire(self.context, self.node.uuid, + shared=True) as task: + kernel_params = 'network-config=base64-cloudinit-blob' + + task.node.driver_info['kernel_append_params'] = kernel_params + + image_utils._prepare_iso_image( + task, 'http://kernel/img', 'http://ramdisk/img', + bootloader_href=None, root_uuid=task.node.uuid, + base_iso='/path/to/baseiso') + + mock_create_boot_iso.assert_called_once_with( + mock.ANY, mock.ANY, 'http://kernel/img', 'http://ramdisk/img', + boot_mode='bios', esp_image_href=None, + kernel_params=kernel_params, + root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123', + base_iso='/path/to/baseiso', inject_files=None) + def test__prepare_iso_image_bootable_iso(self): with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: diff --git a/releasenotes/notes/redfish-append-params-4d28d922484c2731.yaml b/releasenotes/notes/redfish-append-params-4d28d922484c2731.yaml new file mode 100644 index 0000000000..1f38729348 --- /dev/null +++ b/releasenotes/notes/redfish-append-params-4d28d922484c2731.yaml @@ -0,0 +1,14 @@ +--- +features: + - | + The ``redfish-virtual-media``, ``ilo-virtual-media`` and + ``idrac-redfish-virtual-media`` boot interfaces now support + ``kernel_append_params`` not only in the node's ``instance_info``, but also + ``driver_info``. This only applies when the boot image is built from + a kernel and an initramfs, not when a pre-built ISO is used. +deprecations: + - | + The ``ilo-virtual-media`` boot interface has previously declared support + for the ``ilo_kernel_append_params`` option in ``driver_info``. It has + never been implemented in reality and has been replaces by the new + ``kernel_append_params``.