【问题标题】:Unable to get K8S resources in kubebuilder's client.Client for unit test无法在kubebuilder的client.Client中获取K8S资源进行单元测试
【发布时间】:2019-01-02 12:55:33
【问题描述】:

我正在为使用 Kubebuilder 创建的示例 Kubernetes CRD 和控制器编写一些单元测试。控制器中的主要代码创建 Kubernetes 资源(命名空间和其中的 ResourceQuota)。在我的单元测试中,我想验证控制器是否实际创建了这些。我使用使用默认 sigs.k8s.io/controller-runtime/pkg/manager 对象创建的 client.Client 对象。

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。我也尝试过 List() api,但这也没有返回任何东西。也没有错误。只是一个空洞的回应。

我是否必须做一些特殊/不同的事情才能让 Kubebuilder 中的 K8S 控制平面运行单元测试?

【问题讨论】:

  • 如果您使用的是标准生成的测试代码,您需要检查协调请求通道,否则控制器会一直处于阻塞状态。
  • 我没有使用 kubebuilder 生成的默认 TestReconcile 函数。我的测试(上面的示例代码)在一个单独的文件中。

标签: unit-testing kubernetes kubebuilder


【解决方案1】:

发布此内容以防其他人发现它有用。如果你想访问其他 K8S 资源,你需要使用来自 Kubernetes 的 client-go 的标准 clientSet 对象。例如如果您想确认名为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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2023-03-22
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多