libvirt: Reduce calls to qemu-img during update_available_resource
I464bc2b88123a012cd12213beac4b572c3c20a56 introduced a second call to ``qemu-img`` that can easily be collapsed into one with the addition of a new call within the disk_api. Related-Bug: #1785827 Change-Id: Ibfd0527ed79f60282b542034d7cb97b424becba3
This commit is contained in:
parent
536acbfe05
commit
d41ea9d878
|
@ -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=10000),
|
||||||
mock.call(host='127.0.0.1', port=10001)])
|
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',
|
@mock.patch('nova.virt.libvirt.storage.lvm.get_volume_size',
|
||||||
return_value='fake-size')
|
return_value='fake-size')
|
||||||
def test_detach_encrypted_volumes(self, mock_get_volume_size,
|
def test_detach_encrypted_volumes(self, mock_get_volume_size,
|
||||||
|
@ -9421,12 +9422,9 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
return mock_virDomain
|
return mock_virDomain
|
||||||
mock_lookup.side_effect = mock_lookup_side_effect
|
mock_lookup.side_effect = mock_lookup_side_effect
|
||||||
|
|
||||||
mock_getsize = mock.Mock()
|
mock_qemu_img_info = mock.Mock(disk_size=10737418240,
|
||||||
mock_getsize.return_value = "10737418240"
|
virtual_size=10737418240)
|
||||||
mock_get_virtual_size = mock.Mock()
|
return (mock_qemu_img_info, mock_lookup)
|
||||||
mock_get_virtual_size.return_value = "10737418240"
|
|
||||||
|
|
||||||
return (mock_getsize, mock_get_virtual_size, mock_lookup)
|
|
||||||
|
|
||||||
def test_is_shared_block_storage_rbd(self):
|
def test_is_shared_block_storage_rbd(self):
|
||||||
self.flags(images_type='rbd', group='libvirt')
|
self.flags(images_type='rbd', group='libvirt')
|
||||||
|
@ -9519,7 +9517,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
{'connection_info': 'info', 'mount_device': '/dev/vda'}]}
|
{'connection_info': 'info', 'mount_device': '/dev/vda'}]}
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
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)
|
self._is_shared_block_storage_test_create_mocks(disks)
|
||||||
data = objects.LibvirtLiveMigrateData(is_volume_backed=True,
|
data = objects.LibvirtLiveMigrateData(is_volume_backed=True,
|
||||||
is_shared_instance_path=False)
|
is_shared_instance_path=False)
|
||||||
|
@ -9543,21 +9541,18 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
{'connection_info': 'info', 'mount_device': '/dev/vda'}]}
|
{'connection_info': 'info', 'mount_device': '/dev/vda'}]}
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
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)
|
self._is_shared_block_storage_test_create_mocks(disks)
|
||||||
data = objects.LibvirtLiveMigrateData(is_volume_backed=True,
|
data = objects.LibvirtLiveMigrateData(is_volume_backed=True,
|
||||||
is_shared_instance_path=False)
|
is_shared_instance_path=False)
|
||||||
with test.nested(
|
with test.nested(
|
||||||
mock.patch.object(libvirt_driver.disk_api,
|
mock.patch.object(libvirt_driver.disk_api,
|
||||||
'get_allocated_disk_size', mock_getsize),
|
'get_disk_info', mock_qemu_img_info),
|
||||||
mock.patch.object(libvirt_driver.disk_api,
|
|
||||||
'get_disk_size', mock_get_virtual_size),
|
|
||||||
mock.patch.object(host.Host, '_get_domain', mock_lookup)):
|
mock.patch.object(host.Host, '_get_domain', mock_lookup)):
|
||||||
self.assertFalse(drvr._is_shared_block_storage(
|
self.assertFalse(drvr._is_shared_block_storage(
|
||||||
instance, data,
|
instance, data,
|
||||||
block_device_info = bdi))
|
block_device_info = bdi))
|
||||||
mock_getsize.assert_called_once_with('/instance/disk.local')
|
mock_qemu_img_info.assert_called_once_with('/instance/disk.local')
|
||||||
mock_get_virtual_size.assert_called_once_with('/instance/disk.local')
|
|
||||||
mock_lookup.assert_called_once_with(instance)
|
mock_lookup.assert_called_once_with(instance)
|
||||||
|
|
||||||
def test_is_shared_block_storage_nfs(self):
|
def test_is_shared_block_storage_nfs(self):
|
||||||
|
@ -12370,12 +12365,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
migrate_data=migrate_data)
|
migrate_data=migrate_data)
|
||||||
self.assertEqual(['cmt'], res.supported_perf_events)
|
self.assertEqual(['cmt'], res.supported_perf_events)
|
||||||
|
|
||||||
@mock.patch('nova.virt.disk.api.get_disk_size',
|
@mock.patch('nova.virt.disk.api.get_disk_info')
|
||||||
side_effect=[10737418240, 21474836480])
|
def test_get_instance_disk_info_works_correctly(self, mock_qemu_img_info):
|
||||||
@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):
|
|
||||||
# Test data
|
# Test data
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
dummyxml = ("<domain type='kvm'><name>instance-0000000a</name>"
|
dummyxml = ("<domain type='kvm'><name>instance-0000000a</name>"
|
||||||
|
@ -12392,6 +12383,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
vdmock = mock.Mock(autospec=fakelibvirt.virDomain)
|
vdmock = mock.Mock(autospec=fakelibvirt.virDomain)
|
||||||
vdmock.XMLDesc.return_value = dummyxml
|
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):
|
def fake_lookup(_uuid):
|
||||||
if _uuid == instance.uuid:
|
if _uuid == instance.uuid:
|
||||||
return vdmock
|
return vdmock
|
||||||
|
@ -12416,12 +12412,9 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
self.assertEqual(info[1]['over_committed_disk_size'], 18146236825)
|
self.assertEqual(info[1]['over_committed_disk_size'], 18146236825)
|
||||||
|
|
||||||
vdmock.XMLDesc.assert_called_once_with(0)
|
vdmock.XMLDesc.assert_called_once_with(0)
|
||||||
mock_get_alloc.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_alloc.call_count)
|
|
||||||
mock_get_disk_size.assert_has_calls([mock.call('/test/disk'),
|
|
||||||
mock.call('/test/disk.local')])
|
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):
|
def test_post_live_migration(self):
|
||||||
vol = {'block_device_mapping': [
|
vol = {'block_device_mapping': [
|
||||||
|
@ -12508,12 +12501,9 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
instance)
|
instance)
|
||||||
_test()
|
_test()
|
||||||
|
|
||||||
@mock.patch('nova.virt.disk.api.get_disk_size',
|
@mock.patch('nova.virt.disk.api.get_disk_info')
|
||||||
side_effect=[10737418240, 21474836480])
|
|
||||||
@mock.patch('nova.virt.disk.api.get_allocated_disk_size',
|
|
||||||
side_effect=[10737418240, 3328599655])
|
|
||||||
def test_get_instance_disk_info_excludes_volumes(
|
def test_get_instance_disk_info_excludes_volumes(
|
||||||
self, mock_get_alloc, mock_get_disk_size):
|
self, mock_qemu_img_info):
|
||||||
# Test data
|
# Test data
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
dummyxml = ("<domain type='kvm'><name>instance-0000000a</name>"
|
dummyxml = ("<domain type='kvm'><name>instance-0000000a</name>"
|
||||||
|
@ -12536,6 +12526,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
vdmock = mock.Mock(autospec=fakelibvirt.virDomain)
|
vdmock = mock.Mock(autospec=fakelibvirt.virDomain)
|
||||||
vdmock.XMLDesc.return_value = dummyxml
|
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):
|
def fake_lookup(_uuid):
|
||||||
if _uuid == instance.uuid:
|
if _uuid == instance.uuid:
|
||||||
return vdmock
|
return vdmock
|
||||||
|
@ -12565,19 +12560,12 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
self.assertEqual(info[1]['over_committed_disk_size'], 18146236825)
|
self.assertEqual(info[1]['over_committed_disk_size'], 18146236825)
|
||||||
|
|
||||||
vdmock.XMLDesc.assert_called_once_with(0)
|
vdmock.XMLDesc.assert_called_once_with(0)
|
||||||
mock_get_alloc.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_alloc.call_count)
|
|
||||||
mock_get_disk_size.assert_has_calls([mock.call('/test/disk'),
|
|
||||||
mock.call('/test/disk.local')])
|
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',
|
@mock.patch('nova.virt.disk.api.get_disk_info')
|
||||||
return_value=10737418240)
|
def test_get_instance_disk_info_no_bdinfo_passed(self, mock_qemu_img_info):
|
||||||
@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):
|
|
||||||
# NOTE(ndipanov): _get_disk_overcomitted_size_total calls this method
|
# NOTE(ndipanov): _get_disk_overcomitted_size_total calls this method
|
||||||
# without access to Nova's block device information. We want to make
|
# without access to Nova's block device information. We want to make
|
||||||
# sure that we guess volumes mostly correctly in that case as well
|
# 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 = mock.Mock(autospec=fakelibvirt.virDomain)
|
||||||
vdmock.XMLDesc.return_value = dummyxml
|
vdmock.XMLDesc.return_value = dummyxml
|
||||||
|
|
||||||
|
mock_qemu_img_info.return_value = mock.Mock(disk_size=10737418240,
|
||||||
|
virtual_size=10737418240)
|
||||||
|
|
||||||
def fake_lookup(_uuid):
|
def fake_lookup(_uuid):
|
||||||
if _uuid == instance.uuid:
|
if _uuid == instance.uuid:
|
||||||
return vdmock
|
return vdmock
|
||||||
|
@ -12616,8 +12607,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||||
self.assertEqual(info[0]['over_committed_disk_size'], 0)
|
self.assertEqual(info[0]['over_committed_disk_size'], 0)
|
||||||
|
|
||||||
vdmock.XMLDesc.assert_called_once_with(0)
|
vdmock.XMLDesc.assert_called_once_with(0)
|
||||||
mock_get_alloc.assert_called_once_with(path)
|
mock_qemu_img_info.assert_called_once_with(path)
|
||||||
mock_get_disk_size.assert_called_once_with(path)
|
|
||||||
|
|
||||||
def test_spawn_with_network_info(self):
|
def test_spawn_with_network_info(self):
|
||||||
def fake_getLibVersion():
|
def fake_getLibVersion():
|
||||||
|
|
|
@ -89,6 +89,15 @@ def resize2fs(image, check_exit_code=False, run_as_root=False):
|
||||||
nova.privsep.fs.unprivileged_resize2fs(image, check_exit_code)
|
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):
|
def get_disk_size(path):
|
||||||
"""Get the (virtual) size of a disk image
|
"""Get the (virtual) size of a disk image
|
||||||
|
|
||||||
|
|
|
@ -8057,6 +8057,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
# get the real disk size or
|
# get the real disk size or
|
||||||
# raise a localized error if image is unavailable
|
# raise a localized error if image is unavailable
|
||||||
if disk_type == 'file':
|
if disk_type == 'file':
|
||||||
|
qemu_img_info = disk_api.get_disk_info(path)
|
||||||
if driver_type == 'ploop':
|
if driver_type == 'ploop':
|
||||||
dk_size = 0
|
dk_size = 0
|
||||||
for dirpath, dirnames, filenames in os.walk(path):
|
for dirpath, dirnames, filenames in os.walk(path):
|
||||||
|
@ -8064,10 +8065,10 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||||
fp = os.path.join(dirpath, f)
|
fp = os.path.join(dirpath, f)
|
||||||
dk_size += os.path.getsize(fp)
|
dk_size += os.path.getsize(fp)
|
||||||
else:
|
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.
|
# 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:
|
elif disk_type == 'block' and block_device_info:
|
||||||
# FIXME(lyarwood): There's no reason to use a separate call
|
# FIXME(lyarwood): There's no reason to use a separate call
|
||||||
|
|
Loading…
Reference in New Issue