libvirt: Always provide the size in bytes when calling virDomainBlockResize

Since 0.9.11 virDomainBlockResize has accepted the size argument in
bytes when the VIR_DOMAIN_BLOCK_RESIZE_BYTES flag is provided.

This change switches all callers over to using bytes to simplify the
required call, avoiding the need to divide by units.Ki etc.

Change-Id: Ib8d9318596186acd86a738ceea187420698645e6
This commit is contained in:
Lee Yarwood 2020-02-12 18:14:17 +00:00 committed by Stephen Finucane
parent f8d11303bd
commit b1b0f1be18
5 changed files with 44 additions and 37 deletions

View File

@ -61,6 +61,9 @@ VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT = 2
VIR_DOMAIN_BLOCK_REBASE_COPY = 8
VIR_DOMAIN_BLOCK_REBASE_COPY_DEV = 32
# virDomainBlockResize
VIR_DOMAIN_BLOCK_RESIZE_BYTES = 1
VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC = 1
VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT = 2
@ -1173,7 +1176,7 @@ class Domain(object):
def blockJobAbort(self, disk, flags):
pass
def blockResize(self, disk, size):
def blockResize(self, disk, size, flags):
pass
def blockRebase(self, disk, base, bandwidth=0, flags=0):

View File

@ -9141,7 +9141,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
'access_mode': 'rw'}
}
new_size_in_kb = 20 * 1024 * 1024
new_size = 20 * units.Gi
guest = mock.Mock(spec=libvirt_guest.Guest)
# block_device
@ -9151,17 +9151,17 @@ class LibvirtConnTestCase(test.NoDBTestCase,
block_device.resize = mock.Mock()
guest.get_block_device = mock.Mock(return_value=block_device)
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size_in_kb)
drvr._extend_volume = mock.Mock(return_value=new_size)
for state in (power_state.RUNNING, power_state.PAUSED):
guest.get_power_state = mock.Mock(return_value=state)
drvr.extend_volume(
self.context, connection_info, instance, new_size_in_kb * 1024)
self.context, connection_info, instance, new_size)
drvr._extend_volume.assert_called_with(connection_info,
instance,
new_size_in_kb * 1024)
new_size)
guest.get_block_device.assert_called_with('/fake')
block_device.resize.assert_called_with(20480)
block_device.resize.assert_called_with(new_size)
def test_extend_volume_with_volume_driver_without_support(self):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
@ -9182,16 +9182,15 @@ class LibvirtConnTestCase(test.NoDBTestCase,
'data': {'device_path': '/fake',
'access_mode': 'rw'}
}
new_size_in_kb = 20 * 1024 * 1024
new_size = 20 * units.Gi
xml_no_disk = "<domain><devices></devices></domain>"
dom = fakelibvirt.Domain(drvr._get_connection(), xml_no_disk, False)
guest = libvirt_guest.Guest(dom)
guest.get_power_state = mock.Mock(return_value=power_state.RUNNING)
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size_in_kb)
drvr.extend_volume(self.context, connection_info, instance,
new_size_in_kb * 1024)
drvr._extend_volume = mock.Mock(return_value=new_size)
drvr.extend_volume(self.context, connection_info, instance, new_size)
def test_extend_volume_with_instance_not_found(self):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
@ -9216,7 +9215,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
'data': {'device_path': '/fake',
'access_mode': 'rw'}
}
new_size_in_kb = 20 * 1024 * 1024
new_size = 20 * units.Gi
guest = mock.Mock(spec=libvirt_guest.Guest)
guest.get_power_state = mock.Mock(return_value=power_state.RUNNING)
@ -9227,11 +9226,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
side_effect=fakelibvirt.libvirtError('ERR'))
guest.get_block_device = mock.Mock(return_value=block_device)
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size_in_kb)
drvr._extend_volume = mock.Mock(return_value=new_size)
self.assertRaises(fakelibvirt.libvirtError,
drvr.extend_volume, self.context,
connection_info, instance, new_size_in_kb * 1024)
connection_info, instance, new_size)
def test_extend_volume_with_no_device_path_attribute(self):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
@ -9244,7 +9243,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
'volume_id': '58a84f6d-3f0c-4e19-a0af-eb657b790657',
'access_mode': 'rw'}
}
new_size_in_kb = 20 * 1024 * 1024
new_size = 20 * units.Gi
guest = mock.Mock(spec=libvirt_guest.Guest)
# block_device
@ -9259,17 +9258,16 @@ class LibvirtConnTestCase(test.NoDBTestCase,
guest.get_block_device = mock.Mock(return_value=block_device)
guest.get_all_disks = mock.Mock(return_value=[disk])
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size_in_kb)
drvr._extend_volume = mock.Mock(return_value=new_size)
for state in (power_state.RUNNING, power_state.PAUSED):
guest.get_power_state = mock.Mock(return_value=state)
drvr.extend_volume(self.context, connection_info, instance,
new_size_in_kb * 1024)
drvr._extend_volume.assert_called_with(connection_info,
instance,
new_size_in_kb * 1024)
new_size)
drvr._extend_volume.assert_called_with(connection_info, instance,
new_size)
guest.get_block_device.assert_called_with('vdb')
block_device.resize.assert_called_with(20480)
block_device.resize.assert_called_with(new_size)
def test_extend_volume_no_disk_found_by_serial(self):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
@ -9282,7 +9280,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
'volume_id': '58a84f6d-3f0c-4e19-a0af-eb657b790657',
'access_mode': 'rw'}
}
new_size_in_kb = 20 * 1024 * 1024
new_size = 20 * units.Gi
guest = mock.Mock(spec=libvirt_guest.Guest)
# block_device
@ -9296,7 +9294,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
guest.get_block_device = mock.Mock(return_value=block_device)
guest.get_all_disks = mock.Mock(return_value=[disk])
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size_in_kb)
drvr._extend_volume = mock.Mock(return_value=new_size)
guest.get_power_state = mock.Mock(return_value=power_state.RUNNING)
self.assertRaises(
@ -9305,7 +9303,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
self.context,
connection_info,
instance,
new_size_in_kb * 1024
new_size
)
@mock.patch('os_brick.encryptors.get_encryption_metadata')
@ -9407,8 +9405,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
new_size = 20 * units.Gi
# The LUKSv1 payload offset as reported by qemu-img info in bytes.
payload_offset = 2048 * units.Ki
# The new size is provided to Libvirt virDomainBlockResize in units.Ki.
new_size_minus_offset_kb = (new_size - payload_offset) // units.Ki
# The new size is provided to Libvirt virDomainBlockResize
new_size_minus_offset = new_size - payload_offset
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size)
@ -9434,7 +9432,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
# Assert that the Libvirt call to resize the device within the instance
# is called with the LUKSv1 payload offset taken into account.
block_device.resize.assert_called_once_with(new_size_minus_offset_kb)
block_device.resize.assert_called_once_with(new_size_minus_offset)
@mock.patch('os_brick.encryptors.get_encryption_metadata')
@mock.patch('nova.virt.images.privileged_qemu_img_info')
@ -9465,8 +9463,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
new_size = 20 * units.Gi
# The LUKSv1 payload offset as reported by qemu-img info in bytes.
payload_offset = 2048 * units.Ki
# The new size is provided to Libvirt virDomainBlockResize in units.Ki.
new_size_minus_offset_kb = (new_size - payload_offset) // units.Ki
# The new size is provided to Libvirt virDomainBlockResize
new_size_minus_offset = new_size - payload_offset
drvr._host.get_guest = mock.Mock(return_value=guest)
drvr._extend_volume = mock.Mock(return_value=new_size)
@ -9492,7 +9490,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
# Assert that the Libvirt call to resize the device within the instance
# is called with the LUKSv1 payload offset taken into account.
block_device.resize.assert_called_once_with(new_size_minus_offset_kb)
block_device.resize.assert_called_once_with(new_size_minus_offset)
@mock.patch('os_brick.encryptors.get_encryption_metadata')
@mock.patch('nova.virt.libvirt.driver.LibvirtDriver._get_volume_encryptor')
@ -18997,7 +18995,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
mock_conf.to_xml.return_value = mock.sentinel.conf_xml
resize_to = 1
expected_resize_to = resize_to * units.Gi / units.Ki
expected_resize_to = resize_to * units.Gi
drvr._swap_volume(mock_guest, 'vdb', mock_conf, resize_to, None)
@ -19137,7 +19135,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
# Verify we called resize with the correct args.
if resize:
mock_dom.blockResize.assert_called_once_with(
srcfile, 1 * units.Gi / units.Ki)
srcfile, 1 * units.Gi, flags=1)
def test_swap_volume_rebase_file(self):
self._test_swap_volume_rebase('file')

