Skip to content

Commit 930dc6e

Browse files
authored
Merge pull request kroxylicious#1876 from robobario/run-minikube-tests
Run operator minikube tests
2 parents b246eac + ccd908b commit 930dc6e

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

.github/workflows/maven.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ jobs:
4444
with:
4545
java-version: 21
4646
distribution: 'temurin'
47+
- name: Setup Minikube
48+
uses: manusa/actions-setup-minikube@v2.13.1
49+
with:
50+
minikube version: 'v1.35.0'
51+
kubernetes version: 'v1.32.0'
52+
github token: ${{ secrets.GITHUB_TOKEN }}
4753
- name: 'Test for unpublished reference release (japicmp)'
4854
run: |
4955
REFERENCE_RELEASE=$(mvn --quiet -pl kroxylicious-api help:evaluate -Dexpression=ApiCompatability.ReferenceVersion -DforceStdout)

kroxylicious-operator/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,21 @@
194194
</dependencies>
195195
<build>
196196
<plugins>
197+
<plugin>
198+
<groupId>org.apache.maven.plugins</groupId>
199+
<artifactId>maven-failsafe-plugin</artifactId>
200+
<configuration>
201+
<runOrder>random</runOrder>
202+
</configuration>
203+
<executions>
204+
<execution>
205+
<goals>
206+
<goal>integration-test</goal>
207+
<goal>verify</goal>
208+
</goals>
209+
</execution>
210+
</executions>
211+
</plugin>
197212
<plugin>
198213
<groupId>org.apache.maven.plugins</groupId>
199214
<artifactId>maven-assembly-plugin</artifactId>

kroxylicious-operator/src/test/java/io/kroxylicious/kubernetes/operator/OperatorMainIT.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
package io.kroxylicious.kubernetes.operator;
88

99
import org.assertj.core.api.Assumptions;
10+
import org.junit.jupiter.api.Disabled;
1011
import org.junit.jupiter.api.Test;
1112

13+
@Disabled
1214
class OperatorMainIT {
1315
// This is an IT because it depends on having a running Kube cluster
1416

kroxylicious-operator/src/test/java/io/kroxylicious/kubernetes/operator/ProxyReconcilerIT.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.List;
1111
import java.util.Map;
1212
import java.util.Set;
13+
import java.util.concurrent.TimeUnit;
1314
import java.util.stream.Collectors;
1415

1516
import org.assertj.core.api.AbstractStringAssert;
@@ -22,6 +23,7 @@
2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425

26+
import io.fabric8.kubernetes.api.model.Pod;
2527
import io.fabric8.kubernetes.api.model.Secret;
2628
import io.fabric8.kubernetes.api.model.Service;
2729
import io.fabric8.kubernetes.api.model.Volume;
@@ -58,6 +60,19 @@ class ProxyReconcilerIT {
5860
static void checkKubeAvailable() {
5961
client = OperatorTestUtils.kubeClientIfAvailable();
6062
Assumptions.assumeThat(client).describedAs("Test requires a viable kube client").isNotNull();
63+
preloadOperatorImage();
64+
}
65+
66+
// the initial operator image pull can take a long time and interfere with the tests
67+
private static void preloadOperatorImage() {
68+
String operandImage = ProxyDeployment.getOperandImage();
69+
Pod pod = client.run().withName("preload-operator-image")
70+
.withNewRunConfig()
71+
.withImage(operandImage)
72+
.withRestartPolicy("Never")
73+
.withCommand("ls").done();
74+
client.resource(pod).waitUntilCondition(it -> it.getStatus().getPhase().equals("Succeeded"), 2, TimeUnit.MINUTES);
75+
client.resource(pod).delete();
6176
}
6277

6378
@RegisterExtension
@@ -95,11 +110,24 @@ CreatedResources doCreate() {
95110

96111
assertProxyConfigContents(proxy, Set.of(CLUSTER_FOO_BOOTSTRAP, CLUSTER_BAR_BOOTSTRAP), Set.of());
97112
assertDeploymentMountsConfigSecret(proxy);
113+
assertDeploymentBecomesReady(proxy);
98114
assertServiceTargetsProxyInstances(proxy, clusters);
99-
100115
return new CreatedResources(proxy, clusters);
101116
}
102117

118+
private void assertDeploymentBecomesReady(KafkaProxy proxy) {
119+
// wait longer for initial operator image download
120+
await().alias("Deployment as expected").untilAsserted(() -> {
121+
var deployment = extension.get(Deployment.class, ProxyDeployment.deploymentName(proxy));
122+
assertThat(deployment).isNotNull()
123+
.extracting(Deployment::getStatus)
124+
.describedAs("All deployment replicas should become ready")
125+
.satisfies(status -> {
126+
assertThat(status.getReplicas()).isEqualTo(status.getReadyReplicas());
127+
});
128+
});
129+
}
130+
103131
private void assertServiceTargetsProxyInstances(KafkaProxy proxy, Set<VirtualKafkaCluster> clusters) {
104132
await().alias("cluster Services as expected").untilAsserted(() -> {
105133
for (var cluster : clusters) {
@@ -171,6 +199,7 @@ void testUpdateVirtualCluster() {
171199
VirtualKafkaCluster cluster = createdResources.cluster(CLUSTER_FOO).edit().editSpec().editTargetCluster().editBootstrapping().withBootstrapAddress(NEW_BOOTSTRAP)
172200
.endBootstrapping().endTargetCluster().endSpec().build();
173201
extension.replace(cluster);
202+
assertDeploymentBecomesReady(proxy);
174203
await().untilAsserted(() -> {
175204
var secret = extension.get(Secret.class, ProxyConfigSecret.secretName(proxy));
176205
assertThat(secret)
@@ -204,6 +233,7 @@ void testAddVirtualCluster() {
204233
.extracting(map -> map.get(ProxyConfigSecret.CONFIG_YAML_KEY), InstanceOfAssertFactories.STRING)
205234
.contains(CLUSTER_BAZ_BOOTSTRAP);
206235
});
236+
assertDeploymentBecomesReady(proxy);
207237

208238
await().untilAsserted(() -> {
209239
assertClusterServiceExists(proxy, CLUSTER_FOO);
@@ -229,6 +259,7 @@ void testDeleteVirtualCluster() {
229259
.doesNotContain(CLUSTER_FOO_BOOTSTRAP)
230260
.contains(CLUSTER_BAR_BOOTSTRAP);
231261
});
262+
assertDeploymentBecomesReady(proxy);
232263

233264
await().untilAsserted(() -> {
234265
var service = extension.get(Service.class, CLUSTER_FOO);
@@ -259,6 +290,8 @@ void moveVirtualKafkaClusterToAnotherKafkaProxy() {
259290
// when
260291
extension.replace(virtualKafkaCluster(CLUSTER_BAR, CLUSTER_BAR_BOOTSTRAP, proxyB));
261292
// then
293+
assertDeploymentBecomesReady(proxyA);
294+
assertDeploymentBecomesReady(proxyB);
262295
Set<String> doesNotContain = Set.of(CLUSTER_BAR_BOOTSTRAP);
263296
assertProxyConfigContents(proxyA, Set.of(CLUSTER_FOO_BOOTSTRAP), doesNotContain);
264297
assertProxyConfigContents(proxyB, Set.of(CLUSTER_BAZ_BOOTSTRAP, CLUSTER_BAR_BOOTSTRAP), Set.of());

0 commit comments

Comments
 (0)