From d44a53c69809747786cb9b2c1ba6e12b05cd12d7 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 23 Aug 2023 12:51:23 +0200 Subject: [PATCH 1/5] improve: dependent resource can be re-initialized --- .../operator/DependentReInitializationIT.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java new file mode 100644 index 0000000000..c77d3df4a4 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java @@ -0,0 +1,13 @@ +package io.javaoperatorsdk.operator; + +import org.junit.jupiter.api.Test; + +public class DependentReInitializationIT { + + + @Test + void dependentCanDeReInitialized() { + + } + +} From 6fe42aeda78e6ce259a31a779f0c92314136be35 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 23 Aug 2023 13:53:48 +0200 Subject: [PATCH 2/5] test for reproduce --- .../operator/DependentReInitializationIT.java | 31 ++++++++++++--- .../ConfigMapDependentResource.java | 29 ++++++++++++++ ...pendentReInitializationCustomResource.java | 14 +++++++ .../DependentReInitializationReconciler.java | 38 +++++++++++++++++++ 4 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/ConfigMapDependentResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationReconciler.java diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java index c77d3df4a4..d929843d9c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java @@ -2,12 +2,33 @@ import org.junit.jupiter.api.Test; -public class DependentReInitializationIT { +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.dependentreinitialization.ConfigMapDependentResource; +import io.javaoperatorsdk.operator.sample.dependentreinitialization.DependentReInitializationCustomResource; +import io.javaoperatorsdk.operator.sample.dependentreinitialization.DependentReInitializationReconciler; +class DependentReInitializationIT { - @Test - void dependentCanDeReInitialized() { - - } + + @Test + void dependentCanDeReInitialized() { + var client = new KubernetesClientBuilder().build(); + LocallyRunOperatorExtension.applyCrd(DependentReInitializationCustomResource.class, client); + + var dependent = new ConfigMapDependentResource(); + + startEndStopOperator(client, dependent); + startEndStopOperator(client, dependent); + } + + private static void startEndStopOperator(KubernetesClient client, + ConfigMapDependentResource dependent) { + Operator o1 = new Operator(client); + o1.register(new DependentReInitializationReconciler(dependent, client)); + o1.start(); + o1.stop(); + } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/ConfigMapDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/ConfigMapDependentResource.java new file mode 100644 index 0000000000..a102060c10 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/ConfigMapDependentResource.java @@ -0,0 +1,29 @@ +package io.javaoperatorsdk.operator.sample.dependentreinitialization; + +import java.util.Map; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; + +public class ConfigMapDependentResource + extends CRUDKubernetesDependentResource { + + public ConfigMapDependentResource() { + super(ConfigMap.class); + } + + @Override + protected ConfigMap desired(DependentReInitializationCustomResource primary, + Context context) { + return new ConfigMapBuilder() + .withMetadata(new ObjectMetaBuilder() + .withName(primary.getMetadata().getName()) + .withNamespace(primary.getMetadata().getNamespace()) + .build()) + .withData(Map.of("key", "val")) + .build(); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationCustomResource.java new file mode 100644 index 0000000000..ce30463965 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationCustomResource.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.sample.dependentreinitialization; + +import io.fabric8.kubernetes.api.model.Namespaced; +import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.model.annotation.Group; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("sample.javaoperatorsdk") +@Version("v1") +public class DependentReInitializationCustomResource + extends CustomResource + implements Namespaced { + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationReconciler.java new file mode 100644 index 0000000000..e247ddb6df --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentreinitialization/DependentReInitializationReconciler.java @@ -0,0 +1,38 @@ +package io.javaoperatorsdk.operator.sample.dependentreinitialization; + +import java.util.Map; + +import io.fabric8.kubernetes.client.KubernetesClient; +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; + +@ControllerConfiguration +public class DependentReInitializationReconciler + implements Reconciler, + EventSourceInitializer { + + private final ConfigMapDependentResource configMapDependentResource; + + public DependentReInitializationReconciler(ConfigMapDependentResource dependentResource, + KubernetesClient client) { + this.configMapDependentResource = dependentResource; + this.configMapDependentResource.setKubernetesClient(client); + } + + @Override + public UpdateControl reconcile( + DependentReInitializationCustomResource resource, + Context context) throws Exception { + configMapDependentResource.reconcile(resource, context); + return UpdateControl.noUpdate(); + } + + @Override + public Map prepareEventSources( + EventSourceContext context) { + return EventSourceInitializer.nameEventSourcesFromDependentResource(context, + configMapDependentResource); + } + + +} From 72bb259ac7282d48e1ecc88f455be70f8cd60350 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 23 Aug 2023 14:37:43 +0200 Subject: [PATCH 3/5] fix? --- .../event/source/informer/InformerEventSource.java | 2 +- .../operator/DependentReInitializationIT.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java index 8cca524464..727a8d874b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java @@ -365,7 +365,7 @@ public void setConfigurationService(ConfigurationService configurationService) { super.setConfigurationService(configurationService); cache.addIndexers(indexerBuffer); - indexerBuffer = null; + indexerBuffer = new HashMap<>(0); } public void addIndexers(Map>> indexers) { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java index d929843d9c..a94e42f16e 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java @@ -11,7 +11,10 @@ class DependentReInitializationIT { - + /** + * In case dependent resource is managed by CDI (like in Quarkus) can be handy that the instance + * is reused in tests. + */ @Test void dependentCanDeReInitialized() { var client = new KubernetesClientBuilder().build(); @@ -25,7 +28,7 @@ void dependentCanDeReInitialized() { private static void startEndStopOperator(KubernetesClient client, ConfigMapDependentResource dependent) { - Operator o1 = new Operator(client); + Operator o1 = new Operator(client, o -> o.withCloseClientOnStop(false)); o1.register(new DependentReInitializationReconciler(dependent, client)); o1.start(); o1.stop(); From 6a85a83980c78237cb533b39342113c4a8dd9e71 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 23 Aug 2023 15:06:40 +0200 Subject: [PATCH 4/5] imrpove --- .../javaoperatorsdk/operator/DependentReInitializationIT.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java index a94e42f16e..19edc1af61 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentReInitializationIT.java @@ -28,7 +28,9 @@ void dependentCanDeReInitialized() { private static void startEndStopOperator(KubernetesClient client, ConfigMapDependentResource dependent) { - Operator o1 = new Operator(client, o -> o.withCloseClientOnStop(false)); + Operator o1 = new Operator(o -> o + .withCloseClientOnStop(false) + .withKubernetesClient(client)); o1.register(new DependentReInitializationReconciler(dependent, client)); o1.start(); o1.stop(); From 10b6420836fad2e415840719e7870224cbd7a920 Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 24 Aug 2023 12:08:57 +0200 Subject: [PATCH 5/5] remove hashmap init capacity --- .../processing/event/source/informer/InformerEventSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java index 727a8d874b..73927851e7 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java @@ -365,7 +365,7 @@ public void setConfigurationService(ConfigurationService configurationService) { super.setConfigurationService(configurationService); cache.addIndexers(indexerBuffer); - indexerBuffer = new HashMap<>(0); + indexerBuffer = new HashMap<>(); } public void addIndexers(Map>> indexers) {