From 802f54c880c2d0b22bac9678c2a04f89554663e1 Mon Sep 17 00:00:00 2001 From: Etienne Vaneecloo Date: Tue, 31 Mar 2026 18:06:13 +0200 Subject: [PATCH] fix: wait for volume to become available before cleanup deletion --- builder/openstack/step_create_volume.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/builder/openstack/step_create_volume.go b/builder/openstack/step_create_volume.go index a71a72f..4ce827f 100644 --- a/builder/openstack/step_create_volume.go +++ b/builder/openstack/step_create_volume.go @@ -109,9 +109,17 @@ func (s *StepCreateVolume) Cleanup(state multistep.StateBag) { return } - ui.Say(fmt.Sprintf("Deleting volume: %s ...", s.volumeID)) + // Wait for the volume to become available before deleting. + // After image creation from a volume, Cinder may still be detaching it + // (status "uploading"). Deleting in that state returns a 400 error. + ui.Say(fmt.Sprintf("Waiting for volume %s to become available...", s.volumeID)) + if err := WaitForVolume(blockStorageClient, s.volumeID); err != nil { + ui.Error(fmt.Sprintf( + "Error waiting for volume %s to become available: %s. Attempting deletion anyway.", + s.volumeID, err)) + } - // Delete the volume in any status if exists. + ui.Say(fmt.Sprintf("Deleting volume: %s ...", s.volumeID)) err = volumes.Delete(blockStorageClient, s.volumeID, volumes.DeleteOpts{}).ExtractErr() if err != nil { ui.Error(fmt.Sprintf(