diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/AggregatedOperatorException.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/AggregatedOperatorException.java index 4600c2c5e4..db27ce50a3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/AggregatedOperatorException.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/AggregatedOperatorException.java @@ -1,31 +1,28 @@ package io.javaoperatorsdk.operator; -import java.util.Arrays; import java.util.Collections; -import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class AggregatedOperatorException extends OperatorException { - private final List causes; + private final Map causes; - public AggregatedOperatorException(String message, Exception... exceptions) { - super(message, exceptions != null && exceptions.length > 0 ? exceptions[0] : null); - this.causes = exceptions != null ? Arrays.asList(exceptions) : Collections.emptyList(); + public AggregatedOperatorException(String message, Map exceptions) { + super(message); + this.causes = + exceptions != null ? Collections.unmodifiableMap(exceptions) : Collections.emptyMap(); } - public AggregatedOperatorException(String message, List exceptions) { - super(message, exceptions != null && !exceptions.isEmpty() ? exceptions.get(0) : null); - this.causes = exceptions != null ? exceptions : Collections.emptyList(); - } - - public List getAggregatedExceptions() { + @SuppressWarnings("unused") + public Map getAggregatedExceptions() { return causes; } @Override - public String toString() { - return "AggregatedOperatorException{" + - "causes=" + causes + - '}'; + public String getMessage() { + return super.getMessage() + " " + causes.entrySet().stream() + .map(entry -> entry.getKey() + " -> " + entry.getValue()) + .collect(Collectors.joining("\n - ", "Details:\n", "")); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java index 45541b91d6..b1dcfb938c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -176,17 +177,14 @@ private boolean hasErroredDependent(DependentResourceNode dependentResourceNode) } private WorkflowCleanupResult createCleanupResult() { - var result = new WorkflowCleanupResult(); - result.setErroredDependents(exceptionsDuringExecution - .entrySet().stream() - .collect(Collectors.toMap(e -> e.getKey().getDependentResource(), Map.Entry::getValue))); - - result.setPostConditionNotMetDependents( - postDeleteConditionNotMet.stream().map(DependentResourceNode::getDependentResource) - .collect(Collectors.toList())); - result.setDeleteCalledOnDependents( - deleteCalled.stream().map(DependentResourceNode::getDependentResource) - .collect(Collectors.toList())); - return result; + final var erroredDependents = exceptionsDuringExecution.entrySet().stream() + .collect(Collectors.toMap(e -> e.getKey().getDependentResource(), Entry::getValue)); + final var postConditionNotMet = postDeleteConditionNotMet.stream() + .map(DependentResourceNode::getDependentResource) + .collect(Collectors.toList()); + final var deleteCalled = + this.deleteCalled.stream().map(DependentResourceNode::getDependentResource) + .collect(Collectors.toList()); + return new WorkflowCleanupResult(erroredDependents, postConditionNotMet, deleteCalled); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupResult.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupResult.java index f52774b9ac..860a553c39 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupResult.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupResult.java @@ -1,64 +1,32 @@ package io.javaoperatorsdk.operator.processing.dependent.workflow; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import io.javaoperatorsdk.operator.AggregatedOperatorException; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @SuppressWarnings("rawtypes") -public class WorkflowCleanupResult { +public class WorkflowCleanupResult extends WorkflowResult { - private List deleteCalledOnDependents = new ArrayList<>(); - private List postConditionNotMetDependents = new ArrayList<>(); - private Map erroredDependents = new HashMap<>(); + private final List deleteCalledOnDependents; + private final List postConditionNotMetDependents; - public List getDeleteCalledOnDependents() { - return deleteCalledOnDependents; + WorkflowCleanupResult(Map erroredDependents, + List postConditionNotMet, List deleteCalled) { + super(erroredDependents); + this.deleteCalledOnDependents = deleteCalled; + this.postConditionNotMetDependents = postConditionNotMet; } - public WorkflowCleanupResult setDeleteCalledOnDependents( - List deletedDependents) { - this.deleteCalledOnDependents = deletedDependents; - return this; + public List getDeleteCalledOnDependents() { + return deleteCalledOnDependents; } public List getPostConditionNotMetDependents() { return postConditionNotMetDependents; } - public WorkflowCleanupResult setPostConditionNotMetDependents( - List postConditionNotMetDependents) { - this.postConditionNotMetDependents = postConditionNotMetDependents; - return this; - } - - public Map getErroredDependents() { - return erroredDependents; - } - - public WorkflowCleanupResult setErroredDependents( - Map erroredDependents) { - this.erroredDependents = erroredDependents; - return this; - } - public boolean allPostConditionsMet() { return postConditionNotMetDependents.isEmpty(); } - - public boolean erroredDependentsExists() { - return !erroredDependents.isEmpty(); - } - - public void throwAggregateExceptionIfErrorsPresent() { - if (erroredDependentsExists()) { - throw new AggregatedOperatorException("Exception(s) during workflow execution.", - new ArrayList<>(erroredDependents.values())); - } - } - - } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileResult.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileResult.java index d2cdc7c85f..6fbd06486c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileResult.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileResult.java @@ -1,35 +1,28 @@ package io.javaoperatorsdk.operator.processing.dependent.workflow; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import io.javaoperatorsdk.operator.AggregatedOperatorException; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult; @SuppressWarnings("rawtypes") -public class WorkflowReconcileResult { +public class WorkflowReconcileResult extends WorkflowResult { private final List reconciledDependents; private final List notReadyDependents; - private final Map erroredDependents; private final Map reconcileResults; public WorkflowReconcileResult(List reconciledDependents, List notReadyDependents, Map erroredDependents, Map reconcileResults) { + super(erroredDependents); this.reconciledDependents = reconciledDependents; this.notReadyDependents = notReadyDependents; - this.erroredDependents = erroredDependents; this.reconcileResults = reconcileResults; } - public Map getErroredDependents() { - return erroredDependents; - } - public List getReconciledDependents() { return reconciledDependents; } @@ -43,31 +36,7 @@ public Map getReconcileResults() { return reconcileResults; } - public void throwAggregateExceptionIfErrorsPresent() { - if (!erroredDependents.isEmpty()) { - throw createFinalException(); - } - } - - private AggregatedOperatorException createFinalException() { - return new AggregatedOperatorException("Exception during workflow.", - new ArrayList<>(erroredDependents.values())); - } - public boolean allDependentResourcesReady() { return notReadyDependents.isEmpty(); } - - /** - * @deprecated Use {@link #erroredDependentsExist()} instead - */ - @Deprecated(forRemoval = true) - public boolean erroredDependentsExists() { - return !erroredDependents.isEmpty(); - } - - @SuppressWarnings("unused") - public boolean erroredDependentsExist() { - return !erroredDependents.isEmpty(); - } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowResult.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowResult.java new file mode 100644 index 0000000000..f12a45579d --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowResult.java @@ -0,0 +1,43 @@ +package io.javaoperatorsdk.operator.processing.dependent.workflow; + +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 final Map erroredDependents; + + WorkflowResult(Map erroredDependents) { + this.erroredDependents = erroredDependents; + } + + public Map getErroredDependents() { + return erroredDependents; + } + + /** + * @deprecated Use {@link #erroredDependentsExist()} instead + */ + @Deprecated(forRemoval = true) + public boolean erroredDependentsExists() { + return !erroredDependents.isEmpty(); + } + + @SuppressWarnings("unused") + public boolean erroredDependentsExist() { + return !erroredDependents.isEmpty(); + } + + public void throwAggregateExceptionIfErrorsPresent() { + if (erroredDependentsExist()) { + throw new AggregatedOperatorException("Exception(s) during workflow execution.", + erroredDependents.entrySet().stream() + .collect(Collectors.toMap(e -> e.getKey().getClass().getName(), Entry::getValue))); + } + } +}