Skip to content

Commit 3e0bf7a

Browse files
committed
test improvements
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent 976cf0a commit 3e0bf7a

File tree

9 files changed

+153
-73
lines changed

9 files changed

+153
-73
lines changed

docs/documentation/dependent-resources.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ would look as follows:
431431
A sample is provided as an integration test both:
432432
for [managed](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleManagedDependentNoDiscriminatorIT.java)
433433

434-
For [standalone](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleDependentResourceIT.java)
434+
For [standalone](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleDependentResourceIT.java)
435435
cases.
436436

437437
## Bulk Dependent Resources

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,10 @@ public Optional<R> getSecondaryResource(P primary, Context<P> context) {
9595
return resourceDiscriminator.distinguish(resourceType(), primary, context);
9696
} else {
9797
var secondaryResources = context.getSecondaryResources(resourceType());
98-
if (secondaryResources.size() > 1) {
99-
return selectSecondaryBasedOnDesiredState(secondaryResources, desired(primary, context));
98+
if (secondaryResources.isEmpty()) {
99+
return Optional.empty();
100100
} else {
101-
return secondaryResources.isEmpty() ? Optional.empty()
102-
: Optional.of(secondaryResources.iterator().next());
101+
return selectSecondaryBasedOnDesiredState(secondaryResources, desired(primary, context));
103102
}
104103
}
105104
}
Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,78 @@
11
package io.javaoperatorsdk.operator;
22

3-
import java.time.Duration;
4-
import java.util.stream.IntStream;
5-
63
import org.junit.jupiter.api.Test;
74
import org.junit.jupiter.api.extension.RegisterExtension;
85

96
import io.fabric8.kubernetes.api.model.ConfigMap;
107
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
118
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
12-
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceConfigMap;
13-
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceCustomResourceWithDiscriminator;
14-
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceWithDiscriminatorReconciler;
9+
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceCustomResource;
10+
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceReconciler;
11+
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceSpec;
12+
import io.javaoperatorsdk.operator.sample.multipledrsametypenodiscriminator.*;
1513

14+
import static io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceConfigMap.DATA_KEY;
15+
import static io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceConfigMap.getConfigMapName;
16+
import static io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceReconciler.FIRST_CONFIG_MAP_ID;
17+
import static io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceReconciler.SECOND_CONFIG_MAP_ID;
1618
import static org.assertj.core.api.Assertions.assertThat;
1719
import static org.awaitility.Awaitility.await;
1820

