@@ -7,13 +7,15 @@ package controllers
7
7
import (
8
8
"context"
9
9
"fmt"
10
+ "strings"
10
11
"time"
11
12
12
13
corev1 "k8s.io/api/core/v1"
13
14
"k8s.io/apimachinery/pkg/api/errors"
14
15
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15
16
"k8s.io/apimachinery/pkg/runtime"
16
17
"k8s.io/apimachinery/pkg/types"
18
+ "k8s.io/apimachinery/pkg/util/wait"
17
19
ctrl "sigs.k8s.io/controller-runtime"
18
20
"sigs.k8s.io/controller-runtime/pkg/client"
19
21
"sigs.k8s.io/controller-runtime/pkg/controller"
@@ -257,7 +259,10 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
257
259
}
258
260
259
261
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
+ }
261
266
262
267
// we've disposed already - try to remove the finalizer and call it a day
263
268
case workspace .Status .Phase == workspacev1 .WorkspacePhaseStopped :
@@ -349,40 +354,62 @@ func (r *WorkspaceReconciler) deleteWorkspacePod(ctx context.Context, pod *corev
349
354
return ctrl.Result {}, nil
350
355
}
351
356
352
- func (r * WorkspaceReconciler ) deleteWorkspaceSecrets (ctx context.Context , ws * workspacev1.Workspace ) {
357
+ func (r * WorkspaceReconciler ) deleteWorkspaceSecrets (ctx context.Context , ws * workspacev1.Workspace ) error {
353
358
log := log .FromContext (ctx )
354
359
355
360
// if a secret cannot be deleted we do not return early because we want to attempt
356
361
// the deletion of the remaining secrets
362
+ var errs []string
357
363
err := r .deleteSecret (ctx , fmt .Sprintf ("%s-%s" , ws .Name , "env" ), r .Config .Namespace )
358
364
if err != nil {
365
+ errs = append (errs , err .Error ())
359
366
log .Error (err , "could not delete environment secret" , "workspace" , ws .Name )
360
367
}
361
368
362
369
err = r .deleteSecret (ctx , fmt .Sprintf ("%s-%s" , ws .Name , "tokens" ), r .Config .SecretsNamespace )
363
370
if err != nil {
371
+ errs = append (errs , err .Error ())
364
372
log .Error (err , "could not delete token secret" , "workspace" , ws .Name )
365
373
}
374
+
375
+ if len (errs ) != 0 {
376
+ return fmt .Errorf (strings .Join (errs , ":" ))
377
+ }
378
+
379
+ return nil
366
380
}
367
381
368
382
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 )
375
384
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
+ }
379
397
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
+ }
384
402
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
386
413
}
387
414
388
415
var (
0 commit comments