Skip to content

Commit 2b09531

Browse files
committed
integration test
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 69bd6e6 commit 2b09531

File tree

5 files changed

+115
-9
lines changed

5 files changed

+115
-9
lines changed

docs/content/en/docs/features/_index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ InformerEventSourceConfiguration<Tomcat> configuration =
623623
Of course, you will need to specify a `SecondaryToPrimaryMapper`, since the default that
624624
is based on owner references naturally won't work, rather use the one that supports annotations.
625625

626+
See related [integration test](https://github.com/operator-framework/java-operator-sdk/tree/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/informerremotecluster).
626627

627628
## Dynamically Changing Target Namespaces
628629

Original file line numberDiff line numberDiff line change
@@ -1,23 +1,87 @@
11
package io.javaoperatorsdk.operator.baseapi.informerremotecluster;
22

3+
import java.util.Map;
4+
35
import org.junit.jupiter.api.Test;
46
import org.junit.jupiter.api.extension.RegisterExtension;
57

6-
import io.javaoperatorsdk.jenvtest.junit.EnableKubeAPIServer;
7-
import io.javaoperatorsdk.operator.baseapi.labelselector.LabelSelectorTestReconciler;
8+
import io.fabric8.kubeapitest.junit.EnableKubeAPIServer;
9+
import io.fabric8.kubernetes.api.model.ConfigMap;
10+
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
11+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
12+
import io.fabric8.kubernetes.client.KubernetesClient;
813
import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension;
14+
import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
15+
16+
import static io.javaoperatorsdk.operator.baseapi.informerremotecluster.InformerRemoteClusterReconciler.DATA_KEY;
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.awaitility.Awaitility.await;
19+
20+
@EnableKubeAPIServer
21+
class InformerRemoteClusterIT {
922

10-
@EnableKubeAPIServer(apiServerFlags = {"--min-request-timeout", "1"})
11-
public class InformerRemoteClusterIT {
23+
public static final String NAME = "test1";
24+
public static final String CONFIG_MAP_NAME = "testcm";
25+
public static final String INITIAL_VALUE = "initial_value";
26+
public static final String CHANGED_VALUE = "changed_value";
27+
public static final String CM_NAMESPACE = "default";
28+
29+
static KubernetesClient kubernetesClient;
1230

1331
@RegisterExtension
1432
LocallyRunOperatorExtension extension =
15-
LocallyRunOperatorExtension.builder().withReconciler(new LabelSelectorTestReconciler())
33+
LocallyRunOperatorExtension.builder()
34+
.withReconciler(new InformerRemoteClusterReconciler(kubernetesClient))
1635
.build();
1736

1837
@Test
1938
void testRemoteClusterInformer() {
39+
var r = extension.create(testCustomResource());
40+
41+
var cm = kubernetesClient.configMaps()
42+
.resource(remoteConfigMap(r.getMetadata().getName(),
43+
r.getMetadata().getNamespace()))
44+
.create();
45+
46+
// config map not exists on the primary resource cluster
47+
assertThat(extension.getKubernetesClient().configMaps()
48+
.inNamespace(CM_NAMESPACE)
49+
.withName(CONFIG_MAP_NAME).get()).isNull();
50+
51+
await().untilAsserted(() -> {
52+
var cr = extension.get(InformerRemoteClusterCustomResource.class, NAME);
53+
assertThat(cr.getStatus()).isNotNull();
54+
assertThat(cr.getStatus().getRemoteConfigMapMessage()).isEqualTo(INITIAL_VALUE);
55+
});
56+
57+
cm.getData().put(DATA_KEY, CHANGED_VALUE);
58+
kubernetesClient.configMaps().resource(cm).update();
59+
60+
await().untilAsserted(() -> {
61+
var cr = extension.get(InformerRemoteClusterCustomResource.class, NAME);
62+
assertThat(cr.getStatus().getRemoteConfigMapMessage()).isEqualTo(CHANGED_VALUE);
63+
});
64+
}
65+
66+
InformerRemoteClusterCustomResource testCustomResource() {
67+
var res = new InformerRemoteClusterCustomResource();
68+
res.setMetadata(new ObjectMetaBuilder()
69+
.withName(NAME)
70+
.build());
71+
return res;
72+
}
2073

74+
ConfigMap remoteConfigMap(String ownerName, String ownerNamespace) {
75+
return new ConfigMapBuilder()
76+
.withMetadata(new ObjectMetaBuilder()
77+
.withName(CONFIG_MAP_NAME)
78+
.withNamespace(CM_NAMESPACE)
79+
.withAnnotations(Map.of(
80+
Mappers.DEFAULT_ANNOTATION_FOR_NAME, ownerName,
81+
Mappers.DEFAULT_ANNOTATION_FOR_NAMESPACE, ownerNamespace))
82+
.build())
83+
.withData(Map.of(DATA_KEY, INITIAL_VALUE))
84+
.build();
2185
}
2286

2387
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/informerremotecluster/InformerRemoteClusterReconciler.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,64 @@
22

33
import java.util.List;
44

5+
import io.fabric8.kubernetes.api.model.ConfigMap;
6+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
7+
import io.fabric8.kubernetes.client.KubernetesClient;
8+
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
9+
import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration;
510
import io.javaoperatorsdk.operator.api.reconciler.Context;
611
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
712
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
813
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
914
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
1015
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
16+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
17+
import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
1118

1219
@ControllerConfiguration
1320
public class InformerRemoteClusterReconciler
1421
implements Reconciler<InformerRemoteClusterCustomResource> {
1522

23+
public static final String DATA_KEY = "key";
24+
25+
private final KubernetesClient remoteClient;
26+
27+
public InformerRemoteClusterReconciler(KubernetesClient remoteClient) {
28+
this.remoteClient = remoteClient;
29+
}
1630

1731
@Override
1832
public UpdateControl<InformerRemoteClusterCustomResource> reconcile(
1933
InformerRemoteClusterCustomResource resource,
2034
Context<InformerRemoteClusterCustomResource> context) throws Exception {
2135

22-
23-
24-
return UpdateControl.noUpdate();
36+
return context.getSecondaryResource(ConfigMap.class).map(cm -> {
37+
var r = new InformerRemoteClusterCustomResource();
38+
r.setMetadata(new ObjectMetaBuilder()
39+
.withName(resource.getMetadata().getName())
40+
.withNamespace(resource.getMetadata().getNamespace())
41+
.build());
42+
r.setStatus(new InformerRemoteClusterStatus());
43+
r.getStatus().setRemoteConfigMapMessage(cm.getData().get(DATA_KEY));
44+
return UpdateControl.patchStatus(r);
45+
}).orElseGet(UpdateControl::noUpdate);
2546
}
2647

2748
@Override
2849
public List<EventSource<?, InformerRemoteClusterCustomResource>> prepareEventSources(
2950
EventSourceContext<InformerRemoteClusterCustomResource> context) {
30-
return Reconciler.super.prepareEventSources(context);
51+
52+
var es = new InformerEventSource<>(InformerEventSourceConfiguration
53+
.from(ConfigMap.class, InformerRemoteClusterCustomResource.class)
54+
// owner references naturally not work cross cluster, using
55+
// annotations here to reference primary resource
56+
.withSecondaryToPrimaryMapper(Mappers.fromDefaultAnnotations())
57+
// setting remote client for informer
58+
.withKubernetesClient(remoteClient)
59+
.withInformerConfiguration(
60+
InformerConfiguration.Builder::withWatchAllNamespaces)
61+
.build(), context);
62+
63+
return List.of(es);
3164
}
3265
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/informerremotecluster/InformerRemoteClusterStatus.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
public class InformerRemoteClusterStatus {
44

5+
private String remoteConfigMapMessage;
56

7+
public String getRemoteConfigMapMessage() {
8+
return remoteConfigMapMessage;
9+
}
610

11+
public void setRemoteConfigMapMessage(String remoteConfigMapMessage) {
12+
this.remoteConfigMapMessage = remoteConfigMapMessage;
13+
}
714
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/baseapi/labelselector/LabelSelectorTestReconciler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class LabelSelectorTestReconciler
2222
@Override
2323
public UpdateControl<LabelSelectorTestCustomResource> reconcile(
2424
LabelSelectorTestCustomResource resource, Context<LabelSelectorTestCustomResource> context) {
25+
2526
numberOfExecutions.addAndGet(1);
2627
return UpdateControl.noUpdate();
2728
}

0 commit comments

Comments
 (0)