Skip to content

Commit af7484e

Browse files
committed
Fix object overwrite on patch for fake client
Signed-off-by: FillZpp <[email protected]>
1 parent 498ee8a commit af7484e

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

pkg/client/fake/client.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"encoding/json"
2222
"errors"
2323
"fmt"
24+
"reflect"
2425
"strconv"
2526
"strings"
2627
"sync"
@@ -284,6 +285,7 @@ func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj client.O
284285
return err
285286
}
286287
decoder := scheme.Codecs.UniversalDecoder()
288+
zero(obj)
287289
_, _, err = decoder.Decode(j, nil, obj)
288290
return err
289291
}
@@ -346,6 +348,7 @@ func (c *fakeClient) List(ctx context.Context, obj client.ObjectList, opts ...cl
346348
return err
347349
}
348350
decoder := scheme.Codecs.UniversalDecoder()
351+
zero(obj)
349352
_, _, err = decoder.Decode(j, nil, obj)
350353
if err != nil {
351354
return err
@@ -549,6 +552,7 @@ func (c *fakeClient) Patch(ctx context.Context, obj client.Object, patch client.
549552
return err
550553
}
551554
decoder := scheme.Codecs.UniversalDecoder()
555+
zero(obj)
552556
_, _, err = decoder.Decode(j, nil, obj)
553557
return err
554558
}
@@ -695,3 +699,12 @@ func allowsCreateOnUpdate(gvk schema.GroupVersionKind) bool {
695699

696700
return false
697701
}
702+
703+
// zero zeros the value of a pointer.
704+
func zero(x interface{}) {
705+
if x == nil {
706+
return
707+
}
708+
res := reflect.ValueOf(x).Elem()
709+
res.Set(reflect.Zero(res.Type()))
710+
}

pkg/client/fake/client_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,47 @@ var _ = Describe("Fake client", func() {
851851
err = cl.Get(context.Background(), namespacedName, obj)
852852
Expect(apierrors.IsNotFound(err)).To(BeTrue())
853853
})
854+
855+
It("should remove finalizers of the object on Patch", func() {
856+
namespacedName := types.NamespacedName{
857+
Name: "test-cm",
858+
Namespace: "patch-finalizers-in-obj",
859+
}
860+
By("Creating a new object")
861+
obj := &corev1.ConfigMap{
862+
ObjectMeta: metav1.ObjectMeta{
863+
Name: namespacedName.Name,
864+
Namespace: namespacedName.Namespace,
865+
Finalizers: []string{"finalizers.sigs.k8s.io/test"},
866+
},
867+
Data: map[string]string{
868+
"test-key": "new-value",
869+
},
870+
}
871+
err := cl.Create(context.Background(), obj)
872+
Expect(err).To(BeNil())
873+
874+
By("Removing the finalizer")
875+
mergePatch, err := json.Marshal(map[string]interface{}{
876+
"metadata": map[string]interface{}{
877+
"$deleteFromPrimitiveList/finalizers": []string{
878+
"finalizers.sigs.k8s.io/test",
879+
},
880+
},
881+
})
882+
Expect(err).To(BeNil())
883+
err = cl.Patch(context.Background(), obj, client.RawPatch(types.StrategicMergePatchType, mergePatch))
884+
Expect(err).To(BeNil())
885+
886+
By("Check the finalizer has been removed in the object")
887+
Expect(len(obj.Finalizers)).To(Equal(0))
888+
889+
By("Check the finalizer has been removed in client")
890+
newObj := &corev1.ConfigMap{}
891+
err = cl.Get(context.Background(), namespacedName, newObj)
892+
Expect(err).To(BeNil())
893+
Expect(len(newObj.Finalizers)).To(Equal(0))
894+
})
854895
}
855896

856897
Context("with default scheme.Scheme", func() {

0 commit comments

Comments
 (0)