Skip to content

Commit ab89e69

Browse files
committed
feat: extending event source context with workflow support (#2185)
also change webpage sample use workflow builder Signed-off-by: Attila Mészáros <[email protected]>
1 parent e740d66 commit ab89e69

File tree

5 files changed

+50
-44
lines changed

5 files changed

+50
-44
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package io.javaoperatorsdk.operator.api.reconciler;
22

3-
import java.util.Collections;
4-
import java.util.HashMap;
5-
import java.util.Map;
6-
import java.util.Optional;
3+
import java.util.*;
74

85
import io.fabric8.kubernetes.api.model.HasMetadata;
96
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
7+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
108
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
119
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;
1210

@@ -43,12 +41,30 @@ static Map<String, EventSource> nameEventSources(EventSource... eventSources) {
4341
return eventSourceMap;
4442
}
4543

46-
@SuppressWarnings("unchecked,rawtypes")
44+
@SuppressWarnings("unchecked")
45+
static <K extends HasMetadata> Map<String, EventSource> eventSourcesFromWorkflow(
46+
EventSourceContext<K> context,
47+
Workflow<K> workflow) {
48+
Map<String, EventSource> result = new HashMap<>();
49+
for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) {
50+
var eventSource = e.getValue().eventSource(context);
51+
eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es));
52+
}
53+
return result;
54+
}
55+
56+
@SuppressWarnings("rawtypes")
4757
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
4858
EventSourceContext<K> context, DependentResource... dependentResources) {
59+
return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources));
60+
}
61+
62+
@SuppressWarnings("unchecked,rawtypes")
63+
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
64+
EventSourceContext<K> context, Collection<DependentResource> dependentResources) {
4965

5066
if (dependentResources != null) {
51-
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.length);
67+
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.size());
5268
for (DependentResource dependentResource : dependentResources) {
5369
Optional<ResourceEventSource> es = dependentResource.eventSource(context);
5470
es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e));

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static void main(String[] args) throws IOException {
3737
.equals(reconcilerEnvVar)) {
3838
operator.register(new WebPageManagedDependentsReconciler());
3939
} else {
40-
operator.register(new WebPageStandaloneDependentsReconciler(client));
40+
operator.register(new WebPageStandaloneDependentsReconciler());
4141
}
4242
operator.start();
4343

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> contex
107107
"Creating or updating ConfigMap {} in {}",
108108
desiredHtmlConfigMap.getMetadata().getName(),
109109
ns);
110-
var res = kubernetesClient.configMaps().inNamespace(ns).resource(desiredHtmlConfigMap)
110+
kubernetesClient.configMaps().inNamespace(ns).resource(desiredHtmlConfigMap)
111111
.createOr(Replaceable::update);
112112
}
113113

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,13 @@
77
import org.slf4j.LoggerFactory;
88

99
import io.fabric8.kubernetes.api.model.ConfigMap;
10-
import io.fabric8.kubernetes.api.model.Service;
11-
import io.fabric8.kubernetes.api.model.apps.Deployment;
12-
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
13-
import io.fabric8.kubernetes.client.KubernetesClient;
1410
import io.javaoperatorsdk.operator.api.reconciler.*;
15-
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
1611
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder;
12+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
13+
import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder;
1714
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1815
import io.javaoperatorsdk.operator.sample.customresource.WebPage;
19-
import io.javaoperatorsdk.operator.sample.dependentresource.ConfigMapDependentResource;
20-
import io.javaoperatorsdk.operator.sample.dependentresource.DeploymentDependentResource;
21-
import io.javaoperatorsdk.operator.sample.dependentresource.IngressDependentResource;
22-
import io.javaoperatorsdk.operator.sample.dependentresource.ServiceDependentResource;
16+
import io.javaoperatorsdk.operator.sample.dependentresource.*;
2317

2418
import static io.javaoperatorsdk.operator.sample.Utils.*;
2519
import static io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler.SELECTOR;
@@ -34,19 +28,15 @@ public class WebPageStandaloneDependentsReconciler
3428
private static final Logger log =
3529
LoggerFactory.getLogger(WebPageStandaloneDependentsReconciler.class);
3630

