Skip to content

Commit 07f00e5

Browse files
committed
Add new CDI test module and add tests for conditions injections
Signed-off-by: xstefank <[email protected]>
1 parent bd0e63e commit 07f00e5

File tree

15 files changed

+532
-0
lines changed

15 files changed

+532
-0
lines changed

integration-tests/cdi/pom.xml

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<parent>
5+
<groupId>io.quarkiverse.operatorsdk</groupId>
6+
<artifactId>quarkus-operator-sdk-integration-tests-parent</artifactId>
7+
<version>7.3.1-SNAPSHOT</version>
8+
<relativePath>../pom.xml</relativePath>
9+
</parent>
10+
<artifactId>quarkus-operator-sdk-integration-tests-cdi</artifactId>
11+
<name>Quarkus - Operator SDK - Integration Tests - CDI</name>
12+
<dependencies>
13+
<dependency>
14+
<groupId>io.quarkus</groupId>
15+
<artifactId>quarkus-resteasy</artifactId>
16+
</dependency>
17+
<dependency>
18+
<groupId>io.quarkiverse.operatorsdk</groupId>
19+
<artifactId>quarkus-operator-sdk</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>io.quarkus</groupId>
23+
<artifactId>quarkus-junit5</artifactId>
24+
<scope>test</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>io.quarkus</groupId>
28+
<artifactId>quarkus-test-kubernetes-client</artifactId>
29+
<scope>test</scope>
30+
</dependency>
31+
<dependency>
32+
<groupId>io.quarkus</groupId>
33+
<artifactId>quarkus-resteasy-jackson</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>io.rest-assured</groupId>
37+
<artifactId>rest-assured</artifactId>
38+
<scope>test</scope>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.awaitility</groupId>
42+
<artifactId>awaitility</artifactId>
43+
<scope>test</scope>
44+
</dependency>
45+
<!-- to check that MeterRegistry are properly bound to custom Metrics implementations -->
46+
<dependency>
47+
<groupId>io.quarkus</groupId>
48+
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
49+
</dependency>
50+
<dependency>
51+
<groupId>org.bouncycastle</groupId>
52+
<artifactId>bcpkix-jdk18on</artifactId>
53+
<optional>true</optional>
54+
</dependency>
55+
</dependencies>
56+
<build>
57+
<plugins>
58+
<plugin>
59+
<groupId>io.quarkus</groupId>
60+
<artifactId>quarkus-maven-plugin</artifactId>
61+
<executions>
62+
<execution>
63+
<goals>
64+
<goal>build</goal>
65+
</goals>
66+
</execution>
67+
</executions>
68+
</plugin>
69+
<plugin>
70+
<groupId>org.apache.maven.plugins</groupId>
71+
<artifactId>maven-jar-plugin</artifactId>
72+
<executions>
73+
<execution>
74+
<goals>
75+
<goal>test-jar</goal>
76+
</goals>
77+
</execution>
78+
</executions>
79+
</plugin>
80+
<plugin>
81+
<artifactId>maven-surefire-plugin</artifactId>
82+
<configuration>
83+
<environmentVariables>
84+
<NAMESPACE_FROM_ENV>fromEnvVarNS</NAMESPACE_FROM_ENV>
85+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>fromEnv1,fromEnv2
86+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>
87+
<VARIABLE_NS_ENV>variableNSFromEnv</VARIABLE_NS_ENV>
88+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>JOSDK_ALL_NAMESPACES
89+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>
90+
</environmentVariables>
91+
</configuration>
92+
</plugin>
93+
</plugins>
94+
</build>
95+
<profiles>
96+
<profile>
97+
<id>native-image</id>
98+
<activation>
99+
<property>
100+
<name>native</name>
101+
</property>
102+
</activation>
103+
<build>
104+
<plugins>
105+
<plugin>
106+
<artifactId>maven-surefire-plugin</artifactId>
107+
<configuration>
108+
<skipTests>${native.surefire.skip}</skipTests>
109+
<systemPropertyVariables>
110+
<java.util.logging.manager>org.jboss.logmanager.LogManager
111+
</java.util.logging.manager>
112+
<maven.home>${maven.home}</maven.home>
113+
</systemPropertyVariables>
114+
<environmentVariables>
115+
<NAMESPACE_FROM_ENV>fromEnvVarNS</NAMESPACE_FROM_ENV>
116+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>fromEnv1,fromEnv2
117+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>
118+
<VARIABLE_NS_ENV>variableNSFromEnv</VARIABLE_NS_ENV>
119+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>JOSDK_ALL_NAMESPACES
120+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>
121+
</environmentVariables>
122+
</configuration>
123+
</plugin>
124+
<plugin>
125+
<artifactId>maven-failsafe-plugin</artifactId>
126+
<executions>
127+
<execution>
128+
<goals>
129+
<goal>integration-test</goal>
130+
<goal>verify</goal>
131+
</goals>
132+
<configuration>
133+
<systemPropertyVariables>
134+
<native.image.path>
135+
${project.build.directory}/${project.build.finalName}-runner
136+
</native.image.path>
137+
<java.util.logging.manager>org.jboss.logmanager.LogManager
138+
</java.util.logging.manager>
139+
<maven.home>${maven.home}</maven.home>
140+
</systemPropertyVariables>
141+
<environmentVariables>
142+
<NAMESPACE_FROM_ENV>fromEnvVarNS</NAMESPACE_FROM_ENV>
143+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>fromEnv1,fromEnv2
144+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_EMPTY_NAMESPACES>
145+
<VARIABLE_NS_ENV>variableNSFromEnv</VARIABLE_NS_ENV>
146+
<QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>JOSDK_ALL_NAMESPACES
147+
</QUARKUS_OPERATOR_SDK_CONTROLLERS_KEYCLOAKCONTROLLER_NAMESPACES>
148+
</environmentVariables>
149+
</configuration>
150+
</execution>
151+
</executions>
152+
</plugin>
153+
</plugins>
154+
</build>
155+
<properties>
156+
<quarkus.package.type>native</quarkus.package.type>
157+
</properties>
158+
</profile>
159+
</profiles>
160+
</project>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import java.util.Map;
4+
import java.util.Optional;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
import io.fabric8.kubernetes.api.model.ConfigMap;
10+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
11+
import io.javaoperatorsdk.operator.api.reconciler.Context;
12+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
13+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
14+
15+
public class ConfigMapDependent extends CRUDKubernetesDependentResource<ConfigMap, TestResource> {
16+
17+
private static final Logger log = LoggerFactory.getLogger(ConfigMapDependent.class);
18+
19+
@Override
20+
protected ConfigMap desired(TestResource primary, Context<TestResource> context) {
21+
Optional<ConfigMap> optionalConfigMap = getConfigMap(primary, context);
22+
if (!optionalConfigMap.isPresent()) {
23+
ConfigMap configMap = new ConfigMap();
24+
configMap.setMetadata(
25+
new ObjectMetaBuilder()
26+
.withName(primary.getMetadata().getName() + "-cm")
27+
.withNamespace(primary.getMetadata().getNamespace())
28+
.build());
29+
configMap.setData(Map.of("key", "data"));
30+
return configMap;
31+
}
32+
return optionalConfigMap.get();
33+
}
34+
35+
@Override
36+
public void delete(TestResource primary, Context<TestResource> context) {
37+
Optional<ConfigMap> optionalConfigMap = getConfigMap(primary, context);
38+
if (optionalConfigMap == null)
39+
return;
40+
optionalConfigMap.ifPresent(
41+
(configMap -> {
42+
if (configMap.getMetadata().getAnnotations() != null) {
43+
context.getClient().resource(configMap).delete();
44+
}
45+
}));
46+
47+
}
48+
49+
private static Optional<ConfigMap> getConfigMap(TestResource primary, Context<TestResource> context) {
50+
Optional<ConfigMap> optionalConfigMap = context.getSecondaryResource(ConfigMap.class);
51+
if (optionalConfigMap.isEmpty()) {
52+
log.debug("Config Map not found for primary: {}", ResourceID.fromResource(primary));
53+
return Optional.empty();
54+
}
55+
return optionalConfigMap;
56+
}
57+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
9+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
10+
import io.quarkus.arc.Unremovable;
11+
12+
@ApplicationScoped
13+
@Unremovable
14+
public class CustomActionvationCondition implements Condition {
15+
16+
@Inject
17+
TestUUIDBean testUUIDBean;
18+
19+
private String uuid;
20+
21+
@Override
22+
public boolean isMet(DependentResource dependentResource, HasMetadata primary, Context context) {
23+
uuid = testUUIDBean.uuid();
24+
return true;
25+
}
26+
27+
public String getUuid() {
28+
return uuid;
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
9+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
10+
import io.quarkus.arc.Unremovable;
11+
12+
@ApplicationScoped
13+
@Unremovable
14+
public class DeletePostCondition implements Condition {
15+
16+
@Inject
17+
TestUUIDBean testUUIDBean;
18+
19+
private String uuid;
20+
21+
@Override
22+
public boolean isMet(DependentResource dependentResource, HasMetadata primary, Context context) {
23+
this.uuid = testUUIDBean.uuid();
24+
return true;
25+
}
26+
27+
public String getUuid() {
28+
return uuid;
29+
}
30+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import java.util.Map;
4+
5+
import org.jboss.logging.Logger;
6+
7+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
8+
import io.fabric8.kubernetes.api.model.apps.Deployment;
9+
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
10+
import io.javaoperatorsdk.operator.api.reconciler.Context;
11+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDNoGCKubernetesDependentResource;
12+
13+
public class DeploymentDependent extends CRUDNoGCKubernetesDependentResource<Deployment, TestResource> {
14+
15+
private static final Logger LOG = Logger.getLogger(DeploymentDependent.class);
16+
17+
@Override
18+
protected Deployment desired(TestResource primary, Context<TestResource> context) {
19+
return new DeploymentBuilder()
20+
.withMetadata(new ObjectMetaBuilder()
21+
.withName(primary.getMetadata().getName() + "-deployment")
22+
.withNamespace("default")
23+
.withLabels(Map.of("app", primary.getMetadata().getName()))
24+
.build())
25+
.withNewSpec()
26+
.withNewSelector().withMatchLabels(Map.of("app", primary.getMetadata().getName())).endSelector()
27+
.withNewTemplate().withNewMetadata().withLabels(Map.of("app", primary.getMetadata().getName())).endMetadata()
28+
.withNewSpec().addNewContainer()
29+
.withName("nginx").withImage("nginx:1.14.2")
30+
.addNewPort().withName("http").withProtocol("TCP").withContainerPort(8080).endPort()
31+
.endContainer()
32+
.endSpec()
33+
.endTemplate()
34+
.endSpec()
35+
.build();
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
6+
import io.fabric8.kubernetes.api.model.apps.Deployment;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
9+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
10+
import io.quarkus.arc.Unremovable;
11+
12+
@ApplicationScoped
13+
@Unremovable
14+
public class ReadyPostCondition implements Condition<Deployment, TestResource> {
15+
16+
@Inject
17+
TestUUIDBean testUUIDBean;
18+
19+
private String uuid;
20+
21+
@Override
22+
public boolean isMet(DependentResource<Deployment, TestResource> dependentResource, TestResource primary,
23+
Context<TestResource> context) {
24+
uuid = testUUIDBean.uuid();
25+
return dependentResource
26+
.getSecondaryResource(primary, context)
27+
.map(deployment -> deployment.getSpec().getReplicas().equals(1))
28+
.orElse(false);
29+
}
30+
31+
public String getUuid() {
32+
return uuid;
33+
}
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.quarkiverse.operatorsdk.it.cdi;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
9+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
10+
import io.quarkus.arc.Unremovable;
11+
12+
@ApplicationScoped
13+
@Unremovable
14+
public class ReconcilePrecondition implements Condition {
15+
16+
@Inject
17+
TestUUIDBean testUUIDBean;
18+
19+
private String uuid;
20+
21+
@Override
22+
23+
public boolean isMet(DependentResource dependentResource, HasMetadata primary, Context context) {
24+
uuid = testUUIDBean.uuid();
25+
return true;
26+
}
27+
28+
public String getUuid() {
29+
return uuid;
30+
}
31+
}

0 commit comments

Comments
 (0)