Browse Source

Merge "Make _rebase_with_qemu_img() generic" into stable/train

changes/41/794041/1
Zuul 3 weeks ago
committed by Gerrit Code Review
parent
commit
3d39a5413a
2 changed files with 37 additions and 24 deletions
  1. +19
    -0
      nova/tests/unit/virt/libvirt/test_driver.py
  2. +18
    -24
      nova/virt/libvirt/driver.py

+ 19
- 0
nova/tests/unit/virt/libvirt/test_driver.py View File

@ -23858,6 +23858,25 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
</cpu>
'''], 1)
@mock.patch('nova.virt.images.qemu_img_info',
return_value=mock.Mock(file_format="fake_fmt"))
@mock.patch('oslo_concurrency.processutils.execute')
def test_rebase_with_qemu_img(self, mock_execute, mock_qemu_img_info):
"""rebasing disk image to another backing file"""
self.drvr._rebase_with_qemu_img("disk", "backing_file")
mock_qemu_img_info.assert_called_once_with("backing_file")
mock_execute.assert_called_once_with('qemu-img', 'rebase',
'-b', 'backing_file', '-F',
'fake_fmt', 'disk')
# Flatten disk image when no backing file is given.
mock_qemu_img_info.reset_mock()
mock_execute.reset_mock()
self.drvr._rebase_with_qemu_img("disk", None)
self.assertEqual(0, mock_qemu_img_info.call_count)
mock_execute.assert_called_once_with('qemu-img', 'rebase',
'-b', '', 'disk')
class LibvirtVolumeUsageTestCase(test.NoDBTestCase):
"""Test for LibvirtDriver.get_all_volume_usage."""


+ 18
- 24
nova/virt/libvirt/driver.py View File

@ -2861,32 +2861,15 @@ class LibvirtDriver(driver.ComputeDriver):
timer.start(interval=0.5).wait()
@staticmethod
def _rebase_with_qemu_img(guest, device, active_disk_object,
rebase_base):
"""Rebase a device tied to a guest using qemu-img.
:param guest:the Guest which owns the device being rebased
:type guest: nova.virt.libvirt.guest.Guest
:param device: the guest block device to rebase
:type device: nova.virt.libvirt.guest.BlockDevice
:param active_disk_object: the guest block device to rebase
:type active_disk_object: nova.virt.libvirt.config.\
LibvirtConfigGuestDisk
def _rebase_with_qemu_img(source_path, rebase_base):
"""Rebase a disk using qemu-img.
:param source_path: the disk source path to rebase
:type source_path: string
:param rebase_base: the new parent in the backing chain
:type rebase_base: None or string
"""
# It's unsure how well qemu-img handles network disks for
# every protocol. So let's be safe.
active_protocol = active_disk_object.source_protocol
if active_protocol is not None:
msg = _("Something went wrong when deleting a volume snapshot: "
"rebasing a %(protocol)s network disk using qemu-img "
"has not been fully tested") % {'protocol':
active_protocol}
LOG.error(msg)
raise exception.InternalError(msg)
if rebase_base is None:
# If backing_file is specified as "" (the empty string), then
# the image is rebased onto no backing file (i.e. it will exist
@ -2901,7 +2884,7 @@ class LibvirtDriver(driver.ComputeDriver):
b_file_fmt = images.qemu_img_info(backing_file).file_format
qemu_img_extra_arg = ['-F', b_file_fmt]
qemu_img_extra_arg.append(active_disk_object.source_path)
qemu_img_extra_arg.append(source_path)
# execute operation with disk concurrency semaphore
with compute_utils.disk_ops_semaphore:
processutils.execute("qemu-img", "rebase", "-b", backing_file,
@ -3064,7 +3047,18 @@ class LibvirtDriver(driver.ComputeDriver):
else:
LOG.debug('Guest is not running so doing a block rebase '
'using "qemu-img rebase"', instance=instance)
self._rebase_with_qemu_img(guest, dev, active_disk_object,
# It's unsure how well qemu-img handles network disks for
# every protocol. So let's be safe.
active_protocol = active_disk_object.source_protocol
if active_protocol is not None:
msg = _("Something went wrong when deleting a volume "
"snapshot: rebasing a %(protocol)s network disk "
"using qemu-img has not been fully tested"
) % {'protocol': active_protocol}
LOG.error(msg)
raise exception.InternalError(msg)
self._rebase_with_qemu_img(active_disk_object.source_path,
rebase_base)
else:


Loading…
Cancel
Save