Skip to content

Commit 5522c98

Browse files
author
Mengqi Yu
committed
✨handle unstructured objects correctly in fake client
1 parent 47744b5 commit 5522c98

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

pkg/client/fake/client.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj runtime.
106106
if err != nil {
107107
return err
108108
}
109+
110+
gvk, err := apiutil.GVKForObject(obj, c.scheme)
111+
if err != nil {
112+
return err
113+
}
114+
ta, err := meta.TypeAccessor(o)
115+
if err != nil {
116+
return err
117+
}
118+
ta.SetKind(gvk.Kind)
119+
109120
j, err := json.Marshal(o)
110121
if err != nil {
111122
return err
@@ -121,6 +132,8 @@ func (c *fakeClient) List(ctx context.Context, obj runtime.Object, opts ...clien
121132
return err
122133
}
123134

135+
OriginalKind := gvk.Kind
136+
124137
if !strings.HasSuffix(gvk.Kind, "List") {
125138
return fmt.Errorf("non-list type %T (kind %q) passed as output", obj, gvk)
126139
}
@@ -135,6 +148,13 @@ func (c *fakeClient) List(ctx context.Context, obj runtime.Object, opts ...clien
135148
if err != nil {
136149
return err
137150
}
151+
152+
ta, err := meta.TypeAccessor(o)
153+
if err != nil {
154+
return err
155+
}
156+
ta.SetKind(OriginalKind)
157+
138158
j, err := json.Marshal(o)
139159
if err != nil {
140160
return err
@@ -288,6 +308,16 @@ func (c *fakeClient) Patch(ctx context.Context, obj runtime.Object, patch client
288308
panic("tracker could not handle patch method")
289309
}
290310

311+
gvk, err := apiutil.GVKForObject(obj, c.scheme)
312+
if err != nil {
313+
return err
314+
}
315+
ta, err := meta.TypeAccessor(o)
316+
if err != nil {
317+
return err
318+
}
319+
ta.SetKind(gvk.Kind)
320+
291321
j, err := json.Marshal(o)
292322
if err != nil {
293323
return err

pkg/client/fake/client_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
. "github.com/onsi/ginkgo"
2323
. "github.com/onsi/gomega"
24+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2425

2526
appsv1 "k8s.io/api/apps/v1"
2627
corev1 "k8s.io/api/core/v1"
@@ -39,12 +40,18 @@ var _ = Describe("Fake client", func() {
3940

4041
BeforeEach(func() {
4142
dep = &appsv1.Deployment{
43+
TypeMeta: metav1.TypeMeta{
44+
Kind: "Deployment",
45+
},
4246
ObjectMeta: metav1.ObjectMeta{
4347
Name: "test-deployment",
4448
Namespace: "ns1",
4549
},
4650
}
4751
dep2 = &appsv1.Deployment{
52+
TypeMeta: metav1.TypeMeta{
53+
Kind: "Deployment",
54+
},
4855
ObjectMeta: metav1.ObjectMeta{
4956
Name: "test-deployment-2",
5057
Namespace: "ns1",
@@ -54,6 +61,9 @@ var _ = Describe("Fake client", func() {
5461
},
5562
}
5663
cm = &corev1.ConfigMap{
64+
TypeMeta: metav1.TypeMeta{
65+
Kind: "ConfigMap",
66+
},
5767
ObjectMeta: metav1.ObjectMeta{
5868
Name: "test-cm",
5969
Namespace: "ns2",
@@ -77,6 +87,19 @@ var _ = Describe("Fake client", func() {
7787
Expect(obj).To(Equal(dep))
7888
})
7989

90+
It("should be able to Get using unstructured", func() {
91+
By("Getting a deployment")
92+
namespacedName := types.NamespacedName{
93+
Name: "test-deployment",
94+
Namespace: "ns1",
95+
}
96+
obj := &unstructured.Unstructured{}
97+
obj.SetAPIVersion("apps/v1")
98+
obj.SetKind("Deployment")
99+
err := cl.Get(nil, namespacedName, obj)
100+
Expect(err).To(BeNil())
101+
})
102+
80103
It("should be able to List", func() {
81104
By("Listing all deployments in a namespace")
82105
list := &appsv1.DeploymentList{}
@@ -86,6 +109,16 @@ var _ = Describe("Fake client", func() {
86109
Expect(list.Items).To(ConsistOf(*dep, *dep2))
87110
})
88111

112+
It("should be able to List using unstructured list", func() {
113+
By("Listing all deployments in a namespace")
114+
list := &unstructured.UnstructuredList{}
115+
list.SetAPIVersion("apps/v1")
116+
list.SetKind("DeploymentList")
117+
err := cl.List(nil, list, client.InNamespace("ns1"))
118+
Expect(err).To(BeNil())
119+
Expect(list.Items).To(HaveLen(2))
120+
})
121+
89122
It("should support filtering by labels", func() {
90123
By("Listing deployments with a particular label")
91124
list := &appsv1.DeploymentList{}
@@ -101,6 +134,9 @@ var _ = Describe("Fake client", func() {
101134
It("should be able to Create", func() {
102135
By("Creating a new configmap")
103136
newcm := &corev1.ConfigMap{
137+
TypeMeta: metav1.TypeMeta{
138+
Kind: "ConfigMap",
139+
},
104140
ObjectMeta: metav1.ObjectMeta{
105141
Name: "new-test-cm",
106142
Namespace: "ns2",
@@ -124,6 +160,9 @@ var _ = Describe("Fake client", func() {
124160
It("should be able to Update", func() {
125161
By("Updating a new configmap")
126162
newcm := &corev1.ConfigMap{
163+
TypeMeta: metav1.TypeMeta{
164+
Kind: "ConfigMap",
165+
},
127166
ObjectMeta: metav1.ObjectMeta{
128167
Name: "test-cm",
129168
Namespace: "ns2",

pkg/client/fake/doc.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ limitations under the License.
1515
*/
1616

1717
/*
18+
Deprecated: please use pkg/envtest for testing. This package will be dropped
19+
before the v1.0.0 release.
1820
Package fake provides a fake client for testing.
1921
2022
An fake client is backed by its simple object store indexed by GroupVersionResource.

0 commit comments

Comments
 (0)