无法在kubebuilder的客户端中获取K8S资源。

时间:2018-12-31 04:50:38

标签: unit-testing kubernetes kubebuilder

我正在为使用Kubebuilder创建的示例Kubernetes CRD和控制器编写一些单元测试。控制器中的主要代码创建Kubernetes资源(其中包含名称空间和ResourceQuota)。在我的单元测试中,我想验证控制器是否确实创建了这些。我使用使用默认<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="map-poi-nav"> <ul class="map-poi-nav-dropdown"> //Parent #1 <li class="sub-menu-link" id="sub-menu-link-1"> <a href="#"> <img src="https://svgshare.com/i/ADc.svg"> Activities </a> </li> <li class="sub-menu"> <ul class="sub-menu-list" id="sub-menu-list-1"> <li><a><span>•</span>Golden State Park</a></li> <li><a><span>•</span>Sunrise Oaks City Park</a></li> </ul> </li> </ul> <ul class="map-poi-nav-dropdown"> //Parent #2 <li class="sub-menu-link" id="sub-menu-link-2"> <a href="#"> <img src="https://svgshare.com/i/ADc.svg"> Dining </a> </li> <li class="sub-menu"> <ul class="sub-menu-list" id="sub-menu-list-2"> <li><a><span>•</span>The Loft Grill</a></li> <li><a><span>•</span>Fish Grill & Bar</a></li> </ul> </li> </ul> </div>对象创建的client.Client对象。

sigs.k8s.io/controller-runtime/pkg/manager

我知道主要代码可以正常工作,因为我在真实的实时环境中对其进行了测试。我看到从单元测试中调用了主代码。但是,上面的代码在单元测试中不起作用。即对Get()的调用确实返回了我期望的ResourceQuota。我也尝试过List()API,但是也不会返回任何东西。也没有错误。只是一个空洞的反应。

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

1 个答案:

答案 0 :(得分:0)

将其发布以防其他人发现它有用。如果要访问其他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)