我正在进行Fabric8单元测试,现在我正在尝试创建一个针对KubernetesServer的CRD。
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);
}
}当我运行它时,我得到了以下错误
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)在我的代码中,我注释掉了这一行
server.expect().get().withPath("/apis/stable.example.com/v1/namespaces/default/crontabs").andReturn(HttpURLConnection.HTTP_OK, ?????).once();这句话是为了什么?在我的例子中,我想加载一个CRD,然后创建一个CR,什么是“?”在声明里?
我对此表示感谢。
发布于 2021-11-05 08:36:48
从您共享的代码来看,您似乎在使用Fabric8 Kubernetes Mock Server的期望值模式。期望模式要求用户设置REST预期。因此,下面显示的代码从Mock Server的角度设置了一些期望。
// Given
server.expect().get()
.withPath("/apis/stable.example.com/v1/namespaces/default/crontabs")
.andReturn(HttpURLConnection.HTTP_OK, getCronTabList())
.once();以下是所设定的期望:
GET请求在这个网址:/apis/stable.example.com/v1/namespaces/default/crontabs。从URL中,我们可以期待stable.example.com下的资源以v1版本、default命名空间和crontabs作为复数。andReturn()方法中定义响应代码和响应体。第一个参数是响应代码(本例中是200),第二个参数是响应体( CronTab的一个列表对象,它将被模拟服务器序列化并作为响应发送)。.once()不止一次请求此端点,则只访问KubernetesClient;测试将失败。如果您想不止一次地访问端点,可以使用.times(..)方法。但是在您的测试中,我看到您正在从YAML加载一个CustomResourceDefinition并创建它,这似乎不符合您先前设定的期望。如果您正在编写关于创建CustomResourceDefinition的测试,它应该如下所示:
@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。您可以这样启用它:
@Rule
public KubernetesServer server = new KubernetesServer(true, true);然后像这样在测试中使用它:
@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);
}我在演示存储库中添加了CustomResourceLoadAndCreateTest和CustomResourceLoadAndCreateCrudTest测试:https://github.com/r0haaaan/kubernetes-mockserver-demo
https://stackoverflow.com/questions/69830821
复制相似问题