Невозможно получить ресурсы K8S в клиенте kubebuilder. Клиент для модульного теста
Я пишу несколько юнит-тестов для образца 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 ответ
Размещать это на тот случай, если другие найдут это полезным. Если вы хотите получить доступ к другим ресурсам K8S, вам нужно будет использовать стандартный clientSet
объект от клиента-go Kubernetes. Например, если вы хотите подтвердить, что определенное пространство имен называется 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)