Skip to content

Commit a8de673

Browse files
pshcheloyaguangtang
authored andcommitted
Fix device type when booting from ISO image
Closes-Bug: #2054446 Change-Id: Ib4cc34c30a8acf09a1ab6be89d0faa76fb6e705e (cherry picked from commit 96a5c21)
1 parent 1c9f3a1 commit a8de673

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

nova/tests/unit/virt/libvirt/test_blockinfo.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ def test_get_disk_mapping_volumes_swap(self):
578578
'disk_bus': u'virtio',
579579
'device_type': u'disk'}]}
580580
instance_ref.flavor.swap = 5
581-
image_meta = {}
581+
image_meta = objects.ImageMeta.from_dict(None)
582582

583583
mapping = blockinfo.get_disk_mapping("kvm", instance_ref,
584584
"virtio", "ide",
@@ -840,7 +840,7 @@ def test_get_disk_mapping_blockdev_root(self):
840840
def test_get_disk_mapping_blockdev_root_on_spawn(self):
841841
# A disk mapping with a blockdev initializing the default root
842842
instance_ref = objects.Instance(**self.test_instance)
843-
image_meta = {}
843+
image_meta = objects.ImageMeta.from_dict(None)
844844

845845
block_device_info = {
846846
'image': [],
@@ -1287,6 +1287,18 @@ def test_get_root_info_no_bdm_empty_image_meta(self, mock_find_dev):
12871287

12881288
self.assertEqual('virtio', info['bus'])
12891289

1290+
@mock.patch('nova.virt.libvirt.blockinfo.get_info_from_bdm')
1291+
def test_get_root_info_bdm_with_iso_image(self, mock_get_info):
1292+
self.test_image_meta['disk_format'] = 'iso'
1293+
instance = objects.Instance(**self.test_instance)
1294+
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
1295+
init_root_bdm = {'device_type': 'disk'}
1296+
iso_root_bdm = {'device_type': 'cdrom', 'disk_bus': 'ide'}
1297+
blockinfo.get_root_info(instance, 'kvm', image_meta, init_root_bdm,
1298+
'virtio', 'ide')
1299+
mock_get_info.assert_called_once_with(instance, 'kvm', image_meta,
1300+
iso_root_bdm, {}, 'virtio')
1301+
12901302
@mock.patch('nova.virt.libvirt.blockinfo.get_info_from_bdm')
12911303
def test_get_root_info_bdm(self, mock_get_info):
12921304
# call get_root_info() with DriverBlockDevice
@@ -1337,15 +1349,11 @@ def test_get_root_info_bdm_with_deepcopy(self, mock_get_info):
13371349
# No root_device_name
13381350
blockinfo.get_root_info(
13391351
instance, 'kvm', image_meta, root_bdm, 'virtio', 'ide')
1340-
mock_get_info.assert_called_once_with(
1341-
instance, 'kvm', image_meta, root_bdm, {}, 'virtio')
13421352
mock_get_info.reset_mock()
13431353
# Both device names
13441354
blockinfo.get_root_info(
13451355
instance, 'kvm', image_meta, root_bdm, 'virtio', 'scsi',
13461356
root_device_name='/dev/sda')
1347-
mock_get_info.assert_called_once_with(
1348-
instance, 'kvm', image_meta, root_bdm, {}, 'virtio')
13491357
mock_get_info.reset_mock()
13501358
# Missing device names
13511359
original_bdm = copy.deepcopy(root_bdm)

nova/virt/libvirt/blockinfo.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -427,28 +427,32 @@ def get_device_name(bdm):
427427
def get_root_info(instance, virt_type, image_meta, root_bdm,
428428
disk_bus, cdrom_bus, root_device_name=None):
429429

430+
# NOTE(mriedem): In case the image_meta object was constructed from
431+
# an empty dict, like in the case of evacuate, we have to first check
432+
# if disk_format is set on the ImageMeta object.
433+
if is_iso := (image_meta.obj_attr_is_set('disk_format') and
434+
image_meta.disk_format == 'iso'):
435+
root_device_bus = cdrom_bus
436+
root_device_type = 'cdrom'
437+
else:
438+
root_device_bus = disk_bus
439+
root_device_type = 'disk'
440+
430441
if root_bdm is None:
431-
# NOTE(mriedem): In case the image_meta object was constructed from
432-
# an empty dict, like in the case of evacuate, we have to first check
433-
# if disk_format is set on the ImageMeta object.
434-
if (image_meta.obj_attr_is_set('disk_format') and
435-
image_meta.disk_format == 'iso'):
436-
root_device_bus = cdrom_bus
437-
root_device_type = 'cdrom'
438-
else:
439-
root_device_bus = disk_bus
440-
root_device_type = 'disk'
441442
if not root_device_name:
442443
root_device_name = find_disk_dev_for_disk_bus({}, root_device_bus)
443-
444444
return {'bus': root_device_bus,
445445
'type': root_device_type,
446446
'dev': block_device.strip_dev(root_device_name),
447447
'boot_index': '1'}
448448

449-
root_bdm_copy = root_bdm
450-
if not get_device_name(root_bdm) and root_device_name:
451-
root_bdm_copy = copy.deepcopy(root_bdm)
449+
root_bdm_copy = copy.deepcopy(root_bdm)
450+
451+
if is_iso:
452+
root_bdm_copy['disk_bus'] = root_device_bus
453+
root_bdm_copy['device_type'] = root_device_type
454+
455+
if not get_device_name(root_bdm_copy) and root_device_name:
452456
root_bdm_copy['device_name'] = root_device_name
453457

454458
return get_info_from_bdm(

0 commit comments

Comments
 (0)