View File

@ -749,7 +749,7 @@ class GuestBlockTestCase(test.NoDBTestCase):
def test_resize(self):
self.gblock.resize(10)
self.domain.blockResize.assert_called_once_with('vda', 10)
self.domain.blockResize.assert_called_once_with('vda', 10, flags=1)
def test_rebase(self):
self.gblock.rebase("foo")

View File

@ -1843,7 +1843,7 @@ class LibvirtDriver(driver.ComputeDriver):
raise exception.VolumeRebaseFailed(reason=six.text_type(exc))
if resize_to:
dev.resize(resize_to * units.Gi / units.Ki)
dev.resize(resize_to * units.Gi)
# Make sure we will redefine the domain using the updated
# configuration after the volume was swapped. The dump_inactive
@ -1970,7 +1970,7 @@ class LibvirtDriver(driver.ComputeDriver):
LOG.debug('Resizing target device %(dev)s to %(size)u',
{'dev': block_device._disk, 'size': new_size},
instance=instance)
block_device.resize(new_size // units.Ki)
block_device.resize(new_size)
def _resize_attached_encrypted_volume(self, original_new_size,
block_device, instance,

View File

@ -808,9 +808,15 @@ class BlockDevice(object):
return self._guest._domain.blockCommit(
self._disk, base, top, self.COMMIT_DEFAULT_BANDWIDTH, flags=flags)
def resize(self, size_kb):
"""Resize block device to KiB size"""
self._guest._domain.blockResize(self._disk, size_kb)
def resize(self, size):
"""Resize block device to the given size in bytes.
This resizes the block device within the instance to the given size.
:param size: The size to resize the device to in bytes.
"""
flags = libvirt.VIR_DOMAIN_BLOCK_RESIZE_BYTES
self._guest._domain.blockResize(self._disk, size, flags=flags)
def is_job_complete(self):
"""Return True if the job is complete, False otherwise