diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java index bc2d3f9eec..a31c7f4fbf 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java @@ -41,6 +41,7 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedDependentResourceContext; import io.javaoperatorsdk.operator.health.ControllerHealthInfo; import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow; +import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowBuilder; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult; import io.javaoperatorsdk.operator.processing.event.EventProcessor; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; @@ -93,7 +94,11 @@ public Controller(Reconciler

reconciler, isCleaner = reconciler instanceof Cleaner; final var managed = configurationService.getWorkflowFactory().workflowFor(configuration); - managedWorkflow = managed.resolve(kubernetesClient, configuration); + // wrap original wrapper so that we can properly set the result in case it's throwing an + // exception + final Workflow workflow = managed.resolve(kubernetesClient, configuration); + managedWorkflow = WorkflowBuilder.from(workflow) + .withThrowExceptionFurther(false).build(); eventSourceManager = new EventSourceManager<>(this); eventProcessor = new EventProcessor<>(eventSourceManager, configurationService); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java index d65e21659c..8e92fababc 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowBuilder.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @@ -14,11 +15,21 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public class WorkflowBuilder

{ - private final Map> dependentResourceNodes = - new HashMap<>(); - private boolean throwExceptionAutomatically = THROW_EXCEPTION_AUTOMATICALLY_DEFAULT; + private final Map> dependentResourceNodes; + private boolean throwExceptionAutomatically; private DependentResourceNode currentNode; - private boolean isCleaner = false; + private boolean isCleaner; + + public WorkflowBuilder() { + this(new HashMap<>(), THROW_EXCEPTION_AUTOMATICALLY_DEFAULT, false); + } + + private WorkflowBuilder(Map> dependentResourceNodes, + boolean throwExceptionAutomatically, boolean isCleaner) { + this.dependentResourceNodes = dependentResourceNodes; + this.throwExceptionAutomatically = throwExceptionAutomatically; + this.isCleaner = isCleaner; + } public WorkflowBuilder

addDependentResource(DependentResource dependentResource) { return addDependentResource(dependentResource, null); @@ -91,4 +102,12 @@ public Workflow

build() { return new DefaultWorkflow(new HashSet<>(dependentResourceNodes.values()), throwExceptionAutomatically, isCleaner); } + + public static

WorkflowBuilder

from(Workflow

workflow) { + final Map> nodes = + workflow.getDependentResourcesByName().entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, + e -> new DependentResourceNode(e.getKey(), e.getValue()))); + return new WorkflowBuilder<>(nodes, false, workflow.hasCleaner()); + } }