libvirt: fix DiskSmallerThanImage when block migrate ephemerals
When block live migrate an instance with ephemerals an exception FlavorDiskSmallerThanImage can be raised because the size used to create the base ephemeral disk is the total size allowed by flavor which can be greater than the size effectively requested by the instance when spwaned. Closes-Bug: #1628449 Change-Id: I264f5beb73d9b8ba441aec8f8a317b553a7e22c0
This commit is contained in:
parent
7a9eb10d0d
commit
407e659eb9
@ -9307,10 +9307,11 @@ class LibvirtConnTestCase(test.NoDBTestCase):
|
|||||||
CONF.image_cache_subdirectory_name)
|
CONF.image_cache_subdirectory_name)
|
||||||
instance = objects.Instance(**self.test_instance)
|
instance = objects.Instance(**self.test_instance)
|
||||||
disk_info_byname = fake_disk_info_byname(instance)
|
disk_info_byname = fake_disk_info_byname(instance)
|
||||||
disk_info = disk_info_byname.values()
|
|
||||||
|
|
||||||
# Give the ephemeral disk a non-default name
|
|
||||||
disk_info_byname['disk.local']['backing_file'] = 'ephemeral_foo'
|
disk_info_byname['disk.local']['backing_file'] = 'ephemeral_foo'
|
||||||
|
disk_info_byname['disk.local']['virt_disk_size'] = 1 * units.Gi
|
||||||
|
|
||||||
|
disk_info = disk_info_byname.values()
|
||||||
|
|
||||||
with test.nested(
|
with test.nested(
|
||||||
mock.patch.object(libvirt_driver.libvirt_utils, 'fetch_image'),
|
mock.patch.object(libvirt_driver.libvirt_utils, 'fetch_image'),
|
||||||
@ -9338,8 +9339,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
|
|||||||
|
|
||||||
verify_base_size_mock.assert_has_calls([
|
verify_base_size_mock.assert_has_calls([
|
||||||
mock.call(root_backing, instance.flavor.root_gb * units.Gi),
|
mock.call(root_backing, instance.flavor.root_gb * units.Gi),
|
||||||
mock.call(ephemeral_backing,
|
mock.call(ephemeral_backing, 1 * units.Gi)
|
||||||
instance.flavor.ephemeral_gb * units.Gi)
|
|
||||||
])
|
])
|
||||||
|
|
||||||
def test_create_images_and_backing_disk_info_none(self):
|
def test_create_images_and_backing_disk_info_none(self):
|
||||||
|
@ -6608,12 +6608,19 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
instance_disk,
|
instance_disk,
|
||||||
CONF.libvirt.images_type)
|
CONF.libvirt.images_type)
|
||||||
if cache_name.startswith('ephemeral'):
|
if cache_name.startswith('ephemeral'):
|
||||||
image.cache(fetch_func=self._create_ephemeral,
|
# The argument 'size' is used by image.cache to
|
||||||
fs_label=cache_name,
|
# validate disk size retrieved from cache against
|
||||||
os_type=instance.os_type,
|
# the instance disk size (should always return OK)
|
||||||
filename=cache_name,
|
# and ephemeral_size is used by _create_ephemeral
|
||||||
size=info['virt_disk_size'],
|
# to build the image if the disk is not already
|
||||||
ephemeral_size=instance.flavor.ephemeral_gb)
|
# cached.
|
||||||
|
image.cache(
|
||||||
|
fetch_func=self._create_ephemeral,
|
||||||
|
fs_label=cache_name,
|
||||||
|
os_type=instance.os_type,
|
||||||
|
filename=cache_name,
|
||||||
|
size=info['virt_disk_size'],
|
||||||
|
ephemeral_size=info['virt_disk_size'] / units.Gi)
|
||||||
elif cache_name.startswith('swap'):
|
elif cache_name.startswith('swap'):
|
||||||
inst_type = instance.get_flavor()
|
inst_type = instance.get_flavor()
|
||||||
swap_mb = inst_type.swap
|
swap_mb = inst_type.swap
|
||||||
|
Loading…
Reference in New Issue
Block a user