From 8cbe3aaa26dcd3cc18a0579261056f63d7452861 Mon Sep 17 00:00:00 2001 From: lkuchlan Date: Wed, 19 Mar 2025 12:50:12 +0200 Subject: [PATCH] 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 --- tempest/scenario/test_volume_boot_pattern.py | 69 ++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py index aaa39c921e..f378881194 100644 --- a/tempest/scenario/test_volume_boot_pattern.py +++ b/tempest/scenario/test_volume_boot_pattern.py @@ -324,3 +324,72 @@ class TestVolumeBootPattern(manager.EncryptionScenarioTest): 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' + )