Skip to content

Commit 3c080a0

Browse files
csvirimetacosm
andauthored
fix: multiple dependents of same type exceptions (#2226)
Signed-off-by: Attila Mészáros <[email protected]> Signed-off-by: Chris Laprun <[email protected]> Co-authored-by: Chris Laprun <[email protected]>
1 parent 515589a commit 3c080a0

File tree

2 files changed

+82
-3
lines changed

2 files changed

+82
-3
lines changed

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

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package io.javaoperatorsdk.operator.processing.dependent.workflow;
22

3+
import java.util.HashMap;
34
import java.util.Map;
45
import java.util.Map.Entry;
5-
import java.util.stream.Collectors;
66

77
import io.javaoperatorsdk.operator.AggregatedOperatorException;
88
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
99

1010
@SuppressWarnings("rawtypes")
1111
class WorkflowResult {
1212

13+
private static final String NUMBER_DELIMITER = "_";
1314
private final Map<DependentResource, Exception> erroredDependents;
1415

1516
WorkflowResult(Map<DependentResource, Exception> erroredDependents) {
@@ -36,9 +37,22 @@ public boolean erroredDependentsExist() {
3637

3738
public void throwAggregateExceptionIfErrorsPresent() {
3839
if (erroredDependentsExist()) {
40+
Map<String, Exception> exceptionMap = new HashMap<>();
41+
Map<String, Integer> numberOfClasses = new HashMap<>();
42+
43+
for (Entry<DependentResource, Exception> entry : erroredDependents.entrySet()) {
44+
String name = entry.getKey().getClass().getName();
45+
var num = numberOfClasses.getOrDefault(name, 0);
46+
if (num > 0) {
47+
exceptionMap.put(name + NUMBER_DELIMITER + num, entry.getValue());
48+
} else {
49+
exceptionMap.put(name, entry.getValue());
50+
}
51+
numberOfClasses.put(name, num + 1);
52+
}
53+
3954
throw new AggregatedOperatorException("Exception(s) during workflow execution.",
40-
erroredDependents.entrySet().stream()
41-
.collect(Collectors.toMap(e -> e.getKey().getClass().getName(), Entry::getValue)));
55+
exceptionMap);
4256
}
4357
}
4458
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.javaoperatorsdk.operator.processing.dependent.workflow;
2+
3+
import java.util.Map;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import io.fabric8.kubernetes.api.model.HasMetadata;
8+
import io.javaoperatorsdk.operator.AggregatedOperatorException;
9+
import io.javaoperatorsdk.operator.api.reconciler.Context;
10+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
11+
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
class WorkflowResultTest {
16+
17+
@Test
18+
void throwsExceptionWithoutNumberingIfAllDifferentClass() {
19+
var res = new WorkflowResult(Map.of(new DependentA(), new RuntimeException(),
20+
new DependentB(), new RuntimeException()));
21+
try {
22+
res.throwAggregateExceptionIfErrorsPresent();
23+
} catch (AggregatedOperatorException e) {
24+
assertThat(e.getAggregatedExceptions()).containsOnlyKeys(DependentA.class.getName(),
25+
DependentB.class.getName());
26+
}
27+
}
28+
29+
@Test
30+
void numbersDependentClassNamesIfMoreOfSameType() {
31+
var res = new WorkflowResult(Map.of(new DependentA(), new RuntimeException(),
32+
new DependentA(), new RuntimeException()));
33+
try {
34+
res.throwAggregateExceptionIfErrorsPresent();
35+
} catch (AggregatedOperatorException e) {
36+
assertThat(e.getAggregatedExceptions()).hasSize(2);
37+
}
38+
}
39+
40+
@SuppressWarnings("rawtypes")
41+
static class DependentA implements DependentResource {
42+
@Override
43+
public ReconcileResult reconcile(HasMetadata primary, Context context) {
44+
return null;
45+
}
46+
47+
@Override
48+
public Class resourceType() {
49+
return null;
50+
}
51+
}
52+
53+
@SuppressWarnings("rawtypes")
54+
static class DependentB implements DependentResource {
55+
@Override
56+
public ReconcileResult reconcile(HasMetadata primary, Context context) {
57+
return null;
58+
}
59+
60+
@Override
61+
public Class resourceType() {
62+
return null;
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)