37-
private KubernetesDependentResource<ConfigMap, WebPage> configMapDR;
38-
private KubernetesDependentResource<Deployment, WebPage> deploymentDR;
39-
private KubernetesDependentResource<Service, WebPage> serviceDR;
40-
private KubernetesDependentResource<Ingress, WebPage> ingressDR;
31+
private Workflow<WebPage> workflow;
4132

42-
public WebPageStandaloneDependentsReconciler(KubernetesClient kubernetesClient) {
43-
createDependentResources(kubernetesClient);
33+
public WebPageStandaloneDependentsReconciler() {
34+
workflow = createDependentResourcesAndWorkflow();
4435
}
4536

4637
@Override
4738
public Map<String, EventSource> prepareEventSources(EventSourceContext<WebPage> context) {
48-
return EventSourceInitializer.nameEventSourcesFromDependentResource(context, configMapDR,
49-
deploymentDR, serviceDR, ingressDR);
39+
return EventSourceInitializer.eventSourcesFromWorkflow(context, workflow);
5040
}
5141

5242
@Override
@@ -58,14 +48,7 @@ public UpdateControl<WebPage> reconcile(WebPage webPage, Context<WebPage> contex
5848
return UpdateControl.patchStatus(setInvalidHtmlErrorMessage(webPage));
5949
}
6050

61-
Arrays.asList(configMapDR, deploymentDR, serviceDR)
62-
.forEach(dr -> dr.reconcile(webPage, context));
63-
64-
if (Boolean.TRUE.equals(webPage.getSpec().getExposed())) {
65-
ingressDR.reconcile(webPage, context);
66-
} else {
67-
ingressDR.delete(webPage, context);
68-
}
51+
workflow.reconcile(webPage, context);
6952

7053
webPage.setStatus(
7154
createStatus(
@@ -80,16 +63,23 @@ public ErrorStatusUpdateControl<WebPage> updateErrorStatus(
8063
}
8164

8265
@SuppressWarnings({"unchecked", "rawtypes"})
83-
private void createDependentResources(KubernetesClient client) {
84-
this.configMapDR = new ConfigMapDependentResource();
85-
this.deploymentDR = new DeploymentDependentResource();
86-
this.serviceDR = new ServiceDependentResource();
87-
this.ingressDR = new IngressDependentResource();
88-
89-
Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR).forEach(dr -> {
90-
dr.configureWith(new KubernetesDependentResourceConfigBuilder()
91-
.withLabelSelector(SELECTOR + "=true").build());
92-
});
66+
private Workflow<WebPage> createDependentResourcesAndWorkflow() {
67+
var configMapDR = new ConfigMapDependentResource();
68+
var deploymentDR = new DeploymentDependentResource();
69+
var serviceDR = new ServiceDependentResource();
70+
var ingressDR = new IngressDependentResource();
71+
72+
Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR)
73+
.forEach(dr -> dr.configureWith(new KubernetesDependentResourceConfigBuilder()
74+
.withLabelSelector(SELECTOR + "=true").build()));
75+
76+
return new WorkflowBuilder<WebPage>()
77+
.addDependentResource(configMapDR)
78+
.addDependentResource(deploymentDR)
79+
.addDependentResource(serviceDR)
80+
.addDependentResource(ingressDR)
81+
.withReconcilePrecondition(new ExposedIngressCondition())
82+
.build();
9383
}
9484

9585

sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorStandaloneDependentResourcesE2E.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public WebPageOperatorStandaloneDependentResourcesE2E() throws FileNotFoundExcep
1818
isLocal()
1919
? LocallyRunOperatorExtension.builder()
2020
.waitForNamespaceDeletion(false)
21-
.withReconciler(new WebPageStandaloneDependentsReconciler(client))
21+
.withReconciler(new WebPageStandaloneDependentsReconciler())
2222
.build()
2323
: ClusterDeployedOperatorExtension.builder()
2424
.waitForNamespaceDeletion(false)

0 commit comments

Comments
 (0)