Skip to content

Commit 529036d

Browse files
committed
[wsman-mk2] Retry deleting secret
1 parent ce48eea commit 529036d

File tree

1 file changed

+43
-16
lines changed

1 file changed

+43
-16
lines changed

components/ws-manager-mk2/controllers/workspace_controller.go

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ package controllers
77
import (
88
"context"
99
"fmt"
10+
"strings"
1011
"time"
1112

1213
corev1 "k8s.io/api/core/v1"
1314
"k8s.io/apimachinery/pkg/api/errors"
1415
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1516
"k8s.io/apimachinery/pkg/runtime"
1617
"k8s.io/apimachinery/pkg/types"
18+
"k8s.io/apimachinery/pkg/util/wait"
1719
ctrl "sigs.k8s.io/controller-runtime"
1820
"sigs.k8s.io/controller-runtime/pkg/client"
1921
"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -257,7 +259,10 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
257259
}
258260

259261
case workspace.Status.Phase == workspacev1.WorkspacePhaseRunning:
260-
r.deleteWorkspaceSecrets(ctx, workspace)
262+
err := r.deleteWorkspaceSecrets(ctx, workspace)
263+
if err != nil {
264+
log.Error(err, "could not delete workspace secrets")
265+
}
261266

262267
// we've disposed already - try to remove the finalizer and call it a day
263268
case workspace.Status.Phase == workspacev1.WorkspacePhaseStopped:
@@ -349,40 +354,62 @@ func (r *WorkspaceReconciler) deleteWorkspacePod(ctx context.Context, pod *corev
349354
return ctrl.Result{}, nil
350355
}
351356

352-
func (r *WorkspaceReconciler) deleteWorkspaceSecrets(ctx context.Context, ws *workspacev1.Workspace) {
357+
func (r *WorkspaceReconciler) deleteWorkspaceSecrets(ctx context.Context, ws *workspacev1.Workspace) error {
353358
log := log.FromContext(ctx)
354359

355360
// if a secret cannot be deleted we do not return early because we want to attempt
356361
// the deletion of the remaining secrets
362+
var errs []string
357363
err := r.deleteSecret(ctx, fmt.Sprintf("%s-%s", ws.Name, "env"), r.Config.Namespace)
358364
if err != nil {
365+
errs = append(errs, err.Error())
359366
log.Error(err, "could not delete environment secret", "workspace", ws.Name)
360367
}
361368

362369
err = r.deleteSecret(ctx, fmt.Sprintf("%s-%s", ws.Name, "tokens"), r.Config.SecretsNamespace)
363370
if err != nil {
371+
errs = append(errs, err.Error())
364372
log.Error(err, "could not delete token secret", "workspace", ws.Name)
365373
}
374+
375+
if len(errs) != 0 {
376+
return fmt.Errorf(strings.Join(errs, ":"))
377+
}
378+
379+
return nil
366380
}
367381

368382
func (r *WorkspaceReconciler) deleteSecret(ctx context.Context, name, namespace string) error {
369-
var secret corev1.Secret
370-
err := r.Client.Get(ctx, types.NamespacedName{Name: name, Namespace: namespace}, &secret)
371-
if errors.IsNotFound(err) {
372-
// nothing to delete
373-
return nil
374-
}
383+
log := log.FromContext(ctx)
375384

376-
if err != nil {
377-
return fmt.Errorf("could not retrieve secret %s: %w", name, err)
378-
}
385+
err := wait.ExponentialBackoffWithContext(ctx, wait.Backoff{
386+
Duration: 100 * time.Millisecond,
387+
Factor: 1.5,
388+
Jitter: 0.2,
389+
Steps: 3,
390+
}, func() (bool, error) {
391+
var secret corev1.Secret
392+
err := r.Client.Get(ctx, types.NamespacedName{Name: name, Namespace: namespace}, &secret)
393+
if errors.IsNotFound(err) {
394+
// nothing to delete
395+
return true, nil
396+
}
379397

380-
err = r.Client.Delete(ctx, &secret)
381-
if err != nil && !errors.IsNotFound(err) {
382-
return fmt.Errorf("could not delete secret %s: %w", name, err)
383-
}
398+
if err != nil {
399+
log.Error(err, "cannot retrieve secret scheduled for deletion", "secret", name)
400+
return false, nil
401+
}
384402

385-
return nil
403+
err = r.Client.Delete(ctx, &secret)
404+
if err != nil && !errors.IsNotFound(err) {
405+
log.Error(err, "cannot delete secret", "secret", name)
406+
return false, nil
407+
}
408+
409+
return true, nil
410+
})
411+
412+
return err
386413
}
387414

388415
var (

0 commit comments

Comments
 (0)