diff options
author | Alexandre Arents <alexandre.arents@corp.ovh.com> | 2019-05-14 11:37:12 +0000 |
---|---|---|
committer | Lee Yarwood <lyarwood@redhat.com> | 2019-05-30 08:50:32 +0100 |
commit | 55deddf65de824ca6287537ec6947b73021557ee (patch) | |
tree | 6ea798fb8cd9625b9510084d37bca2ba79407fd6 | |
parent | 076c576eff7f6ef05ad1d3842e251bd7911acf29 (diff) | |
download | nova-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.py | 28 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 2 |
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, |