Skip to content

Commit 0112e6f

Browse files
committed
feat: explicit workflow invocation
Signed-off-by: Attila Mészáros <[email protected]>
1 parent b720b16 commit 0112e6f

File tree

8 files changed

+62
-13
lines changed

8 files changed

+62
-13
lines changed

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ protected <P extends HasMetadata> ControllerConfiguration<P> configFor(Reconcile
169169
io.javaoperatorsdk.operator.api.reconciler.Workflow.class);
170170
if (workflowAnnotation != null) {
171171
List<DependentResourceSpec> specs = dependentResources(workflowAnnotation, config);
172-
WorkflowSpec workflowSpec = new WorkflowSpec(specs);
172+
WorkflowSpec workflowSpec = new WorkflowSpec(specs, workflowAnnotation.explicitInvocation());
173173
config.setWorkflowSpec(workflowSpec);
174174
}
175175

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/workflow/WorkflowSpec.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,19 @@ public class WorkflowSpec {
88

99
@SuppressWarnings("rawtypes")
1010
private final List<DependentResourceSpec> dependentResourceSpecs;
11+
private final boolean explicitInvocation;
1112

12-
public WorkflowSpec(List<DependentResourceSpec> dependentResourceSpecs) {
13+
public WorkflowSpec(List<DependentResourceSpec> dependentResourceSpecs,
14+
boolean explicitInvocation) {
1315
this.dependentResourceSpecs = dependentResourceSpecs;
16+
this.explicitInvocation = explicitInvocation;
1417
}
1518

1619
public List<DependentResourceSpec> getDependentResourceSpecs() {
1720
return dependentResourceSpecs;
1821
}
22+
23+
public boolean isExplicitInvocation() {
24+
return explicitInvocation;
25+
}
1926
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/DefaultContext.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@ public class DefaultContext<P extends HasMetadata> implements Context<P> {
2121
private final Controller<P> controller;
2222
private final P primaryResource;
2323
private final ControllerConfiguration<P> controllerConfiguration;
24-
private final DefaultManagedDependentResourceContext defaultManagedDependentResourceContext;
24+
private final DefaultManagedDependentResourceContext<P> defaultManagedDependentResourceContext;
2525

2626
public DefaultContext(RetryInfo retryInfo, Controller<P> controller, P primaryResource) {
2727
this.retryInfo = retryInfo;
2828
this.controller = controller;
2929
this.primaryResource = primaryResource;
3030
this.controllerConfiguration = controller.getConfiguration();
31-
this.defaultManagedDependentResourceContext = new DefaultManagedDependentResourceContext();
31+
this.defaultManagedDependentResourceContext =
32+
new DefaultManagedDependentResourceContext<>(controller, primaryResource, this);
3233
}
3334

3435
@Override

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Workflow.java

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.lang.annotation.*;
44

5+
import io.fabric8.kubernetes.api.model.HasMetadata;
56
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
67

78
@Inherited
@@ -11,4 +12,12 @@
1112

1213
Dependent[] dependents();
1314

15+
// todo maybe better naming? "explicitReconciliation" ?
16+
/**
17+
* If true, managed workflow should be explicitly invoked within the reconciler implementation. If
18+
* false workflow is invoked just before the {@link Reconciler#reconcile(HasMetadata, Context)}
19+
* method.
20+
*/
21+
boolean explicitInvocation() default false;
22+
1423
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/managed/DefaultManagedDependentResourceContext.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,30 @@
33
import java.util.Optional;
44
import java.util.concurrent.ConcurrentHashMap;
55

6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.javaoperatorsdk.operator.api.reconciler.Context;
8+
import io.javaoperatorsdk.operator.processing.Controller;
69
import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult;
710
import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowReconcileResult;
811

912
@SuppressWarnings("rawtypes")
10-
public class DefaultManagedDependentResourceContext implements ManagedDependentResourceContext {
13+
public class DefaultManagedDependentResourceContext<P extends HasMetadata>
14+
implements ManagedDependentResourceContext {
1115

16+
private final ConcurrentHashMap attributes = new ConcurrentHashMap();
17+
private final Controller<P> controller;
18+
private final P primaryResource;
19+
private final Context<P> context;
1220
private WorkflowReconcileResult workflowReconcileResult;
1321
private WorkflowCleanupResult workflowCleanupResult;
14-
private final ConcurrentHashMap attributes = new ConcurrentHashMap();
22+
23+
public DefaultManagedDependentResourceContext(Controller<P> controller,
24+
P primaryResource,
25+
Context<P> context) {
26+
this.controller = controller;
27+
this.primaryResource = primaryResource;
28+
this.context = context;
29+
}
1530

1631
@Override
1732
public <T> Optional<T> get(Object key, Class<T> expectedType) {
@@ -58,4 +73,10 @@ public WorkflowReconcileResult getWorkflowReconcileResult() {
5873
public WorkflowCleanupResult getWorkflowCleanupResult() {
5974
return workflowCleanupResult;
6075
}
76+
77+
@Override
78+
public void invokeWorkflow() {
79+
controller.invokeManagedWorkflow(primaryResource, context);
80+
}
81+
6182
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/managed/ManagedDependentResourceContext.java

+3
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,7 @@ public interface ManagedDependentResourceContext {
5555
WorkflowReconcileResult getWorkflowReconcileResult();
5656

5757
WorkflowCleanupResult getWorkflowCleanupResult();
58+
59+
void invokeWorkflow();
60+
5861
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,11 @@ public Map<String, Object> metadata() {
130130
@Override
131131
public UpdateControl<P> execute() throws Exception {
132132
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-
}
133+
configuration.getWorkflowSpec().ifPresent(ws -> {
134+
if (!ws.isExplicitInvocation()) {
135+
invokeManagedWorkflow(resource, context);
136+
}
137+
});
139138
return reconciler.reconcile(resource, context);
140139
}
141140
});
@@ -429,4 +428,13 @@ public ExecutorServiceManager getExecutorServiceManager() {
429428
public EventSourceContext<P> eventSourceContext() {
430429
return eventSourceContext;
431430
}
431+
432+
public void invokeManagedWorkflow(P primary, Context<P> context) {
433+
if (!managedWorkflow.isEmpty()) {
434+
var res = managedWorkflow.reconcile(primary, context);
435+
((DefaultManagedDependentResourceContext) context.managedDependentResourceContext())
436+
.setWorkflowExecutionResult(res);
437+
res.throwAggregateExceptionIfErrorsPresent();
438+
}
439+
}
432440
}

Diff for: operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ ManagedWorkflow managedWorkflow(DependentResourceSpec... specs) {
6464
final var configuration = mock(ControllerConfiguration.class);
6565
final var specList = List.of(specs);
6666

67-
var ws = new WorkflowSpec(specList);
67+
var ws = new WorkflowSpec(specList, false);
6868
when(configuration.getWorkflowSpec()).thenReturn(Optional.of(ws));
6969

7070
return new BaseConfigurationService().getWorkflowFactory()

0 commit comments

Comments
 (0)