From af7484eb6ed5372edc4437215d678796c51183d1 Mon Sep 17 00:00:00 2001 From: FillZpp Date: Fri, 3 Sep 2021 14:57:07 +0800 Subject: [PATCH] Fix object overwrite on patch for fake client Signed-off-by: FillZpp --- pkg/client/fake/client.go | 13 +++++++++++ pkg/client/fake/client_test.go | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/pkg/client/fake/client.go b/pkg/client/fake/client.go index f254523b7f..dcc1e00888 100644 --- a/pkg/client/fake/client.go +++ b/pkg/client/fake/client.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "fmt" + "reflect" "strconv" "strings" "sync" @@ -284,6 +285,7 @@ func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj client.O return err } decoder := scheme.Codecs.UniversalDecoder() + zero(obj) _, _, err = decoder.Decode(j, nil, obj) return err } @@ -346,6 +348,7 @@ func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...cl return err } decoder := scheme.Codecs.UniversalDecoder() + zero(obj) _, _, err = decoder.Decode(j, nil, obj) if err != nil { return err @@ -549,6 +552,7 @@ func (c *fakeClient) Patch(ctx context.Context, obj client.Object, patch client. return err } decoder := scheme.Codecs.UniversalDecoder() + zero(obj) _, _, err = decoder.Decode(j, nil, obj) return err } @@ -695,3 +699,12 @@ func allowsCreateOnUpdate(gvk schema.GroupVersionKind) bool { return false } + +// zero zeros the value of a pointer. +func zero(x interface{}) { + if x == nil { + return + } + res := reflect.ValueOf(x).Elem() + res.Set(reflect.Zero(res.Type())) +} diff --git a/pkg/client/fake/client_test.go b/pkg/client/fake/client_test.go index 23435b528c..5ef943d1c0 100644 --- a/pkg/client/fake/client_test.go +++ b/pkg/client/fake/client_test.go @@ -851,6 +851,47 @@ var _ = Describe("Fake client", func() { err = cl.Get(context.Background(), namespacedName, obj) Expect(apierrors.IsNotFound(err)).To(BeTrue()) }) + + It("should remove finalizers of the object on Patch", func() { + namespacedName := types.NamespacedName{ + Name: "test-cm", + Namespace: "patch-finalizers-in-obj", + } + By("Creating a new object") + obj := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespacedName.Name, + Namespace: namespacedName.Namespace, + Finalizers: []string{"finalizers.sigs.k8s.io/test"}, + }, + Data: map[string]string{ + "test-key": "new-value", + }, + } + err := cl.Create(context.Background(), obj) + Expect(err).To(BeNil()) + + By("Removing the finalizer") + mergePatch, err := json.Marshal(map[string]interface{}{ + "metadata": map[string]interface{}{ + "$deleteFromPrimitiveList/finalizers": []string{ + "finalizers.sigs.k8s.io/test", + }, + }, + }) + Expect(err).To(BeNil()) + err = cl.Patch(context.Background(), obj, client.RawPatch(types.StrategicMergePatchType, mergePatch)) + Expect(err).To(BeNil()) + + By("Check the finalizer has been removed in the object") + Expect(len(obj.Finalizers)).To(Equal(0)) + + By("Check the finalizer has been removed in client") + newObj := &corev1.ConfigMap{} + err = cl.Get(context.Background(), namespacedName, newObj) + Expect(err).To(BeNil()) + Expect(len(newObj.Finalizers)).To(Equal(0)) + }) } Context("with default scheme.Scheme", func() {