Skip to content

Commit 40a6af8

Browse files
authored
feat: improvements on e2e tests (#51)
1 parent 80525bf commit 40a6af8

File tree

22 files changed

+186
-222
lines changed

22 files changed

+186
-222
lines changed

Diff for: samples/commons/pom.xml

+31-4
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,42 @@
3030
<groupId>io.fabric8</groupId>
3131
<artifactId>crd-generator-apt</artifactId>
3232
</dependency>
33+
<dependency>
34+
<groupId>org.assertj</groupId>
35+
<artifactId>assertj-core</artifactId>
36+
<scope>test</scope>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.awaitility</groupId>
40+
<artifactId>awaitility</artifactId>
41+
<scope>test</scope>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.junit.jupiter</groupId>
45+
<artifactId>junit-jupiter-engine</artifactId>
46+
<scope>test</scope>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.junit.jupiter</groupId>
50+
<artifactId>junit-jupiter-api</artifactId>
51+
52+
<scope>test</scope>
53+
</dependency>
3354
</dependencies>
3455

3556
<build>
3657
<plugins>
3758
<plugin>
38-
<groupId>org.springframework.boot</groupId>
39-
<artifactId>spring-boot-maven-plugin</artifactId>
40-
<version>${spring-boot-dependencies.version}</version>
41-
</plugin>
59+
<groupId>org.apache.maven.plugins</groupId>
60+
<artifactId>maven-jar-plugin</artifactId>
61+
<executions>
62+
<execution>
63+
<goals>
64+
<goal>test-jar</goal>
65+
</goals>
66+
</execution>
67+
</executions>
68+
</plugin>
4269
</plugins>
4370
</build>
4471

Diff for: samples/commons/src/main/java/io/javaoperatorsdk/webhook/sample/commons/ConversionControllers.java

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99

1010
public class ConversionControllers {
1111

12+
public static final String CONVERSION_PATH = "convert";
13+
public static final String ASYNC_CONVERSION_PATH = "async-convert";
14+
1215
public static ConversionController conversionController() {
1316
var controller = new ConversionController();
1417
controller.registerMapper(new V1Mapper());

Diff for: samples/commons/src/main/java/io/javaoperatorsdk/webhook/sample/commons/mapper/V1Mapper.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import io.javaoperatorsdk.webhook.conversion.Mapper;
44
import io.javaoperatorsdk.webhook.conversion.TargetVersion;
5-
import io.javaoperatorsdk.webhook.sample.commons.customresource.*;
5+
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResource;
6+
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResourceSpec;
67

78
@TargetVersion("v1")
89
public class V1Mapper implements Mapper<MultiVersionCustomResource, MultiVersionHub> {
910

10-
public static final String DEFAULT_ADDITIONAL_VALUE = "default_additional_value";
11-
1211
@Override
1312
public MultiVersionHub toHub(MultiVersionCustomResource resource) {
1413
var hub = new MultiVersionHub();

Diff for: samples/spring-boot/src/test/java/io/javaoperatorsdk/webhook/sample/springboot/WebhooksE2E.java renamed to samples/commons/src/test/java/io/javaoperatorsdk/webhook/sample/EndToEndTestBase.java

+32-46
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1-
package io.javaoperatorsdk.webhook.sample.springboot;
1+
package io.javaoperatorsdk.webhook.sample;
22

3-
import java.io.IOException;
4-
import java.io.InputStream;
5-
import java.net.URL;
63
import java.time.Duration;
74
import java.util.List;
85
import java.util.Map;
6+
import java.util.concurrent.TimeUnit;
7+
import java.util.function.Supplier;
98
import java.util.function.UnaryOperator;
109

11-
import org.junit.jupiter.api.BeforeAll;
1210
import org.junit.jupiter.api.Test;
1311

1412
import io.fabric8.kubernetes.api.model.HasMetadata;
1513
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
1614
import io.fabric8.kubernetes.api.model.apiextensions.v1.*;
17-
import io.fabric8.kubernetes.api.model.networking.v1.*;
1815
import io.fabric8.kubernetes.client.KubernetesClient;
1916
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
2017
import io.fabric8.kubernetes.client.KubernetesClientException;
@@ -23,47 +20,27 @@
2320
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResourceV2;
2421

2522
import static io.javaoperatorsdk.webhook.sample.commons.AdmissionControllers.MUTATION_TARGET_LABEL;
23+
import static io.javaoperatorsdk.webhook.sample.commons.ConversionControllers.CONVERSION_PATH;
2624
import static io.javaoperatorsdk.webhook.sample.commons.Utils.*;
27-
import static io.javaoperatorsdk.webhook.sample.springboot.conversion.ConversionEndpoint.CONVERSION_PATH;
28-
import static org.assertj.core.api.Assertions.assertThat;
25+
import static io.javaoperatorsdk.webhook.sample.commons.Utils.SPIN_UP_GRACE_PERIOD;
26+
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
2927
import static org.awaitility.Awaitility.await;
3028
import static org.junit.jupiter.api.Assertions.assertThrows;
3129

32-
class WebhooksE2E {
30+
public class EndToEndTestBase {
3331

34-
private KubernetesClient client = new KubernetesClientBuilder().build();
32+
protected KubernetesClient client = new KubernetesClientBuilder().build();
3533

3634
public static final String TEST_CR_NAME = "test-cr";
3735
public static final int CR_SPEC_VALUE = 5;
3836

39-
@BeforeAll
40-
static void deployService() throws IOException {
41-
try (KubernetesClient client = new KubernetesClientBuilder().build();
42-
InputStream certManager =
43-
new URL(
44-
"https://github.com/cert-manager/cert-manager/releases/download/v1.10.1/cert-manager.yaml")
45-
.openStream()) {
46-
applyAndWait(client, certManager);
47-
applyAndWait(client, "target/classes/META-INF/dekorate/kubernetes.yml");
48-
applyAndWait(client, "k8s/validating-webhook-configuration.yml");
49-
applyAndWait(client, "k8s/mutating-webhook-configuration.yml");
50-
applyAndWait(client,
51-
"../commons/target/classes/META-INF/fabric8/multiversioncustomresources.sample.javaoperatorsdk-v1.yml",
52-
addConversionHookEndpointToCustomResource());
53-
}
54-
}
55-
5637
@Test
5738
void validationHook() {
5839
var ingressWithLabel = testIngress("normal-add-test");
5940
addRequiredLabels(ingressWithLabel);
6041
await().atMost(Duration.ofSeconds(SPIN_UP_GRACE_PERIOD)).untilAsserted(() -> {
61-
Ingress res = null;
62-
try {
63-
// this can be since coredns in minikube can take some time
64-
res = client.network().v1().ingresses().resource(ingressWithLabel).createOrReplace();
65-
} catch (KubernetesClientException e) {
66-
}
42+
var res = avoidRequestTimeout(
43+
() -> client.network().v1().ingresses().resource(ingressWithLabel).createOrReplace());
6744
assertThat(res).isNotNull();
6845
});
6946
assertThrows(KubernetesClientException.class,
@@ -76,11 +53,8 @@ void mutationHook() {
7653
var ingressWithLabel = testIngress("mutation-test");
7754
addRequiredLabels(ingressWithLabel);
7855
await().atMost(Duration.ofSeconds(SPIN_UP_GRACE_PERIOD)).untilAsserted(() -> {
79-
Ingress res = null;
80-
try {
81-
res = client.network().v1().ingresses().resource(ingressWithLabel).createOrReplace();
82-
} catch (KubernetesClientException e) {
83-
}
56+
var res = avoidRequestTimeout(
57+
() -> client.network().v1().ingresses().resource(ingressWithLabel).createOrReplace());
8458
assertThat(res).isNotNull();
8559
assertThat(res.getMetadata().getLabels()).containsKey(MUTATION_TARGET_LABEL);
8660
});
@@ -89,11 +63,7 @@ void mutationHook() {
8963
@Test
9064
void conversionHook() {
9165
await().atMost(Duration.ofSeconds(SPIN_UP_GRACE_PERIOD)).untilAsserted(() -> {
92-
try {
93-
// this can be since coredns in minikube can take some time
94-
createV1Resource(TEST_CR_NAME);
95-
} catch (KubernetesClientException e) {
96-
}
66+
avoidRequestTimeout(() -> createV1Resource(TEST_CR_NAME));
9767
});
9868
MultiVersionCustomResourceV2 v2 =
9969
client.resources(MultiVersionCustomResourceV2.class).withName(TEST_CR_NAME).get();
@@ -110,15 +80,30 @@ private MultiVersionCustomResource createV1Resource(String name) {
11080
return client.resource(res).createOrReplace();
11181
}
11282

113-
static UnaryOperator<HasMetadata> addConversionHookEndpointToCustomResource() {
83+
<T> T avoidRequestTimeout(Supplier<T> operator) {
84+
try {
85+
return operator.get();
86+
} catch (KubernetesClientException e) {
87+
return null;
88+
}
89+
}
90+
91+
/** On minikube CoreDNS can take some time to start */
92+
public static void waitForCoreDNS(KubernetesClient client) {
93+
client.apps().deployments().inNamespace("kube-system").withName("coredns").waitUntilReady(2,
94+
TimeUnit.MINUTES);
95+
}
96+
97+
public static UnaryOperator<HasMetadata> addConversionHookEndpointToCustomResource(
98+
String serviceName) {
11499
return r -> {
115100
if (!(r instanceof CustomResourceDefinition)) {
116101
return r;
117102
}
118103
var crd = (CustomResourceDefinition) r;
119104
var crc = new CustomResourceConversion();
120105
crd.getMetadata()
121-
.setAnnotations(Map.of("cert-manager.io/inject-ca-from", "default/spring-boot-sample"));
106+
.setAnnotations(Map.of("cert-manager.io/inject-ca-from", "default/" + serviceName));
122107
crd.getSpec().setConversion(crc);
123108
crc.setStrategy("Webhook");
124109

@@ -127,8 +112,9 @@ static UnaryOperator<HasMetadata> addConversionHookEndpointToCustomResource() {
127112
.withClientConfig(new WebhookClientConfigBuilder()
128113
.withService(new ServiceReferenceBuilder()
129114
.withPath("/" + CONVERSION_PATH)
130-
.withName("spring-boot-sample")
115+
.withName(serviceName)
131116
.withNamespace("default")
117+
.withPort(443)
132118
.build())
133119
.build())
134120
.build();

Diff for: samples/quarkus/pom.xml

+14
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,20 @@
102102
</exclusion>
103103
</exclusions>
104104
</dependency>
105+
<dependency>
106+
<groupId>io.javaoperatorsdk.admissioncontroller.sample</groupId>
107+
<artifactId>sample-commons</artifactId>
108+
<version>${project.version}</version>
109+
<exclusions>
110+
<exclusion>
111+
<artifactId>kubernetes-client</artifactId>
112+
<groupId>io.fabric8</groupId>
113+
</exclusion>
114+
</exclusions>
115+
<type>test-jar</type>
116+
<scope>test</scope>
117+
</dependency>
118+
105119
<dependency>
106120
<groupId>org.awaitility</groupId>
107121
<artifactId>awaitility</artifactId>
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.webhook.admission.sample.quarkus.admission;
1+
package io.javaoperatorsdk.webhook.sample.admission;
22

33
import javax.inject.Named;
44
import javax.inject.Singleton;
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.webhook.admission.sample.quarkus.admission;
1+
package io.javaoperatorsdk.webhook.sample.admission;
22

33
import javax.inject.Inject;
44
import javax.inject.Named;
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.webhook.admission.sample.quarkus.conversion;
1+
package io.javaoperatorsdk.webhook.sample.conversion;
22

33
import javax.inject.Singleton;
44

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.webhook.admission.sample.quarkus.conversion;
1+
package io.javaoperatorsdk.webhook.sample.conversion;
22

33
import javax.ws.rs.Consumes;
44
import javax.ws.rs.POST;
@@ -11,12 +11,12 @@
1111
import io.javaoperatorsdk.webhook.conversion.ConversionController;
1212
import io.smallrye.mutiny.Uni;
1313

14+
import static io.javaoperatorsdk.webhook.sample.commons.ConversionControllers.ASYNC_CONVERSION_PATH;
15+
import static io.javaoperatorsdk.webhook.sample.commons.ConversionControllers.CONVERSION_PATH;
16+
1417
@Path("/")
1518
public class ConversionEndpoint {
1619

17-
public static final String CONVERSION_PATH = "convert";
18-
public static final String ASYNC_CONVERSION_PATH = "async-convert";
19-
2020
private final ConversionController conversionController;
2121
private final AsyncConversionController asyncConversionController;
2222

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.webhook.admission.sample.quarkus.conversion;
1+
package io.javaoperatorsdk.webhook.sample.conversion;
22

33
import javax.inject.Singleton;
44

0 commit comments

Comments
 (0)