diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index feb7f3903f71..b42f4afd4736 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -4642,7 +4642,8 @@ class LibvirtConnTestCase(test.NoDBTestCase, [mock.call(host='127.0.0.1', port=10000), mock.call(host='127.0.0.1', port=10001)]) - @mock.patch('nova.virt.disk.api.get_disk_size', return_value=0) + @mock.patch('nova.virt.disk.api.get_disk_info', + return_value=mock.Mock(disk_size=0)) @mock.patch('nova.virt.libvirt.storage.lvm.get_volume_size', return_value='fake-size') def test_detach_encrypted_volumes(self, mock_get_volume_size, @@ -9421,12 +9422,9 @@ class LibvirtConnTestCase(test.NoDBTestCase, return mock_virDomain mock_lookup.side_effect = mock_lookup_side_effect - mock_getsize = mock.Mock() - mock_getsize.return_value = "10737418240" - mock_get_virtual_size = mock.Mock() - mock_get_virtual_size.return_value = "10737418240" - - return (mock_getsize, mock_get_virtual_size, mock_lookup) + mock_qemu_img_info = mock.Mock(disk_size=10737418240, + virtual_size=10737418240) + return (mock_qemu_img_info, mock_lookup) def test_is_shared_block_storage_rbd(self): self.flags(images_type='rbd', group='libvirt') @@ -9519,7 +9517,7 @@ class LibvirtConnTestCase(test.NoDBTestCase, {'connection_info': 'info', 'mount_device': '/dev/vda'}]} instance = objects.Instance(**self.test_instance) drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - (mock_getsize, mock_get_virtual_size, mock_lookup) =\ + (mock_qemu_img_info, mock_lookup) =\ self._is_shared_block_storage_test_create_mocks(disks) data = objects.LibvirtLiveMigrateData(is_volume_backed=True, is_shared_instance_path=False) @@ -9543,21 +9541,18 @@ class LibvirtConnTestCase(test.NoDBTestCase, {'connection_info': 'info', 'mount_device': '/dev/vda'}]} instance = objects.Instance(**self.test_instance) drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - (mock_getsize, mock_get_virtual_size, mock_lookup) =\ + (mock_qemu_img_info, mock_lookup) =\ self._is_shared_block_storage_test_create_mocks(disks) data = objects.LibvirtLiveMigrateData(is_volume_backed=True, is_shared_instance_path=False) with test.nested( mock.patch.object(libvirt_driver.disk_api, - 'get_allocated_disk_size', mock_getsize), - mock.patch.object(libvirt_driver.disk_api, - 'get_disk_size', mock_get_virtual_size), + 'get_disk_info', mock_qemu_img_info), mock.patch.object(host.Host, '_get_domain', mock_lookup)): self.assertFalse(drvr._is_shared_block_storage( instance, data, block_device_info = bdi)) - mock_getsize.assert_called_once_with('/instance/disk.local') - mock_get_virtual_size.assert_called_once_with('/instance/disk.local') + mock_qemu_img_info.assert_called_once_with('/instance/disk.local') mock_lookup.assert_called_once_with(instance) def test_is_shared_block_storage_nfs(self): @@ -12370,12 +12365,8 @@ class LibvirtConnTestCase(test.NoDBTestCase, migrate_data=migrate_data) self.assertEqual(['cmt'], res.supported_perf_events) - @mock.patch('nova.virt.disk.api.get_disk_size', - side_effect=[10737418240, 21474836480]) - @mock.patch('nova.virt.disk.api.get_allocated_disk_size', - side_effect=[10737418240, 3328599655]) - def test_get_instance_disk_info_works_correctly(self, mock_get_alloc, - mock_get_disk_size): + @mock.patch('nova.virt.disk.api.get_disk_info') + def test_get_instance_disk_info_works_correctly(self, mock_qemu_img_info): # Test data instance = objects.Instance(**self.test_instance) dummyxml = ("instance-0000000a" @@ -12392,6 +12383,11 @@ class LibvirtConnTestCase(test.NoDBTestCase, vdmock = mock.Mock(autospec=fakelibvirt.virDomain) vdmock.XMLDesc.return_value = dummyxml + mock_qemu_img_info.side_effect = [ + mock.Mock(disk_size=10737418240, virtual_size=10737418240), + mock.Mock(disk_size=3328599655, virtual_size=21474836480) + ] + def fake_lookup(_uuid): if _uuid == instance.uuid: return vdmock @@ -12416,12 +12412,9 @@ class LibvirtConnTestCase(test.NoDBTestCase, self.assertEqual(info[1]['over_committed_disk_size'], 18146236825) vdmock.XMLDesc.assert_called_once_with(0) - mock_get_alloc.assert_has_calls([mock.call('/test/disk'), - mock.call('/test/disk.local')]) - self.assertEqual(2, mock_get_alloc.call_count) - mock_get_disk_size.assert_has_calls([mock.call('/test/disk'), + mock_qemu_img_info.assert_has_calls([mock.call('/test/disk'), mock.call('/test/disk.local')]) - self.assertEqual(2, mock_get_disk_size.call_count) + self.assertEqual(2, mock_qemu_img_info.call_count) def test_post_live_migration(self): vol = {'block_device_mapping': [ @@ -12508,12 +12501,9 @@ class LibvirtConnTestCase(test.NoDBTestCase, instance) _test() - @mock.patch('nova.virt.disk.api.get_disk_size', - side_effect=[10737418240, 21474836480]) - @mock.patch('nova.virt.disk.api.get_allocated_disk_size', - side_effect=[10737418240, 3328599655]) + @mock.patch('nova.virt.disk.api.get_disk_info') def test_get_instance_disk_info_excludes_volumes( - self, mock_get_alloc, mock_get_disk_size): + self, mock_qemu_img_info): # Test data instance = objects.Instance(**self.test_instance) dummyxml = ("instance-0000000a" @@ -12536,6 +12526,11 @@ class LibvirtConnTestCase(test.NoDBTestCase, vdmock = mock.Mock(autospec=fakelibvirt.virDomain) vdmock.XMLDesc.return_value = dummyxml + mock_qemu_img_info.side_effect = [ + mock.Mock(disk_size=10737418240, virtual_size=10737418240), + mock.Mock(disk_size=3328599655, virtual_size=21474836480) + ] + def fake_lookup(_uuid): if _uuid == instance.uuid: return vdmock @@ -12565,19 +12560,12 @@ class LibvirtConnTestCase(test.NoDBTestCase, self.assertEqual(info[1]['over_committed_disk_size'], 18146236825) vdmock.XMLDesc.assert_called_once_with(0) - mock_get_alloc.assert_has_calls([mock.call('/test/disk'), - mock.call('/test/disk.local')]) - self.assertEqual(2, mock_get_alloc.call_count) - mock_get_disk_size.assert_has_calls([mock.call('/test/disk'), + mock_qemu_img_info.assert_has_calls([mock.call('/test/disk'), mock.call('/test/disk.local')]) - self.assertEqual(2, mock_get_disk_size.call_count) + self.assertEqual(2, mock_qemu_img_info.call_count) - @mock.patch('nova.virt.disk.api.get_disk_size', - return_value=10737418240) - @mock.patch('nova.virt.disk.api.get_allocated_disk_size', - return_value=10737418240) - def test_get_instance_disk_info_no_bdinfo_passed( - self, mock_get_alloc, mock_get_disk_size): + @mock.patch('nova.virt.disk.api.get_disk_info') + def test_get_instance_disk_info_no_bdinfo_passed(self, mock_qemu_img_info): # NOTE(ndipanov): _get_disk_overcomitted_size_total calls this method # without access to Nova's block device information. We want to make # sure that we guess volumes mostly correctly in that case as well @@ -12598,6 +12586,9 @@ class LibvirtConnTestCase(test.NoDBTestCase, vdmock = mock.Mock(autospec=fakelibvirt.virDomain) vdmock.XMLDesc.return_value = dummyxml + mock_qemu_img_info.return_value = mock.Mock(disk_size=10737418240, + virtual_size=10737418240) + def fake_lookup(_uuid): if _uuid == instance.uuid: return vdmock @@ -12616,8 +12607,7 @@ class LibvirtConnTestCase(test.NoDBTestCase, self.assertEqual(info[0]['over_committed_disk_size'], 0) vdmock.XMLDesc.assert_called_once_with(0) - mock_get_alloc.assert_called_once_with(path) - mock_get_disk_size.assert_called_once_with(path) + mock_qemu_img_info.assert_called_once_with(path) def test_spawn_with_network_info(self): def fake_getLibVersion(): diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index 3a1fb92b4238..415e1b7cfc1c 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -89,6 +89,15 @@ def resize2fs(image, check_exit_code=False, run_as_root=False): nova.privsep.fs.unprivileged_resize2fs(image, check_exit_code) +def get_disk_info(path): + """Get QEMU info of a disk image + + :param path: Path to the disk image + :returns: oslo_utils.imageutils.QemuImgInfo object for the image. + """ + return images.qemu_img_info(path) + + def get_disk_size(path): """Get the (virtual) size of a disk image diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 37e7dedcd651..5a8376f7708d 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -8057,6 +8057,7 @@ class LibvirtDriver(driver.ComputeDriver): # get the real disk size or # raise a localized error if image is unavailable if disk_type == 'file': + qemu_img_info = disk_api.get_disk_info(path) if driver_type == 'ploop': dk_size = 0 for dirpath, dirnames, filenames in os.walk(path): @@ -8064,10 +8065,10 @@ class LibvirtDriver(driver.ComputeDriver): fp = os.path.join(dirpath, f) dk_size += os.path.getsize(fp) else: - dk_size = disk_api.get_allocated_disk_size(path) + dk_size = qemu_img_info.disk_size # NOTE(lyarwood): Fetch the virtual size for all file disks. - virt_size = disk_api.get_disk_size(path) + virt_size = qemu_img_info.virtual_size elif disk_type == 'block' and block_device_info: # FIXME(lyarwood): There's no reason to use a separate call