Skip to content

Commit e0ad38b

Browse files
committed
Update Secret Purge Flow
1 parent fbd96bf commit e0ad38b

1 file changed

Lines changed: 42 additions & 4 deletions

File tree

datasource/keyvaultsecret/data_acc_test.go

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,25 +177,63 @@ func (s *AzureKeyVault) Create() error {
177177
}
178178

179179
func (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

Comments
 (0)