19-
class MultipleDependentResourceIT {
21+
public class MultipleDependentResourceIT {
22+
23+
public static final String CHANGED_VALUE = "changed value";
24+
public static final String INITIAL_VALUE = "initial value";
2025

21-
public static final String TEST_RESOURCE_NAME = "multipledependentresource-testresource";
2226
@RegisterExtension
23-
LocallyRunOperatorExtension operator =
27+
LocallyRunOperatorExtension extension =
2428
LocallyRunOperatorExtension.builder()
25-
.withReconciler(MultipleDependentResourceWithDiscriminatorReconciler.class)
26-
.waitForNamespaceDeletion(true)
29+
.withReconciler(new MultipleDependentResourceReconciler())
2730
.build();
2831

2932
@Test
30-
void twoConfigMapsHaveBeenCreated() {
31-
MultipleDependentResourceCustomResourceWithDiscriminator customResource =
32-
createTestCustomResource();
33-
operator.create(customResource);
34-
35-
var reconciler =
36-
operator.getReconcilerOfType(MultipleDependentResourceWithDiscriminatorReconciler.class);
37-
38-
await().pollDelay(Duration.ofMillis(300))
39-
.until(() -> reconciler.getNumberOfExecutions() <= 1);
40-
41-
IntStream.of(MultipleDependentResourceWithDiscriminatorReconciler.FIRST_CONFIG_MAP_ID,
42-
MultipleDependentResourceWithDiscriminatorReconciler.SECOND_CONFIG_MAP_ID)
43-
.forEach(configMapId -> {
44-
ConfigMap configMap =
45-
operator.get(ConfigMap.class, customResource.getConfigMapName(configMapId));
46-
assertThat(configMap).isNotNull();
47-
assertThat(configMap.getMetadata().getName())
48-
.isEqualTo(customResource.getConfigMapName(configMapId));
49-
assertThat(configMap.getData().get(MultipleDependentResourceConfigMap.DATA_KEY))
50-
.isEqualTo(String.valueOf(configMapId));
51-
});
52-
}
33+
void handlesCRUDOperations() {
34+
var res = extension.create(testResource());
35+
36+
await().untilAsserted(() -> {
37+
var cm1 = extension.get(ConfigMap.class, getConfigMapName(FIRST_CONFIG_MAP_ID));
38+
var cm2 = extension.get(ConfigMap.class, getConfigMapName(SECOND_CONFIG_MAP_ID));
39+
40+
assertThat(cm1).isNotNull();
41+
assertThat(cm2).isNotNull();
42+
assertThat(cm1.getData()).containsEntry(DATA_KEY, INITIAL_VALUE);
43+
assertThat(cm2.getData()).containsEntry(DATA_KEY, INITIAL_VALUE);
44+
});
45+
46+
res.getSpec().setValue(CHANGED_VALUE);
47+
res = extension.replace(res);
5348

54-
public MultipleDependentResourceCustomResourceWithDiscriminator createTestCustomResource() {
55-
MultipleDependentResourceCustomResourceWithDiscriminator resource =
56-
new MultipleDependentResourceCustomResourceWithDiscriminator();
57-
resource.setMetadata(
58-
new ObjectMetaBuilder()
59-
.withName(TEST_RESOURCE_NAME)
60-
.withNamespace(operator.getNamespace())
61-
.build());
62-
return resource;
49+
await().untilAsserted(() -> {
50+
var cm1 = extension.get(ConfigMap.class, getConfigMapName(FIRST_CONFIG_MAP_ID));
51+
var cm2 = extension.get(ConfigMap.class, getConfigMapName(SECOND_CONFIG_MAP_ID));
52+
53+
assertThat(cm1.getData()).containsEntry(DATA_KEY, CHANGED_VALUE);
54+
assertThat(cm2.getData()).containsEntry(DATA_KEY, CHANGED_VALUE);
55+
});
56+
57+
extension.delete(res);
58+
59+
await().untilAsserted(() -> {
60+
var cm1 = extension.get(ConfigMap.class, getConfigMapName(FIRST_CONFIG_MAP_ID));
61+
var cm2 = extension.get(ConfigMap.class, getConfigMapName(SECOND_CONFIG_MAP_ID));
62+
63+
assertThat(cm1).isNull();
64+
assertThat(cm2).isNull();
65+
});
6366
}
6467

68+
MultipleDependentResourceCustomResource testResource() {
69+
var res = new MultipleDependentResourceCustomResource();
70+
res.setMetadata(new ObjectMetaBuilder()
71+
.withName("test1")
72+
.build());
73+
res.setSpec(new MultipleDependentResourceSpec());
74+
res.getSpec().setValue(INITIAL_VALUE);
75+
76+
return res;
77+
}
6578
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import java.time.Duration;
4+
import java.util.stream.IntStream;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.fabric8.kubernetes.api.model.ConfigMap;
10+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
11+
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
12+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceConfigMap;
13+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceCustomResourceWithDiscriminator;
14+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceWithDiscriminatorReconciler;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.awaitility.Awaitility.await;
18+
19+
class MultipleDependentResourceWithNoDiscriminatorIT {
20+
21+
public static final String TEST_RESOURCE_NAME = "multipledependentresource-testresource";
22+
@RegisterExtension
23+
LocallyRunOperatorExtension operator =
24+
LocallyRunOperatorExtension.builder()
25+
.withReconciler(MultipleDependentResourceWithDiscriminatorReconciler.class)
26+
.waitForNamespaceDeletion(true)
27+
.build();
28+
29+
@Test
30+
void twoConfigMapsHaveBeenCreated() {
31+
MultipleDependentResourceCustomResourceWithDiscriminator customResource =
32+
createTestCustomResource();
33+
operator.create(customResource);
34+
35+
var reconciler =
36+
operator.getReconcilerOfType(MultipleDependentResourceWithDiscriminatorReconciler.class);
37+
38+
await().pollDelay(Duration.ofMillis(300))
39+
.until(() -> reconciler.getNumberOfExecutions() <= 1);
40+
41+
IntStream.of(MultipleDependentResourceWithDiscriminatorReconciler.FIRST_CONFIG_MAP_ID,
42+
MultipleDependentResourceWithDiscriminatorReconciler.SECOND_CONFIG_MAP_ID)
43+
.forEach(configMapId -> {
44+
ConfigMap configMap =
45+
operator.get(ConfigMap.class, customResource.getConfigMapName(configMapId));
46+
assertThat(configMap).isNotNull();
47+
assertThat(configMap.getMetadata().getName())
48+
.isEqualTo(customResource.getConfigMapName(configMapId));
49+
assertThat(configMap.getData().get(MultipleDependentResourceConfigMap.DATA_KEY))
50+
.isEqualTo(String.valueOf(configMapId));
51+
});
52+
}
53+
54+
public MultipleDependentResourceCustomResourceWithDiscriminator createTestCustomResource() {
55+
MultipleDependentResourceCustomResourceWithDiscriminator resource =
56+
new MultipleDependentResourceCustomResourceWithDiscriminator();
57+
resource.setMetadata(
58+
new ObjectMetaBuilder()
59+
.withName(TEST_RESOURCE_NAME)
60+
.withNamespace(operator.getNamespace())
61+
.build());
62+
return resource;
63+
}
64+
65+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.javaoperatorsdk.operator.sample.multipledependentresource;
22

3-
import java.util.HashMap;
43
import java.util.Map;
54

65
import io.fabric8.kubernetes.api.model.ConfigMap;
@@ -12,25 +11,27 @@ public class MultipleDependentResourceConfigMap
1211
extends CRUDKubernetesDependentResource<ConfigMap, MultipleDependentResourceCustomResource> {
1312

1413
public static final String DATA_KEY = "key";
15-
private final int value;
14+
private final String value;
1615

17-
public MultipleDependentResourceConfigMap(int value) {
16+
public MultipleDependentResourceConfigMap(String value) {
1817
super(ConfigMap.class);
1918
this.value = value;
2019
}
2120

2221
@Override
2322
protected ConfigMap desired(MultipleDependentResourceCustomResource primary,
2423
Context<MultipleDependentResourceCustomResource> context) {
25-
Map<String, String> data = new HashMap<>();
26-
data.put(DATA_KEY, String.valueOf(value));
2724

2825
return new ConfigMapBuilder()
2926
.withNewMetadata()
30-
.withName(primary.getConfigMapName(value))
27+
.withName(getConfigMapName(value))
3128
.withNamespace(primary.getMetadata().getNamespace())
3229
.endMetadata()
33-
.withData(data)
30+
.withData(Map.of(DATA_KEY, primary.getSpec().getValue()))
3431
.build();
3532
}
33+
34+
public static String getConfigMapName(String id) {
35+
return "configmap" + id;
36+
}
3637
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multipledependentresource/MultipleDependentResourceCustomResource.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
@Version("v1")
1111
@ShortNames("mdr")
1212
public class MultipleDependentResourceCustomResource
13-
extends CustomResource<Void, MultipleDependentResourceStatus>
13+
extends CustomResource<MultipleDependentResourceSpec, MultipleDependentResourceStatus>
1414
implements Namespaced {
15-
16-
public String getConfigMapName(int id) {
17-
return "configmap" + id;
18-
}
1915
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multipledependentresource/MultipleDependentResourceReconciler.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package io.javaoperatorsdk.operator.sample.multipledependentresource;
22

33
import java.util.Map;
4-
import java.util.concurrent.atomic.AtomicInteger;
54

65
import io.fabric8.kubernetes.api.model.ConfigMap;
76
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
87
import io.javaoperatorsdk.operator.api.reconciler.*;
98
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
109
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
11-
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
1210

1311
@ControllerConfiguration
1412
public class MultipleDependentResourceReconciler
1513
implements Reconciler<MultipleDependentResourceCustomResource>,
16-
TestExecutionInfoProvider, EventSourceInitializer<MultipleDependentResourceCustomResource> {
14+
EventSourceInitializer<MultipleDependentResourceCustomResource> {
1715

18-
public static final int FIRST_CONFIG_MAP_ID = 1;
19-
public static final int SECOND_CONFIG_MAP_ID = 2;
20-
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
16+
public static final String FIRST_CONFIG_MAP_ID = "1";
17+
public static final String SECOND_CONFIG_MAP_ID = "2";
2118

2219
private final MultipleDependentResourceConfigMap firstDependentResourceConfigMap;
2320
private final MultipleDependentResourceConfigMap secondDependentResourceConfigMap;
@@ -31,17 +28,11 @@ public MultipleDependentResourceReconciler() {
3128
public UpdateControl<MultipleDependentResourceCustomResource> reconcile(
3229
MultipleDependentResourceCustomResource resource,
3330
Context<MultipleDependentResourceCustomResource> context) {
34-
numberOfExecutions.getAndIncrement();
3531
firstDependentResourceConfigMap.reconcile(resource, context);
3632
secondDependentResourceConfigMap.reconcile(resource, context);
3733
return UpdateControl.noUpdate();
3834
}
3935

40-
41-
public int getNumberOfExecutions() {
42-
return numberOfExecutions.get();
43-
}
44-
4536
@Override
4637
public Map<String, EventSource> prepareEventSources(
4738
EventSourceContext<MultipleDependentResourceCustomResource> context) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.javaoperatorsdk.operator.sample.multipledependentresource;
2+
3+
public class MultipleDependentResourceSpec {
4+
5+
private String value;
6+
7+
public String getValue() {
8+
return value;
9+
}
10+
11+
public MultipleDependentResourceSpec setValue(String value) {
12+
this.value = value;
13+
return this;
14+
}
15+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multipledependentresourcewithdiscriminator/MultipleDependentResourceCustomResourceWithDiscriminator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
@Group("sample.javaoperatorsdk")
1010
@Version("v1")
11-
@ShortNames("mdr")
11+
@ShortNames("mdwd")
1212
public class MultipleDependentResourceCustomResourceWithDiscriminator
1313
extends CustomResource<Void, MultipleDependentResourceWithDiscriminatorStatus>
1414
implements Namespaced {

0 commit comments

Comments
 (0)