diff --git a/nova/tests/unit/virt/libvirt/fakelibvirt.py b/nova/tests/unit/virt/libvirt/fakelibvirt.py index 6091f5ac77..9cd3a927f3 100644 --- a/nova/tests/unit/virt/libvirt/fakelibvirt.py +++ b/nova/tests/unit/virt/libvirt/fakelibvirt.py @@ -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): diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index c643515d2a..bb16260c25 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -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 = "" 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') diff --git a/nova/tests/unit/virt/libvirt/test_guest.py b/nova/tests/unit/virt/libvirt/test_guest.py index fce31f56f6..e44b4567fa 100644 --- a/nova/tests/unit/virt/libvirt/test_guest.py +++ b/nova/tests/unit/virt/libvirt/test_guest.py @@ -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") diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 443d331de5..b4b561dee7 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -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, diff --git a/nova/virt/libvirt/guest.py b/nova/virt/libvirt/guest.py index 696e9d2482..d5527837d9 100644 --- a/nova/virt/libvirt/guest.py +++ b/nova/virt/libvirt/guest.py @@ -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