From 171474d69a8b21cac578a38b5153b3f563285e62 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Tue, 27 Jul 2021 10:43:40 +0200 Subject: [PATCH] Fix regression in ramdisk deploy kernel parameters After commit d7a5b3469cfb5c16e122451e9cd8594d7a7671a1 the custom kernel parameters are not used in cleaning/inspection. This patch fixes it. Change-Id: Ic017cc0f3aebd4858a1a6e3326e5cf0fc0888d24 --- ironic/drivers/modules/image_utils.py | 10 ++- .../unit/drivers/modules/test_image_utils.py | 77 ++++++++++++++++++- ...stom-params-cleaning-f938549964ff6df0.yaml | 5 ++ 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/custom-params-cleaning-f938549964ff6df0.yaml diff --git a/ironic/drivers/modules/image_utils.py b/ironic/drivers/modules/image_utils.py index 5f877fb44d..dd93e71292 100644 --- a/ironic/drivers/modules/image_utils.py +++ b/ironic/drivers/modules/image_utils.py @@ -29,6 +29,7 @@ from ironic.common import exception from ironic.common.glance_service import service_utils from ironic.common.i18n import _ from ironic.common import images +from ironic.common import states from ironic.common import swift from ironic.common import utils from ironic.conf import CONF @@ -426,9 +427,12 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href, {'node': task.node.uuid}) i_info = task.node.instance_info + is_ramdisk_boot = ( + task.node.provision_state == states.DEPLOYING + and deploy_utils.get_boot_option(task.node) == 'ramdisk' + ) - boot_option = deploy_utils.get_boot_option(task.node) - if boot_option == 'ramdisk': + if is_ramdisk_boot: download_source = (i_info.get('ramdisk_image_download_source') or CONF.deploy.ramdisk_image_download_source) else: @@ -463,7 +467,7 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href, # NOTE(TheJulia): Until we support modifying a base iso, most of # this logic actually does nothing in the end. But it should! - if boot_option == "ramdisk": + if is_ramdisk_boot: if not base_iso: kernel_params = "root=/dev/ram0 text " kernel_params += i_info.get("ramdisk_kernel_arguments", "") diff --git a/ironic/tests/unit/drivers/modules/test_image_utils.py b/ironic/tests/unit/drivers/modules/test_image_utils.py index f458227714..edfb7b29b7 100644 --- a/ironic/tests/unit/drivers/modules/test_image_utils.py +++ b/ironic/tests/unit/drivers/modules/test_image_utils.py @@ -22,6 +22,7 @@ from oslo_utils import importutils from oslo_utils import uuidutils from ironic.common import images +from ironic.common import states from ironic.common import utils from ironic.conductor import task_manager from ironic.drivers.modules import deploy_utils @@ -241,7 +242,8 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase): enabled_inspect_interfaces=['redfish'], enabled_bios_interfaces=['redfish']) self.node = obj_utils.create_test_node( - self.context, driver='redfish', driver_info=INFO_DICT) + self.context, driver='redfish', driver_info=INFO_DICT, + provision_state=states.DEPLOYING) @mock.patch.object(image_utils.ImageHandler, 'unpublish_image', autospec=True) @@ -579,6 +581,79 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase): root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123', base_iso='/path/to/baseiso', inject_files=None) + @mock.patch.object(deploy_utils, 'get_boot_option', lambda node: 'ramdisk') + @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_for_ramdisk( + 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.instance_info['ramdisk_kernel_arguments'] = kernel_params + + image_utils._prepare_iso_image( + task, 'http://kernel/img', 'http://ramdisk/img', + bootloader_href=None, root_uuid=task.node.uuid) + + 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="root=/dev/ram0 text " + kernel_params, + root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123', + base_iso=None, inject_files=None) + + @mock.patch.object(deploy_utils, 'get_boot_option', lambda node: 'ramdisk') + @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_for_ramdisk_boot_iso( + 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.instance_info['ramdisk_kernel_arguments'] = 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, + # No custom parameters with a boot ISO present + kernel_params=None, + root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123', + base_iso='/path/to/baseiso', inject_files=None) + + @mock.patch.object(deploy_utils, 'get_boot_option', lambda node: 'ramdisk') + @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_for_ramdisk_cleaning( + 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 + task.node.provision_state = states.CLEANING + + 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) + @mock.patch.object(image_utils.ImageHandler, 'publish_image', autospec=True) @mock.patch.object(images, 'create_boot_iso', autospec=True) diff --git a/releasenotes/notes/custom-params-cleaning-f938549964ff6df0.yaml b/releasenotes/notes/custom-params-cleaning-f938549964ff6df0.yaml new file mode 100644 index 0000000000..0b326f86ba --- /dev/null +++ b/releasenotes/notes/custom-params-cleaning-f938549964ff6df0.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixes a regression in the ``ramdisk`` deploy where custom kernel parameters + were not used during inspection and cleaning.