Skip to content

Commit 375b0dd

Browse files
author
Mengqi Yu
committed
implement a fake client
1 parent 3eae967 commit 375b0dd

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

pkg/client/fake/client.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
Copyright 2018 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package fake
18+
19+
import (
20+
"context"
21+
"encoding/json"
22+
"log"
23+
24+
"k8s.io/apimachinery/pkg/api/meta"
25+
"k8s.io/apimachinery/pkg/runtime"
26+
"k8s.io/apimachinery/pkg/runtime/schema"
27+
"k8s.io/client-go/kubernetes/scheme"
28+
"k8s.io/client-go/testing"
29+
30+
"github.com/kubernetes-sigs/controller-runtime/pkg/client"
31+
)
32+
33+
type fakeClient struct {
34+
tracker testing.ObjectTracker
35+
}
36+
37+
var _ client.Client = &fakeClient{}
38+
39+
// NewFakeClient creates a new fake client for testing.
40+
func NewFakeClient(initObjs ...runtime.Object) client.Client {
41+
tracker := testing.NewObjectTracker(scheme.Scheme, scheme.Codecs.UniversalDecoder())
42+
for _, obj := range initObjs {
43+
err := tracker.Add(obj)
44+
if err != nil {
45+
log.Fatalf("failed to add object: %#v, error: %v", obj, err)
46+
return nil
47+
}
48+
}
49+
return &fakeClient{
50+
tracker: tracker,
51+
}
52+
}
53+
54+
func (c *fakeClient) Get(ctx context.Context, key client.ObjectKey, obj runtime.Object) error {
55+
gvr := getGVRFromObject(obj)
56+
o, err := c.tracker.Get(gvr, key.Namespace, key.Name)
57+
if err != nil {
58+
return err
59+
}
60+
j, err := json.Marshal(o)
61+
if err != nil {
62+
return err
63+
}
64+
decoder := scheme.Codecs.UniversalDeserializer()
65+
_, _, err = decoder.Decode(j, nil, obj)
66+
return err
67+
}
68+
69+
func (c *fakeClient) List(ctx context.Context, opts *client.ListOptions, list runtime.Object) error {
70+
gvk := opts.Raw.TypeMeta.GroupVersionKind()
71+
gvr, _ := meta.UnsafeGuessKindToResource(gvk)
72+
o, err := c.tracker.List(gvr, gvk, opts.Namespace)
73+
if err != nil {
74+
return err
75+
}
76+
j, err := json.Marshal(o)
77+
if err != nil {
78+
return err
79+
}
80+
decoder := scheme.Codecs.UniversalDeserializer()
81+
_, _, err = decoder.Decode(j, nil, list)
82+
return err
83+
}
84+
85+
func (c *fakeClient) Create(ctx context.Context, obj runtime.Object) error {
86+
gvr := getGVRFromObject(obj)
87+
accessor, err := meta.Accessor(obj)
88+
if err != nil {
89+
return err
90+
}
91+
return c.tracker.Create(gvr, obj, accessor.GetNamespace())
92+
}
93+
94+
func (c *fakeClient) Delete(ctx context.Context, obj runtime.Object) error {
95+
gvr := getGVRFromObject(obj)
96+
accessor, err := meta.Accessor(obj)
97+
if err != nil {
98+
return err
99+
}
100+
return c.tracker.Delete(gvr, accessor.GetNamespace(), accessor.GetName())
101+
}
102+
103+
func (c *fakeClient) Update(ctx context.Context, obj runtime.Object) error {
104+
gvr := getGVRFromObject(obj)
105+
accessor, err := meta.Accessor(obj)
106+
if err != nil {
107+
return err
108+
}
109+
return c.tracker.Update(gvr, obj, accessor.GetNamespace())
110+
}
111+
112+
func getGVRFromObject(obj runtime.Object) schema.GroupVersionResource {
113+
gvk := obj.GetObjectKind().GroupVersionKind()
114+
gvr, _ := meta.UnsafeGuessKindToResource(gvk)
115+
return gvr
116+
}

0 commit comments

Comments
 (0)