Skip to content

Commit b631a33

Browse files
committed
Integration test
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent c97d9f6 commit b631a33

File tree

6 files changed

+167
-12
lines changed

6 files changed

+167
-12
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/CRDPresentActivationCondition.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
import io.javaoperatorsdk.operator.api.reconciler.Context;
1212
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1313

14+
/**
15+
* A generic CRD checking activation condition. Makes sure that the CRD is not checked unnecessarily
16+
* even used in multiple condition. By default, it checks CRD at most 10 times with a delay at least
17+
* 10 seconds. To fully customize CRD check trigger behavior you can extend this class and override
18+
* the {@link CRDPresentActivationCondition#shouldCheckStateNow(CRDCheckState)} method.
19+
**/
1420
public class CRDPresentActivationCondition<R extends HasMetadata, P extends HasMetadata>
1521
implements Condition<R, P> {
1622

@@ -98,25 +104,13 @@ public Boolean isCrdPresent() {
98104
return crdPresent;
99105
}
100106

101-
public void setCrdPresent(boolean crdPresent) {
102-
this.crdPresent = crdPresent;
103-
}
104-
105107
public LocalDateTime getLastChecked() {
106108
return lastChecked;
107109
}
108110

109-
public void setLastChecked(LocalDateTime lastChecked) {
110-
this.lastChecked = lastChecked;
111-
}
112-
113111
public int getCheckCount() {
114112
return checkCount;
115113
}
116-
117-
public void setCheckCount(int checkCount) {
118-
this.checkCount = checkCount;
119-
}
120114
}
121115

122116
public static class CRDPresentChecker {
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import java.time.Duration;
4+
import java.util.Map;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
10+
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;
11+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
12+
import io.javaoperatorsdk.operator.sample.crdpresentactivation.CRDPresentActivationCustomResource;
13+
import io.javaoperatorsdk.operator.sample.crdpresentactivation.CRDPresentActivationDependentCustomResource;
14+
import io.javaoperatorsdk.operator.sample.crdpresentactivation.CRDPresentActivationReconciler;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.awaitility.Awaitility.await;
18+
19+
public class CRDPresentActivationConditionIT {
20+
21+
public static final String TEST_1 = "test1";
22+
public static final String CRD_NAME =
23+
"crdpresentactivationdependentcustomresources.sample.javaoperatorsdk";
24+
25+
@RegisterExtension
26+
LocallyRunOperatorExtension extension =
27+
LocallyRunOperatorExtension.builder()
28+
.withReconciler(new CRDPresentActivationReconciler())
29+
.build();
30+
31+
32+
@Test
33+
void resourceCreatedOnlyIfCRDPresent() {
34+
// deleted so test can be repeated
35+
extension.getKubernetesClient().resources(CustomResourceDefinition.class)
36+
.withName(CRD_NAME).delete();
37+
38+
var resource = extension.create(testResource());
39+
40+
await().pollDelay(Duration.ofMillis(300)).untilAsserted(() -> {
41+
var crd = extension.getKubernetesClient().resources(CustomResourceDefinition.class)
42+
.withName(CRD_NAME).get();
43+
assertThat(crd).isNull();
44+
45+
var dr = extension.get(CRDPresentActivationDependentCustomResource.class, TEST_1);
46+
assertThat(dr).isNull();
47+
});
48+
49+
LocallyRunOperatorExtension.applyCrd(CRDPresentActivationDependentCustomResource.class,
50+
extension.getKubernetesClient());
51+
52+
resource.getMetadata().setAnnotations(Map.of("sampple", "value"));
53+
extension.replace(resource);
54+
55+
await().pollDelay(Duration.ofMillis(300)).untilAsserted(() -> {
56+
var cm = extension.get(CRDPresentActivationDependentCustomResource.class, TEST_1);
57+
assertThat(cm).isNull();
58+
});
59+
60+
}
61+
62+
CRDPresentActivationCustomResource testResource() {
63+
var res = new CRDPresentActivationCustomResource();
64+
res.setMetadata(new ObjectMetaBuilder()
65+
.withName(TEST_1)
66+
.build());
67+
return res;
68+
}
69+
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.javaoperatorsdk.operator.sample.crdpresentactivation;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("crdp")
12+
public class CRDPresentActivationCustomResource
13+
extends CustomResource<Void, Void>
14+
implements Namespaced {
15+
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.javaoperatorsdk.operator.sample.crdpresentactivation;
2+
3+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
4+
import io.javaoperatorsdk.operator.api.reconciler.Context;
5+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDNoGCKubernetesDependentResource;
6+
7+
public class CRDPresentActivationDependent
8+
extends
9+
CRUDNoGCKubernetesDependentResource<CRDPresentActivationDependentCustomResource, CRDPresentActivationCustomResource> {
10+
11+
public static final String DATA_KEY = "data";
12+
13+
public CRDPresentActivationDependent() {
14+
super(CRDPresentActivationDependentCustomResource.class);
15+
}
16+
17+
@Override
18+
protected CRDPresentActivationDependentCustomResource desired(
19+
CRDPresentActivationCustomResource primary,
20+
Context<CRDPresentActivationCustomResource> context) {
21+
var res = new CRDPresentActivationDependentCustomResource();
22+
res.setMetadata(new ObjectMetaBuilder()
23+
.withName(primary.getMetadata().getName())
24+
.withNamespace(primary.getMetadata().getNamespace())
25+
.build());
26+
return res;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.operator.sample.crdpresentactivation;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("addp")
12+
public class CRDPresentActivationDependentCustomResource extends CustomResource<Void, Void>
13+
implements Namespaced {
14+
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.javaoperatorsdk.operator.sample.crdpresentactivation;
2+
3+
import io.javaoperatorsdk.operator.api.reconciler.*;
4+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
5+
import io.javaoperatorsdk.operator.processing.dependent.workflow.CRDPresentActivationCondition;
6+
7+
@Workflow(dependents = {
8+
@Dependent(type = CRDPresentActivationDependent.class,
9+
activationCondition = CRDPresentActivationCondition.class),
10+
})
11+
// to trigger reconciliation with metadata change
12+
@ControllerConfiguration(generationAwareEventProcessing = false)
13+
public class CRDPresentActivationReconciler
14+
implements Reconciler<CRDPresentActivationCustomResource>,
15+
Cleaner<CRDPresentActivationCustomResource> {
16+
17+
@Override
18+
public UpdateControl<CRDPresentActivationCustomResource> reconcile(
19+
CRDPresentActivationCustomResource resource,
20+
Context<CRDPresentActivationCustomResource> context) {
21+
22+
return UpdateControl.noUpdate();
23+
}
24+
25+
@Override
26+
public DeleteControl cleanup(CRDPresentActivationCustomResource resource,
27+
Context<CRDPresentActivationCustomResource> context) {
28+
return DeleteControl.defaultDelete();
29+
}
30+
}

0 commit comments

Comments
 (0)