Add qcow2 format to upload image test
When we test uploading a volume to image, we have a config option
to specify the disk format. Currently the default disk format is
'raw' but most cinder backends store the volume in 'raw' format
and we end up avoiding the conversion workflow which becomes an
untested code path and could lead to bugs as recently discovered
with [1].
This patch adds the 'raw' and 'qcow2' as the default formats.
The config option is also updated to List so we have add multiple
formats to be tested by the same test.
[1] https://bugs.launchpad.net/cinder/+bug/2092534
Depends-On: https://review.opendev.org/c/openstack/cinder/+/938265
Related-Bug: #2092534
Change-Id: I5f0f005d9487d7cf59dfa818e2a327f6d3956d1b
diff --git a/releasenotes/notes/change-default-disk-format-0d5230cbb19e3d44.yaml b/releasenotes/notes/change-default-disk-format-0d5230cbb19e3d44.yaml
new file mode 100644
index 0000000..57c5319
--- /dev/null
+++ b/releasenotes/notes/change-default-disk-format-0d5230cbb19e3d44.yaml
@@ -0,0 +1,8 @@
+---
+upgrade:
+ - |
+ The default value for ``[volume] disk_format``, which specifies the
+ disk format of the image in a copy a volume to image operation,
+ is changed from ``raw`` to ``[raw, qcow2]`` for which the type of
+ the config option also needed to change from ``string`` type to
+ ``list`` type i.e. it accepts multiple values now.
diff --git a/tempest/api/volume/test_volumes_actions.py b/tempest/api/volume/test_volumes_actions.py
index 8cf44be..8b2bc69 100644
--- a/tempest/api/volume/test_volumes_actions.py
+++ b/tempest/api/volume/test_volumes_actions.py
@@ -109,29 +109,37 @@
# it is shared with the other tests. After it is uploaded in Glance,
# there is no way to delete it from Cinder, so we delete it from Glance
# using the Glance images_client and from Cinder via tearDownClass.
- image_name = data_utils.rand_name(self.__class__.__name__ + '-Image',
- prefix=CONF.resource_name_prefix)
- body = self.volumes_client.upload_volume(
- self.volume['id'], image_name=image_name,
- disk_format=CONF.volume.disk_format)['os-volume_upload_image']
- image_id = body["image_id"]
- self.addCleanup(test_utils.call_and_ignore_notfound_exc,
- self.images_client.delete_image,
- image_id)
- waiters.wait_for_image_status(self.images_client, image_id, 'active')
- # This is required for the optimized upload volume path.
- # New location APIs are async so we need to wait for the location
- # import task to complete.
- # This should work with old location API since we don't fail if there
- # are no tasks for the image
- waiters.wait_for_image_tasks_status(self.images_client,
- image_id, 'success')
- waiters.wait_for_volume_resource_status(self.volumes_client,
- self.volume['id'], 'available')
+ # NOTE: This looks really strange to loop through the disk formats
+ # but similar implementation is done in test_volume_bootable test.
+ # Also there is no trace of ddt usage in tempest so this looks like
+ # the only way.
+ for disk_format in CONF.volume.disk_format:
+ image_name = data_utils.rand_name(
+ self.__class__.__name__ + '-Image',
+ prefix=CONF.resource_name_prefix)
+ body = self.volumes_client.upload_volume(
+ self.volume['id'], image_name=image_name,
+ disk_format=disk_format)['os-volume_upload_image']
+ image_id = body["image_id"]
+ self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+ self.images_client.delete_image,
+ image_id)
+ waiters.wait_for_image_status(self.images_client, image_id,
+ 'active')
+ # This is required for the optimized upload volume path.
+ # New location APIs are async so we need to wait for the location
+ # import task to complete.
+ # This should work with old location API since we don't fail if
+ # there are no tasks for the image
+ waiters.wait_for_image_tasks_status(self.images_client,
+ image_id, 'success')
+ waiters.wait_for_volume_resource_status(self.volumes_client,
+ self.volume['id'],
+ 'available')
- image_info = self.images_client.show_image(image_id)
- self.assertEqual(image_name, image_info['name'])
- self.assertEqual(CONF.volume.disk_format, image_info['disk_format'])
+ image_info = self.images_client.show_image(image_id)
+ self.assertEqual(image_name, image_info['name'])
+ self.assertEqual(disk_format, image_info['disk_format'])
@decorators.idempotent_id('92c4ef64-51b2-40c0-9f7e-4749fbaaba33')
def test_reserve_unreserve_volume(self):
diff --git a/tempest/config.py b/tempest/config.py
index 36f0152..9b2cea4 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -1026,9 +1026,9 @@
cfg.StrOpt('vendor_name',
default='Open Source',
help='Backend vendor to target when creating volume types'),
- cfg.StrOpt('disk_format',
- default='raw',
- help='Disk format to use when copying a volume to image'),
+ cfg.ListOpt('disk_format',
+ default=['raw', 'qcow2'],
+ help='Disk format to use when copying a volume to image'),
cfg.IntOpt('volume_size',
default=1,
help='Default size in GB for volumes created by volumes tests'),