Skip to content

Can not mock K8S api /version #23023

@synox

Description

@synox

Describe the bug

Cannot mock the /version api. I followed the guide https://quarkus.io/guides/kubernetes-client#testing.

Mocking /version works on 2.4.2.Final, but fails on 2.5.4.Final and 2.6.2.Final.

The following code should throw an exception when the version path is accessed, but it does not thrown an error for v2.5.4 or higher:

import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
import io.fabric8.kubernetes.client.VersionInfo;
import io.fabric8.kubernetes.client.server.mock.KubernetesServer;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.kubernetes.client.KubernetesTestServer;
import io.quarkus.test.kubernetes.client.WithKubernetesTestServer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.net.HttpURLConnection;


@QuarkusTest
@WithKubernetesTestServer(crud = false)
class K8sTest {

    @KubernetesTestServer
    KubernetesServer server;


    @Test
    public void fail() {
        server.expect().get().withPath("/version")
                .andReturn(HttpURLConnection.HTTP_INTERNAL_ERROR, "error")
                .always();

        System.out.println("http://" + server.getKubernetesMockServer().getHostName() + ":" + server.getKubernetesMockServer().getPort());

        NamespacedKubernetesClient client = server.getClient();
        Assertions.assertThrows(KubernetesClientException.class, () -> {

            VersionInfo response = client.getKubernetesVersion();
            System.out.println(response);
        });
    }
}

However the following code works as expected with Quarkus 2.4.2 (note there are some api changes).

import io.fabric8.kubernetes.client.KubernetesClientException;
import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
import io.fabric8.kubernetes.client.VersionInfo;
import io.fabric8.kubernetes.client.server.mock.KubernetesServer;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.kubernetes.client.KubernetesTestServer;
import io.quarkus.test.kubernetes.client.WithKubernetesTestServer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.net.HttpURLConnection;


@QuarkusTest
@WithKubernetesTestServer(crud = false)
class K8sTest {

    @KubernetesTestServer
    KubernetesServer server;


    @Test
    public void fail() {
        server.expect().get().withPath("/version")
                .andReturn(HttpURLConnection.HTTP_INTERNAL_ERROR, "error")
                .always();

        System.out.println("http://" + server.getMockServer().getHostName() + ":" + server.getMockServer().getPort());

        NamespacedKubernetesClient client = server.getClient();
        Assertions.assertThrows(KubernetesClientException.class, () -> {

            VersionInfo response = client.getVersion();
            System.out.println(response);
        });
    }
}

Expected behavior

Should allow to mock /version api.

Actual behavior

Mock of /version does not have any impact.

How to Reproduce?

See code above.

Output of uname -a or ver

Darwin 21.2.0 Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:41 PST 2021; root:xnu-8019.61.5~1/RELEASE_ARM64_T6000 arm64

Output of java -version

openjdk version "17.0.1" 2021-10-19

GraalVM version (if different from Java)

not relevant

Quarkus version or git rev

2.6.2

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions