Skip to content

Commit 902670f

Browse files
authored
Merge pull request #1306 from alvaroaleman/set-rv-on-create
⚠ Fakeclient: Set ResourceVersion when adding objects to the tracker
2 parents 5564be7 + 51fb3f8 commit 902670f

File tree

2 files changed

+70
-12
lines changed

2 files changed

+70
-12
lines changed

pkg/client/fake/client.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func (f *ClientBuilder) Build() client.Client {
118118
f.scheme = scheme.Scheme
119119
}
120120

121-
tracker := testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder())
121+
tracker := versionedTracker{ObjectTracker: testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder()), scheme: f.scheme}
122122
for _, obj := range f.initObject {
123123
if err := tracker.Add(obj); err != nil {
124124
panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err))
@@ -135,11 +135,44 @@ func (f *ClientBuilder) Build() client.Client {
135135
}
136136
}
137137
return &fakeClient{
138-
tracker: versionedTracker{ObjectTracker: tracker, scheme: f.scheme},
138+
tracker: tracker,
139139
scheme: f.scheme,
140140
}
141141
}
142142

143+
const trackerAddResourceVersion = "999"
144+
145+
func (t versionedTracker) Add(obj runtime.Object) error {
146+
var objects []runtime.Object
147+
if meta.IsListType(obj) {
148+
var err error
149+
objects, err = meta.ExtractList(obj)
150+
if err != nil {
151+
return err
152+
}
153+
} else {
154+
objects = []runtime.Object{obj}
155+
}
156+
for _, obj := range objects {
157+
accessor, err := meta.Accessor(obj)
158+
if err != nil {
159+
return fmt.Errorf("failed to get accessor for object: %w", err)
160+
}
161+
if accessor.GetResourceVersion() == "" {
162+
// We use a "magic" value of 999 here because this field
163+
// is parsed as uint and and 0 is already used in Update.
164+
// As we can't go lower, go very high instead so this can
165+
// be recognized
166+
accessor.SetResourceVersion(trackerAddResourceVersion)
167+
}
168+
if err := t.ObjectTracker.Add(obj); err != nil {
169+
return err
170+
}
171+
}
172+
173+
return nil
174+
}
175+
143176
func (t versionedTracker) Create(gvr schema.GroupVersionResource, obj runtime.Object, ns string) error {
144177
accessor, err := meta.Accessor(obj)
145178
if err != nil {

pkg/client/fake/client_test.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ var _ = Describe("Fake client", func() {
4848
Kind: "Deployment",
4949
},
5050
ObjectMeta: metav1.ObjectMeta{
51-
Name: "test-deployment",
52-
Namespace: "ns1",
51+
Name: "test-deployment",
52+
Namespace: "ns1",
53+
ResourceVersion: trackerAddResourceVersion,
5354
},
5455
}
5556
dep2 = &appsv1.Deployment{
@@ -63,6 +64,7 @@ var _ = Describe("Fake client", func() {
6364
Labels: map[string]string{
6465
"test-label": "label-value",
6566
},
67+
ResourceVersion: trackerAddResourceVersion,
6668
},
6769
}
6870
cm = &corev1.ConfigMap{
@@ -71,8 +73,9 @@ var _ = Describe("Fake client", func() {
7173
Kind: "ConfigMap",
7274
},
7375
ObjectMeta: metav1.ObjectMeta{
74-
Name: "test-cm",
75-
Namespace: "ns2",
76+
Name: "test-cm",
77+
Namespace: "ns2",
78+
ResourceVersion: trackerAddResourceVersion,
7679
},
7780
Data: map[string]string{
7881
"test-key": "test-value",
@@ -190,9 +193,12 @@ var _ = Describe("Fake client", func() {
190193
It("should not change the submitted object if Create failed", func() {
191194
By("Trying to create an existing configmap")
192195
submitted := cm.DeepCopy()
196+
submitted.ResourceVersion = ""
197+
submittedReference := submitted.DeepCopy()
193198
err := cl.Create(context.Background(), submitted)
199+
Expect(err).ToNot(BeNil())
194200
Expect(apierrors.IsAlreadyExists(err)).To(BeTrue())
195-
Expect(submitted).To(Equal(cm))
201+
Expect(submitted).To(Equal(submittedReference))
196202
})
197203

198204
It("should error on Create with empty Name", func() {
@@ -282,7 +288,7 @@ var _ = Describe("Fake client", func() {
282288
err = cl.Get(context.Background(), namespacedName, obj)
283289
Expect(err).To(BeNil())
284290
Expect(obj).To(Equal(newcm))
285-
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1"))
291+
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1000"))
286292
})
287293

288294
It("should allow updates with non-set ResourceVersion for a resource that allows unconditional updates", func() {
@@ -312,7 +318,7 @@ var _ = Describe("Fake client", func() {
312318
err = cl.Get(context.Background(), namespacedName, obj)
313319
Expect(err).To(BeNil())
314320
Expect(obj).To(Equal(newcm))
315-
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1"))
321+
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1000"))
316322
})
317323

318324
It("should reject updates with non-set ResourceVersion for a resource that doesn't allow unconditional updates", func() {
@@ -421,7 +427,7 @@ var _ = Describe("Fake client", func() {
421427
err = cl.Get(context.Background(), namespacedName, obj)
422428
Expect(err).To(BeNil())
423429
Expect(obj).To(Equal(cm))
424-
Expect(obj.ObjectMeta.ResourceVersion).To(Equal(""))
430+
Expect(obj.ObjectMeta.ResourceVersion).To(Equal(trackerAddResourceVersion))
425431
})
426432

427433
It("should be able to Delete", func() {
@@ -497,7 +503,7 @@ var _ = Describe("Fake client", func() {
497503
err = cl.Get(context.Background(), namespacedName, obj)
498504
Expect(err).To(BeNil())
499505
Expect(obj).To(Equal(cm))
500-
Expect(obj.ObjectMeta.ResourceVersion).To(Equal(""))
506+
Expect(obj.ObjectMeta.ResourceVersion).To(Equal(trackerAddResourceVersion))
501507
})
502508
})
503509

@@ -523,7 +529,7 @@ var _ = Describe("Fake client", func() {
523529
err = cl.Get(context.Background(), namespacedName, obj)
524530
Expect(err).NotTo(HaveOccurred())
525531
Expect(obj.Annotations["foo"]).To(Equal("bar"))
526-
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1"))
532+
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1000"))
527533
})
528534
}
529535

@@ -552,4 +558,23 @@ var _ = Describe("Fake client", func() {
552558
})
553559
AssertClientBehavior()
554560
})
561+
562+
It("should set the ResourceVersion to 999 when adding an object to the tracker", func() {
563+
cl := NewClientBuilder().WithObjects(&corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "cm"}}).Build()
564+
565+
retrieved := &corev1.Secret{}
566+
Expect(cl.Get(context.Background(), types.NamespacedName{Name: "cm"}, retrieved)).To(Succeed())
567+
568+
reference := &corev1.Secret{
569+
TypeMeta: metav1.TypeMeta{
570+
APIVersion: "v1",
571+
Kind: "Secret",
572+
},
573+
ObjectMeta: metav1.ObjectMeta{
574+
Name: "cm",
575+
ResourceVersion: "999",
576+
},
577+
}
578+
Expect(retrieved).To(Equal(reference))
579+
})
555580
})

0 commit comments

Comments
 (0)