@@ -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"
@@ -195,7 +197,9 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
195
197
}
196
198
}
197
199
198
- r .deleteWorkspaceSecrets (ctx , workspace )
200
+ if err := r .deleteWorkspaceSecrets (ctx , workspace ); err != nil {
201
+ return ctrl.Result {RequeueAfter : 10 * time .Second }, err
202
+ }
199
203
200
204
// Workspace might have already been in a deleting state,
201
205
// but not guaranteed, so try deleting anyway.
@@ -257,7 +261,10 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
257
261
}
258
262
259
263
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
+ }
261
268
262
269
// we've disposed already - try to remove the finalizer and call it a day
263
270
case workspace .Status .Phase == workspacev1 .WorkspacePhaseStopped :
@@ -349,40 +356,62 @@ func (r *WorkspaceReconciler) deleteWorkspacePod(ctx context.Context, pod *corev
349
356
return ctrl.Result {}, nil
350
357
}
351
358
352
- func (r * WorkspaceReconciler ) deleteWorkspaceSecrets (ctx context.Context , ws * workspacev1.Workspace ) {
359
+ func (r * WorkspaceReconciler ) deleteWorkspaceSecrets (ctx context.Context , ws * workspacev1.Workspace ) error {
353
360
log := log .FromContext (ctx )
354
361
355
362
// if a secret cannot be deleted we do not return early because we want to attempt
356
363
// the deletion of the remaining secrets
364
+ var errs []string
357
365
err := r .deleteSecret (ctx , fmt .Sprintf ("%s-%s" , ws .Name , "env" ), r .Config .Namespace )
358
366
if err != nil {
367
+ errs = append (errs , err .Error ())
359
368
log .Error (err , "could not delete environment secret" , "workspace" , ws .Name )
360
369
}
361
370
362
371
err = r .deleteSecret (ctx , fmt .Sprintf ("%s-%s" , ws .Name , "tokens" ), r .Config .SecretsNamespace )
363
372
if err != nil {
373
+ errs = append (errs , err .Error ())
364
374
log .Error (err , "could not delete token secret" , "workspace" , ws .Name )
365
375
}
376
+
377
+ if len (errs ) != 0 {
378
+ return fmt .Errorf (strings .Join (errs , ":" ))
379
+ }
380
+
381
+ return nil
366
382
}
367
383
368
384
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 )
375
386
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
+ }
379
399
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
+ }
384
404
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
386
415
}
387
416
388
417
var (
0 commit comments