From 96d4d6c166b33c2a3fff94ebfce98e52290a220a Mon Sep 17 00:00:00 2001 From: Bruce Zhang Date: Sun, 10 Apr 2022 21:50:47 -0700 Subject: [PATCH 1/4] Improve the fake client builder with WithObjectTracker option --- pkg/client/fake/client.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/client/fake/client.go b/pkg/client/fake/client.go index d23e1957d1..665f7d2339 100644 --- a/pkg/client/fake/client.go +++ b/pkg/client/fake/client.go @@ -92,6 +92,7 @@ type ClientBuilder struct { initObject []client.Object initLists []client.ObjectList initRuntimeObjects []runtime.Object + objectTracker testing.ObjectTracker } // WithScheme sets this builder's internal scheme. @@ -128,6 +129,12 @@ func (f *ClientBuilder) WithRuntimeObjects(initRuntimeObjs ...runtime.Object) *C return f } +// WithObjectTracker can be optionally used to initialize this fake client with testing.ObjectTracker. +func (f *ClientBuilder) WithObjectTracker(ot testing.ObjectTracker) *ClientBuilder { + f.objectTracker = ot + return f +} + // Build builds and returns a new fake client. func (f *ClientBuilder) Build() client.WithWatch { if f.scheme == nil { @@ -137,7 +144,14 @@ func (f *ClientBuilder) Build() client.WithWatch { f.restMapper = meta.NewDefaultRESTMapper([]schema.GroupVersion{}) } - tracker := versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme} + var tracker versionedTracker + + if f.objectTracker == nil { + tracker = versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme} + } else { + tracker = versionedTracker{ObjectTracker: f.objectTracker, scheme: f.scheme} + } + for _, obj := range f.initObject { if err := tracker.Add(obj); err != nil { panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err)) From ca968c61504859f3de4c4dcdf15a57236abaebc3 Mon Sep 17 00:00:00 2001 From: Bruce Zhang Date: Thu, 14 Apr 2022 21:28:21 -0700 Subject: [PATCH 2/4] Update unit test to cover WithObjectTracker --- pkg/client/fake/client_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pkg/client/fake/client_test.go b/pkg/client/fake/client_test.go index 3d6ea17bed..5a74966344 100644 --- a/pkg/client/fake/client_test.go +++ b/pkg/client/fake/client_test.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + "k8s.io/client-go/kubernetes/fake" "time" . "github.com/onsi/ginkgo" @@ -981,4 +982,32 @@ var _ = Describe("Fake client", func() { } Expect(retrieved).To(Equal(reference)) }) + + It("should be able to build with given tracker and get resource", func() { + clientSet := fake.NewSimpleClientset(dep) + cl := NewClientBuilder().WithObjectTracker(clientSet.Tracker()).Build() + + By("Getting a deployment") + namespacedName := types.NamespacedName{ + Name: "test-deployment", + Namespace: "ns1", + } + obj := &appsv1.Deployment{} + err := cl.Get(context.Background(), namespacedName, obj) + Expect(err).To(BeNil()) + Expect(obj).To(Equal(dep)) + + namespacedName2 := types.NamespacedName{ + Name: "test-deployment-2", + Namespace: "ns1", + } + + _, err = clientSet.AppsV1().Deployments("ns1").Create(context.Background(), dep2, metav1.CreateOptions{}) + Expect(err).To(BeNil()) + + obj = &appsv1.Deployment{} + err = cl.Get(context.Background(), namespacedName2, obj) + Expect(err).To(BeNil()) + Expect(obj).To(Equal(dep2)) + }) }) From b093deff4a0966c7e8a861a7274224c4fa596f37 Mon Sep 17 00:00:00 2001 From: Bruce Zhang Date: Thu, 14 Apr 2022 21:48:31 -0700 Subject: [PATCH 3/4] Update unit test to cover WithObjectTracker --- pkg/client/fake/client_test.go | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/pkg/client/fake/client_test.go b/pkg/client/fake/client_test.go index 5a74966344..02884c8953 100644 --- a/pkg/client/fake/client_test.go +++ b/pkg/client/fake/client_test.go @@ -985,7 +985,7 @@ var _ = Describe("Fake client", func() { It("should be able to build with given tracker and get resource", func() { clientSet := fake.NewSimpleClientset(dep) - cl := NewClientBuilder().WithObjectTracker(clientSet.Tracker()).Build() + cl := NewClientBuilder().WithRuntimeObjects(dep2).WithObjectTracker(clientSet.Tracker()).Build() By("Getting a deployment") namespacedName := types.NamespacedName{ @@ -997,17 +997,38 @@ var _ = Describe("Fake client", func() { Expect(err).To(BeNil()) Expect(obj).To(Equal(dep)) - namespacedName2 := types.NamespacedName{ - Name: "test-deployment-2", + By("Getting a deployment from clientSet") + csDep2, err := clientSet.AppsV1().Deployments("ns1").Get(context.Background(), "test-deployment-2", metav1.GetOptions{}) + Expect(err).To(BeNil()) + Expect(csDep2).To(Equal(dep2)) + + By("Getting a new deployment") + namespacedName3 := types.NamespacedName{ + Name: "test-deployment-3", Namespace: "ns1", } - _, err = clientSet.AppsV1().Deployments("ns1").Create(context.Background(), dep2, metav1.CreateOptions{}) + dep3 := &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "Deployment", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-deployment-3", + Namespace: "ns1", + Labels: map[string]string{ + "test-label": "label-value", + }, + ResourceVersion: trackerAddResourceVersion, + }, + } + + _, err = clientSet.AppsV1().Deployments("ns1").Create(context.Background(), dep3, metav1.CreateOptions{}) Expect(err).To(BeNil()) obj = &appsv1.Deployment{} - err = cl.Get(context.Background(), namespacedName2, obj) + err = cl.Get(context.Background(), namespacedName3, obj) Expect(err).To(BeNil()) - Expect(obj).To(Equal(dep2)) + Expect(obj).To(Equal(dep3)) }) }) From 0c5e73aaf609f90b45cac0aa15935eb6e7899d21 Mon Sep 17 00:00:00 2001 From: Bruce Zhang Date: Thu, 14 Apr 2022 21:51:10 -0700 Subject: [PATCH 4/4] Update unit test with goimports --- pkg/client/fake/client_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/client/fake/client_test.go b/pkg/client/fake/client_test.go index 02884c8953..afebdae30c 100644 --- a/pkg/client/fake/client_test.go +++ b/pkg/client/fake/client_test.go @@ -20,9 +20,10 @@ import ( "context" "encoding/json" "fmt" - "k8s.io/client-go/kubernetes/fake" "time" + "k8s.io/client-go/kubernetes/fake" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"