diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index d1e608ee9f..3846160273 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -87,5 +87,9 @@ io.fabric8 openshift-server-mock + + io.fabric8 + kube-api-test + diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java index 7ad4fa9d8b..de75862c55 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java @@ -14,9 +14,11 @@ package org.eclipse.jkube.kit.resource.helm; import com.marcnuri.helm.Helm; +import io.fabric8.kubeapitest.junit.EnableKubeAPIServer; +import io.fabric8.kubeapitest.junit.KubeConfig; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.openshift.api.model.Template; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; @@ -24,9 +26,12 @@ import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.Serialization; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.io.TempDir; import java.io.File; @@ -36,26 +41,34 @@ import java.util.Arrays; import java.util.Collections; import java.util.Objects; +import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @DisplayName("HelmService.install") -@EnableKubernetesMockClient(crud = true) +@EnableKubeAPIServer +@EnabledForJreRange(min = JRE.JAVA_11) class HelmServiceInstallIT { + + @KubeConfig + static String kubeConfigYaml; @TempDir private Path tempDir; + private KubernetesClient kubernetesClient; private HelmConfig helmConfig; private HelmService helmService; private KitLogger kitLogger; - private KubernetesClient kubernetesClient; - private KubernetesMockServer server; @BeforeEach void setUp() throws URISyntaxException, IOException { + kubernetesClient = new KubernetesClientBuilder().withConfig(Config.fromKubeconfig(kubeConfigYaml)).build(); + kubernetesClient.apps().deployments().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.pods().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.configMaps().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.secrets().withTimeout(1, TimeUnit.SECONDS).delete(); kitLogger = spy(new KitLogger.SilentLogger()); Template helmParameterTemplates = Serialization.unmarshal(HelmServiceInstallIT.class.getResource("/it/sources/global-template.yml"), Template.class); Path outputDir = tempDir.resolve("output"); @@ -75,8 +88,6 @@ void setUp() throws URISyntaxException, IOException { HelmParameter.builder().name("annotation.from.config.dotted").value("{{ .Chart.Name }}").build(), HelmParameter.builder().name("deployment.replicas").value(1).build())) .build(); - // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed - prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); helmService = new HelmService(JKubeConfiguration.builder() .project(JavaProject.builder() .buildDirectory(tempDir.resolve("target").toFile()) @@ -85,6 +96,11 @@ void setUp() throws URISyntaxException, IOException { .build(), new ResourceServiceConfig(), kitLogger); } + @AfterEach + void tearDown() { + kubernetesClient.close(); + } + @Test @DisplayName("when valid chart provided, then log installation details after install") void validChart_thenLogInstalledChartDetails() throws IOException { diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTestIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTestIT.java index 05caae4b32..1c0f889842 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTestIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTestIT.java @@ -14,18 +14,13 @@ package org.eclipse.jkube.kit.resource.helm; import com.marcnuri.helm.Helm; +import io.fabric8.kubeapitest.junit.EnableKubeAPIServer; +import io.fabric8.kubeapitest.junit.KubeConfig; import io.fabric8.kubernetes.api.model.PodBuilder; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMixedDispatcher; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; -import io.fabric8.mockwebserver.Context; -import io.fabric8.mockwebserver.ServerRequest; -import io.fabric8.mockwebserver.ServerResponse; -import okhttp3.mockwebserver.MockWebServer; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -37,30 +32,31 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.io.TempDir; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import java.util.Objects; -import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; @DisplayName("HelmService.test") +@EnableKubeAPIServer +@EnabledForJreRange(min = JRE.JAVA_11) class HelmServiceTestIT { + + @KubeConfig + static String kubeConfigYaml; @TempDir private Path tempDir; - private KubernetesMockServer server; private KubernetesClient kubernetesClient; private ByteArrayOutputStream logOutput; private HelmService helmService; @@ -68,12 +64,11 @@ class HelmServiceTestIT { @BeforeEach void setUp() throws Exception { - final Map> responses = new HashMap<>(); - server = new KubernetesMockServer(new Context(), new MockWebServer(), responses, new KubernetesMixedDispatcher(responses), true); - server.init(); - // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed - prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); - kubernetesClient = server.createClient(); + kubernetesClient = new KubernetesClientBuilder().withConfig(Config.fromKubeconfig(kubeConfigYaml)).build(); + kubernetesClient.apps().deployments().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.pods().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.configMaps().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.secrets().withTimeout(1, TimeUnit.SECONDS).delete(); logOutput = new ByteArrayOutputStream(); Helm.create().withDir(tempDir).withName("test-project").call(); Path helmChartOutputDir = tempDir.resolve("output").resolve("jkube").resolve("helm"); @@ -99,29 +94,14 @@ void setUp() throws Exception { @AfterEach void stopKubernetesServer() { kubernetesClient.close(); - server.destroy(); } @Nested class WithChartInstalled { @BeforeEach - void setUp() throws Exception { - // OpenAPI validation endpoints required by helm test - server.expect().get().withPath("/openapi/v3?timeout=32s") - .andReturn(200, IOUtils.toString(Objects.requireNonNull(HelmServiceTestIT.class.getResourceAsStream("/it/helm-service-test/kubernetes-openapi-v3-schema.json")), StandardCharsets.UTF_8)) - .always(); - server.expect().get().withPath("/openapi/v3/api/v1?timeout=32s") - .andReturn(200, IOUtils.toString(Objects.requireNonNull(HelmServiceTestIT.class.getResourceAsStream("/it/helm-service-test/kubernetes-openapi-v3-api-v1-schema-pod.json")), StandardCharsets.UTF_8)) - .always(); - // Chart is installed + void installChart() { helmService.install(helmConfig); - Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.test-project.v1").get(); - server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dtest-project%2Cowner%3Dhelm") - .andReturn(200, new SecretListBuilder() - .addToItems(secret) - .build()) - .once(); } @Test diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java index 520fd8357c..1cb5341b7c 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java @@ -13,11 +13,11 @@ */ package org.eclipse.jkube.kit.resource.helm; -import io.fabric8.kubernetes.api.model.Secret; -import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubeapitest.junit.EnableKubeAPIServer; +import io.fabric8.kubeapitest.junit.KubeConfig; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.openshift.api.model.Template; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; @@ -25,9 +25,12 @@ import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.Serialization; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.io.TempDir; import java.io.File; @@ -37,26 +40,34 @@ import java.util.Arrays; import java.util.Collections; import java.util.Objects; +import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @DisplayName("HelmService.uninstall") -@EnableKubernetesMockClient(crud = true) +@EnableKubeAPIServer +@EnabledForJreRange(min = JRE.JAVA_11) class HelmServiceUninstallIT { + + @KubeConfig + static String kubeConfigYaml; @TempDir private Path tempDir; + private KubernetesClient kubernetesClient; private HelmConfig helmConfig; private HelmService helmService; private KitLogger kitLogger; - private KubernetesClient kubernetesClient; - private KubernetesMockServer server; @BeforeEach void setUp() throws URISyntaxException, IOException { + kubernetesClient = new KubernetesClientBuilder().withConfig(Config.fromKubeconfig(kubeConfigYaml)).build(); + kubernetesClient.apps().deployments().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.pods().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.configMaps().withTimeout(1, TimeUnit.SECONDS).delete(); + kubernetesClient.secrets().withTimeout(1, TimeUnit.SECONDS).delete(); kitLogger = spy(new KitLogger.SilentLogger()); Template helmParameterTemplates = Serialization.unmarshal(HelmServiceUninstallIT.class.getResource("/it/sources/global-template.yml"), Template.class); Path outputDir = tempDir.resolve("output"); @@ -76,8 +87,6 @@ void setUp() throws URISyntaxException, IOException { HelmParameter.builder().name("annotation.from.config.dotted").value("{{ .Chart.Name }}").build(), HelmParameter.builder().name("deployment.replicas").value(1).build())) .build(); - // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed - prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); helmService = new HelmService(JKubeConfiguration.builder() .project(JavaProject.builder() .buildDirectory(tempDir.resolve("target").toFile()) @@ -86,18 +95,17 @@ void setUp() throws URISyntaxException, IOException { .build(), new ResourceServiceConfig(), kitLogger); } + @AfterEach + void tearDown() { + kubernetesClient.close(); + } + @Test @DisplayName("uninstall invoked, then log uninstallation details after uninstall") void uninstall_thenLogUninstalledChartDetails() throws IOException { // Given helmService.generateHelmCharts(helmConfig); helmService.install(helmConfig); - Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.test-project.v1").get(); - server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dtest-project%2Cowner%3Dhelm") - .andReturn(200, new SecretListBuilder() - .addToItems(secret) - .build()) - .once(); // When helmService.uninstall(helmConfig); // Then diff --git a/jkube-kit/helm/src/test/resources/it/expected/kubernetes/templates/kubernetes.yaml b/jkube-kit/helm/src/test/resources/it/expected/kubernetes/templates/kubernetes.yaml index e110adca10..67bed1ce14 100644 --- a/jkube-kit/helm/src/test/resources/it/expected/kubernetes/templates/kubernetes.yaml +++ b/jkube-kit/helm/src/test/resources/it/expected/kubernetes/templates/kubernetes.yaml @@ -35,7 +35,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 name: test spec: ports: @@ -46,7 +46,7 @@ items: selector: app: test provider: jkube - version: 1337 + version: v1337 type: NodePort - apiVersion: apps/v1 kind: Deployment @@ -60,16 +60,16 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 name: test spec: replicas: {{ .Values.deployment.replicas }} revisionHistoryLimit: 2 selector: matchLabels: - app: spring-boot-yaml + app: test provider: jkube - group: org.eclipse.jkube.quickstarts.maven + version: v1337 template: metadata: annotations: @@ -79,7 +79,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 spec: containers: - env: diff --git a/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/openshift.yaml b/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/openshift.yaml index ea9641ca3a..e7da518c2c 100644 --- a/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/openshift.yaml +++ b/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/openshift.yaml @@ -30,7 +30,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 helm-variable: {{ required "A valid .Values.GLOBAL_TEMPLATE_ENV_VAR entry required!" .Values.GLOBAL_TEMPLATE_ENV_VAR }} escape-test: "{{"{{"}} {{"}}"}} should be escaped to prevent helm errors" name: test diff --git a/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/test-pod.yaml b/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/test-pod.yaml index 2632abd69c..90a49a9011 100644 --- a/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/test-pod.yaml +++ b/jkube-kit/helm/src/test/resources/it/expected/openshift/templates/test-pod.yaml @@ -19,7 +19,7 @@ metadata: labels: app: test provider: jkube - version: "1337" + version: "v1337" helm-variable: {{ required "A valid .Values.GLOBAL_TEMPLATE_ENV_VAR entry required!" .Values.GLOBAL_TEMPLATE_ENV_VAR }} name: test spec: diff --git a/jkube-kit/helm/src/test/resources/it/sources/kubernetes/kubernetes.yml b/jkube-kit/helm/src/test/resources/it/sources/kubernetes/kubernetes.yml index 54d8b1a139..522508caa5 100644 --- a/jkube-kit/helm/src/test/resources/it/sources/kubernetes/kubernetes.yml +++ b/jkube-kit/helm/src/test/resources/it/sources/kubernetes/kubernetes.yml @@ -35,7 +35,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 name: test spec: ports: @@ -46,7 +46,7 @@ items: selector: app: test provider: jkube - version: 1337 + version: v1337 type: NodePort - apiVersion: apps/v1 kind: Deployment @@ -60,16 +60,16 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 name: test spec: replicas: ${deployment.replicas} revisionHistoryLimit: 2 selector: matchLabels: - app: spring-boot-yaml + app: test provider: jkube - group: org.eclipse.jkube.quickstarts.maven + version: v1337 template: metadata: annotations: @@ -79,7 +79,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 spec: containers: - env: diff --git a/jkube-kit/helm/src/test/resources/it/sources/openshift/openshift.yml b/jkube-kit/helm/src/test/resources/it/sources/openshift/openshift.yml index cd9f8955e8..92719ee63e 100644 --- a/jkube-kit/helm/src/test/resources/it/sources/openshift/openshift.yml +++ b/jkube-kit/helm/src/test/resources/it/sources/openshift/openshift.yml @@ -30,7 +30,7 @@ items: labels: app: test provider: jkube - version: 1337 + version: v1337 helm-variable: ${GLOBAL_TEMPLATE_ENV_VAR} escape-test: "{{ }} should be escaped to prevent helm errors" name: test diff --git a/jkube-kit/helm/src/test/resources/it/sources/openshift/some-template.yml b/jkube-kit/helm/src/test/resources/it/sources/openshift/some-template.yml index 5a15584f14..f68f72ad23 100644 --- a/jkube-kit/helm/src/test/resources/it/sources/openshift/some-template.yml +++ b/jkube-kit/helm/src/test/resources/it/sources/openshift/some-template.yml @@ -18,7 +18,7 @@ metadata: labels: app: test provider: jkube - version: 1337 + version: v1337 name: test objects: - apiVersion: v1 @@ -27,7 +27,7 @@ objects: labels: app: test provider: jkube - version: 1337 + version: v1337 helm-variable: ${GLOBAL_TEMPLATE_ENV_VAR} name: test spec: @@ -57,4 +57,4 @@ objects: parameters: - description: Parameter to replace environment variable value name: SAMPLE_ENV_VAR - value: This is a sample \ No newline at end of file + value: This is a sample diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 553ac603a3..97e665745b 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -778,6 +778,12 @@ + + io.fabric8 + kube-api-test + ${version.kubernetes-client} + test + org.asciidoctor