From 6237e1ad952f91ae0166595959cf1298bb0286b5 Mon Sep 17 00:00:00 2001 From: melanie witt Date: Thu, 31 Jul 2025 19:56:30 +0000 Subject: [PATCH] Test deleting volume snapshots while instance is stopped Related-Bug: #2119353 Change-Id: Id03a98f20eb2f6108e4523a76179ac07c186f425 Signed-off-by: melanie witt --- tempest/scenario/test_volume_boot_pattern.py | 55 ++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tempest/scenario/test_volume_boot_pattern.py b/tempest/scenario/test_volume_boot_pattern.py index f378881194..ec220b04a1 100644 --- a/tempest/scenario/test_volume_boot_pattern.py +++ b/tempest/scenario/test_volume_boot_pattern.py @@ -169,6 +169,61 @@ class TestVolumeBootPattern(manager.EncryptionScenarioTest): # Step 6: Verify console log self.log_console_output([instance]) + @decorators.idempotent_id('3c87bc15-cf6a-4dd6-8c23-4541b2cc3dbb') + @testtools.skipUnless(CONF.volume_feature_enabled.snapshot, + 'Cinder volume snapshots are disabled') + @utils.services('compute', 'volume', 'image') + def test_bootable_volume_last_snapshot_delete_while_stopped(self): + """Test bootable volume snapshot deletion while instance is stopped. + + This test ensures that all volume snapshots can be deleted which + verifies that their backing files were handled correctly during + deletions. + + This scenario is related to the Cinder NFS backend. + + Steps: + 1. Create a bootable volume from an image. + 2. Launch an instance from the created volume. + 3. Create three volume snapshots of the created volume. + 4. Stop the instance. + 5. Delete the latest snapshot and verify it succeeds. + 6. Delete the next latest snapshot and verify it succeeds. + 7. Delete the remaining snapshot and verify it succeeds. + """ + # Step 1: Create a bootable volume from an image + volume = self.create_volume_from_image() + + # Step 2: Boot an instance from the created volume + instance = self.boot_instance_from_resource( + source_id=volume['id'], + source_type='volume', + wait_until='SSHABLE' + ) + + # Step 3: Create three volume snapshots of the bootable volume. + # The force=True is needed in order to snapshot an attached volume. + snapshot1 = self.create_volume_snapshot(volume['id'], force=True) + snapshot2 = self.create_volume_snapshot(volume['id'], force=True) + snapshot3 = self.create_volume_snapshot(volume['id'], force=True) + + # Step 4: Stop the instance + self.servers_client.stop_server(instance['id']) + waiters.wait_for_server_status(self.servers_client, instance['id'], + 'SHUTOFF') + + # Step 5: Delete the latest (newest) snapshot + self.snapshots_client.delete_snapshot(snapshot3['id']) + self.snapshots_client.wait_for_resource_deletion(snapshot3['id']) + + # Step 6: Delete the next latest (next newest) snapshot + self.snapshots_client.delete_snapshot(snapshot2['id']) + self.snapshots_client.wait_for_resource_deletion(snapshot2['id']) + + # Step 7: Delete the last remaining snapshot + self.snapshots_client.delete_snapshot(snapshot1['id']) + self.snapshots_client.wait_for_resource_deletion(snapshot1['id']) + @decorators.idempotent_id('05795fb2-b2a7-4c9f-8fac-ff25aedb1489') @decorators.attr(type='slow') @testtools.skipUnless(CONF.volume_feature_enabled.snapshot,