Skip to content

Commit b1e1a4f

Browse files
authored
✨ Improve the fake client builder with WithObjectTracker option (#1863)
* Improve the fake client builder with WithObjectTracker option * Update unit test to cover WithObjectTracker * Update unit test to cover WithObjectTracker * Update unit test with goimports
1 parent c162794 commit b1e1a4f

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

pkg/client/fake/client.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ type ClientBuilder struct {
9292
initObject []client.Object
9393
initLists []client.ObjectList
9494
initRuntimeObjects []runtime.Object
95+
objectTracker testing.ObjectTracker
9596
}
9697

9798
// WithScheme sets this builder's internal scheme.
@@ -128,6 +129,12 @@ func (f *ClientBuilder) WithRuntimeObjects(initRuntimeObjs ...runtime.Object) *C
128129
return f
129130
}
130131

132+
// WithObjectTracker can be optionally used to initialize this fake client with testing.ObjectTracker.
133+
func (f *ClientBuilder) WithObjectTracker(ot testing.ObjectTracker) *ClientBuilder {
134+
f.objectTracker = ot
135+
return f
136+
}
137+
131138
// Build builds and returns a new fake client.
132139
func (f *ClientBuilder) Build() client.WithWatch {
133140
if f.scheme == nil {
@@ -137,7 +144,14 @@ func (f *ClientBuilder) Build() client.WithWatch {
137144
f.restMapper = meta.NewDefaultRESTMapper([]schema.GroupVersion{})
138145
}
139146

140-
tracker := versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme}
147+
var tracker versionedTracker
148+
149+
if f.objectTracker == nil {
150+
tracker = versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme}
151+
} else {
152+
tracker = versionedTracker{ObjectTracker: f.objectTracker, scheme: f.scheme}
153+
}
154+
141155
for _, obj := range f.initObject {
142156
if err := tracker.Add(obj); err != nil {
143157
panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err))

pkg/client/fake/client_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"fmt"
2323
"time"
2424

25+
"k8s.io/client-go/kubernetes/fake"
26+
2527
. "github.com/onsi/ginkgo"
2628
. "github.com/onsi/gomega"
2729
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -1002,4 +1004,53 @@ var _ = Describe("Fake client", func() {
10021004
}
10031005
Expect(retrieved).To(Equal(reference))
10041006
})
1007+
1008+
It("should be able to build with given tracker and get resource", func() {
1009+
clientSet := fake.NewSimpleClientset(dep)
1010+
cl := NewClientBuilder().WithRuntimeObjects(dep2).WithObjectTracker(clientSet.Tracker()).Build()
1011+
1012+
By("Getting a deployment")
1013+
namespacedName := types.NamespacedName{
1014+
Name: "test-deployment",
1015+
Namespace: "ns1",
1016+
}
1017+
obj := &appsv1.Deployment{}
1018+
err := cl.Get(context.Background(), namespacedName, obj)
1019+
Expect(err).To(BeNil())
1020+
Expect(obj).To(Equal(dep))
1021+
1022+
By("Getting a deployment from clientSet")
1023+
csDep2, err := clientSet.AppsV1().Deployments("ns1").Get(context.Background(), "test-deployment-2", metav1.GetOptions{})
1024+
Expect(err).To(BeNil())
1025+
Expect(csDep2).To(Equal(dep2))
1026+
1027+
By("Getting a new deployment")
1028+
namespacedName3 := types.NamespacedName{
1029+
Name: "test-deployment-3",
1030+
Namespace: "ns1",
1031+
}
1032+
1033+
dep3 := &appsv1.Deployment{
1034+
TypeMeta: metav1.TypeMeta{
1035+
APIVersion: "apps/v1",
1036+
Kind: "Deployment",
1037+
},
1038+
ObjectMeta: metav1.ObjectMeta{
1039+
Name: "test-deployment-3",
1040+
Namespace: "ns1",
1041+
Labels: map[string]string{
1042+
"test-label": "label-value",
1043+
},
1044+
ResourceVersion: trackerAddResourceVersion,
1045+
},
1046+
}
1047+
1048+
_, err = clientSet.AppsV1().Deployments("ns1").Create(context.Background(), dep3, metav1.CreateOptions{})
1049+
Expect(err).To(BeNil())
1050+
1051+
obj = &appsv1.Deployment{}
1052+
err = cl.Get(context.Background(), namespacedName3, obj)
1053+
Expect(err).To(BeNil())
1054+
Expect(obj).To(Equal(dep3))
1055+
})
10051056
})

0 commit comments

Comments
 (0)