Skip to content

Commit 6fd293e

Browse files
authored
Merge pull request #166 from stackhpc/bugfix/2024.1/ironic-rebuild
Fix ironic instance rebuild with API >=2.93
2 parents 2f258b8 + 613778a commit 6fd293e

2 files changed

Lines changed: 33 additions & 10 deletions

File tree

nova/tests/unit/virt/ironic/test_driver.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,7 +2221,8 @@ def test_detach_interface(self, mock_uv):
22212221
'_add_instance_info_to_node')
22222222
@mock.patch.object(objects.Instance, 'save')
22232223
def _test_rebuild(self, mock_save, mock_add_instance_info,
2224-
mock_looping, mock_wait_active, preserve=False):
2224+
mock_looping, mock_wait_active, preserve=False,
2225+
reimage_boot_volume=False, block_device_info=None):
22252226
node_uuid = uuidutils.generate_uuid()
22262227
node = _get_cached_node(id=node_uuid, instance_id=self.instance_id)
22272228
self.mock_conn.get_node.return_value = node
@@ -2239,7 +2240,9 @@ def _test_rebuild(self, mock_save, mock_add_instance_info,
22392240
context=self.ctx, instance=instance, image_meta=image_meta,
22402241
injected_files=None, admin_password=None, allocations={},
22412242
bdms=None, detach_block_devices=None, attach_block_devices=None,
2242-
preserve_ephemeral=preserve)
2243+
preserve_ephemeral=preserve,
2244+
reimage_boot_volume=reimage_boot_volume,
2245+
block_device_info=block_device_info)
22432246

22442247
mock_save.assert_called_once_with(
22452248
expected_task_state=[task_states.REBUILDING])
@@ -2276,11 +2279,25 @@ def test_rebuild_no_preserve_ephemeral(self, mock_required_by,
22762279
def test_rebuild_with_configdrive(self, mock_required_by,
22772280
mock_configdrive):
22782281
mock_required_by.return_value = True
2279-
self._test_rebuild()
2282+
self._test_rebuild(reimage_boot_volume=True)
22802283
# assert configdrive was generated
22812284
mock_configdrive.assert_called_once_with(
22822285
self.ctx, mock.ANY, mock.ANY, mock.ANY, extra_md={}, files=None)
22832286

2287+
@mock.patch.object(ironic_driver.IronicDriver, '_generate_configdrive')
2288+
@mock.patch.object(configdrive, 'required_by')
2289+
def test_rebuild_bfv_fails(self, mock_required_by,
2290+
mock_configdrive):
2291+
mock_required_by.return_value = False
2292+
block_device_info = self._create_fake_block_device_info()
2293+
e = self.assertRaises(exception.NovaException,
2294+
self._test_rebuild,
2295+
reimage_boot_volume=True,
2296+
block_device_info=block_device_info)
2297+
self.assertEqual(
2298+
"Ironic doesn't support rebuilding volume backed instances.",
2299+
str(e))
2300+
22842301
@mock.patch.object(ironic_driver.IronicDriver, '_generate_configdrive')
22852302
@mock.patch.object(configdrive, 'required_by')
22862303
@mock.patch.object(ironic_driver.IronicDriver,

nova/virt/ironic/driver.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -405,13 +405,16 @@ def failed_spawn_cleanup(self, instance):
405405
return
406406
self._cleanup_deploy(node, instance)
407407

408+
def _is_boot_from_volume(self, block_device_info):
409+
root_bdm = block_device.get_root_bdm(
410+
virt_driver.block_device_info_get_mapping(block_device_info))
411+
return root_bdm is not None
412+
408413
def _add_instance_info_to_node(self, node, instance, image_meta, flavor,
409414
preserve_ephemeral=None,
410415
block_device_info=None):
411416

412-
root_bdm = block_device.get_root_bdm(
413-
virt_driver.block_device_info_get_mapping(block_device_info))
414-
boot_from_volume = root_bdm is not None
417+
boot_from_volume = self._is_boot_from_volume(block_device_info)
415418
patch = patcher.create(node).get_deploy_patch(instance,
416419
image_meta,
417420
flavor,
@@ -1730,12 +1733,15 @@ def rebuild(self, context, instance, image_meta, injected_files,
17301733
:param preserve_ephemeral: Boolean value; if True the ephemeral
17311734
must be preserved on rebuild.
17321735
:param accel_uuids: Accelerator UUIDs. Ignored by this driver.
1733-
:param reimage_boot_volume: Re-image the volume backed instance.
1736+
:param reimage_boot_volume: Ironic driver raises when rebuild
1737+
of a boot from volume instance, as its not yet supported.
17341738
"""
17351739
if reimage_boot_volume:
1736-
raise exception.NovaException(
1737-
_("Ironic doesn't support rebuilding volume backed "
1738-
"instances."))
1740+
boot_from_volume = self._is_boot_from_volume(block_device_info)
1741+
if boot_from_volume:
1742+
raise exception.NovaException(
1743+
_("Ironic doesn't support rebuilding volume backed "
1744+
"instances."))
17391745

17401746
LOG.debug('Rebuild called for instance', instance=instance)
17411747

0 commit comments

Comments
 (0)