|
1 | 1 | package io.javaoperatorsdk.operator.processing;
|
2 | 2 |
|
3 |
| -import java.util.*; |
| 3 | +import java.util.ArrayList; |
| 4 | +import java.util.HashMap; |
| 5 | +import java.util.List; |
| 6 | +import java.util.Map; |
| 7 | +import java.util.Optional; |
| 8 | +import java.util.Set; |
4 | 9 |
|
5 | 10 | import org.slf4j.Logger;
|
6 | 11 | import org.slf4j.LoggerFactory;
|
|
18 | 23 | import io.javaoperatorsdk.operator.RegisteredController;
|
19 | 24 | import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
|
20 | 25 | import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
|
| 26 | +import io.javaoperatorsdk.operator.api.config.workflow.WorkflowSpec; |
21 | 27 | import io.javaoperatorsdk.operator.api.monitoring.Metrics;
|
22 | 28 | import io.javaoperatorsdk.operator.api.monitoring.Metrics.ControllerExecution;
|
23 |
| -import io.javaoperatorsdk.operator.api.reconciler.*; |
| 29 | +import io.javaoperatorsdk.operator.api.reconciler.Cleaner; |
| 30 | +import io.javaoperatorsdk.operator.api.reconciler.Constants; |
| 31 | +import io.javaoperatorsdk.operator.api.reconciler.Context; |
| 32 | +import io.javaoperatorsdk.operator.api.reconciler.ContextInitializer; |
| 33 | +import io.javaoperatorsdk.operator.api.reconciler.DeleteControl; |
| 34 | +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; |
| 35 | +import io.javaoperatorsdk.operator.api.reconciler.Ignore; |
| 36 | +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; |
| 37 | +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; |
24 | 38 | import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceNotFoundException;
|
25 | 39 | import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
|
26 | 40 | import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer;
|
27 |
| -import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedDependentResourceContext; |
| 41 | +import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedWorkflowAndDependentResourceContext; |
28 | 42 | import io.javaoperatorsdk.operator.health.ControllerHealthInfo;
|
29 | 43 | import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
|
30 | 44 | import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult;
|
@@ -130,12 +144,11 @@ public Map<String, Object> metadata() {
|
130 | 144 | @Override
|
131 | 145 | public UpdateControl<P> execute() throws Exception {
|
132 | 146 | initContextIfNeeded(resource, context);
|
133 |
| - if (!managedWorkflow.isEmpty()) { |
134 |
| - var res = managedWorkflow.reconcile(resource, context); |
135 |
| - ((DefaultManagedDependentResourceContext) context.managedDependentResourceContext()) |
136 |
| - .setWorkflowExecutionResult(res); |
137 |
| - res.throwAggregateExceptionIfErrorsPresent(); |
138 |
| - } |
| 147 | + configuration.getWorkflowSpec().ifPresent(ws -> { |
| 148 | + if (!isWorkflowExplicitInvocation()) { |
| 149 | + reconcileManagedWorkflow(resource, context); |
| 150 | + } |
| 151 | + }); |
139 | 152 | return reconciler.reconcile(resource, context);
|
140 | 153 | }
|
141 | 154 | });
|
@@ -175,12 +188,13 @@ public Map<String, Object> metadata() {
|
175 | 188 | public DeleteControl execute() {
|
176 | 189 | initContextIfNeeded(resource, context);
|
177 | 190 | WorkflowCleanupResult workflowCleanupResult = null;
|
178 |
| - if (managedWorkflow.hasCleaner()) { |
179 |
| - workflowCleanupResult = managedWorkflow.cleanup(resource, context); |
180 |
| - ((DefaultManagedDependentResourceContext) context.managedDependentResourceContext()) |
181 |
| - .setWorkflowCleanupResult(workflowCleanupResult); |
182 |
| - workflowCleanupResult.throwAggregateExceptionIfErrorsPresent(); |
| 191 | + |
| 192 | + // The cleanup is called also when explicit invocation is true, but the cleaner is not |
| 193 | + // implemented |
| 194 | + if (!isCleaner || !isWorkflowExplicitInvocation()) { |
| 195 | + workflowCleanupResult = cleanupManagedWorkflow(resource, context); |
183 | 196 | }
|
| 197 | + |
184 | 198 | if (isCleaner) {
|
185 | 199 | var cleanupResult = ((Cleaner<P>) reconciler).cleanup(resource, context);
|
186 | 200 | if (!cleanupResult.isRemoveFinalizer()) {
|
@@ -429,4 +443,32 @@ public ExecutorServiceManager getExecutorServiceManager() {
|
429 | 443 | public EventSourceContext<P> eventSourceContext() {
|
430 | 444 | return eventSourceContext;
|
431 | 445 | }
|
| 446 | + |
| 447 | + public void reconcileManagedWorkflow(P primary, Context<P> context) { |
| 448 | + if (!managedWorkflow.isEmpty()) { |
| 449 | + var res = managedWorkflow.reconcile(primary, context); |
| 450 | + ((DefaultManagedWorkflowAndDependentResourceContext) context |
| 451 | + .managedWorkflowAndDependentResourceContext()) |
| 452 | + .setWorkflowExecutionResult(res); |
| 453 | + res.throwAggregateExceptionIfErrorsPresent(); |
| 454 | + } |
| 455 | + } |
| 456 | + |
| 457 | + public WorkflowCleanupResult cleanupManagedWorkflow(P resource, Context<P> context) { |
| 458 | + if (managedWorkflow.hasCleaner()) { |
| 459 | + var workflowCleanupResult = managedWorkflow.cleanup(resource, context); |
| 460 | + ((DefaultManagedWorkflowAndDependentResourceContext) context |
| 461 | + .managedWorkflowAndDependentResourceContext()) |
| 462 | + .setWorkflowCleanupResult(workflowCleanupResult); |
| 463 | + workflowCleanupResult.throwAggregateExceptionIfErrorsPresent(); |
| 464 | + return workflowCleanupResult; |
| 465 | + } else { |
| 466 | + return null; |
| 467 | + } |
| 468 | + } |
| 469 | + |
| 470 | + public boolean isWorkflowExplicitInvocation() { |
| 471 | + return configuration.getWorkflowSpec().map(WorkflowSpec::isExplicitInvocation) |
| 472 | + .orElse(false); |
| 473 | + } |
432 | 474 | }
|
0 commit comments