Skip to content

Commit

Permalink
fix: multiple dependents of same type exceptions (#2226)
Browse files Browse the repository at this point in the history
Signed-off-by: Attila Mészáros <[email protected]>
Signed-off-by: Chris Laprun <[email protected]>
Co-authored-by: Chris Laprun <[email protected]>
  • Loading branch information
csviri and metacosm authored Feb 6, 2024
1 parent 515589a commit 3c080a0
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package io.javaoperatorsdk.operator.processing.dependent.workflow;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import io.javaoperatorsdk.operator.AggregatedOperatorException;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;

@SuppressWarnings("rawtypes")
class WorkflowResult {

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

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

public void throwAggregateExceptionIfErrorsPresent() {
if (erroredDependentsExist()) {
Map<String, Exception> exceptionMap = new HashMap<>();
Map<String, Integer> numberOfClasses = new HashMap<>();

for (Entry<DependentResource, Exception> entry : erroredDependents.entrySet()) {
String name = entry.getKey().getClass().getName();
var num = numberOfClasses.getOrDefault(name, 0);
if (num > 0) {
exceptionMap.put(name + NUMBER_DELIMITER + num, entry.getValue());
} else {
exceptionMap.put(name, entry.getValue());
}
numberOfClasses.put(name, num + 1);
}

throw new AggregatedOperatorException("Exception(s) during workflow execution.",
erroredDependents.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().getClass().getName(), Entry::getValue)));
exceptionMap);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package io.javaoperatorsdk.operator.processing.dependent.workflow;

import java.util.Map;

import org.junit.jupiter.api.Test;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.AggregatedOperatorException;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;

import static org.assertj.core.api.Assertions.assertThat;

class WorkflowResultTest {

@Test
void throwsExceptionWithoutNumberingIfAllDifferentClass() {
var res = new WorkflowResult(Map.of(new DependentA(), new RuntimeException(),
new DependentB(), new RuntimeException()));
try {
res.throwAggregateExceptionIfErrorsPresent();
} catch (AggregatedOperatorException e) {
assertThat(e.getAggregatedExceptions()).containsOnlyKeys(DependentA.class.getName(),
DependentB.class.getName());
}
}

@Test
void numbersDependentClassNamesIfMoreOfSameType() {
var res = new WorkflowResult(Map.of(new DependentA(), new RuntimeException(),
new DependentA(), new RuntimeException()));
try {
res.throwAggregateExceptionIfErrorsPresent();
} catch (AggregatedOperatorException e) {
assertThat(e.getAggregatedExceptions()).hasSize(2);
}
}

@SuppressWarnings("rawtypes")
static class DependentA implements DependentResource {
@Override
public ReconcileResult reconcile(HasMetadata primary, Context context) {
return null;
}

@Override
public Class resourceType() {
return null;
}
}

@SuppressWarnings("rawtypes")
static class DependentB implements DependentResource {
@Override
public ReconcileResult reconcile(HasMetadata primary, Context context) {
return null;
}

@Override
public Class resourceType() {
return null;
}
}
}

0 comments on commit 3c080a0

Please sign in to comment.