Quarkus kubernetesMockServer для инициализации приложения - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над приложением Quarkus для работы в качестве оператора в кластере OpenShift / Kubernetes. При написании тестов с использованием kubernetesMockServer он работает нормально для вызовов REST для разработанного приложения, но когда код выполняется внутри блока инициализации, он не работает, в журнале я вижу, что фиктивный сервер отвечает с ошибкой 404:

2020-02-17 11:04:12,148 INFO  [okh.moc.MockWebServer] (MockWebServer /127.0.0.1:53048) MockWebServer[57577] received request: GET /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions HTTP/1.1 and responded: HTTP/1.1 404 Client Error

На TestCode у меня есть:

@QuarkusTestResource(KubernetesMockServerTestResource.class)
@QuarkusTest
class TestAIRController {

    @MockServer
    KubernetesMockServer mockServer;

    private CustomResourceDefinition crd;
    private CustomResourceDefinitionList crdlist;

    @BeforeEach
    public void before() {
        crd = new CustomResourceDefinitionBuilder()
            .withApiVersion("apiextensions.k8s.io/v1beta1")
            .withNewMetadata().withName("types.openshift.example-cloud.com")
            .endMetadata()
            .withNewSpec()
            .withNewNames()
            .withKind("Type")
            .withPlural("types")
            .endNames()
            .withGroup("openshift.example-cloud.com")
            .withVersion("v1")
            .withScope("Namespaced")
            .endSpec()
            .build();
        crdlist = new CustomResourceDefinitionListBuilder().withItems(crd).build();
        mockServer.expect().get().withPath("/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions")
            .andReturn(200, crdlist)
            .always();
    }

    @Test
    void test() {
        RestAssured.when().get("/dummy").then().body("size()", Is.is(0));
    }

}

Пустой остаток использует тот же код для поиска в CRD, и фактически при запуске без класса, наблюдающего событие запуска, он работает нормально

@Path("/dummy")
public class Dummy {

    private static final Logger LOGGER =LoggerFactory.getLogger(Dummy.class); 

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response listCRDs(){
        KubernetesClient oc = new DefaultKubernetesClient();
        CustomResourceDefinition crd = oc.customResourceDefinitions()
                .list().getItems().stream()
                    .filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
                    .findFirst().get();
        LOGGER.info("CRD NAME is {}", crd.getMetadata().getName());
        return Response.ok(new ArrayList<String>()).build();
    }
}

Наконец, это исключение из

@ApplicationScoped
public class AIRWatcher {

    private static final Logger LOGGER = LoggerFactory.getLogger(AIRWatcher.class);

    void OnStart(@Observes StartupEvent ev) {
        KubernetesClient oc = new DefaultKubernetesClient();
        CustomResourceDefinition crd = oc.customResourceDefinitions()
                .list().getItems().stream()
                    .filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
                    .findFirst().get();
        LOGGER.info("Using {}", crd.getMetadata().getName());

    }

}

По какой-то причине фиктивный сервер все еще не инициализирован для события запуска, есть ли способ его решить?

1 Ответ

2 голосов
/ 17 февраля 2020

Проблема в том, что Mock Server настроен на ответ только непосредственно перед выполнением теста, в то время как этот код:

void OnStart(@Observes StartupEvent ev) {
        KubernetesClient oc = new DefaultKubernetesClient();
        CustomResourceDefinition crd = oc.customResourceDefinitions()
                .list().getItems().stream()
                    .filter( ob -> ob.getMetadata().getName().equals("types.openshift.example-cloud.com"))
                    .findFirst().get();
        LOGGER.info("Using {}", crd.getMetadata().getName());

    }

запускается, когда приложение действительно запускается (что раньше любого @BeforeEach работает).

Можете ли вы открыть вопрос о Quarkus Github? Это должно быть то, что мы предлагаем решение для

...