Skip to content

Commit 678f4da

Browse files
committed
IT refactor
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent 06a2d30 commit 678f4da

File tree

8 files changed

+150
-31
lines changed

8 files changed

+150
-31
lines changed

docs/documentation/dependent-resources.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ resource, since there will be multiple instances of that type which could possib
392392
associated with the same primary resource. The target resource is computed and selected based on
393393
desired state automatically.
394394

395-
Formally there were resource discriminators used for:
395+
Formally there were resource discriminators used for this purpose, still present for backwards compatibility:
396396
[resource discriminator](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceDiscriminator.java)
397397
Resource discriminators uniquely identify the target resource of a dependent resource.
398398
In the managed Kubernetes dependent resources case, the discriminator can be declaratively set
@@ -407,6 +407,7 @@ public class MultipleManagedDependentResourceConfigMap1 {
407407
```
408408
Resource discriminators still can be used. But might be removed in the future releases.
409409

410+
### Sharing an Event Source Between Dependent Resources
410411

411412
Dependent resources usually also provide event sources. When dealing with multiple dependents of
412413
the same type, one needs to decide whether these dependent resources should track the same
@@ -422,10 +423,10 @@ would look as follows:
422423
useEventSourceWithName = "configMapSource")
423424
```
424425

425-
A sample is provided as an integration test both
426-
for [managed](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleManagedDependentSameTypeIT.java)
427-
and
428-
for [standalone](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleDependentResourceIT.java)
426+
A sample is provided as an integration test both:
427+
for [managed](https://github.com/operator-framework/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleManagedDependentNoDiscriminatorIT.java)
428+
429+
For [standalone](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleDependentResourceIT.java)
429430
cases.
430431

431432
## Bulk Dependent Resources

operator-framework/src/test/java/io/javaoperatorsdk/operator/MultipleDependentResourceIT.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import io.fabric8.kubernetes.api.model.ConfigMap;
1010
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
1111
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
12-
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceConfigMap;
13-
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceCustomResource;
14-
import io.javaoperatorsdk.operator.sample.multipledependentresource.MultipleDependentResourceReconciler;
12+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceConfigMap;
13+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceCustomResourceWithDiscriminator;
14+
import io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator.MultipleDependentResourceWithDiscriminatorReconciler;
1515

1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import static org.awaitility.Awaitility.await;
@@ -22,22 +22,25 @@ class MultipleDependentResourceIT {
2222
@RegisterExtension
2323
LocallyRunOperatorExtension operator =
2424
LocallyRunOperatorExtension.builder()
25-
.withReconciler(MultipleDependentResourceReconciler.class)
25+
.withReconciler(MultipleDependentResourceWithDiscriminatorReconciler.class)
2626
.waitForNamespaceDeletion(true)
2727
.build();
2828

2929
@Test
3030
void twoConfigMapsHaveBeenCreated() {
31-
MultipleDependentResourceCustomResource customResource = createTestCustomResource();
31+
MultipleDependentResourceCustomResourceWithDiscriminator customResource =
32+
createTestCustomResource();
3233
operator.create(customResource);
3334

34-
var reconciler = operator.getReconcilerOfType(MultipleDependentResourceReconciler.class);
35+
var reconciler =
36+
operator.getReconcilerOfType(MultipleDependentResourceWithDiscriminatorReconciler.class);
3537

3638
await().pollDelay(Duration.ofMillis(300))
3739
.until(() -> reconciler.getNumberOfExecutions() <= 1);
3840

39-
IntStream.of(MultipleDependentResourceReconciler.FIRST_CONFIG_MAP_ID,
40-
MultipleDependentResourceReconciler.SECOND_CONFIG_MAP_ID).forEach(configMapId -> {
41+
IntStream.of(MultipleDependentResourceWithDiscriminatorReconciler.FIRST_CONFIG_MAP_ID,
42+
MultipleDependentResourceWithDiscriminatorReconciler.SECOND_CONFIG_MAP_ID)
43+
.forEach(configMapId -> {
4144
ConfigMap configMap =
4245
operator.get(ConfigMap.class, customResource.getConfigMapName(configMapId));
4346
assertThat(configMap).isNotNull();
@@ -48,9 +51,9 @@ void twoConfigMapsHaveBeenCreated() {
4851
});
4952
}
5053

51-
public MultipleDependentResourceCustomResource createTestCustomResource() {
52-
MultipleDependentResourceCustomResource resource =
53-
new MultipleDependentResourceCustomResource();
54+
public MultipleDependentResourceCustomResourceWithDiscriminator createTestCustomResource() {
55+
MultipleDependentResourceCustomResourceWithDiscriminator resource =
56+
new MultipleDependentResourceCustomResourceWithDiscriminator();
5457
resource.setMetadata(
5558
new ObjectMetaBuilder()
5659
.withName(TEST_RESOURCE_NAME)

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
import io.fabric8.kubernetes.api.model.Namespaced;
44
import io.fabric8.kubernetes.client.CustomResource;
55
import io.fabric8.kubernetes.model.annotation.Group;
6-
import io.fabric8.kubernetes.model.annotation.Kind;
76
import io.fabric8.kubernetes.model.annotation.ShortNames;
87
import io.fabric8.kubernetes.model.annotation.Version;
98

109
@Group("sample.javaoperatorsdk")
1110
@Version("v1")
12-
@Kind("MultipleDependentResourceCustomResource")
1311
@ShortNames("mdr")
1412
public class MultipleDependentResourceCustomResource
1513
extends CustomResource<Void, MultipleDependentResourceStatus>

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import io.fabric8.kubernetes.api.model.ConfigMap;
77
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
88
import io.javaoperatorsdk.operator.api.reconciler.*;
9-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
109
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1110
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
1211
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
@@ -25,19 +24,7 @@ public class MultipleDependentResourceReconciler
2524

2625
public MultipleDependentResourceReconciler() {
2726
firstDependentResourceConfigMap = new MultipleDependentResourceConfigMap(FIRST_CONFIG_MAP_ID);
28-
2927
secondDependentResourceConfigMap = new MultipleDependentResourceConfigMap(SECOND_CONFIG_MAP_ID);
30-
31-
firstDependentResourceConfigMap
32-
.setResourceDiscriminator(
33-
new ResourceIDMatcherDiscriminator<>(
34-
p -> new ResourceID(p.getConfigMapName(FIRST_CONFIG_MAP_ID),
35-
p.getMetadata().getNamespace())));
36-
secondDependentResourceConfigMap
37-
.setResourceDiscriminator(
38-
new ResourceIDMatcherDiscriminator<>(
39-
p -> new ResourceID(p.getConfigMapName(SECOND_CONFIG_MAP_ID),
40-
p.getMetadata().getNamespace())));
4128
}
4229

4330
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import io.fabric8.kubernetes.api.model.ConfigMap;
7+
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
8+
import io.javaoperatorsdk.operator.api.reconciler.Context;
9+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource;
10+
11+
public class MultipleDependentResourceConfigMap
12+
extends
13+
CRUDKubernetesDependentResource<ConfigMap, MultipleDependentResourceCustomResourceWithDiscriminator> {
14+
15+
public static final String DATA_KEY = "key";
16+
private final int value;
17+
18+
public MultipleDependentResourceConfigMap(int value) {
19+
super(ConfigMap.class);
20+
this.value = value;
21+
}
22+
23+
@Override
24+
protected ConfigMap desired(MultipleDependentResourceCustomResourceWithDiscriminator primary,
25+
Context<MultipleDependentResourceCustomResourceWithDiscriminator> context) {
26+
Map<String, String> data = new HashMap<>();
27+
data.put(DATA_KEY, String.valueOf(value));
28+
29+
return new ConfigMapBuilder()
30+
.withNewMetadata()
31+
.withName(primary.getConfigMapName(value))
32+
.withNamespace(primary.getMetadata().getNamespace())
33+
.endMetadata()
34+
.withData(data)
35+
.build();
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator;
2+
3+
import io.fabric8.kubernetes.api.model.Namespaced;
4+
import io.fabric8.kubernetes.client.CustomResource;
5+
import io.fabric8.kubernetes.model.annotation.Group;
6+
import io.fabric8.kubernetes.model.annotation.ShortNames;
7+
import io.fabric8.kubernetes.model.annotation.Version;
8+
9+
@Group("sample.javaoperatorsdk")
10+
@Version("v1")
11+
@ShortNames("mdr")
12+
public class MultipleDependentResourceCustomResourceWithDiscriminator
13+
extends CustomResource<Void, MultipleDependentResourceWithDiscriminatorStatus>
14+
implements Namespaced {
15+
16+
public String getConfigMapName(int id) {
17+
return "configmap" + id;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.atomic.AtomicInteger;
5+
6+
import io.fabric8.kubernetes.api.model.ConfigMap;
7+
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
8+
import io.javaoperatorsdk.operator.api.reconciler.*;
9+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
10+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
11+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
12+
import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider;
13+
14+
@ControllerConfiguration
15+
public class MultipleDependentResourceWithDiscriminatorReconciler
16+
implements Reconciler<MultipleDependentResourceCustomResourceWithDiscriminator>,
17+
TestExecutionInfoProvider,
18+
EventSourceInitializer<MultipleDependentResourceCustomResourceWithDiscriminator> {
19+
20+
public static final int FIRST_CONFIG_MAP_ID = 1;
21+
public static final int SECOND_CONFIG_MAP_ID = 2;
22+
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
23+
24+
private final MultipleDependentResourceConfigMap firstDependentResourceConfigMap;
25+
private final MultipleDependentResourceConfigMap secondDependentResourceConfigMap;
26+
27+
public MultipleDependentResourceWithDiscriminatorReconciler() {
28+
firstDependentResourceConfigMap = new MultipleDependentResourceConfigMap(FIRST_CONFIG_MAP_ID);
29+
secondDependentResourceConfigMap = new MultipleDependentResourceConfigMap(SECOND_CONFIG_MAP_ID);
30+
31+
firstDependentResourceConfigMap
32+
.setResourceDiscriminator(
33+
new ResourceIDMatcherDiscriminator<>(
34+
p -> new ResourceID(p.getConfigMapName(FIRST_CONFIG_MAP_ID),
35+
p.getMetadata().getNamespace())));
36+
secondDependentResourceConfigMap
37+
.setResourceDiscriminator(
38+
new ResourceIDMatcherDiscriminator<>(
39+
p -> new ResourceID(p.getConfigMapName(SECOND_CONFIG_MAP_ID),
40+
p.getMetadata().getNamespace())));
41+
}
42+
43+
@Override
44+
public UpdateControl<MultipleDependentResourceCustomResourceWithDiscriminator> reconcile(
45+
MultipleDependentResourceCustomResourceWithDiscriminator resource,
46+
Context<MultipleDependentResourceCustomResourceWithDiscriminator> context) {
47+
numberOfExecutions.getAndIncrement();
48+
firstDependentResourceConfigMap.reconcile(resource, context);
49+
secondDependentResourceConfigMap.reconcile(resource, context);
50+
return UpdateControl.noUpdate();
51+
}
52+
53+
54+
public int getNumberOfExecutions() {
55+
return numberOfExecutions.get();
56+
}
57+
58+
@Override
59+
public Map<String, EventSource> prepareEventSources(
60+
EventSourceContext<MultipleDependentResourceCustomResourceWithDiscriminator> context) {
61+
InformerEventSource<ConfigMap, MultipleDependentResourceCustomResourceWithDiscriminator> eventSource =
62+
new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context)
63+
.build(), context);
64+
firstDependentResourceConfigMap.configureWith(eventSource);
65+
secondDependentResourceConfigMap.configureWith(eventSource);
66+
67+
return EventSourceInitializer.nameEventSources(eventSource);
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.javaoperatorsdk.operator.sample.multipledependentresourcewithdiscriminator;
2+
3+
public class MultipleDependentResourceWithDiscriminatorStatus {
4+
5+
}

0 commit comments

Comments
 (0)