Use absolute path during qemu img rebase

During an assisted volume snapshot delete request from Cinder nova
removes the snapshot from the backing file chain. During that nova
checks the existence of such file. However in some cases (see the bug
report) the path is relative and therefore os.path.exists fails.

This patch makes sure that nova uses the volume absolute path to make
the backing file path absolute as well.

Closes-Bug #1885528

Change-Id: I58dca95251b607eaff602783fee2fc38e2421944
(cherry picked from commit b933312579)
This commit is contained in:
Balazs Gibizer 2020-07-02 12:13:29 +02:00 committed by Lee Yarwood
parent d3968f17df
commit 831abc9f83
2 changed files with 33 additions and 6 deletions

View File

@ -26635,8 +26635,23 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
not running should trigger a blockRebase using qemu-img not libvirt.
In this test, we rebase the image with another image as backing file.
"""
dom_xml = """
<domain type='kvm'>
<devices>
<disk type='file'>
<source file='/var/lib/nova/instances/%s/disk1_file'/>
<target dev='vda' bus='virtio'/>
<serial>0e38683e-f0af-418f-a3f1-6b67ea0f919d</serial>
</disk>
<disk type='block'>
<source dev='/path/to/dev/1'/>
<target dev='vdb' bus='virtio' serial='1234'/>
</disk>
</devices>
</domain>""" % self.inst['uuid']
mock_domain, guest = self._setup_block_rebase_domain_and_guest_mocks(
self.dom_xml)
dom_xml)
instance = objects.Instance(**self.inst)
snapshot_id = 'snapshot-1234'
@ -26647,10 +26662,13 @@ class LibvirtVolumeSnapshotTestCase(test.NoDBTestCase):
self.delete_info_1)
mock_disk_op_sema.__enter__.assert_called_once()
mock_qemu_img_info.assert_called_once_with("snap.img")
mock_execute.assert_called_once_with('qemu-img', 'rebase',
'-b', 'snap.img', '-F',
'fake_fmt', 'disk1_file')
mock_qemu_img_info.assert_called_once_with(
"/var/lib/nova/instances/%s/snap.img" % instance.uuid)
mock_execute.assert_called_once_with(
'qemu-img', 'rebase',
'-b', '/var/lib/nova/instances/%s/snap.img' % instance.uuid,
'-F', 'fake_fmt',
'/var/lib/nova/instances/%s/disk1_file' % instance.uuid)
@mock.patch.object(compute_utils, 'disk_ops_semaphore')
@mock.patch.object(host.Host, "has_min_version",

View File

@ -3008,7 +3008,16 @@ class LibvirtDriver(driver.ComputeDriver):
# If the rebased image is going to have a backing file then
# explicitly set the backing file format to avoid any security
# concerns related to file format auto detection.
backing_file = rebase_base
if os.path.isabs(rebase_base):
backing_file = rebase_base
else:
# this is a probably a volume snapshot case where the
# rebase_base is relative. See bug
# https://bugs.launchpad.net/nova/+bug/1885528
backing_file_name = os.path.basename(rebase_base)
volume_path = os.path.dirname(source_path)
backing_file = os.path.join(volume_path, backing_file_name)
b_file_fmt = images.qemu_img_info(backing_file).file_format
qemu_img_extra_arg = ['-F', b_file_fmt]