Skip to content

Commit 553e389

Browse files
committed
fix: ready impl no tests
1 parent e6a5057 commit 553e389

File tree

6 files changed

+49
-30
lines changed

6 files changed

+49
-30
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DependentResourceNode.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public DependentResourceNode(DependentResource<R, P> dependentResource) {
2323
}
2424

2525
public DependentResourceNode(DependentResource<R, P> dependentResource,
26-
ReconcileCondition reconcileCondition) {
26+
ReconcileCondition<P> reconcileCondition) {
2727
this(dependentResource, reconcileCondition, null);
2828
}
2929

@@ -76,8 +76,8 @@ public DependentResourceNode<R, P> setCleanupCondition(CleanupCondition cleanupC
7676
return this;
7777
}
7878

79-
public ReadyCondition<R, P> getReadyCondition() {
80-
return readyCondition;
79+
public Optional<ReadyCondition<R, P>> getReadyCondition() {
80+
return Optional.ofNullable(readyCondition);
8181
}
8282

8383
public DependentResourceNode<R, P> setReadyCondition(ReadyCondition<R, P> readyCondition) {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/Workflow.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,27 @@
1818
*/
1919
public class Workflow<P extends HasMetadata> {
2020

21-
private final List<DependentResourceNode<?, ?>> dependentResourceNodes;
22-
private final List<DependentResourceNode<?, ?>> topLevelResources = new ArrayList<>();
23-
private Map<DependentResourceNode<?, ?>, List<DependentResourceNode<?, ?>>> dependents;
21+
private final List<DependentResourceNode<?, P>> dependentResourceNodes;
22+
private final List<DependentResourceNode<?, P>> topLevelResources = new ArrayList<>();
23+
private Map<DependentResourceNode<?, P>, List<DependentResourceNode<?, P>>> dependents;
2424

2525
// it's "global" executor service shared between multiple reconciliations running parallel
2626
private ExecutorService executorService;
2727

28-
public Workflow(List<DependentResourceNode<?, ?>> dependentResourceNodes) {
28+
public Workflow(List<DependentResourceNode<?, P>> dependentResourceNodes) {
2929
this.executorService = ConfigurationServiceProvider.instance().getExecutorService();
3030
this.dependentResourceNodes = dependentResourceNodes;
3131
preprocessForReconcile();
3232
}
3333

34-
public Workflow(List<DependentResourceNode<?, ?>> dependentResourceNodes,
34+
public Workflow(List<DependentResourceNode<?, P>> dependentResourceNodes,
3535
ExecutorService executorService) {
3636
this.executorService = executorService;
3737
this.dependentResourceNodes = dependentResourceNodes;
3838
preprocessForReconcile();
3939
}
4040

41-
public Workflow(List<DependentResourceNode<?, ?>> dependentResourceNodes, int globalParallelism) {
41+
public Workflow(List<DependentResourceNode<?, P>> dependentResourceNodes, int globalParallelism) {
4242
this(dependentResourceNodes, Executors.newFixedThreadPool(globalParallelism));
4343
}
4444

@@ -55,11 +55,11 @@ public void cleanup(P resource, Context<P> context) {
5555
// add cycle detection?
5656
private void preprocessForReconcile() {
5757
dependents = new ConcurrentHashMap<>(dependentResourceNodes.size());
58-
for (DependentResourceNode<?, ?> node : dependentResourceNodes) {
58+
for (DependentResourceNode<?, P> node : dependentResourceNodes) {
5959
if (node.getDependsOn().isEmpty()) {
6060
topLevelResources.add(node);
6161
} else {
62-
for (DependentResourceNode<?, ?> dependsOn : node.getDependsOn()) {
62+
for (DependentResourceNode<?, P> dependsOn : node.getDependsOn()) {
6363
dependents.computeIfAbsent(dependsOn, dr -> new ArrayList<>());
6464
dependents.get(dependsOn).add(node);
6565
}
@@ -71,11 +71,11 @@ public void setExecutorService(ExecutorService executorService) {
7171
this.executorService = executorService;
7272
}
7373

74-
List<DependentResourceNode<?, ?>> getTopLevelDependentResources() {
74+
List<DependentResourceNode<?, P>> getTopLevelDependentResources() {
7575
return topLevelResources;
7676
}
7777

78-
Map<DependentResourceNode<?, ?>, List<DependentResourceNode<?, ?>>> getDependents() {
78+
Map<DependentResourceNode<?, P>, List<DependentResourceNode<?, P>>> getDependents() {
7979
return dependents;
8080
}
8181

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.javaoperatorsdk.operator.AggregatedOperatorException;
1111
import io.javaoperatorsdk.operator.api.reconciler.Context;
1212
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
13+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1314
import io.javaoperatorsdk.operator.processing.dependent.workflow.condition.ReconcileCondition;
1415

1516
public class WorkflowReconcileExecutor<P extends HasMetadata> {
@@ -20,6 +21,8 @@ public class WorkflowReconcileExecutor<P extends HasMetadata> {
2021

2122
private final Set<DependentResourceNode<?, ?>> alreadyReconciled = ConcurrentHashMap.newKeySet();
2223
private final Set<DependentResourceNode<?, ?>> errored = ConcurrentHashMap.newKeySet();
24+
private final Set<DependentResourceNode<?, ?>> reconciledButNotReady =
25+
ConcurrentHashMap.newKeySet();
2326
private final Set<DependentResourceNode<?, ?>> reconcileConditionOrParentsConditionNotMet =
2427
ConcurrentHashMap.newKeySet();
2528

@@ -39,9 +42,9 @@ public WorkflowReconcileExecutor(Workflow<P> workflow, P primary, Context<P> con
3942

4043
// add reconcile results
4144
public synchronized void reconcile() {
42-
for (DependentResourceNode<?, ?> dependentResourceNode : workflow
45+
for (DependentResourceNode<?, P> dependentResourceNode : workflow
4346
.getTopLevelDependentResources()) {
44-
handleReconcileOrDelete(dependentResourceNode, false);
47+
handleReconcile(dependentResourceNode, false);
4548
}
4649
while (true) {
4750
try {
@@ -62,14 +65,14 @@ public synchronized void reconcile() {
6265
}
6366
}
6467

65-
private synchronized void handleReconcileOrDelete(
66-
DependentResourceNode<?, ?> dependentResourceNode,
68+
private synchronized void handleReconcile(
69+
DependentResourceNode<?, P> dependentResourceNode,
6770
boolean onlyReconcileForPossibleDelete) {
6871
log.debug("Submitting for reconcile: {}", dependentResourceNode);
6972

7073
if (alreadyReconciled(dependentResourceNode)
7174
|| isReconcilingNow(dependentResourceNode)
72-
|| !allDependsReconciled(dependentResourceNode)
75+
|| !allDependsReconciledAndReady(dependentResourceNode)
7376
|| hasErroredDependOn(dependentResourceNode)) {
7477
log.debug("Skipping submit of: {}, ", dependentResourceNode);
7578
return;
@@ -114,10 +117,10 @@ private boolean ownOrParentsReconcileConditionNotMet(
114117

115118
private class NodeExecutor implements Runnable {
116119

117-
private final DependentResourceNode dependentResourceNode;
120+
private final DependentResourceNode<?, P> dependentResourceNode;
118121
private final boolean onlyReconcileForPossibleDelete;
119122

120-
private NodeExecutor(DependentResourceNode<?, ?> dependentResourceNode,
123+
private NodeExecutor(DependentResourceNode<?, P> dependentResourceNode,
121124
boolean onlyReconcileForDelete) {
122125
this.dependentResourceNode = dependentResourceNode;
123126
this.onlyReconcileForPossibleDelete = onlyReconcileForDelete;
@@ -127,16 +130,25 @@ private NodeExecutor(DependentResourceNode<?, ?> dependentResourceNode,
127130
@SuppressWarnings("unchecked")
128131
public void run() {
129132
try {
130-
var dependentResource = dependentResourceNode.getDependentResource();
133+
DependentResource dependentResource = dependentResourceNode.getDependentResource();
134+
boolean handleDependents = true;
131135
if (onlyReconcileForPossibleDelete) {
132136
if (dependentResource instanceof Deleter) {
133137
((Deleter<P>) dependentResource).delete(primary, context);
134138
}
135139
} else {
136140
dependentResource.reconcile(primary, context);
141+
if (dependentResourceNode.getReadyCondition().isPresent()
142+
&& !dependentResourceNode.getReadyCondition().get()
143+
.isMet(dependentResource, primary, context)) {
144+
handleDependents = false;
145+
reconciledButNotReady.add(dependentResourceNode);
146+
}
137147
}
138148
alreadyReconciled.add(dependentResourceNode);
139-
handleDependentsReconcile(dependentResourceNode, onlyReconcileForPossibleDelete);
149+
if (handleDependents) {
150+
handleDependentsReconcile(dependentResourceNode, onlyReconcileForPossibleDelete);
151+
}
140152
} catch (RuntimeException e) {
141153
handleExceptionInExecutor(dependentResourceNode, e);
142154
} finally {
@@ -150,10 +162,10 @@ private boolean isReconcilingNow(DependentResourceNode<?, ?> dependentResourceNo
150162
}
151163

152164
private synchronized void handleDependentsReconcile(
153-
DependentResourceNode<?, ?> dependentResourceNode, boolean onlyReconcileForPossibleDelete) {
165+
DependentResourceNode<?, P> dependentResourceNode, boolean onlyReconcileForPossibleDelete) {
154166
var dependents = workflow.getDependents().get(dependentResourceNode);
155167
if (dependents != null) {
156-
dependents.forEach(d -> handleReconcileOrDelete(d, onlyReconcileForPossibleDelete));
168+
dependents.forEach(d -> handleReconcile(d, onlyReconcileForPossibleDelete));
157169
}
158170
}
159171

@@ -180,11 +192,12 @@ private void handleReconcileCondition(DependentResourceNode<?, ?> dependentResou
180192
}
181193
}
182194

183-
private boolean allDependsReconciled(
195+
private boolean allDependsReconciledAndReady(
184196
DependentResourceNode<?, ?> dependentResourceNode) {
185197
return dependentResourceNode.getDependsOn().isEmpty()
186198
|| dependentResourceNode.getDependsOn().stream()
187-
.allMatch(this::alreadyReconciled);
199+
.allMatch(d -> alreadyReconciled(d)
200+
&& !reconciledButNotReady.contains(dependentResourceNode));
188201
}
189202

190203
private boolean hasErroredDependOn(

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/builder/DependentBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.fabric8.kubernetes.api.model.HasMetadata;
44
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
55
import io.javaoperatorsdk.operator.processing.dependent.workflow.DependentResourceNode;
6+
import io.javaoperatorsdk.operator.processing.dependent.workflow.condition.ReadyCondition;
67
import io.javaoperatorsdk.operator.processing.dependent.workflow.condition.ReconcileCondition;
78

89
public class DependentBuilder<P extends HasMetadata> {
@@ -28,6 +29,11 @@ public DependentBuilder<P> withReconcileCondition(ReconcileCondition reconcileCo
2829
return this;
2930
}
3031

32+
public DependentBuilder<P> withReadyCondition(ReadyCondition readyCondition) {
33+
node.setReadyCondition(readyCondition);
34+
return this;
35+
}
36+
3137
public WorkflowBuilder<P> build() {
3238
return workflowBuilder;
3339
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/builder/WorkflowBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212

1313
public class WorkflowBuilder<P extends HasMetadata> {
1414

15-
private List<DependentResourceNode<?, ?>> dependentResourceNodes = new ArrayList<>();
15+
private List<DependentResourceNode<?, P>> dependentResourceNodes = new ArrayList<>();
1616

17-
public DependentBuilder<P> addDependent(DependentResource<?, ?> dependentResource) {
18-
DependentResourceNode<?, ?> node = new DependentResourceNode<>(dependentResource);
17+
public DependentBuilder<P> addDependent(DependentResource<?, P> dependentResource) {
18+
DependentResourceNode<?, P> node = new DependentResourceNode<>(dependentResource);
1919
dependentResourceNodes.add(node);
2020
return new DependentBuilder<>(this, node);
2121
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/condition/ReadyCondition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66

77
public interface ReadyCondition<R, P extends HasMetadata> {
88

9-
void isMet(DependentResource<R, P> dependentResource, P primary, Context<P> context);
9+
boolean isMet(DependentResource<R, P> dependentResource, P primary, Context<P> context);
1010

1111
}

0 commit comments

Comments
 (0)