From 1a48eb45760b6724d3457cc0eba60e5a924b343d Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 12 Nov 2021 16:22:41 +0100 Subject: [PATCH 1/3] chore(deps): upgrade to fabric8 5.10.1 (#656) Mocking the version is not needed anymore. (cherry picked from commit f3b9438a490c4ed8dc2ab0fbdffd0e683add375b) --- .../internal/CustomResourceSelectorTest.java | 23 +------------------ pom.xml | 2 +- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceSelectorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceSelectorTest.java index 6a1e5144e0..ad741aa85d 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceSelectorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceSelectorTest.java @@ -1,8 +1,5 @@ package io.javaoperatorsdk.operator.processing.event.internal; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -18,7 +15,6 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.VersionInfo; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.javaoperatorsdk.operator.Operator; @@ -51,24 +47,7 @@ public class CustomResourceSelectorTest { @SuppressWarnings("unchecked") @BeforeEach - void setUpResources() throws ParseException { - String buildDate = - DateTimeFormatter.ofPattern(VersionInfo.VersionKeys.BUILD_DATE_FORMAT) - .format(LocalDateTime.now()); - - server - .expect() - .get() - .withPath("/version") - .andReturn( - 200, - new VersionInfo.Builder() - .withBuildDate(buildDate) - .withMajor("1") - .withMinor("21") - .build()) - .always(); - + void setUpResources() { configurationService = spy(ConfigurationService.class); when(configurationService.checkCRDAndValidateLocalModel()).thenReturn(false); when(configurationService.getVersion()).thenReturn(new Version("1", "1", new Date())); diff --git a/pom.xml b/pom.xml index 9f29e7f03b..b788e40919 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ ${java.version} 5.8.1 - 5.8.0 + 5.10.1 1.7.32 2.14.1 4.0.0 From 915e4138eb1658395407953e256b9fd061eccef0 Mon Sep 17 00:00:00 2001 From: csviri Date: Fri, 12 Nov 2021 14:30:01 +0100 Subject: [PATCH 2/3] fix: startup bug, when CRs already present on cluster + renaming --- .../event/internal/CustomResourceEventSource.java | 8 ++++++-- .../javaoperatorsdk/operator/junit/OperatorExtension.java | 2 +- .../io/javaoperatorsdk/operator/support/TestUtils.java | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java index c1391b92c7..7b12d0dfe8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java @@ -75,15 +75,19 @@ public void start() { try { if (ControllerConfiguration.allNamespacesWatched(targetNamespaces)) { var informer = client.inAnyNamespace() - .withLabels(parseSimpleLabelSelector(labelSelector)).inform(this); + .withLabels(parseSimpleLabelSelector(labelSelector)).runnableInformer(0); + informer.addEventHandler(this); sharedIndexInformers.put(ANY_NAMESPACE_MAP_KEY, informer); log.debug("Registered {} -> {} for any namespace", controller, informer); + informer.run(); } else { targetNamespaces.forEach( ns -> { var informer = client.inNamespace(ns) - .withLabels(parseSimpleLabelSelector(labelSelector)).inform(this); + .withLabels(parseSimpleLabelSelector(labelSelector)).runnableInformer(0); + informer.addEventHandler(this); sharedIndexInformers.put(ns, informer); + informer.run(); log.debug("Registered {} -> {} for namespace: {}", controller, informer, ns); }); diff --git a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java index 5fed85dc67..ed19ed3ac2 100644 --- a/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java +++ b/operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/OperatorExtension.java @@ -106,7 +106,7 @@ public String getNamespace() { } @SuppressWarnings({"rawtypes"}) - public List getControllers() { + public List getReconcilers() { return operator.getControllers().stream() .map(Controller::getReconciler) .collect(Collectors.toUnmodifiableList()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/support/TestUtils.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/support/TestUtils.java index a81cf9ce05..c2b5841d68 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/support/TestUtils.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/support/TestUtils.java @@ -58,6 +58,6 @@ public static void waitXms(int x) { } public static int getNumberOfExecutions(OperatorExtension extension) { - return ((TestExecutionInfoProvider) extension.getControllers().get(0)).getNumberOfExecutions(); + return ((TestExecutionInfoProvider) extension.getReconcilers().get(0)).getNumberOfExecutions(); } } From 6c73a5046b26530abb5aa68e5bc7fe14f5836e04 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 12 Nov 2021 17:02:32 +0100 Subject: [PATCH 3/3] feat: pass selector as String instead of parsing it This is a new feature of Fabric8 5.9+ --- .../internal/CustomResourceEventSource.java | 28 +++++++++++------- .../internal/LabelSelectorParserTest.java | 29 ------------------- 2 files changed, 17 insertions(+), 40 deletions(-) delete mode 100644 operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/LabelSelectorParserTest.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java index 7b12d0dfe8..578c6894cb 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/internal/CustomResourceEventSource.java @@ -6,8 +6,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.fabric8.kubernetes.api.model.KubernetesResourceList; import io.fabric8.kubernetes.client.CustomResource; import io.fabric8.kubernetes.client.KubernetesClientException; +import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; import io.fabric8.kubernetes.client.informers.cache.Cache; @@ -23,7 +25,6 @@ import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getName; import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID; import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion; -import static io.javaoperatorsdk.operator.processing.event.internal.LabelSelectorParser.parseSimpleLabelSelector; /** * This is a special case since is not bound to a single custom resource @@ -74,20 +75,16 @@ public void start() { try { if (ControllerConfiguration.allNamespacesWatched(targetNamespaces)) { - var informer = client.inAnyNamespace() - .withLabels(parseSimpleLabelSelector(labelSelector)).runnableInformer(0); - informer.addEventHandler(this); - sharedIndexInformers.put(ANY_NAMESPACE_MAP_KEY, informer); + final var filteredBySelectorClient = client.inAnyNamespace() + .withLabelSelector(labelSelector); + final var informer = + createAndRunInformerFor(filteredBySelectorClient, ANY_NAMESPACE_MAP_KEY); log.debug("Registered {} -> {} for any namespace", controller, informer); - informer.run(); } else { targetNamespaces.forEach( ns -> { - var informer = client.inNamespace(ns) - .withLabels(parseSimpleLabelSelector(labelSelector)).runnableInformer(0); - informer.addEventHandler(this); - sharedIndexInformers.put(ns, informer); - informer.run(); + final var informer = createAndRunInformerFor( + client.inNamespace(ns).withLabelSelector(labelSelector), ns); log.debug("Registered {} -> {} for namespace: {}", controller, informer, ns); }); @@ -107,6 +104,15 @@ public void start() { } } + private SharedIndexInformer createAndRunInformerFor( + FilterWatchListDeletable> filteredBySelectorClient, String key) { + var informer = filteredBySelectorClient.runnableInformer(0); + informer.addEventHandler(this); + sharedIndexInformers.put(key, informer); + informer.run(); + return informer; + } + @Override public void stop() { for (SharedIndexInformer informer : sharedIndexInformers.values()) { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/LabelSelectorParserTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/LabelSelectorParserTest.java deleted file mode 100644 index 3a619bbc19..0000000000 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/internal/LabelSelectorParserTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.javaoperatorsdk.operator.processing.event.internal; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class LabelSelectorParserTest { - - @Test - public void nullParamReturnsEmptyMap() { - var res = LabelSelectorParser.parseSimpleLabelSelector(null); - assertThat(res).hasSize(0); - } - - @Test - public void emptyLabelSelectorReturnsEmptyMap() { - var res = LabelSelectorParser.parseSimpleLabelSelector(" "); - assertThat(res).hasSize(0); - } - - @Test - public void parseSimpleLabelSelector() { - var res = LabelSelectorParser.parseSimpleLabelSelector("app=foo"); - assertThat(res).hasSize(1).containsEntry("app", "foo"); - - res = LabelSelectorParser.parseSimpleLabelSelector("app=foo,owner=me"); - assertThat(res).hasSize(2).containsEntry("app", "foo").containsEntry("owner", "me"); - } -}