Skip to content

Commit ef697aa

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

File tree

1 file changed

+46
-17
lines changed

1 file changed

+46
-17
lines changed

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

Lines changed: 46 additions & 17 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"
@@ -195,7 +197,9 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
195197
}
196198
}
197199

198-
r.deleteWorkspaceSecrets(ctx, workspace)
200+
if err := r.deleteWorkspaceSecrets(ctx, workspace); err != nil {
201+
return ctrl.Result{RequeueAfter: 10 * time.Second}, err
202+
}
199203

200204
// Workspace might have already been in a deleting state,
201205
// but not guaranteed, so try deleting anyway.
@@ -257,7 +261,10 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
257261
}
258262

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

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

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

355362
// if a secret cannot be deleted we do not return early because we want to attempt
356363
// the deletion of the remaining secrets
364+
var errs []string
357365
err := r.deleteSecret(ctx, fmt.Sprintf("%s-%s", ws.Name, "env"), r.Config.Namespace)
358366
if err != nil {
367+
errs = append(errs, err.Error())
359368
log.Error(err, "could not delete environment secret", "workspace", ws.Name)
360369
}
361370

362371
err = r.deleteSecret(ctx, fmt.Sprintf("%s-%s", ws.Name, "tokens"), r.Config.SecretsNamespace)
363372
if err != nil {
373+
errs = append(errs, err.Error())
364374
log.Error(err, "could not delete token secret", "workspace", ws.Name)
365375
}
376+
377+
if len(errs) != 0 {
378+
return fmt.Errorf(strings.Join(errs, ":"))
379+
}
380+
381+
return nil
366382
}
367383

368384
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-
}
385+
log := log.FromContext(ctx)
375386

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

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-
}
400+
if err != nil {
401+
log.Error(err, "cannot retrieve secret scheduled for deletion", "secret", name)
402+
return false, nil
403+
}
384404

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

388417
var (

0 commit comments

Comments
 (0)