Merge "[2025.2]Update integrated template for grenade-skip-level-always job"
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 cbfa7b5..9c288ff 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -1025,9 +1025,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'),
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 2f21c2d..bd21e73 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -45,7 +45,7 @@
         # if things are working in latest and oldest it will work in between
         # stable branches also. If anything is breaking we will be catching
         # those in respective stable branch gate.
-        - tempest-full-2024-2:
+        - tempest-full-2025-1:
             irrelevant-files: *tempest-irrelevant-files
         - tempest-full-2023-2:
             irrelevant-files: *tempest-irrelevant-files
@@ -201,12 +201,15 @@
             irrelevant-files: *tempest-irrelevant-files
     periodic-stable:
       jobs:
+        - tempest-full-2025-1
         - tempest-full-2024-2
         - tempest-full-2024-1
         - tempest-full-2023-2
+        - tempest-slow-2025-1
         - tempest-slow-2024-2
         - tempest-slow-2024-1
         - tempest-slow-2023-2
+        - tempest-full-2025-1-extra-tests
         - tempest-full-2024-2-extra-tests
         - tempest-full-2024-1-extra-tests
         - tempest-full-2023-2-extra-tests
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index 5785ec6..6409ae3 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -1,5 +1,11 @@
 # NOTE(gmann): This file includes all stable release jobs definition.
 - job:
+    name: tempest-full-2025-1
+    parent: tempest-full-py3
+    nodeset: openstack-single-node-noble
+    override-checkout: stable/2025.1
+
+- job:
     name: tempest-full-2024-2
     parent: tempest-full-py3
     nodeset: openstack-single-node-jammy
@@ -18,6 +24,12 @@
     override-checkout: stable/2023.2
 
 - job:
+    name: tempest-full-2025-1-extra-tests
+    parent: tempest-extra-tests
+    nodeset: openstack-single-node-noble
+    override-checkout: stable/2025.1
+
+- job:
     name: tempest-full-2024-2-extra-tests
     parent: tempest-extra-tests
     nodeset: openstack-single-node-jammy
@@ -36,6 +48,12 @@
     override-checkout: stable/2023.2
 
 - job:
+    name: tempest-slow-2025-1
+    parent: tempest-slow-py3
+    nodeset: openstack-two-node-noble
+    override-checkout: stable/2025.1
+
+- job:
     name: tempest-slow-2024-2
     parent: tempest-slow-py3
     nodeset: openstack-two-node-jammy