diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java index 2c94840d38..09c1687e1e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java @@ -1,12 +1,10 @@ package io.javaoperatorsdk.operator.api.reconciler; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow; import io.javaoperatorsdk.operator.processing.event.source.EventSource; import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource; @@ -43,12 +41,30 @@ static Map nameEventSources(EventSource... eventSources) { return eventSourceMap; } - @SuppressWarnings("unchecked,rawtypes") + @SuppressWarnings("unchecked") + static Map eventSourcesFromWorkflow( + EventSourceContext context, + Workflow workflow) { + Map result = new HashMap<>(); + for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) { + var eventSource = e.getValue().eventSource(context); + eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es)); + } + return result; + } + + @SuppressWarnings("rawtypes") static Map nameEventSourcesFromDependentResource( EventSourceContext context, DependentResource... dependentResources) { + return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources)); + } + + @SuppressWarnings("unchecked,rawtypes") + static Map nameEventSourcesFromDependentResource( + EventSourceContext context, Collection dependentResources) { if (dependentResources != null) { - Map eventSourceMap = new HashMap<>(dependentResources.length); + Map eventSourceMap = new HashMap<>(dependentResources.size()); for (DependentResource dependentResource : dependentResources) { Optional es = dependentResource.eventSource(context); es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e)); diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java index 28a0b4e84f..e3ab63dc54 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java @@ -37,7 +37,7 @@ public static void main(String[] args) throws IOException { .equals(reconcilerEnvVar)) { operator.register(new WebPageManagedDependentsReconciler()); } else { - operator.register(new WebPageStandaloneDependentsReconciler(client)); + operator.register(new WebPageStandaloneDependentsReconciler()); } operator.start(); diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java index af938a7833..4be2da11c7 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageReconciler.java @@ -107,7 +107,7 @@ public UpdateControl reconcile(WebPage webPage, Context contex "Creating or updating ConfigMap {} in {}", desiredHtmlConfigMap.getMetadata().getName(), ns); - var res = kubernetesClient.configMaps().inNamespace(ns).resource(desiredHtmlConfigMap) + kubernetesClient.configMaps().inNamespace(ns).resource(desiredHtmlConfigMap) .createOr(Replaceable::update); } diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java index 34a208f72e..1799d72cea 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java @@ -7,19 +7,13 @@ import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.ConfigMap; -import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.api.model.networking.v1.Ingress; -import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.*; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfigBuilder; +import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow; +import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; import io.javaoperatorsdk.operator.processing.event.source.EventSource; import io.javaoperatorsdk.operator.sample.customresource.WebPage; -import io.javaoperatorsdk.operator.sample.dependentresource.ConfigMapDependentResource; -import io.javaoperatorsdk.operator.sample.dependentresource.DeploymentDependentResource; -import io.javaoperatorsdk.operator.sample.dependentresource.IngressDependentResource; -import io.javaoperatorsdk.operator.sample.dependentresource.ServiceDependentResource; +import io.javaoperatorsdk.operator.sample.dependentresource.*; import static io.javaoperatorsdk.operator.sample.Utils.*; import static io.javaoperatorsdk.operator.sample.WebPageManagedDependentsReconciler.SELECTOR; @@ -34,19 +28,15 @@ public class WebPageStandaloneDependentsReconciler private static final Logger log = LoggerFactory.getLogger(WebPageStandaloneDependentsReconciler.class); - private KubernetesDependentResource configMapDR; - private KubernetesDependentResource deploymentDR; - private KubernetesDependentResource serviceDR; - private KubernetesDependentResource ingressDR; + private Workflow workflow; - public WebPageStandaloneDependentsReconciler(KubernetesClient kubernetesClient) { - createDependentResources(kubernetesClient); + public WebPageStandaloneDependentsReconciler() { + workflow = createDependentResourcesAndWorkflow(); } @Override public Map prepareEventSources(EventSourceContext context) { - return EventSourceInitializer.nameEventSourcesFromDependentResource(context, configMapDR, - deploymentDR, serviceDR, ingressDR); + return EventSourceInitializer.eventSourcesFromWorkflow(context, workflow); } @Override @@ -58,14 +48,7 @@ public UpdateControl reconcile(WebPage webPage, Context contex return UpdateControl.patchStatus(setInvalidHtmlErrorMessage(webPage)); } - Arrays.asList(configMapDR, deploymentDR, serviceDR) - .forEach(dr -> dr.reconcile(webPage, context)); - - if (Boolean.TRUE.equals(webPage.getSpec().getExposed())) { - ingressDR.reconcile(webPage, context); - } else { - ingressDR.delete(webPage, context); - } + workflow.reconcile(webPage, context); webPage.setStatus( createStatus( @@ -80,16 +63,23 @@ public ErrorStatusUpdateControl updateErrorStatus( } @SuppressWarnings({"unchecked", "rawtypes"}) - private void createDependentResources(KubernetesClient client) { - this.configMapDR = new ConfigMapDependentResource(); - this.deploymentDR = new DeploymentDependentResource(); - this.serviceDR = new ServiceDependentResource(); - this.ingressDR = new IngressDependentResource(); - - Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR).forEach(dr -> { - dr.configureWith(new KubernetesDependentResourceConfigBuilder() - .withLabelSelector(SELECTOR + "=true").build()); - }); + private Workflow createDependentResourcesAndWorkflow() { + var configMapDR = new ConfigMapDependentResource(); + var deploymentDR = new DeploymentDependentResource(); + var serviceDR = new ServiceDependentResource(); + var ingressDR = new IngressDependentResource(); + + Arrays.asList(configMapDR, deploymentDR, serviceDR, ingressDR) + .forEach(dr -> dr.configureWith(new KubernetesDependentResourceConfigBuilder() + .withLabelSelector(SELECTOR + "=true").build())); + + return new WorkflowBuilder() + .addDependentResource(configMapDR) + .addDependentResource(deploymentDR) + .addDependentResource(serviceDR) + .addDependentResource(ingressDR) + .withReconcilePrecondition(new ExposedIngressCondition()) + .build(); } diff --git a/sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorStandaloneDependentResourcesE2E.java b/sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorStandaloneDependentResourcesE2E.java index e1e9e65f96..7786473257 100644 --- a/sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorStandaloneDependentResourcesE2E.java +++ b/sample-operators/webpage/src/test/java/io/javaoperatorsdk/operator/sample/WebPageOperatorStandaloneDependentResourcesE2E.java @@ -18,7 +18,7 @@ public WebPageOperatorStandaloneDependentResourcesE2E() throws FileNotFoundExcep isLocal() ? LocallyRunOperatorExtension.builder() .waitForNamespaceDeletion(false) - .withReconciler(new WebPageStandaloneDependentsReconciler(client)) + .withReconciler(new WebPageStandaloneDependentsReconciler()) .build() : ClusterDeployedOperatorExtension.builder() .waitForNamespaceDeletion(false)