@@ -37,13 +37,15 @@ import (
3737 "k8s.io/apimachinery/pkg/fields"
3838 "k8s.io/apimachinery/pkg/labels"
3939 "k8s.io/apimachinery/pkg/runtime"
40+ "k8s.io/apimachinery/pkg/runtime/schema"
4041 "k8s.io/apimachinery/pkg/types"
4142 "k8s.io/apimachinery/pkg/watch"
4243 "k8s.io/client-go/kubernetes/fake"
4344 "k8s.io/utils/ptr"
4445
4546 "sigs.k8s.io/controller-runtime/pkg/client"
4647 "sigs.k8s.io/controller-runtime/pkg/client/interceptor"
48+ "sigs.k8s.io/controller-runtime/pkg/scheme"
4749)
4850
4951const (
@@ -1354,10 +1356,6 @@ var _ = Describe("Fake client", func() {
13541356 Expect (cl .Get (context .Background (), types.NamespacedName {Name : "cm" }, retrieved )).To (Succeed ())
13551357
13561358 reference := & corev1.Secret {
1357- TypeMeta : metav1.TypeMeta {
1358- APIVersion : "v1" ,
1359- Kind : "Secret" ,
1360- },
13611359 ObjectMeta : metav1.ObjectMeta {
13621360 Name : "cm" ,
13631361 ResourceVersion : "999" ,
@@ -1771,8 +1769,6 @@ var _ = Describe("Fake client", func() {
17711769
17721770 actual := & corev1.Pod {}
17731771 Expect (cl .Get (context .Background (), client .ObjectKeyFromObject (obj ), actual )).To (Succeed ())
1774- obj .APIVersion = "v1"
1775- obj .Kind = "Pod"
17761772 obj .ResourceVersion = actual .ResourceVersion
17771773 // only the status mutation should persist
17781774 obj .Status .Phase = corev1 .PodRunning
@@ -1877,13 +1873,201 @@ var _ = Describe("Fake client", func() {
18771873 }
18781874
18791875 It ("should error when creating an eviction with the wrong type" , func () {
1880-
18811876 cl := NewClientBuilder ().Build ()
18821877 err := cl .SubResource ("eviction" ).Create (context .Background (), & corev1.Pod {}, & corev1.Namespace {})
18831878 Expect (apierrors .IsBadRequest (err )).To (BeTrue ())
18841879 })
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+ })
18852019})
18862020
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+
18872071var _ = Describe ("Fake client builder" , func () {
18882072 It ("panics when an index with the same name and GroupVersionKind is registered twice" , func () {
18892073 // We need any realistic GroupVersionKind, the choice of apps/v1 Deployment is arbitrary.
0 commit comments