summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Arents <alexandre.arents@corp.ovh.com>2019-05-14 11:37:12 +0000
committerLee Yarwood <lyarwood@redhat.com>2019-05-30 08:50:32 +0100
commit55deddf65de824ca6287537ec6947b73021557ee (patch)
tree6ea798fb8cd9625b9510084d37bca2ba79407fd6
parent076c576eff7f6ef05ad1d3842e251bd7911acf29 (diff)
downloadnova-55deddf65de824ca6287537ec6947b73021557ee.tar.gz
Fix live-migration when glance image deleted
When block live-migration is run on instance with a deleted glance image, image.cache() is called without specyfing instance disk size parameter, preventing the resize of disk on the target host. Change-Id: Id0f05bb1275cc816d98b662820e02eae25dc57a3 Closes-Bug: #1829000 (cherry picked from commit c1782bacd8461bdd8c833792864e61228fa451f1) (cherry picked from commit b45f47c7577f7b9694ba0a6060312f1a0ec06abd) (cherry picked from commit e06a66fe9f9cb05c2d05cae336e2676fb5e5f3d2)
-rw-r--r--nova/tests/unit/virt/libvirt/test_driver.py28
-rw-r--r--nova/virt/libvirt/driver.py2
2 files changed, 23 insertions, 7 deletions
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index d4512ee3f0..a89bb72243 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -10992,23 +10992,38 @@ class LibvirtConnTestCase(test.NoDBTestCase,
instance = objects.Instance(**self.test_instance)
backing_file = imagecache.get_cache_fname(instance.image_ref)
+ backfile_path = os.path.join(base_dir, backing_file)
+ disk_size = 10747904
+ virt_disk_size = 25165824
disk_info = [
{u'backing_file': backing_file,
- u'disk_size': 10747904,
+ u'disk_size': disk_size,
u'path': u'disk_path',
u'type': u'qcow2',
- u'virt_disk_size': 25165824}]
-
+ u'virt_disk_size': virt_disk_size}]
+
+ def fake_copy_image(src, dest, **kwargs):
+ # backing file should be present and have a smaller size
+ # than instance root disk in order to assert resize_image()
+ if dest == backfile_path:
+ # dest is created under TempDir() fixture,
+ # it will go away after test cleanup
+ with open(dest, 'a'):
+ pass
with test.nested(
- mock.patch.object(libvirt_driver.libvirt_utils, 'copy_image'),
+ mock.patch.object(libvirt_driver.libvirt_utils, 'copy_image',
+ side_effect=fake_copy_image),
mock.patch.object(libvirt_driver.libvirt_utils, 'fetch_image',
side_effect=exception.ImageNotFound(
image_id=uuids.fake_id)),
- ) as (copy_image_mock, fetch_image_mock):
+ mock.patch.object(imagebackend.Qcow2, 'resize_image'),
+ mock.patch.object(imagebackend.Image, 'get_disk_size',
+ return_value=disk_size),
+ ) as (copy_image_mock, fetch_image_mock, resize_image_mock,
+ get_disk_size_mock):
conn._create_images_and_backing(self.context, instance,
"/fake/instance/dir", disk_info,
fallback_from_host="fake_host")
- backfile_path = os.path.join(base_dir, backing_file)
kernel_path = os.path.join(CONF.instances_path,
self.test_instance['uuid'],
'kernel')
@@ -11030,6 +11045,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
mock.call(self.context, kernel_path, instance.kernel_id),
mock.call(self.context, ramdisk_path, instance.ramdisk_id)
])
+ resize_image_mock.assert_called_once_with(virt_disk_size)
mock_utime.assert_called()
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 44cdc7d53a..4863deff0d 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -7668,7 +7668,7 @@ class LibvirtDriver(driver.ComputeDriver):
dest=target,
host=fallback_from_host,
receive=True)
- image.cache(fetch_func=copy_from_host,
+ image.cache(fetch_func=copy_from_host, size=size,
filename=filename)
def _create_images_and_backing(self, context, instance, instance_dir,