fake k8s client
在服务代码中,与k8s交互我们使用client,这个client中含有对接k8s的kubeconfig配置,并且具有需要跟k8s apiserver交互的方法接口。 在controller-runtime中,有一个client fake;用法见下面示例
import (
"context"
"testing"
cachev1alpha1 "github.com/example-inc/memcached-operator/pkg/apis/cache/v1alpha1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)
func TestMemcachedController(t *testing.T) {
...
// A Memcached object with metadata and spec.
memcached := &cachev1alpha1.Memcached{
ObjectMeta: metav1.ObjectMeta{
Name: "memcached",
Namespace: "memcached-operator",
Labels: map[string]string{
"label-key": "label-value",
},
},
}
// Objects to track in the fake client.
objs := []runtime.Object{memcached}
// Create a fake client to mock API calls.
cl := fake.NewFakeClient(objs...)
// List Memcached objects filtering by labels
opt := client.MatchingLabels(map[string]string{"label-key": "label-value"})
memcachedList := &cachev1alpha1.MemcachedList{}
err := cl.List(context.TODO(), memcachedList, opt)
if err != nil {
t.Fatalf("list memcached: (%v)", err)
}
...
}
fake k8s build-in API
如果服务需要访问k8s的既有API接口,我们一般使用ClientSet,这是一个访问各种类型资源的客户端的集合。由库:k8s.io/client-go/kubernetes 所定义。 在使用时,代码实现如下:
type Client struct {
ClientSet kubernetes.Interface // 这里需要使用interface,而不是直接就是 kubernetes.ClientSet 这个具体的实现。否则fake clientSet不方便注入
}
func NewBuildinClient()(*Client, error){
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return &Client{
Clientset: clientset,
}, nil
}
在fake 这个Clientset时,
import "k8s.io/client-go/kubernentes/fake"
func TestSample(t *testing.T) {
ApplyFunc(NewBuildClient, func()(*Client, error){
return &Client{
Clientset: fake.NewSimpleClientset(),
}, nil
})
}