@@ -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,136 @@ 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+ })
18851954})
18861955
1956+ type WithPointerMetaList struct {
1957+ * metav1.ListMeta
1958+ * metav1.TypeMeta
1959+ Items []* WithPointerMeta
1960+ }
1961+
1962+ func (t * WithPointerMetaList ) DeepCopy () * WithPointerMetaList {
1963+ l := & WithPointerMetaList {
1964+ ListMeta : t .ListMeta .DeepCopy (),
1965+ }
1966+ if t .TypeMeta != nil {
1967+ l .TypeMeta = & metav1.TypeMeta {
1968+ APIVersion : t .APIVersion ,
1969+ Kind : t .Kind ,
1970+ }
1971+ }
1972+ for _ , item := range t .Items {
1973+ l .Items = append (l .Items , item .DeepCopy ())
1974+ }
1975+
1976+ return l
1977+ }
1978+
1979+ func (t * WithPointerMetaList ) DeepCopyObject () runtime.Object {
1980+ return t .DeepCopy ()
1981+ }
1982+
1983+ type WithPointerMeta struct {
1984+ * metav1.TypeMeta
1985+ * metav1.ObjectMeta
1986+ }
1987+
1988+ func (t * WithPointerMeta ) DeepCopy () * WithPointerMeta {
1989+ w := & WithPointerMeta {
1990+ ObjectMeta : t .ObjectMeta .DeepCopy (),
1991+ }
1992+ if t .TypeMeta != nil {
1993+ w .TypeMeta = & metav1.TypeMeta {
1994+ APIVersion : t .APIVersion ,
1995+ Kind : t .Kind ,
1996+ }
1997+ }
1998+
1999+ return w
2000+ }
2001+
2002+ func (t * WithPointerMeta ) DeepCopyObject () runtime.Object {
2003+ return t .DeepCopy ()
2004+ }
2005+
18872006var _ = Describe ("Fake client builder" , func () {
18882007 It ("panics when an index with the same name and GroupVersionKind is registered twice" , func () {
18892008 // We need any realistic GroupVersionKind, the choice of apps/v1 Deployment is arbitrary.
0 commit comments