summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-06-25 23:11:10 +0000
committerGerrit Code Review <review@openstack.org>2021-06-25 23:11:10 +0000
commitdb1660d545c7cdf9a95e98d841f81ca60759d56d (patch)
tree347a18a751e3ae08d9609cb8d5cb212d7a86b601
parente6d6284563a9b60eeaf4fdffdede3fc0966869ef (diff)
parente926ec75e29dcdf3b671811533587bba246a8c45 (diff)
downloadnova-db1660d545c7cdf9a95e98d841f81ca60759d56d.tar.gz
Merge "Use absolute path during qemu img rebase" into stable/train
-rw-r--r--nova/tests/unit/virt/libvirt/test_driver.py28
-rw-r--r--nova/virt/libvirt/driver.py11
2 files changed, 33 insertions, 6 deletions
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index a95640c750..93b4158304 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -24610,8 +24610,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'
@@ -24622,10 +24637,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",
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 5d1caf34f6..da98829453 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -2880,7 +2880,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]