Skip to content

Commit 8229d71

Browse files
Fake client should set CreationTimestamp
1 parent f28fd58 commit 8229d71

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

pkg/client/fake/client.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,14 @@ func (c *fakeClient) patch(obj client.Object, patch client.Patch, opts ...client
933933
// Overwrite it unconditionally, this matches the apiserver behavior
934934
// which allows to set it on create, but will then ignore it.
935935
obj.SetResourceVersion("1")
936+
937+
now, err := time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
938+
if err != nil {
939+
return apierrors.NewInternalError(err)
940+
}
941+
obj.SetCreationTimestamp(metav1.Time{
942+
Time: now,
943+
})
936944
} else {
937945
// SSA deletionTimestamp updates are silently ignored
938946
obj.SetDeletionTimestamp(oldAccessor.GetDeletionTimestamp())

pkg/client/fake/client_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ var _ = Describe("Fake client", func() {
414414
Expect(err).ToNot(HaveOccurred())
415415
Expect(obj).To(Equal(newcm))
416416
Expect(obj.ObjectMeta.ResourceVersion).To(Equal("1"))
417+
Expect(obj.ObjectMeta.CreationTimestamp.IsZero()).To(BeFalse())
417418
})
418419

419420
It("should error on create with set resourceVersion", func(ctx SpecContext) {
@@ -429,6 +430,19 @@ var _ = Describe("Fake client", func() {
429430
Expect(apierrors.IsBadRequest(err)).To(BeTrue())
430431
})
431432

433+
It("should error on create with set creationTimestamp", func(ctx SpecContext) {
434+
By("Creating a new configmap")
435+
newcm := &corev1.ConfigMap{
436+
ObjectMeta: metav1.ObjectMeta{
437+
Name: "new-test-cm",
438+
Namespace: "ns2",
439+
CreationTimestamp: metav1.Now(),
440+
},
441+
}
442+
err := cl.Create(ctx, newcm)
443+
Expect(apierrors.IsBadRequest(err)).To(BeTrue())
444+
})
445+
432446
It("should not change the submitted object if Create failed", func(ctx SpecContext) {
433447
By("Trying to create an existing configmap")
434448
submitted := cm.DeepCopy()
@@ -3068,6 +3082,16 @@ var _ = Describe("Fake client", func() {
30683082
Expect(obj.ResourceVersion).To(BeEquivalentTo(ptr.To("1")))
30693083
})
30703084

3085+
It("sets creatioTimestamp on SSA create", func(ctx SpecContext) {
3086+
obj := corev1applyconfigurations.
3087+
ConfigMap("foo", "default").
3088+
WithData(map[string]string{"some": "data"})
3089+
3090+
cl := NewClientBuilder().Build()
3091+
Expect(cl.Apply(ctx, obj, client.FieldOwner("foo"))).NotTo(HaveOccurred())
3092+
Expect(obj.CreationTimestamp.IsZero()).To(BeFalse())
3093+
})
3094+
30713095
It("ignores a passed resourceVersion on SSA create", func(ctx SpecContext) {
30723096
obj := corev1applyconfigurations.
30733097
ConfigMap("foo", "default").

pkg/client/fake/versioned_tracker.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import (
2020
"bytes"
2121
"errors"
2222
"fmt"
23+
"reflect"
2324
"runtime/debug"
2425
"strconv"
26+
"time"
2527

2628
apierrors "k8s.io/apimachinery/pkg/api/errors"
2729
"k8s.io/apimachinery/pkg/api/meta"
@@ -34,6 +36,7 @@ import (
3436
"k8s.io/apimachinery/pkg/util/validation/field"
3537
"k8s.io/apimachinery/pkg/watch"
3638
"k8s.io/client-go/testing"
39+
3740
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3841
)
3942

@@ -111,12 +114,23 @@ func (t versionedTracker) Create(gvr schema.GroupVersionResource, obj runtime.Ob
111114
return apierrors.NewBadRequest("resourceVersion can not be set for Create requests")
112115
}
113116
accessor.SetResourceVersion("1")
117+
if !reflect.DeepEqual(accessor.GetCreationTimestamp(), metav1.Time{}) {
118+
return apierrors.NewBadRequest("creationTimestamp can not be set for Create requests")
119+
}
120+
now, err := time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
121+
if err != nil {
122+
return apierrors.NewInternalError(err)
123+
}
124+
accessor.SetCreationTimestamp(metav1.Time{
125+
Time: now,
126+
})
114127
obj, err = convertFromUnstructuredIfNecessary(t.scheme, obj)
115128
if err != nil {
116129
return err
117130
}
118131
if err := t.upstream.Create(gvr, obj, ns, opts...); err != nil {
119132
accessor.SetResourceVersion("")
133+
accessor.SetCreationTimestamp(metav1.Time{})
120134
return err
121135
}
122136

0 commit comments

Comments
 (0)