@@ -39,7 +39,7 @@ var _ = Describe("WorkspaceController", func() {
39
39
ws := newWorkspace (uuid .NewString (), "default" )
40
40
pod := createWorkspaceExpectPod (ws )
41
41
42
- Expect (controllerutil .ContainsFinalizer (pod , gitpodPodFinalizerName )).To (BeTrue ())
42
+ Expect (controllerutil .ContainsFinalizer (pod , workspacev1 . GitpodFinalizerName )).To (BeTrue ())
43
43
44
44
By ("controller updating the pod starts value" )
45
45
Eventually (func () (int , error ) {
@@ -156,6 +156,19 @@ var _ = Describe("WorkspaceController", func() {
156
156
// Expect cleanup without a backup.
157
157
expectWorkspaceCleanup (ws , pod )
158
158
})
159
+
160
+ It ("deleting workspace resource should gracefully clean up" , func () {
161
+ ws := newWorkspace (uuid .NewString (), "default" )
162
+ pod := createWorkspaceExpectPod (ws )
163
+
164
+ Expect (k8sClient .Delete (ctx , ws )).To (Succeed ())
165
+
166
+ expectPhaseEventually (ws , workspacev1 .WorkspacePhaseStopping )
167
+
168
+ expectFinalizerAndMarkBackupCompleted (ws , pod )
169
+
170
+ expectWorkspaceCleanup (ws , pod )
171
+ })
159
172
})
160
173
161
174
Context ("with headless workspaces" , func () {
@@ -250,6 +263,14 @@ func createWorkspaceExpectPod(ws *workspacev1.Workspace) *corev1.Pod {
250
263
return pod
251
264
}
252
265
266
+ func expectPhaseEventually (ws * workspacev1.Workspace , phase workspacev1.WorkspacePhase ) {
267
+ By (fmt .Sprintf ("controller transition workspace phase to %s" , phase ))
268
+ Eventually (func (g Gomega ) {
269
+ g .Expect (k8sClient .Get (ctx , types.NamespacedName {Name : ws .Name , Namespace : ws .Namespace }, ws )).To (Succeed ())
270
+ g .Expect (ws .Status .Phase ).To (Equal (phase ))
271
+ }, timeout , interval ).Should (Succeed ())
272
+ }
273
+
253
274
func expectConditionEventually (ws * workspacev1.Workspace , tpe string , status string , reason string ) {
254
275
By (fmt .Sprintf ("controller setting workspace condition %s to %s" , tpe , status ))
255
276
Eventually (func (g Gomega ) {
@@ -306,7 +327,7 @@ func expectFinalizerAndMarkBackupCompleted(ws *workspacev1.Workspace, pod *corev
306
327
if err := k8sClient .Get (ctx , types.NamespacedName {Name : pod .GetName (), Namespace : pod .GetNamespace ()}, pod ); err != nil {
307
328
return false , err
308
329
}
309
- return controllerutil .ContainsFinalizer (pod , gitpodPodFinalizerName ), nil
330
+ return controllerutil .ContainsFinalizer (pod , workspacev1 . GitpodFinalizerName ), nil
310
331
}, duration , interval ).Should (BeTrue (), "missing gitpod finalizer on pod, expected one to wait for backup to succeed" )
311
332
312
333
By ("signalling backup completed" )
@@ -328,7 +349,7 @@ func expectFinalizerAndMarkBackupFailed(ws *workspacev1.Workspace, pod *corev1.P
328
349
if err := k8sClient .Get (ctx , types.NamespacedName {Name : pod .GetName (), Namespace : pod .GetNamespace ()}, pod ); err != nil {
329
350
return false , err
330
351
}
331
- return controllerutil .ContainsFinalizer (pod , gitpodPodFinalizerName ), nil
352
+ return controllerutil .ContainsFinalizer (pod , workspacev1 . GitpodFinalizerName ), nil
332
353
}, duration , interval ).Should (BeTrue (), "missing gitpod finalizer on pod, expected one to wait for backup to succeed" )
333
354
334
355
By ("signalling backup completed" )
@@ -347,7 +368,8 @@ func expectWorkspaceCleanup(ws *workspacev1.Workspace, pod *corev1.Pod) {
347
368
Eventually (func () (int , error ) {
348
369
if err := k8sClient .Get (ctx , types.NamespacedName {Name : pod .GetName (), Namespace : pod .GetNamespace ()}, pod ); err != nil {
349
370
if errors .IsNotFound (err ) {
350
- // Pod got deleted, because finalizers got removed.
371
+ // Race: finalizers got removed causing pod to get deleted before we could check.
372
+ // This is what we want though.
351
373
return 0 , nil
352
374
}
353
375
return 0 , err
@@ -361,6 +383,20 @@ func expectWorkspaceCleanup(ws *workspacev1.Workspace, pod *corev1.Pod) {
361
383
return checkNotFound (pod )
362
384
}, timeout , interval ).Should (Succeed (), "pod did not go away" )
363
385
386
+ By ("controller removing workspace finalizers" )
387
+ Eventually (func () (int , error ) {
388
+ if err := k8sClient .Get (ctx , types.NamespacedName {Name : ws .GetName (), Namespace : ws .GetNamespace ()}, ws ); err != nil {
389
+ if errors .IsNotFound (err ) {
390
+ // Race: finalizers got removed causing workspace to get deleted before we could check.
391
+ // This is what we want though.
392
+ return 0 , nil
393
+ }
394
+ return 0 , err
395
+ }
396
+ return len (ws .ObjectMeta .Finalizers ), nil
397
+
398
+ }, timeout , interval ).Should (Equal (0 ), "workspace finalizers did not go away" )
399
+
364
400
By ("cleaning up the workspace resource" )
365
401
Eventually (func () error {
366
402
return checkNotFound (ws )
@@ -395,8 +431,9 @@ func newWorkspace(name, namespace string) *workspacev1.Workspace {
395
431
Kind : "Workspace" ,
396
432
},
397
433
ObjectMeta : metav1.ObjectMeta {
398
- Name : name ,
399
- Namespace : namespace ,
434
+ Name : name ,
435
+ Namespace : namespace ,
436
+ Finalizers : []string {workspacev1 .GitpodFinalizerName },
400
437
},
401
438
Spec : workspacev1.WorkspaceSpec {
402
439
Ownership : workspacev1.Ownership {
0 commit comments