diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java index b25de43bb7..b2b8716470 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultWorkflow.java @@ -79,6 +79,10 @@ private Map toMap(Set node } map.put(node.getName(), node); } + if (topLevelResources.size() == 0) { + throw new IllegalStateException( + "No top-level dependent resources found. This might indicate a cyclic Set of DependentResourceNode has been provided."); + } return map; } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowTest.java index 49f1274fa8..bc6ab8515f 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowTest.java @@ -14,6 +14,7 @@ import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -24,6 +25,22 @@ class WorkflowTest { ExecutorService executorService = Executors.newCachedThreadPool(); + @Test + void zeroTopLevelDRShouldThrowException() { + var dr1 = mock(DependentResource.class); + var dr2 = mock(DependentResource.class); + var dr3 = mock(DependentResource.class); + + var cyclicWorkflowBuilderSetup = new WorkflowBuilder() + .addDependentResource(dr1).dependsOn() + .addDependentResource(dr2).dependsOn(dr1) + .addDependentResource(dr3).dependsOn(dr2) + .addDependentResource(dr1).dependsOn(dr2); + + assertThrows(IllegalStateException.class, + cyclicWorkflowBuilderSetup::build); + } + @Test void calculatesTopLevelResources() { var dr1 = mock(DependentResource.class);