首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fabric8 customResourceDefinitions试验

Fabric8 customResourceDefinitions试验
EN

Stack Overflow用户
提问于 2021-11-03 19:38:11
回答 1查看 549关注 0票数 0

我正在进行Fabric8单元测试,现在我正在尝试创建一个针对KubernetesServer的CRD。

代码语言:javascript
复制
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;

public class TestCertManagerService {

  @Rule
  public KubernetesServer server = new KubernetesServer();


  @Test
  @DisplayName("Should list all CronTab custom resources")
  public void testCronTabCrd() throws IOException {
    // Given
    //server.expect().get().withPath("/apis/stable.example.com/v1/namespaces/default/crontabs").andReturn(HttpURLConnection.HTTP_OK, ?????).once();
    KubernetesClient client = server.getClient();


    CustomResourceDefinition cronTabCrd = client.apiextensions().v1().customResourceDefinitions()
        .load(new BufferedInputStream(new FileInputStream("src/test/resources/crontab-crd.yml")))
        .get();
    client.apiextensions().v1().customResourceDefinitions().create(cronTabCrd);

  }
}

当我运行它时,我得到了以下错误

代码语言:javascript
复制
TestCertManagerService > testCronTabCrd FAILED
    io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: GET at: https://localhost:60690/apis/apiextensions.k8s.io/v1/customresourcedefinitions.
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:694)
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:673)
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.assertResponseCode(OperationSupport.java:626)
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:566)
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:527)
        at app//io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:510)
        at app//io.fabric8.kubernetes.client.dsl.base.BaseOperation.listRequestHelper(BaseOperation.java:136)
        at app//io.fabric8.kubernetes.client.dsl.base.BaseOperation.list(BaseOperation.java:505)
        at app//io.fabric8.kubernetes.client.dsl.base.BaseOperation.list(BaseOperation.java:494)
        at app//io.fabric8.kubernetes.client.dsl.base.BaseOperation.list(BaseOperation.java:87)
        at app//com.ibm.si.qradar.cp4s.service.certmanager.TestCertManagerService.testCronTabCrd(TestCertManagerService.java:94)

我有几个问题:(1)在本例中,我使用的是v1()接口,有时我看到示例代码使用v1beta1(),是什么决定了这个版本?顺便说一下,我正在使用Kubernetes-客户端库5.9.0

(2)在我的代码中,我注释掉了这一行

代码语言:javascript
复制
server.expect().get().withPath("/apis/stable.example.com/v1/namespaces/default/crontabs").andReturn(HttpURLConnection.HTTP_OK, ?????).once();

这句话是为了什么?在我的例子中,我想加载一个CRD,然后创建一个CR,什么是“?”在声明里?

  1. 对堆栈跟踪有什么想法吗?怎么修呢?

我对此表示感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 08:36:48

从您共享的代码来看,您似乎在使用Fabric8 Kubernetes Mock Server的期望值模式。期望模式要求用户设置REST预期。因此,下面显示的代码从Mock Server的角度设置了一些期望。

代码语言:javascript
复制
// Given
server.expect().get()
      .withPath("/apis/stable.example.com/v1/namespaces/default/crontabs")
      .andReturn(HttpURLConnection.HTTP_OK, getCronTabList())
      .once();

以下是所设定的期望:

  1. 模拟服务器将被请求一个GET请求在这个网址:/apis/stable.example.com/v1/namespaces/default/crontabs。从URL中,我们可以期待stable.example.com下的资源以v1版本、default命名空间和crontabs作为复数。
  2. 当该URL被击中时,您还将在andReturn()方法中定义响应代码和响应体。第一个参数是响应代码(本例中是200),第二个参数是响应体( CronTab的一个列表对象,它将被模拟服务器序列化并作为响应发送)。
  3. 如果由Mock Server创建的.once()不止一次请求此端点,则只访问KubernetesClient;测试将失败。如果您想不止一次地访问端点,可以使用.times(..)方法。

但是在您的测试中,我看到您正在从YAML加载一个CustomResourceDefinition并创建它,这似乎不符合您先前设定的期望。如果您正在编写关于创建CustomResourceDefinition的测试,它应该如下所示:

代码语言:javascript
复制
@Test
@DisplayName("Should Create CronTab CRD")
void testCronTabCrd() throws IOException {
  // Given
  KubernetesClient client = server.getClient();
  CustomResourceDefinition cronTabCrd = client.apiextensions().v1()
    .customResourceDefinitions()
    .load(new BufferedInputStream(new FileInputStream("src/test/resources/crontab-crd.yml")))
    .get();
  server.expect().post()
    .withPath("/apis/apiextensions.k8s.io/v1/customresourcedefinitions")
    .andReturn(HttpURLConnection.HTTP_OK, cronTabCrd)
    .once();

  // When
  CustomResourceDefinition createdCronTabCrd = client.apiextensions().v1()
    .customResourceDefinitions()
    .create(cronTabCrd);

  // Then
  assertNotNull(createdCronTabCrd);
}

Bdw,如果你不喜欢设定休息的期望。Fabric8 Kubernetes Mock Server也有一个CRUD模式,它模拟真正的Kubernetes APIServer。您可以这样启用它:

代码语言:javascript
复制
@Rule
public KubernetesServer server = new KubernetesServer(true, true);

然后像这样在测试中使用它:

代码语言:javascript
复制
@Test
@DisplayName("Should Create CronTab CRD")
void testCronTabCrd() throws IOException {
  // Given
  KubernetesClient client = server.getClient();
  CustomResourceDefinition cronTabCrd = client.apiextensions().v1()
    .customResourceDefinitions()
    .load(new BufferedInputStream(new FileInputStream("src/test/resources/crontab-crd.yml")))
    .get();

  // When
  CustomResourceDefinition createdCronTabCrd = client.apiextensions().v1()
    .customResourceDefinitions()
    .create(cronTabCrd);

  // Then
  assertNotNull(createdCronTabCrd);
}

我在演示存储库中添加了CustomResourceLoadAndCreateTestCustomResourceLoadAndCreateCrudTest测试:https://github.com/r0haaaan/kubernetes-mockserver-demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69830821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档