Skip to content

Commit f20e2fe

Browse files
committed
:warn: Fakeclient: Remove support for objects with pointer meta
This change removes supports for objects that have type or object meta defined as pointer. This is because the `FieldManagedObjectTracker` needed for support of SSA in the fakeclient can not support it, as it has a lot of places where it unconditionally accesses these fields using reflect, which will cause panics.
1 parent 71f7db5 commit f20e2fe

File tree

1 file changed

+6
-177
lines changed

1 file changed

+6
-177
lines changed

pkg/client/fake/client_test.go

Lines changed: 6 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -592,24 +592,18 @@ var _ = Describe("Fake client", func() {
592592
})
593593

594594
It("should allow patch when the patch sets RV to 'null'", func() {
595-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
596-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
597-
598-
scheme := runtime.NewScheme()
599-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
600-
601-
cl := NewClientBuilder().WithScheme(scheme).Build()
602-
original := &WithPointerMeta{
603-
ObjectMeta: &metav1.ObjectMeta{
595+
cl := NewClientBuilder().Build()
596+
original := &corev1.ConfigMap{
597+
ObjectMeta: metav1.ObjectMeta{
604598
Name: "obj",
605599
Namespace: "ns2",
606600
}}
607601

608602
err := cl.Create(context.Background(), original)
609603
Expect(err).ToNot(HaveOccurred())
610604

611-
newObj := &WithPointerMeta{
612-
ObjectMeta: &metav1.ObjectMeta{
605+
newObj := &corev1.ConfigMap{
606+
ObjectMeta: metav1.ObjectMeta{
613607
Name: original.Name,
614608
Namespace: original.Namespace,
615609
Annotations: map[string]string{
@@ -619,7 +613,7 @@ var _ = Describe("Fake client", func() {
619613

620614
Expect(cl.Patch(context.Background(), newObj, client.MergeFrom(original))).To(Succeed())
621615

622-
patched := &WithPointerMeta{}
616+
patched := &corev1.ConfigMap{}
623617
Expect(cl.Get(context.Background(), client.ObjectKeyFromObject(original), patched)).To(Succeed())
624618
Expect(patched.Annotations).To(Equal(map[string]string{"foo": "bar"}))
625619
})
@@ -2142,121 +2136,6 @@ var _ = Describe("Fake client", func() {
21422136
Expect(podList.Items[0].TypeMeta).To(Equal(metav1.TypeMeta{}))
21432137
})
21442138

2145-
It("should be able to Get an object that has pointer fields for metadata", func() {
2146-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2147-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2148-
scheme := runtime.NewScheme()
2149-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2150-
2151-
cl := NewClientBuilder().
2152-
WithScheme(scheme).
2153-
WithObjects(&WithPointerMeta{ObjectMeta: &metav1.ObjectMeta{
2154-
Name: "foo",
2155-
}}).
2156-
Build()
2157-
2158-
var object WithPointerMeta
2159-
Expect(cl.Get(context.Background(), client.ObjectKey{Name: "foo"}, &object)).NotTo(HaveOccurred())
2160-
})
2161-
2162-
It("should be able to List an object type that has pointer fields for metadata", func() {
2163-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2164-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2165-
scheme := runtime.NewScheme()
2166-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2167-
2168-
cl := NewClientBuilder().
2169-
WithScheme(scheme).
2170-
WithObjects(&WithPointerMeta{ObjectMeta: &metav1.ObjectMeta{
2171-
Name: "foo",
2172-
}}).
2173-
Build()
2174-
2175-
var objectList WithPointerMetaList
2176-
Expect(cl.List(context.Background(), &objectList)).NotTo(HaveOccurred())
2177-
Expect(objectList.Items).To(HaveLen(1))
2178-
})
2179-
2180-
It("should be able to List an object type that has pointer fields for metadata with no results", func() {
2181-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2182-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2183-
scheme := runtime.NewScheme()
2184-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2185-
2186-
cl := NewClientBuilder().
2187-
WithScheme(scheme).
2188-
Build()
2189-
2190-
var objectList WithPointerMetaList
2191-
Expect(cl.List(context.Background(), &objectList)).NotTo(HaveOccurred())
2192-
Expect(objectList.Items).To(BeEmpty())
2193-
})
2194-
2195-
It("should be able to Patch an object type that has pointer fields for metadata", func() {
2196-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2197-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2198-
scheme := runtime.NewScheme()
2199-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2200-
2201-
obj := &WithPointerMeta{ObjectMeta: &metav1.ObjectMeta{
2202-
Name: "foo",
2203-
}}
2204-
cl := NewClientBuilder().
2205-
WithScheme(scheme).
2206-
WithObjects(obj).
2207-
Build()
2208-
2209-
original := obj.DeepCopy()
2210-
obj.Labels = map[string]string{"foo": "bar"}
2211-
Expect(cl.Patch(context.Background(), obj, client.MergeFrom(original))).NotTo(HaveOccurred())
2212-
2213-
Expect(cl.Get(context.Background(), client.ObjectKey{Name: "foo"}, obj)).NotTo(HaveOccurred())
2214-
Expect(obj.Labels).To(Equal(map[string]string{"foo": "bar"}))
2215-
})
2216-
2217-
It("should be able to Update an object type that has pointer fields for metadata", func() {
2218-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2219-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2220-
scheme := runtime.NewScheme()
2221-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2222-
2223-
obj := &WithPointerMeta{ObjectMeta: &metav1.ObjectMeta{
2224-
Name: "foo",
2225-
}}
2226-
cl := NewClientBuilder().
2227-
WithScheme(scheme).
2228-
WithObjects(obj).
2229-
Build()
2230-
2231-
Expect(cl.Get(context.Background(), client.ObjectKey{Name: "foo"}, obj)).NotTo(HaveOccurred())
2232-
2233-
obj.Labels = map[string]string{"foo": "bar"}
2234-
Expect(cl.Update(context.Background(), obj)).NotTo(HaveOccurred())
2235-
2236-
Expect(cl.Get(context.Background(), client.ObjectKey{Name: "foo"}, obj)).NotTo(HaveOccurred())
2237-
Expect(obj.Labels).To(Equal(map[string]string{"foo": "bar"}))
2238-
})
2239-
2240-
It("should be able to Delete an object type that has pointer fields for metadata", func() {
2241-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2242-
schemeBuilder.Register(&WithPointerMeta{}, &WithPointerMetaList{})
2243-
scheme := runtime.NewScheme()
2244-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2245-
2246-
obj := &WithPointerMeta{ObjectMeta: &metav1.ObjectMeta{
2247-
Name: "foo",
2248-
}}
2249-
cl := NewClientBuilder().
2250-
WithScheme(scheme).
2251-
WithObjects(obj).
2252-
Build()
2253-
2254-
Expect(cl.Delete(context.Background(), obj)).NotTo(HaveOccurred())
2255-
2256-
err := cl.Get(context.Background(), client.ObjectKey{Name: "foo"}, obj)
2257-
Expect(apierrors.IsNotFound(err)).To(BeTrue())
2258-
})
2259-
22602139
It("should allow concurrent patches to a configMap", func() {
22612140
scheme := runtime.NewScheme()
22622141
Expect(corev1.AddToScheme(scheme)).To(Succeed())
@@ -2791,56 +2670,6 @@ func (in *Schemaless) DeepCopy() *Schemaless {
27912670
return out
27922671
}
27932672

2794-
type WithPointerMetaList struct {
2795-
*metav1.ListMeta
2796-
*metav1.TypeMeta
2797-
Items []*WithPointerMeta
2798-
}
2799-
2800-
func (t *WithPointerMetaList) DeepCopy() *WithPointerMetaList {
2801-
l := &WithPointerMetaList{
2802-
ListMeta: t.ListMeta.DeepCopy(),
2803-
}
2804-
if t.TypeMeta != nil {
2805-
l.TypeMeta = &metav1.TypeMeta{
2806-
APIVersion: t.APIVersion,
2807-
Kind: t.Kind,
2808-
}
2809-
}
2810-
for _, item := range t.Items {
2811-
l.Items = append(l.Items, item.DeepCopy())
2812-
}
2813-
2814-
return l
2815-
}
2816-
2817-
func (t *WithPointerMetaList) DeepCopyObject() runtime.Object {
2818-
return t.DeepCopy()
2819-
}
2820-
2821-
type WithPointerMeta struct {
2822-
*metav1.TypeMeta `json:",inline"`
2823-
*metav1.ObjectMeta `json:"metadata,omitempty"`
2824-
}
2825-
2826-
func (t *WithPointerMeta) DeepCopy() *WithPointerMeta {
2827-
w := &WithPointerMeta{
2828-
ObjectMeta: t.ObjectMeta.DeepCopy(),
2829-
}
2830-
if t.TypeMeta != nil {
2831-
w.TypeMeta = &metav1.TypeMeta{
2832-
APIVersion: t.APIVersion,
2833-
Kind: t.Kind,
2834-
}
2835-
}
2836-
2837-
return w
2838-
}
2839-
2840-
func (t *WithPointerMeta) DeepCopyObject() runtime.Object {
2841-
return t.DeepCopy()
2842-
}
2843-
28442673
var _ = Describe("Fake client builder", func() {
28452674
It("panics when an index with the same name and GroupVersionKind is registered twice", func() {
28462675
// We need any realistic GroupVersionKind, the choice of apps/v1 Deployment is arbitrary.

0 commit comments

Comments
 (0)