@@ -37,13 +37,15 @@ import (
37
37
"k8s.io/apimachinery/pkg/fields"
38
38
"k8s.io/apimachinery/pkg/labels"
39
39
"k8s.io/apimachinery/pkg/runtime"
40
+ "k8s.io/apimachinery/pkg/runtime/schema"
40
41
"k8s.io/apimachinery/pkg/types"
41
42
"k8s.io/apimachinery/pkg/watch"
42
43
"k8s.io/client-go/kubernetes/fake"
43
44
"k8s.io/utils/ptr"
44
45
45
46
"sigs.k8s.io/controller-runtime/pkg/client"
46
47
"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
48
+ "sigs.k8s.io/controller-runtime/pkg/scheme"
47
49
)
48
50
49
51
const (
@@ -1354,10 +1356,6 @@ var _ = Describe("Fake client", func() {
1354
1356
Expect (cl .Get (context .Background (), types.NamespacedName {Name : "cm" }, retrieved )).To (Succeed ())
1355
1357
1356
1358
reference := & corev1.Secret {
1357
- TypeMeta : metav1.TypeMeta {
1358
- APIVersion : "v1" ,
1359
- Kind : "Secret" ,
1360
- },
1361
1359
ObjectMeta : metav1.ObjectMeta {
1362
1360
Name : "cm" ,
1363
1361
ResourceVersion : "999" ,
@@ -1771,8 +1769,6 @@ var _ = Describe("Fake client", func() {
1771
1769
1772
1770
actual := & corev1.Pod {}
1773
1771
Expect (cl .Get (context .Background (), client .ObjectKeyFromObject (obj ), actual )).To (Succeed ())
1774
- obj .APIVersion = "v1"
1775
- obj .Kind = "Pod"
1776
1772
obj .ResourceVersion = actual .ResourceVersion
1777
1773
// only the status mutation should persist
1778
1774
obj .Status .Phase = corev1 .PodRunning
@@ -1877,13 +1873,201 @@ var _ = Describe("Fake client", func() {
1877
1873
}
1878
1874
1879
1875
It ("should error when creating an eviction with the wrong type" , func () {
1880
-
1881
1876
cl := NewClientBuilder ().Build ()
1882
1877
err := cl .SubResource ("eviction" ).Create (context .Background (), & corev1.Pod {}, & corev1.Namespace {})
1883
1878
Expect (apierrors .IsBadRequest (err )).To (BeTrue ())
1884
1879
})
1880
+
1881
+ It ("should leave typemeta empty on typed get" , func () {
1882
+ cl := NewClientBuilder ().WithObjects (& corev1.Pod {ObjectMeta : metav1.ObjectMeta {
1883
+ Namespace : "default" ,
1884
+ Name : "foo" ,
1885
+ }}).Build ()
1886
+
1887
+ var pod corev1.Pod
1888
+ Expect (cl .Get (context .Background (), client.ObjectKey {Namespace : "default" , Name : "foo" }, & pod )).NotTo (HaveOccurred ())
1889
+
1890
+ Expect (pod .TypeMeta ).To (Equal (metav1.TypeMeta {}))
1891
+ })
1892
+
1893
+ It ("should leave typemeta empty on typed list" , func () {
1894
+ cl := NewClientBuilder ().WithObjects (& corev1.Pod {ObjectMeta : metav1.ObjectMeta {
1895
+ Namespace : "default" ,
1896
+ Name : "foo" ,
1897
+ }}).Build ()
1898
+
1899
+ var podList corev1.PodList
1900
+ Expect (cl .List (context .Background (), & podList )).NotTo (HaveOccurred ())
1901
+ Expect (podList .ListMeta ).To (Equal (metav1.ListMeta {}))
1902
+ Expect (podList .Items [0 ].TypeMeta ).To (Equal (metav1.TypeMeta {}))
1903
+ })
1904
+
1905
+ It ("should be able to Get an object that has pointer fields for metadata" , func () {
1906
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
1907
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
1908
+ scheme := runtime .NewScheme ()
1909
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
1910
+
1911
+ cl := NewClientBuilder ().
1912
+ WithScheme (scheme ).
1913
+ WithObjects (& WithPointerMeta {ObjectMeta : & metav1.ObjectMeta {
1914
+ Name : "foo" ,
1915
+ }}).
1916
+ Build ()
1917
+
1918
+ var object WithPointerMeta
1919
+ Expect (cl .Get (context .Background (), client.ObjectKey {Name : "foo" }, & object )).NotTo (HaveOccurred ())
1920
+ })
1921
+
1922
+ It ("should be able to List an object type that has pointer fields for metadata" , func () {
1923
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
1924
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
1925
+ scheme := runtime .NewScheme ()
1926
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
1927
+
1928
+ cl := NewClientBuilder ().
1929
+ WithScheme (scheme ).
1930
+ WithObjects (& WithPointerMeta {ObjectMeta : & metav1.ObjectMeta {
1931
+ Name : "foo" ,
1932
+ }}).
1933
+ Build ()
1934
+
1935
+ var objectList WithPointerMetaList
1936
+ Expect (cl .List (context .Background (), & objectList )).NotTo (HaveOccurred ())
1937
+ Expect (objectList .Items ).To (HaveLen (1 ))
1938
+ })
1939
+
1940
+ It ("should be able to List an object type that has pointer fields for metadata with no results" , func () {
1941
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
1942
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
1943
+ scheme := runtime .NewScheme ()
1944
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
1945
+
1946
+ cl := NewClientBuilder ().
1947
+ WithScheme (scheme ).
1948
+ Build ()
1949
+
1950
+ var objectList WithPointerMetaList
1951
+ Expect (cl .List (context .Background (), & objectList )).NotTo (HaveOccurred ())
1952
+ Expect (objectList .Items ).To (BeEmpty ())
1953
+ })
1954
+
1955
+ It ("should be able to Patch an object type that has pointer fields for metadata" , func () {
1956
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
1957
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
1958
+ scheme := runtime .NewScheme ()
1959
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
1960
+
1961
+ obj := & WithPointerMeta {ObjectMeta : & metav1.ObjectMeta {
1962
+ Name : "foo" ,
1963
+ }}
1964
+ cl := NewClientBuilder ().
1965
+ WithScheme (scheme ).
1966
+ WithObjects (obj ).
1967
+ Build ()
1968
+
1969
+ original := obj .DeepCopy ()
1970
+ obj .Labels = map [string ]string {"foo" : "bar" }
1971
+ Expect (cl .Patch (context .Background (), obj , client .MergeFrom (original ))).NotTo (HaveOccurred ())
1972
+
1973
+ Expect (cl .Get (context .Background (), client.ObjectKey {Name : "foo" }, obj )).NotTo (HaveOccurred ())
1974
+ Expect (obj .Labels ).To (Equal (map [string ]string {"foo" : "bar" }))
1975
+ })
1976
+
1977
+ It ("should be able to Update an object type that has pointer fields for metadata" , func () {
1978
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
1979
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
1980
+ scheme := runtime .NewScheme ()
1981
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
1982
+
1983
+ obj := & WithPointerMeta {ObjectMeta : & metav1.ObjectMeta {
1984
+ Name : "foo" ,
1985
+ }}
1986
+ cl := NewClientBuilder ().
1987
+ WithScheme (scheme ).
1988
+ WithObjects (obj ).
1989
+ Build ()
1990
+
1991
+ Expect (cl .Get (context .Background (), client.ObjectKey {Name : "foo" }, obj )).NotTo (HaveOccurred ())
1992
+
1993
+ obj .Labels = map [string ]string {"foo" : "bar" }
1994
+ Expect (cl .Update (context .Background (), obj )).NotTo (HaveOccurred ())
1995
+
1996
+ Expect (cl .Get (context .Background (), client.ObjectKey {Name : "foo" }, obj )).NotTo (HaveOccurred ())
1997
+ Expect (obj .Labels ).To (Equal (map [string ]string {"foo" : "bar" }))
1998
+ })
1999
+
2000
+ It ("should be able to Delete an object type that has pointer fields for metadata" , func () {
2001
+ schemeBuilder := & scheme.Builder {GroupVersion : schema.GroupVersion {Group : "test" , Version : "v1" }}
2002
+ schemeBuilder .Register (& WithPointerMeta {}, & WithPointerMetaList {})
2003
+ scheme := runtime .NewScheme ()
2004
+ Expect (schemeBuilder .AddToScheme (scheme )).NotTo (HaveOccurred ())
2005
+
2006
+ obj := & WithPointerMeta {ObjectMeta : & metav1.ObjectMeta {
2007
+ Name : "foo" ,
2008
+ }}
2009
+ cl := NewClientBuilder ().
2010
+ WithScheme (scheme ).
2011
+ WithObjects (obj ).
2012
+ Build ()
2013
+
2014
+ Expect (cl .Delete (context .Background (), obj )).NotTo (HaveOccurred ())
2015
+
2016
+ err := cl .Get (context .Background (), client.ObjectKey {Name : "foo" }, obj )
2017
+ Expect (apierrors .IsNotFound (err )).To (BeTrue ())
2018
+ })
1885
2019
})
1886
2020
2021
+ type WithPointerMetaList struct {
2022
+ * metav1.ListMeta
2023
+ * metav1.TypeMeta
2024
+ Items []* WithPointerMeta
2025
+ }
2026
+
2027
+ func (t * WithPointerMetaList ) DeepCopy () * WithPointerMetaList {
2028
+ l := & WithPointerMetaList {
2029
+ ListMeta : t .ListMeta .DeepCopy (),
2030
+ }
2031
+ if t .TypeMeta != nil {
2032
+ l .TypeMeta = & metav1.TypeMeta {
2033
+ APIVersion : t .APIVersion ,
2034
+ Kind : t .Kind ,
2035
+ }
2036
+ }
2037
+ for _ , item := range t .Items {
2038
+ l .Items = append (l .Items , item .DeepCopy ())
2039
+ }
2040
+
2041
+ return l
2042
+ }
2043
+
2044
+ func (t * WithPointerMetaList ) DeepCopyObject () runtime.Object {
2045
+ return t .DeepCopy ()
2046
+ }
2047
+
2048
+ type WithPointerMeta struct {
2049
+ * metav1.TypeMeta
2050
+ * metav1.ObjectMeta
2051
+ }
2052
+
2053
+ func (t * WithPointerMeta ) DeepCopy () * WithPointerMeta {
2054
+ w := & WithPointerMeta {
2055
+ ObjectMeta : t .ObjectMeta .DeepCopy (),
2056
+ }
2057
+ if t .TypeMeta != nil {
2058
+ w .TypeMeta = & metav1.TypeMeta {
2059
+ APIVersion : t .APIVersion ,
2060
+ Kind : t .Kind ,
2061
+ }
2062
+ }
2063
+
2064
+ return w
2065
+ }
2066
+
2067
+ func (t * WithPointerMeta ) DeepCopyObject () runtime.Object {
2068
+ return t .DeepCopy ()
2069
+ }
2070
+
1887
2071
var _ = Describe ("Fake client builder" , func () {
1888
2072
It ("panics when an index with the same name and GroupVersionKind is registered twice" , func () {
1889
2073
// We need any realistic GroupVersionKind, the choice of apps/v1 Deployment is arbitrary.
0 commit comments