Skip to content

Commit 09c9826

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix deepcopy usage for BlockDeviceMapping in get_root_info" into unmaintained/zed
2 parents 94f01f2 + 26e815d commit 09c9826

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,7 @@ def test_get_root_info_no_bdm_empty_image_meta(self, mock_find_dev):
12891289

12901290
@mock.patch('nova.virt.libvirt.blockinfo.get_info_from_bdm')
12911291
def test_get_root_info_bdm(self, mock_get_info):
1292+
# call get_root_info() with DriverBlockDevice
12921293
instance = objects.Instance(**self.test_instance)
12931294
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
12941295
root_bdm = {'mount_device': '/dev/vda',
@@ -1318,6 +1319,49 @@ def test_get_root_info_bdm(self, mock_get_info):
13181319
{}, 'virtio')
13191320
mock_get_info.reset_mock()
13201321

1322+
@mock.patch('nova.virt.libvirt.blockinfo.get_info_from_bdm')
1323+
def test_get_root_info_bdm_with_deepcopy(self, mock_get_info):
1324+
# call get_root_info() with BlockDeviceMapping
1325+
instance = objects.Instance(**self.test_instance)
1326+
image_meta = objects.ImageMeta.from_dict(self.test_image_meta)
1327+
root_bdm = objects.BlockDeviceMapping(self.context,
1328+
**fake_block_device.FakeDbBlockDeviceDict(
1329+
{'id': 3, 'instance_uuid': uuids.instance,
1330+
'device_name': '/dev/sda',
1331+
'source_type': 'blank',
1332+
'destination_type': 'local',
1333+
'device_type': 'cdrom',
1334+
'disk_bus': 'virtio',
1335+
'volume_id': 'fake-volume-id-1',
1336+
'boot_index': 0}))
1337+
# No root_device_name
1338+
blockinfo.get_root_info(
1339+
instance, 'kvm', image_meta, root_bdm, 'virtio', 'ide')
1340+
mock_get_info.assert_called_once_with(
1341+
instance, 'kvm', image_meta, root_bdm, {}, 'virtio')
1342+
mock_get_info.reset_mock()
1343+
# Both device names
1344+
blockinfo.get_root_info(
1345+
instance, 'kvm', image_meta, root_bdm, 'virtio', 'scsi',
1346+
root_device_name='/dev/sda')
1347+
mock_get_info.assert_called_once_with(
1348+
instance, 'kvm', image_meta, root_bdm, {}, 'virtio')
1349+
mock_get_info.reset_mock()
1350+
# Missing device names
1351+
original_bdm = copy.deepcopy(root_bdm)
1352+
root_bdm.device_name = ''
1353+
blockinfo.get_root_info(
1354+
instance, 'kvm', image_meta, root_bdm, 'virtio', 'scsi',
1355+
root_device_name='/dev/sda')
1356+
mock_get_info.assert_called_with(
1357+
instance, 'kvm', image_meta, mock.ANY, {}, 'virtio')
1358+
actual_call = mock_get_info.call_args
1359+
_, _, _, actual_bdm, _, _ = actual_call[0]
1360+
self.assertEqual(
1361+
original_bdm.obj_to_primitive(),
1362+
actual_bdm.obj_to_primitive()
1363+
)
1364+
13211365
def test_get_boot_order_simple(self):
13221366
disk_info = {
13231367
'disk_bus': 'virtio',

nova/virt/libvirt/blockinfo.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
7070
"""
7171

72+
import copy
7273
import itertools
7374
import operator
7475

@@ -444,12 +445,13 @@ def get_root_info(instance, virt_type, image_meta, root_bdm,
444445
'dev': block_device.strip_dev(root_device_name),
445446
'boot_index': '1'}
446447

448+
root_bdm_copy = root_bdm
447449
if not get_device_name(root_bdm) and root_device_name:
448-
root_bdm = root_bdm.copy()
449-
root_bdm['device_name'] = root_device_name
450+
root_bdm_copy = copy.deepcopy(root_bdm)
451+
root_bdm_copy['device_name'] = root_device_name
450452

451453
return get_info_from_bdm(
452-
instance, virt_type, image_meta, root_bdm, {}, disk_bus,
454+
instance, virt_type, image_meta, root_bdm_copy, {}, disk_bus,
453455
)
454456

455457

0 commit comments

Comments
 (0)