Skip to content

Commit 5dc5f4b

Browse files
committed
add integration test
Signed-off-by: Attila Mészáros <[email protected]>
1 parent 68627ad commit 5dc5f4b

File tree

6 files changed

+169
-0
lines changed

6 files changed

+169
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
2+
3+
4+
import io.fabric8.kubernetes.api.model.ConfigMap;
5+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
6+
import io.javaoperatorsdk.operator.api.reconciler.Context;
7+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
8+
9+
public class ConfigMapDependentResource
10+
extends CRUDKubernetesDependentResource<ConfigMap, GetNonActiveSecondaryCustomResource> {
11+
12+
public static final String DATA_KEY = "data";
13+
14+
public ConfigMapDependentResource() {
15+
super(ConfigMap.class);
16+
}
17+
18+
@Override
19+
protected ConfigMap desired(GetNonActiveSecondaryCustomResource primary,
20+
Context<GetNonActiveSecondaryCustomResource> context) {
21+
ConfigMap configMap = new ConfigMap();
22+
configMap.setMetadata(new ObjectMetaBuilder()
23+
.withName(primary.getMetadata().getName())
24+
.withNamespace(primary.getMetadata().getNamespace())
25+
.build());
26+
return configMap;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
2+
3+
import io.fabric8.openshift.api.model.Route;
4+
import io.javaoperatorsdk.operator.api.reconciler.Context;
5+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
6+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
7+
8+
public class FalseActivationCondition
9+
implements Condition<Route, GetNonActiveSecondaryCustomResource> {
10+
@Override
11+
public boolean isMet(
12+
DependentResource<Route, GetNonActiveSecondaryCustomResource> dependentResource,
13+
GetNonActiveSecondaryCustomResource primary,
14+
Context<GetNonActiveSecondaryCustomResource> context) {
15+
return false;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
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("gnas")
12+
public class GetNonActiveSecondaryCustomResource
13+
extends CustomResource<Void, Void>
14+
implements Namespaced {
15+
16+
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
2+
3+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
4+
import io.fabric8.openshift.api.model.Route;
5+
import io.javaoperatorsdk.operator.api.reconciler.Context;
6+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
7+
8+
public class RouteDependentResource
9+
extends CRUDKubernetesDependentResource<Route, GetNonActiveSecondaryCustomResource> {
10+
11+
public RouteDependentResource() {
12+
super(Route.class);
13+
}
14+
15+
@Override
16+
protected Route desired(GetNonActiveSecondaryCustomResource primary,
17+
Context<GetNonActiveSecondaryCustomResource> context) {
18+
// basically does not matter since this should not be called
19+
Route route = new Route();
20+
route.setMetadata(new ObjectMetaBuilder()
21+
.withName(primary.getMetadata().getName())
22+
.withNamespace(primary.getMetadata().getNamespace())
23+
.build());
24+
25+
return route;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.junit.jupiter.api.extension.RegisterExtension;
5+
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
import static org.awaitility.Awaitility.await;
11+
12+
public class WorkflowActivationConditionIT {
13+
14+
public static final String TEST_RESOURCE_NAME = "test1";
15+
16+
@RegisterExtension
17+
LocallyRunOperatorExtension extension =
18+
LocallyRunOperatorExtension.builder()
19+
.withReconciler(WorkflowActivationConditionReconciler.class)
20+
.build();
21+
22+
@Test
23+
void reconciledOnVanillaKubernetesDespiteRouteInWorkflow() {
24+
extension.create(testResource());
25+
26+
await().untilAsserted(() -> {
27+
assertThat(extension.getReconcilerOfType(WorkflowActivationConditionReconciler.class)
28+
.getNumberOfReconciliationExecution()).isEqualTo(1);
29+
});
30+
}
31+
32+
private GetNonActiveSecondaryCustomResource testResource() {
33+
var res = new GetNonActiveSecondaryCustomResource();
34+
res.setMetadata(new ObjectMetaBuilder()
35+
.withName(TEST_RESOURCE_NAME)
36+
.build());
37+
return res;
38+
}
39+
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.javaoperatorsdk.operator.workflow.getnonactivesecondary;
2+
3+
import java.util.concurrent.atomic.AtomicInteger;
4+
5+
import io.fabric8.openshift.api.model.Route;
6+
import io.javaoperatorsdk.operator.api.reconciler.Context;
7+
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
8+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
9+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
10+
import io.javaoperatorsdk.operator.api.reconciler.Workflow;
11+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
12+
13+
@Workflow(dependents = {
14+
@Dependent(type = ConfigMapDependentResource.class),
15+
@Dependent(type = RouteDependentResource.class,
16+
activationCondition = FalseActivationCondition.class)
17+
})
18+
@ControllerConfiguration
19+
public class WorkflowActivationConditionReconciler
20+
implements Reconciler<GetNonActiveSecondaryCustomResource> {
21+
22+
private final AtomicInteger numberOfReconciliationExecution = new AtomicInteger(0);
23+
24+
@Override
25+
public UpdateControl<GetNonActiveSecondaryCustomResource> reconcile(
26+
GetNonActiveSecondaryCustomResource resource,
27+
Context<GetNonActiveSecondaryCustomResource> context) {
28+
29+
// should not throw an exception even if the condition is false
30+
var route = context.getSecondaryResource(Route.class);
31+
32+
numberOfReconciliationExecution.incrementAndGet();
33+
34+
return UpdateControl.noUpdate();
35+
}
36+
37+
public int getNumberOfReconciliationExecution() {
38+
return numberOfReconciliationExecution.get();
39+
}
40+
}

0 commit comments

Comments
 (0)