Модульное тестирование клиентской функции, которая выполняет аутентификацию и возвращает клиентский набор k8s

avatar
pkaramol
8 августа 2021 в 23:19
389
1
0

Я пишу простейший возможный fxn, используя client-go, который просто выполняет аутентификацию в кластере и возвращает указатель на объект kubernetes.Clientset

// getInClusterAuth performs in cluster authentication and returns the clientset
func getInClusterAuth() (*kubernetes.Clientset, error) {
    // creates the in-cluster config
    config, err := rest.InClusterConfig()
    if err != nil {
        return nil, err
    }
    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }

    return clientset, nil
}

Поскольку это что-то такое, что оно не только запускается во внешней системе (API-сервер k8s), но также предполагается, что оно работает изнутри Pod после развертывания, каков подходящий способ юнит- тестировать?

Может быть приемлемой практикой покрывать случай в e2e или интеграционных тестах?

Источник

Ответы (1)

avatar
Miffa Young
9 августа 2021 в 00:26
2

вы можете использовать k8s.io/client-go/kubernetes/fake.NewSimpleClientset для имитации clientSet в вашем модульном тесте.


import (
        "context"
        "testing"

        v1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/kubernetes/fake"
)

func TestHelloWorld(t *testing.T) {
        clientset := fake.NewSimpleClientset(&v1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                        Name:        "influxdb-v2",
                        Namespace:   "default",
                        Annotations: map[string]string{},
                },
        }, &v1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                        Name:        "chronograf",
                        Namespace:   "default",
                        Annotations: map[string]string{},
                },
        })

        _, err := clientset.CoreV1().Pods(v1.NamespaceDefault).Get(context.Background(), "influxdb-v2", metav1.GetOptions{})
        if err != nil {
                if errors.IsNotFound(err) {
                        t.Error(err)
                } else {
                        t.Errorf("failed to get service from apiserver: %s", err)
                }
        }

        p := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "helloooooo"}}
        _, err = clientset.CoreV1().Pods(v1.NamespaceDefault).Create(context.Background(), p, metav1.CreateOptions{})
        if err != nil {
            t.Fatalf("error injecting pod add: %v", err)
        }
}

это образец: случай поддельного клиента

pkaramol
9 августа 2021 в 15:22
0

Я думаю, что позже я смогу смоделировать запросы, сделанные к этому clientset, однако я не могу (в приведенном выше примере) смоделировать/модульное тестирование самого создания клиента, верно?