Skip to content

Commit 828dc09

Browse files
committed
additional unit tests
1 parent ff0f198 commit 828dc09

File tree

13 files changed

+176
-116
lines changed

13 files changed

+176
-116
lines changed

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

+3-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.LinkedList;
44
import java.util.List;
55
import java.util.Optional;
6-
import java.util.stream.Collectors;
76

87
import io.fabric8.kubernetes.api.model.HasMetadata;
98
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
@@ -58,13 +57,9 @@ public void addDependsOnRelation(DependentResourceNode node) {
5857

5958
@Override
6059
public String toString() {
61-
return "{"
62-
+ parents.stream().map(p -> p.dependentResource.toString())
63-
.collect(Collectors.joining(", ", "[", "]->"))
64-
+ "(" + dependentResource + ")"
65-
+ dependsOn.stream().map(d -> d.dependentResource.toString())
66-
.collect(Collectors.joining(", ", "->[", "]"))
67-
+ '}';
60+
return "DependentResourceNode{" +
61+
"dependentResource=" + dependentResource +
62+
'}';
6863
}
6964

7065
public DependentResourceNode<R, P> setReconcileCondition(

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public ManagedWorkflow(KubernetesClient client,
3535

3636
isEmptyWorkflow = dependentResourceSpecs.isEmpty();
3737
workflow =
38-
managedWorkflowSupport.toWorkflow(client, dependentResourceSpecs, dependentResourceByName);
38+
managedWorkflowSupport.createWorkflow(dependentResourceSpecs, dependentResourceByName);
3939
isCleaner = checkIfCleaner();
4040
}
4141

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

+5-6
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,19 @@ public void checkForNameDuplication(List<DependentResourceSpec> dependentResourc
3131
}
3232

3333
@SuppressWarnings("unchecked")
34-
public Workflow<P> toWorkflow(KubernetesClient client,
35-
List<DependentResourceSpec> dependentResourceSpecs,
34+
public Workflow<P> createWorkflow(List<DependentResourceSpec> dependentResourceSpecs,
3635
Map<String, DependentResource> dependentResourceByName) {
3736
var orderedResourceSpecs = orderAndDetectCycles(dependentResourceSpecs);
3837
var w = new WorkflowBuilder<P>();
3938
w.withThrowExceptionFurther(false);
4039
orderedResourceSpecs.forEach(spec -> {
4140
var drBuilder =
42-
w.addDependent(dependentResourceByName.get(spec.getName())).dependsOn(
41+
w.addDependentResource(dependentResourceByName.get(spec.getName())).dependsOn(
4342
(Set<DependentResource>) spec.getDependsOn()
4443
.stream().map(dependentResourceByName::get).collect(Collectors.toSet()));
45-
drBuilder.withDeletePostCondition(spec.getDeletePostCondition());
46-
drBuilder.withReconcileCondition(spec.getReconcileCondition());
47-
drBuilder.withReadyCondition(spec.getReadyCondition());
44+
drBuilder.withDeletePostCondition(spec.getDeletePostCondition())
45+
.withReconcileCondition(spec.getReconcileCondition())
46+
.withReadyCondition(spec.getReadyCondition());
4847
});
4948
return w.build();
5049
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class WorkflowBuilder<P extends HasMetadata> {
1818
private final Set<DependentResourceNode<?, P>> dependentResourceNodes = new HashSet<>();
1919
private boolean throwExceptionAutomatically = THROW_EXCEPTION_AUTOMATICALLY_DEFAULT;
2020

21-
public DependentBuilder<P> addDependent(DependentResource dependentResource) {
21+
public DependentBuilder<P> addDependentResource(DependentResource dependentResource) {
2222
DependentResourceNode node = new DependentResourceNode<>(dependentResource);
2323
dependentResourceNodes.add(node);
2424
return new DependentBuilder<>(this, node);

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/UtilsTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.javaoperatorsdk.operator.api.reconciler.Context;
99
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1010
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
11+
import io.javaoperatorsdk.operator.processing.dependent.EmptyTestDependentResource;
1112
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
1213
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
1314

@@ -84,7 +85,7 @@ void getsFirstTypeArgumentFromExtendedClass() {
8485

8586
@Test
8687
void getsFirstTypeArgumentFromInterface() {
87-
assertThat(Utils.getFirstTypeArgumentFromInterface(TestDependentResource.class))
88+
assertThat(Utils.getFirstTypeArgumentFromInterface(EmptyTestDependentResource.class))
8889
.isEqualTo(Deployment.class);
8990
}
9091

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.javaoperatorsdk.operator.processing.dependent;
2+
3+
import java.util.Optional;
4+
5+
import io.fabric8.kubernetes.api.model.apps.Deployment;
6+
import io.javaoperatorsdk.operator.api.reconciler.Context;
7+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
8+
import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult;
9+
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
10+
11+
public class EmptyTestDependentResource
12+
implements DependentResource<Deployment, TestCustomResource> {
13+
14+
@Override
15+
public ReconcileResult<Deployment> reconcile(TestCustomResource primary,
16+
Context<TestCustomResource> context) {
17+
return null;
18+
}
19+
20+
@Override
21+
public Optional<Deployment> getSecondaryResource(TestCustomResource primaryResource) {
22+
return Optional.empty();
23+
}
24+
25+
@Override
26+
public Class<Deployment> resourceType() {
27+
return Deployment.class;
28+
}
29+
30+
}
31+

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupportTest.java

+28-4
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,22 @@
88
import org.junit.jupiter.api.Assertions;
99
import org.junit.jupiter.api.Test;
1010

11+
import io.fabric8.kubernetes.client.KubernetesClient;
1112
import io.javaoperatorsdk.operator.OperatorException;
1213
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
14+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
1315

1416
import static io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowTestUtils.createDRS;
1517
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.mockito.Mockito.mock;
1619

1720
@SuppressWarnings("rawtypes")
1821
class ManagedWorkflowSupportTest {
1922

20-
21-
public static final String NAME_2 = "name2";
2223
public static final String NAME_1 = "name1";
24+
public static final String NAME_2 = "name2";
25+
public static final String NAME_3 = "name3";
26+
public static final String NAME_4 = "name4";
2327

2428
ManagedWorkflowSupport<?> managedWorkflowSupport = new ManagedWorkflowSupport();
2529

@@ -80,14 +84,34 @@ void detectsCyclesTrivialCases() {
8084

8185
@Test
8286
void detectsCycleOnSubTree() {
83-
String NAME_3 = "name3";
84-
String NAME_4 = "name4";
87+
8588
Assertions.assertThrows(OperatorException.class,
8689
() -> managedWorkflowSupport.orderAndDetectCycles(List.of(createDRS(NAME_1),
8790
createDRS(NAME_2, NAME_1),
8891
createDRS(NAME_3, NAME_1, NAME_4),
8992
createDRS(NAME_4, NAME_3))));
9093
}
9194

95+
@Test
96+
void createsWorkflow() {
97+
var specs = List.of(createDRS(NAME_1),
98+
createDRS(NAME_2, NAME_1),
99+
createDRS(NAME_3, NAME_1),
100+
createDRS(NAME_4, NAME_3, NAME_2));
101+
102+
var drByName = specs
103+
.stream().collect(Collectors.toMap(DependentResourceSpec::getName,
104+
spec -> managedWorkflowSupport.createAndConfigureFrom(spec,
105+
mock(KubernetesClient.class))));
106+
107+
var workflow = managedWorkflowSupport.createWorkflow(specs, drByName);
108+
109+
assertThat(workflow.getDependentResources()).containsExactlyInAnyOrder(drByName.values()
110+
.toArray(new DependentResource[0]));
111+
assertThat(workflow.getTopLevelDependentResources())
112+
.map(DependentResourceNode::getDependentResource).containsExactly(drByName.get(NAME_1));
113+
assertThat(workflow.getBottomLevelResource()).map(DependentResourceNode::getDependentResource)
114+
.containsExactly(drByName.get(NAME_4));
115+
}
92116

93117
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class ManagedWorkflowTest {
2727
@Test
2828
void checksIfWorkflowEmpty() {
2929
var mockWorkflow = mock(Workflow.class);
30-
when(managedWorkflowSupportMock.toWorkflow(any(), any(), any())).thenReturn(mockWorkflow);
30+
when(managedWorkflowSupportMock.createWorkflow(any(), any())).thenReturn(mockWorkflow);
3131
when(managedWorkflowSupportMock.createAndConfigureFrom(any(), any()))
3232
.thenReturn(mock(DependentResource.class));
3333
assertThat(managedWorkflow().isEmptyWorkflow()).isTrue();
@@ -39,7 +39,7 @@ void checksIfWorkflowEmpty() {
3939
@Test
4040
void isCleanerIfAtLeastOneDRIsDeleterAndNoGC() {
4141
var mockWorkflow = mock(Workflow.class);
42-
when(managedWorkflowSupportMock.toWorkflow(any(), any(), any())).thenReturn(mockWorkflow);
42+
when(managedWorkflowSupportMock.createWorkflow(any(), any())).thenReturn(mockWorkflow);
4343
when(managedWorkflowSupportMock.createAndConfigureFrom(any(), any()))
4444
.thenReturn(mock(DependentResource.class));
4545
when(mockWorkflow.getDependentResources()).thenReturn(Set.of(mock(DependentResource.class)));

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.HashSet;
55

66
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
7+
import io.javaoperatorsdk.operator.processing.dependent.EmptyTestDependentResource;
78

89
import static org.mockito.Mockito.mock;
910
import static org.mockito.Mockito.when;
@@ -13,8 +14,10 @@ public class ManagedWorkflowTestUtils {
1314

1415
public static DependentResourceSpec createDRS(String name, String... dependOns) {
1516
var drcMock = mock(DependentResourceSpec.class);
17+
when(drcMock.getDependentResourceClass()).thenReturn(EmptyTestDependentResource.class);
1618
when(drcMock.getName()).thenReturn(name);
1719
when(drcMock.getDependsOn()).thenReturn(new HashSet(Arrays.asList(dependOns)));
1820
return drcMock;
1921
}
22+
2023
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutorTest.java

+20-17
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ class WorkflowCleanupExecutorTest extends AbstractWorkflowExecutorTest {
1919
@Test
2020
void cleanUpDiamondWorkflow() {
2121
var workflow = new WorkflowBuilder<TestCustomResource>()
22-
.addDependent(dd1).build()
23-
.addDependent(dr1).dependsOn(dd1).build()
24-
.addDependent(dd2).dependsOn(dd1).build()
25-
.addDependent(dd3).dependsOn(dr1, dd2).build()
22+
.addDependentResource(dd1).build()
23+
.addDependentResource(dr1).dependsOn(dd1).build()
24+
.addDependentResource(dd2).dependsOn(dd1).build()
25+
.addDependentResource(dd3).dependsOn(dr1, dd2).build()
2626
.build();
2727

2828
var res = workflow.cleanup(new TestCustomResource(), null);
@@ -38,10 +38,10 @@ void cleanUpDiamondWorkflow() {
3838
@Test
3939
void dontDeleteIfDependentErrored() {
4040
var workflow = new WorkflowBuilder<TestCustomResource>()
41-
.addDependent(dd1).build()
42-
.addDependent(dd2).dependsOn(dd1).build()
43-
.addDependent(dd3).dependsOn(dd2).build()
44-
.addDependent(errorDD).dependsOn(dd2).build()
41+
.addDependentResource(dd1).build()
42+
.addDependentResource(dd2).dependsOn(dd1).build()
43+
.addDependentResource(dd3).dependsOn(dd2).build()
44+
.addDependentResource(errorDD).dependsOn(dd2).build()
4545
.withThrowExceptionFurther(false)
4646
.build();
4747

@@ -60,8 +60,9 @@ void dontDeleteIfDependentErrored() {
6060
@Test
6161
void cleanupConditionTrivialCase() {
6262
var workflow = new WorkflowBuilder<TestCustomResource>()
63-
.addDependent(dd1).build()
64-
.addDependent(dd2).dependsOn(dd1).withDeletePostCondition(noMetDeletePostCondition).build()
63+
.addDependentResource(dd1).build()
64+
.addDependentResource(dd2).dependsOn(dd1).withDeletePostCondition(noMetDeletePostCondition)
65+
.build()
6566
.build();
6667

6768
var res = workflow.cleanup(new TestCustomResource(), null);
@@ -75,8 +76,9 @@ void cleanupConditionTrivialCase() {
7576
@Test
7677
void cleanupConditionMet() {
7778
var workflow = new WorkflowBuilder<TestCustomResource>()
78-
.addDependent(dd1).build()
79-
.addDependent(dd2).dependsOn(dd1).withDeletePostCondition(metDeletePostCondition).build()
79+
.addDependentResource(dd1).build()
80+
.addDependentResource(dd2).dependsOn(dd1).withDeletePostCondition(metDeletePostCondition)
81+
.build()
8082
.build();
8183

8284
var res = workflow.cleanup(new TestCustomResource(), null);
@@ -93,10 +95,11 @@ void cleanupConditionDiamondWorkflow() {
9395
TestDeleterDependent dd4 = new TestDeleterDependent("DR_DELETER_4");
9496

9597
var workflow = new WorkflowBuilder<TestCustomResource>()
96-
.addDependent(dd1).build()
97-
.addDependent(dd2).dependsOn(dd1).build()
98-
.addDependent(dd3).dependsOn(dd1).withDeletePostCondition(noMetDeletePostCondition).build()
99-
.addDependent(dd4).dependsOn(dd2, dd3).build()
98+
.addDependentResource(dd1).build()
99+
.addDependentResource(dd2).dependsOn(dd1).build()
100+
.addDependentResource(dd3).dependsOn(dd1).withDeletePostCondition(noMetDeletePostCondition)
101+
.build()
102+
.addDependentResource(dd4).dependsOn(dd2, dd3).build()
100103
.build();
101104

102105
var res = workflow.cleanup(new TestCustomResource(), null);
@@ -116,7 +119,7 @@ void cleanupConditionDiamondWorkflow() {
116119
void dontDeleteIfGarbageCollected() {
117120
GarbageCollectedDeleter gcDel = new GarbageCollectedDeleter("GC_DELETER");
118121
var workflow = new WorkflowBuilder<TestCustomResource>()
119-
.addDependent(gcDel).build()
122+
.addDependentResource(gcDel).build()
120123
.build();
121124

122125
var res = workflow.cleanup(new TestCustomResource(), null);

0 commit comments

Comments
 (0)