Skip to content

Commit 286a287

Browse files
committed
Handle finalizers when deleting collections
1 parent 4f23760 commit 286a287

File tree

2 files changed

+55
-15
lines changed

2 files changed

+55
-15
lines changed

pkg/client/fake/client.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -392,20 +392,7 @@ func (c *fakeClient) Delete(ctx context.Context, obj client.Object, opts ...clie
392392
delOptions := client.DeleteOptions{}
393393
delOptions.ApplyOptions(opts)
394394

395-
old, err := c.tracker.Get(gvr, accessor.GetNamespace(), accessor.GetName())
396-
if err == nil {
397-
oldAccessor, err := meta.Accessor(old)
398-
if err == nil {
399-
if len(oldAccessor.GetFinalizers()) > 0 {
400-
now := metav1.Now()
401-
oldAccessor.SetDeletionTimestamp(&now)
402-
return c.tracker.Update(gvr, old, accessor.GetNamespace())
403-
}
404-
}
405-
}
406-
407-
//TODO: implement propagation
408-
return c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName())
395+
return c.deleteObject(gvr, accessor)
409396
}
410397

411398
func (c *fakeClient) DeleteAllOf(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error {
@@ -436,7 +423,7 @@ func (c *fakeClient) DeleteAllOf(ctx context.Context, obj client.Object, opts ..
436423
if err != nil {
437424
return err
438425
}
439-
err = c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName())
426+
err = c.deleteObject(gvr, accessor)
440427
if err != nil {
441428
return err
442429
}
@@ -521,6 +508,23 @@ func (c *fakeClient) Status() client.StatusWriter {
521508
return &fakeStatusWriter{client: c}
522509
}
523510

511+
func (c *fakeClient) deleteObject(gvr schema.GroupVersionResource, accessor metav1.Object) error {
512+
old, err := c.tracker.Get(gvr, accessor.GetNamespace(), accessor.GetName())
513+
if err == nil {
514+
oldAccessor, err := meta.Accessor(old)
515+
if err == nil {
516+
if len(oldAccessor.GetFinalizers()) > 0 {
517+
now := metav1.Now()
518+
oldAccessor.SetDeletionTimestamp(&now)
519+
return c.tracker.Update(gvr, old, accessor.GetNamespace())
520+
}
521+
}
522+
}
523+
524+
//TODO: implement propagation
525+
return c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName())
526+
}
527+
524528
func getGVRFromObject(obj runtime.Object, scheme *runtime.Scheme) (schema.GroupVersionResource, error) {
525529
gvk, err := apiutil.GVKForObject(obj, scheme)
526530
if err != nil {

pkg/client/fake/client_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package fake
1919
import (
2020
"context"
2121
"encoding/json"
22+
"fmt"
2223

2324
. "github.com/onsi/ginkgo"
2425
. "github.com/onsi/gomega"
@@ -495,6 +496,41 @@ var _ = Describe("Fake client", func() {
495496
Expect(list.Items).To(BeEmpty())
496497
})
497498

499+
It("should handle finalizers deleting a collection", func() {
500+
for i := 0; i < 5; i++ {
501+
namespacedName := types.NamespacedName{
502+
Name: fmt.Sprintf("test-cm-%d", i),
503+
Namespace: "delete-collection-with-finalizers",
504+
}
505+
By("Creating a new object")
506+
newObj := &corev1.ConfigMap{
507+
ObjectMeta: metav1.ObjectMeta{
508+
Name: namespacedName.Name,
509+
Namespace: namespacedName.Namespace,
510+
Finalizers: []string{"finalizers.sigs.k8s.io/test"},
511+
},
512+
Data: map[string]string{
513+
"test-key": "new-value",
514+
},
515+
}
516+
err := cl.Create(context.Background(), newObj)
517+
Expect(err).To(BeNil())
518+
}
519+
520+
By("Deleting the object")
521+
err := cl.DeleteAllOf(context.Background(), &corev1.ConfigMap{}, client.InNamespace("delete-collection-with-finalizers"))
522+
Expect(err).To(BeNil())
523+
524+
configmaps := corev1.ConfigMapList{}
525+
err = cl.List(context.Background(), &configmaps, client.InNamespace("delete-collection-with-finalizers"))
526+
Expect(err).To(BeNil())
527+
528+
Expect(len(configmaps.Items)).To(Equal(5))
529+
for _, cm := range configmaps.Items {
530+
Expect(cm.DeletionTimestamp).NotTo(BeNil())
531+
}
532+
})
533+
498534
Context("with the DryRun option", func() {
499535
It("should not create a new object", func() {
500536
By("Creating a new configmap with DryRun")

0 commit comments

Comments
 (0)