Skip to content

Commit

Permalink
test(helm): updated tests to use kube-api-test
Browse files Browse the repository at this point in the history
Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
manusa committed Jan 13, 2025
1 parent 64cfee1 commit f90af77
Show file tree
Hide file tree
Showing 11 changed files with 93 additions and 79 deletions.
4 changes: 4 additions & 0 deletions jkube-kit/helm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,9 @@
<groupId>io.fabric8</groupId>
<artifactId>openshift-server-mock</artifactId>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kube-api-test</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,24 @@
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;
import org.eclipse.jkube.kit.common.KitLogger;
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;
Expand All @@ -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");
Expand All @@ -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())
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -37,43 +32,43 @@
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;
private HelmConfig helmConfig;

@BeforeEach
void setUp() throws Exception {
final Map<ServerRequest, Queue<ServerResponse>> 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");
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,24 @@
*/
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;
import org.eclipse.jkube.kit.common.KitLogger;
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;
Expand All @@ -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");
Expand All @@ -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())
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ items:
labels:
app: test
provider: jkube
version: 1337
version: v1337
name: test
spec:
ports:
Expand All @@ -46,7 +46,7 @@ items:
selector:
app: test
provider: jkube
version: 1337
version: v1337
type: NodePort
- apiVersion: apps/v1
kind: Deployment
Expand All @@ -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:
Expand All @@ -79,7 +79,7 @@ items:
labels:
app: test
provider: jkube
version: 1337
version: v1337
spec:
containers:
- env:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading

0 comments on commit f90af77

Please sign in to comment.