Add test for instance boot after snapshot deletion
This test verifies that an instance remains bootable after
deleting its snapshots by creating and using instance snapshots
for volume creation.
Related-Bug: #1989514
Change-Id: I3e60ee2bb93e63e1ec07a64e3d5b9f63e79172d9
diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py
index aaa39c9..f378881 100644
--- a/tempest/scenario/test_volume_boot_pattern.py
+++ b/tempest/scenario/test_volume_boot_pattern.py
@@ -324,3 +324,72 @@
def test_boot_server_from_encrypted_volume_luksv2(self):
"""LUKs v2 decrypts volume through os-brick."""
self._do_test_boot_server_from_encrypted_volume_luks('luks2')
+
+
+class TestVolumeBootPatternV346(manager.EncryptionScenarioTest):
+
+ volume_min_microversion = '3.46'
+ volume_max_microversion = 'latest'
+
+ @decorators.idempotent_id('77889046-1a75-4f14-9b3a-fbbfdd8e5093')
+ @decorators.attr(type='slow')
+ @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,
+ 'Cinder volume snapshots are disabled')
+ @utils.services('compute', 'volume', 'image')
+ def test_instance_boot_after_snapshot_deletion(self):
+ """Test instance bootability after deleting snapshots.
+
+ This test ensures volumes created from instance snapshots
+ are bootable with volume API microversion >= 3.46.
+
+ Steps:
+ 1. Create a bootable volume1 from an image.
+ 2. Launch an instance1 from the created volume.
+ 3. Create image1 - a snapshot1 of the instance1.
+ 4. Create a volume2 from the image1.
+ 5. Boot an instance2 from the volume2 to verify it's bootable.
+ 6. Delete image1 - the first instance1 snapshot1.
+ 7. Create image2 - a snapshot2 of the instance1.
+ 8. Create a volume3 from the image2.
+ 9. Boot instance3 from the new volume3 to verify it's bootable.
+ """
+
+ # Step 1: Create a bootable volume1 from an image
+ volume1 = self.create_volume_from_image()
+
+ # Step 2: Launch instance1 from volume1
+ instance1 = self.boot_instance_from_resource(
+ source_id=volume1['id'],
+ source_type='volume',
+ wait_until='SSHABLE'
+ )
+
+ # Step 3: Create image1 – a snapshot of the instance1
+ image1 = self.create_server_snapshot(instance1)
+
+ # Step 4: Create volume2 from image1
+ volume2 = self.create_volume_from_image(image_id=image1['id'])
+
+ # Step 5: Launch instance2 from volume2
+ self.boot_instance_from_resource(
+ source_id=volume2['id'],
+ source_type='volume',
+ wait_until='SSHABLE'
+ )
+
+ # Step 6: Delete image1
+ self.image_client.delete_image(image1['id'])
+ self.image_client.wait_for_resource_deletion(image1['id'])
+
+ # Step 7: Create image2 – a snapshot of the instance1
+ image2 = self.create_server_snapshot(instance1)
+
+ # Step 8: Create volume3 from image2
+ volume3 = self.create_volume_from_image(image_id=image2['id'])
+
+ # Step 9: Launch instance from volume3
+ self.boot_instance_from_resource(
+ source_id=volume3['id'],
+ source_type='volume',
+ wait_until='SSHABLE'
+ )