Невозможно получить ресурсы K8S в клиенте kubebuilder. Клиент для модульного теста - PullRequest
0 голосов
/ 31 декабря 2018

Я пишу несколько юнит-тестов для образца CRD и контроллера Kubernetes, созданного с помощью Kubebuilder.Основной код в контроллере создает ресурсы Kubernetes (пространство имен и ResourceQuota внутри него).В моих юнит-тестах я хочу убедиться, что контроллер действительно их создал.Я использую объект client.Client, созданный с использованием объекта sigs.k8s.io/controller-runtime/pkg/manager по умолчанию.

mgr, _ := manager.New(cfg, manager.Options{})
cl := mgr.GetClient()
rq := &corev1.ResourceQuota{}
err = cl.Get(ctx, types.NamespacedName{Name: "my-quota", Namespace: 
        "my-namespace"}, rq)

Я знаю, что основной код работает нормально, потому что я тестировал его в реальной, живой среде.Я вижу, что основной код вызывается из модульных тестов.Однако приведенный выше код в модульных тестах не работает;т.е. вызов Get () возвращает ResourceQuota, которую я ожидаю.Я также попробовал API List (), но это тоже ничего не возвращает.Там также нет ошибки.Просто пустой ответ.

Нужно ли делать что-то особенное / другое, чтобы заставить плоскость управления K8S в Kubebuilder запускать юнит-тесты?

1 Ответ

0 голосов
/ 02 января 2019

Размещение сообщения на случай, если другие найдут его полезным.Если вы хотите получить доступ к другим ресурсам K8S, вам нужно будет использовать стандартный объект clientSet из client-go Кубернетеса.Например, если вы хотите подтвердить, что существует определенное пространство имен с именем targetNamespace:

mgr, _ := manager.New(cfg, manager.Options{})
generatedClient := kubernetes.NewForConfigOrDie(mgr.GetConfig())

nsFound := false
namespaces := generatedClient.CoreV1().Namespaces()
namespaceList, _ := namespaces.List(metav1.ListOptions{})
for _, ns := range namespaceList.Items {
    if ns.Name == targetNamespace {
        nsFound = true
        break
    }
}
g.Expect(nsFound).To(gomega.BeTrue())
log.Printf("Namespace %s verified", targetNamespace)
...