@@ -177,25 +177,63 @@ func (s *AzureKeyVault) Create() error {
177177}
178178
179179func (s * AzureKeyVault ) Delete () error {
180-
181180 client , err := s .getSecretsClient ()
182181 if err != nil {
183182 return err
184183 }
185184
185+ // 1. Initiate Soft Delete
186186 _ , err = client .DeleteSecret (context .TODO (), s .SecretName , nil )
187187 if err != nil && ! isNotFound (err ) {
188188 return fmt .Errorf ("failed to delete secret: %w" , err )
189189 }
190- time .Sleep (1 * time .Second ) // Wait for the secret to be deleted
191190
191+ // 2. Poll until the secret appears in the "Deleted" state
192+ // "DeleteSecret" returns before the secret is actually ready to be purged.
193+ // We must wait for it to appear in the DeletedSecrets list.
194+ maxRetries := 30
195+ retryInterval := 2 * time .Second
196+
197+ log .Printf ("Waiting for secret %q to enter soft-deleted state..." , s .SecretName )
198+
199+ secretReadyToPurge := false
200+ for i := 0 ; i < maxRetries ; i ++ {
201+ _ , err := client .GetDeletedSecret (context .TODO (), s .SecretName , nil )
202+
203+ if err == nil {
204+ // Success: Secret is confirmed in "Deleted" state.
205+ secretReadyToPurge = true
206+ break
207+ }
208+
209+ // If error is anything other than NotFound, it's a real error
210+ if ! isNotFound (err ) {
211+ return fmt .Errorf ("error checking deleted secret status: %w" , err )
212+ }
213+
214+ // If NotFound, it means it hasn't reached the "Deleted" table yet. Wait and retry.
215+ time .Sleep (retryInterval )
216+ }
217+
218+ if ! secretReadyToPurge {
219+ // If we timed out and still can't find it in deleted secrets,
220+ // implies it was already purged or never existed.
221+ log .Printf ("Secret %q not found in deleted state after waiting. Assuming already cleaned." , s .SecretName )
222+ return nil
223+ }
224+
225+ // 3. Purge
226+ log .Printf ("Purging secret %q..." , s .SecretName )
192227 _ , err = client .PurgeDeletedSecret (context .TODO (), s .SecretName , nil )
193228 if err != nil {
229+ // If it says NotFound now, it implies it was purged by a parallel process or completed instantly
230+ if isNotFound (err ) {
231+ return nil
232+ }
194233 return fmt .Errorf ("failed to purge deleted secret: %w" , err )
195234 }
196235
197- log .Printf ("Secret %q deleted successfully" , s .SecretName )
198-
236+ log .Printf ("Secret %q purged successfully" , s .SecretName )
199237 return nil
200238}
201239
0 commit comments