diff options
author | Zuul <zuul@review.opendev.org> | 2020-03-20 19:23:11 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2020-03-20 19:23:11 +0000 |
commit | 5101808e8daceeef8cb486e71124c6b1efd4b319 (patch) | |
tree | 1c4c5517adb6da4dc0eba8ab32a4a4f1ec926e34 | |
parent | 9b9be431f5816c2cc30817c8975fd1062ec37369 (diff) | |
parent | d68ece1f1a450505b3120f9f27e8a207f7f4fc33 (diff) | |
download | ironic-5101808e8daceeef8cb486e71124c6b1efd4b319.tar.gz |
Merge "Don't require root partition when installing a whole disk image" into stable/stein12.1.4
3 files changed, 53 insertions, 7 deletions
diff --git a/ironic/drivers/modules/agent_base_vendor.py b/ironic/drivers/modules/agent_base_vendor.py index 1857e82c4..6b9fcad41 100644 --- a/ironic/drivers/modules/agent_base_vendor.py +++ b/ironic/drivers/modules/agent_base_vendor.py @@ -32,6 +32,7 @@ from ironic.conductor import steps as conductor_steps from ironic.conductor import utils as manager_utils from ironic.conf import CONF from ironic.drivers.modules import agent_client +from ironic.drivers.modules import boot_mode_utils from ironic.drivers.modules import deploy_utils from ironic.drivers import utils as driver_utils @@ -778,8 +779,13 @@ class AgentDeployMixin(HeartbeatMixin): """ node = task.node LOG.debug('Configuring local boot for node %s', node.uuid) - if not node.driver_internal_info.get( - 'is_whole_disk_image') and root_uuid: + + # For whole disk images it is not necessary that the root_uuid + # be provided since the bootloaders on the disk will be used + whole_disk_image = node.driver_internal_info.get('is_whole_disk_image') + if ((root_uuid and not whole_disk_image) or + (whole_disk_image and + boot_mode_utils.get_boot_mode(node) == 'uefi')): LOG.debug('Installing the bootloader for node %(node)s on ' 'partition %(part)s, EFI system partition %(efi)s', {'node': node.uuid, 'part': root_uuid, @@ -789,11 +795,20 @@ class AgentDeployMixin(HeartbeatMixin): efi_system_part_uuid=efi_system_part_uuid, prep_boot_part_uuid=prep_boot_part_uuid) if result['command_status'] == 'FAILED': - msg = (_("Failed to install a bootloader when " - "deploying node %(node)s. Error: %(error)s") % - {'node': node.uuid, - 'error': result['command_error']}) - log_and_raise_deployment_error(task, msg) + if not whole_disk_image: + msg = (_("Failed to install a bootloader when " + "deploying node %(node)s. Error: %(error)s") % + {'node': node.uuid, + 'error': result['command_error']}) + log_and_raise_deployment_error(task, msg) + else: + # Its possible the install will fail if the IPA image + # has not been updated, log this and continue + LOG.info('Could not install bootloader for whole disk ' + 'image for node %(node)s, Error: %(error)s"', + {'node': node.uuid, + 'error': result['command_error']}) + return try: persistent = True diff --git a/ironic/tests/unit/drivers/modules/test_agent_base_vendor.py b/ironic/tests/unit/drivers/modules/test_agent_base_vendor.py index eec26f9b6..2ece28003 100644 --- a/ironic/tests/unit/drivers/modules/test_agent_base_vendor.py +++ b/ironic/tests/unit/drivers/modules/test_agent_base_vendor.py @@ -29,6 +29,7 @@ from ironic.drivers import base as drivers_base from ironic.drivers.modules import agent from ironic.drivers.modules import agent_base_vendor from ironic.drivers.modules import agent_client +from ironic.drivers.modules import boot_mode_utils from ironic.drivers.modules import deploy_utils from ironic.drivers.modules import fake from ironic.drivers.modules import pxe @@ -1039,6 +1040,26 @@ class AgentDeployMixinTest(AgentDeployMixinBaseTest): try_set_boot_device_mock.assert_called_once_with( task, boot_devices.DISK, persistent=True) + @mock.patch.object(boot_mode_utils, 'get_boot_mode', + autospec=True) + @mock.patch.object(deploy_utils, 'try_set_boot_device', autospec=True) + @mock.patch.object(agent_client.AgentClient, 'install_bootloader', + autospec=True) + def test_configure_local_boot_no_root_uuid_whole_disk( + self, install_bootloader_mock, try_set_boot_device_mock, + boot_mode_mock): + with task_manager.acquire(self.context, self.node['uuid'], + shared=False) as task: + task.node.driver_internal_info['is_whole_disk_image'] = True + boot_mode_mock.return_value = 'uefi' + self.deploy.configure_local_boot( + task, root_uuid=None, + efi_system_part_uuid='efi-system-part-uuid') + install_bootloader_mock.assert_called_once_with( + mock.ANY, task.node, root_uuid=None, + efi_system_part_uuid='efi-system-part-uuid', + prep_boot_part_uuid=None) + @mock.patch.object(deploy_utils, 'try_set_boot_device', autospec=True) @mock.patch.object(agent_client.AgentClient, 'install_bootloader', autospec=True) @@ -1049,6 +1070,8 @@ class AgentDeployMixinTest(AgentDeployMixinBaseTest): driver_info = task.node.driver_info driver_info['force_persistent_boot_device'] = 'Default' task.node.driver_info = driver_info + driver_info['force_persistent_boot_device'] = 'Always' + task.node.driver_internal_info['is_whole_disk_image'] = False self.deploy.configure_local_boot(task) self.assertFalse(install_bootloader_mock.called) try_set_boot_device_mock.assert_called_once_with( @@ -1064,6 +1087,7 @@ class AgentDeployMixinTest(AgentDeployMixinBaseTest): driver_info = task.node.driver_info driver_info['force_persistent_boot_device'] = 'Always' task.node.driver_info = driver_info + task.node.driver_internal_info['is_whole_disk_image'] = False self.deploy.configure_local_boot(task) self.assertFalse(install_bootloader_mock.called) try_set_boot_device_mock.assert_called_once_with( @@ -1079,6 +1103,7 @@ class AgentDeployMixinTest(AgentDeployMixinBaseTest): driver_info = task.node.driver_info driver_info['force_persistent_boot_device'] = 'Never' task.node.driver_info = driver_info + task.node.driver_internal_info['is_whole_disk_image'] = False self.deploy.configure_local_boot(task) self.assertFalse(install_bootloader_mock.called) try_set_boot_device_mock.assert_called_once_with( diff --git a/releasenotes/notes/whole-disk-scsi-install-bootloader-f7e791d82da476ca.yaml b/releasenotes/notes/whole-disk-scsi-install-bootloader-f7e791d82da476ca.yaml new file mode 100644 index 000000000..e5fc1abb7 --- /dev/null +++ b/releasenotes/notes/whole-disk-scsi-install-bootloader-f7e791d82da476ca.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + When installing a whole disk image using iscsi, set up the bootloader even + if a root partition can not be found. The bootloaders will be located on + the disk. |