From a2acb31d790e6cb41c067bfc0343bde274c9428c Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Mon, 1 Jul 2024 09:06:40 -0700 Subject: [PATCH] Fix vmdk_allowed_types checking This restores the vmdk_allowed_types checking in create_image() that was unintentionally lost by tightening the qemu-type-matches-glance code in the fetch patch recently. Since we are still detecting the format of base images without metadata, we would have treated a vmdk file that claims to be raw as raw in fetch, but then read it like a vmdk once it was used as a base image for something else. Conflicts: nova/tests/unit/virt/libvirt/test_utils.py NOTE(elod.illes): conflicts are due to encryption support adding patch I5d6d2a7b03b5ace0826af80c4004de852579ff12 was introduced in zed. Change-Id: I07b332a7edb814f6a91661651d9d24bfd6651ae7 Related-Bug: #2059809 (cherry picked from commit 08be7b2a0dc1d7728d8034bc2aab0428c4fb642e) (cherry picked from commit 11301e7e3f0d81a3368632f90608e30d9c647111) (cherry picked from commit 70a435fd519a0ebcc3ac9ad5254fefbf19c93e48) (cherry picked from commit f732f8476851e6272d8ad9937f54b918795844e8) --- nova/tests/unit/virt/libvirt/test_utils.py | 25 ++++++++++++++++++++-- nova/virt/libvirt/utils.py | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/nova/tests/unit/virt/libvirt/test_utils.py b/nova/tests/unit/virt/libvirt/test_utils.py index 0ab00717d28e..26de82790d97 100644 --- a/nova/tests/unit/virt/libvirt/test_utils.py +++ b/nova/tests/unit/virt/libvirt/test_utils.py @@ -117,9 +117,11 @@ class LibvirtUtilsTestCase(test.NoDBTestCase): else: backing_info = {} backing_backing_file = backing_info.pop('backing_file', None) + backing_fmt = backing_info.pop('backing_fmt', + mock.sentinel.backing_fmt) mock_info.return_value = mock.Mock( - file_format=mock.sentinel.backing_fmt, + file_format=backing_fmt, cluster_size=mock.sentinel.cluster_size, backing_file=backing_backing_file, format_specific=backing_info, @@ -139,7 +141,7 @@ class LibvirtUtilsTestCase(test.NoDBTestCase): cow_opts = [ '-o', f'backing_file={backing_file},' - f'backing_fmt={mock.sentinel.backing_fmt},' + f'backing_fmt={backing_fmt},' f'cluster_size={mock.sentinel.cluster_size}', ] @@ -193,6 +195,25 @@ class LibvirtUtilsTestCase(test.NoDBTestCase): backing_file=mock.sentinel.backing_file, ) + def test_create_image_vmdk(self): + self._test_create_image( + '/some/vmdk', 'vmdk', '1234567891234', + backing_file={'file': mock.sentinel.backing_file, + 'backing_fmt': 'vmdk', + 'backing_file': None, + 'data': {'create-type': 'monolithicSparse'}} + ) + + def test_create_image_vmdk_invalid_type(self): + self.assertRaises(exception.ImageUnacceptable, + self._test_create_image, + '/some/vmdk', 'vmdk', '1234567891234', + backing_file={'file': mock.sentinel.backing_file, + 'backing_fmt': 'vmdk', + 'backing_file': None, + 'data': {'create-type': 'monolithicFlat'}} + ) + @ddt.unpack @ddt.data({'fs_type': 'some_fs_type', 'default_eph_format': None, diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py index 7637930b6a63..6dcc928a28d5 100644 --- a/nova/virt/libvirt/utils.py +++ b/nova/virt/libvirt/utils.py @@ -148,6 +148,8 @@ def create_image( reason=_('Base image failed safety check')) base_details = images.qemu_img_info(backing_file) + if base_details.file_format == 'vmdk': + images.check_vmdk_image('base', base_details) if base_details.backing_file is not None: LOG.warning('Base image %s failed safety check', backing_file) raise exception.InvalidDiskInfo(