summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-03-20 19:23:11 +0000
committerGerrit Code Review <review@openstack.org>2020-03-20 19:23:11 +0000
commit5101808e8daceeef8cb486e71124c6b1efd4b319 (patch)
tree1c4c5517adb6da4dc0eba8ab32a4a4f1ec926e34
parent9b9be431f5816c2cc30817c8975fd1062ec37369 (diff)
parentd68ece1f1a450505b3120f9f27e8a207f7f4fc33 (diff)
downloadironic-5101808e8daceeef8cb486e71124c6b1efd4b319.tar.gz
Merge "Don't require root partition when installing a whole disk image" into stable/stein12.1.4
-rw-r--r--ironic/drivers/modules/agent_base_vendor.py29
-rw-r--r--ironic/tests/unit/drivers/modules/test_agent_base_vendor.py25
-rw-r--r--releasenotes/notes/whole-disk-scsi-install-bootloader-f7e791d82da476ca.yaml6
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.