From bc4382c56a54da9ac1a05b56c6b8e5580b06bbed Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 29 May 2023 09:52:04 +0200 Subject: [PATCH 1/5] improve: PerResourcePollingEventSource init improvements --- .../PerResourcePollingDependentResource.java | 6 ++- .../PerResourcePollingEventSource.java | 46 ++++++++++++++++++- .../PerResourcePollingEventSourceTest.java | 15 +++--- .../ExternalStateReconciler.java | 3 +- ...ourcePollingEventSourceTestReconciler.java | 3 +- 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java index f495f5f316..affc63cfd3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java @@ -1,5 +1,7 @@ package io.javaoperatorsdk.operator.processing.dependent.external; +import java.time.Duration; + import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.api.reconciler.Ignore; @@ -23,8 +25,8 @@ public PerResourcePollingDependentResource(Class resourceType, long pollingPe @Override protected ExternalResourceCachingEventSource createEventSource( EventSourceContext

context) { - return new PerResourcePollingEventSource<>(this, context.getPrimaryCache(), - getPollingPeriod(), resourceType(), this); + return new PerResourcePollingEventSource<>(this, context, + Duration.ofMillis(getPollingPeriod()), resourceType(), this); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java index 7b02f7e43e..06c4cb8948 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java @@ -10,6 +10,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.OperatorException; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.Cache; import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper; @@ -43,19 +44,49 @@ public class PerResourcePollingEventSource private final long period; private final Set fetchedForPrimaries = ConcurrentHashMap.newKeySet(); + public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, + EventSourceContext

context, Duration defaultPollingPeriod, + Class resourceClass) { + this(resourceFetcher, context.getPrimaryCache(), defaultPollingPeriod.toMillis(), + null, resourceClass, + CacheKeyMapper.singleResourceCacheKeyMapper()); + } + @Deprecated public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass) { this(resourceFetcher, resourceCache, period, null, resourceClass, CacheKeyMapper.singleResourceCacheKeyMapper()); } + public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, + EventSourceContext

context, + Duration defaultPollingPeriod, + Class resourceClass, + CacheKeyMapper cacheKeyMapper) { + this(resourceFetcher, context.getPrimaryCache(), defaultPollingPeriod.toMillis(), + null, resourceClass, cacheKeyMapper); + } + + @Deprecated public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass, CacheKeyMapper cacheKeyMapper) { this(resourceFetcher, resourceCache, period, null, resourceClass, cacheKeyMapper); } + public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, + EventSourceContext

context, + Duration defaultPollingPeriod, + Predicate

registerPredicate, + Class resourceClass, + CacheKeyMapper cacheKeyMapper) { + this(resourceFetcher, context.getPrimaryCache(), defaultPollingPeriod.toMillis(), + registerPredicate, resourceClass, cacheKeyMapper, + new ScheduledThreadPoolExecutor(DEFAULT_EXECUTOR_THREAD_NUMBER)); + } + + @Deprecated public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Predicate

registerPredicate, Class resourceClass, @@ -64,7 +95,20 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, new ScheduledThreadPoolExecutor(DEFAULT_EXECUTOR_THREAD_NUMBER)); } - public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, + + public PerResourcePollingEventSource( + ResourceFetcher resourceFetcher, + EventSourceContext

context, Duration defaultPollingPeriod, + Predicate

registerPredicate, Class resourceClass, + CacheKeyMapper cacheKeyMapper, ScheduledExecutorService executorService) { + this(resourceFetcher, context.getPrimaryCache(), defaultPollingPeriod.toMillis(), + registerPredicate, + resourceClass, cacheKeyMapper, executorService); + } + + @Deprecated + public PerResourcePollingEventSource( + ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Predicate

registerPredicate, Class resourceClass, CacheKeyMapper cacheKeyMapper, ScheduledExecutorService executorService) { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSourceTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSourceTest.java index 02f173da2b..70249f6125 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSourceTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSourceTest.java @@ -9,11 +9,9 @@ import org.junit.jupiter.api.Test; import io.javaoperatorsdk.operator.TestUtils; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.processing.event.EventHandler; -import io.javaoperatorsdk.operator.processing.event.source.AbstractEventSourceTestBase; -import io.javaoperatorsdk.operator.processing.event.source.Cache; -import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper; -import io.javaoperatorsdk.operator.processing.event.source.SampleExternalResource; +import io.javaoperatorsdk.operator.processing.event.source.*; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import static org.assertj.core.api.Assertions.assertThat; @@ -35,16 +33,19 @@ class PerResourcePollingEventSourceTest extends private final PerResourcePollingEventSource.ResourceFetcher supplier = mock(PerResourcePollingEventSource.ResourceFetcher.class); @SuppressWarnings("unchecked") - private final Cache resourceCache = mock(Cache.class); + private final IndexerResourceCache resourceCache = + mock(IndexerResourceCache.class); private final TestCustomResource testCustomResource = TestUtils.testCustomResource(); + private final EventSourceContext context = mock(EventSourceContext.class); @BeforeEach public void setup() { when(resourceCache.get(any())).thenReturn(Optional.of(testCustomResource)); when(supplier.fetchResources(any())) .thenReturn(Set.of(SampleExternalResource.testResource1())); + when(context.getPrimaryCache()).thenReturn(resourceCache); - setUpSource(new PerResourcePollingEventSource<>(supplier, resourceCache, PERIOD, + setUpSource(new PerResourcePollingEventSource<>(supplier, context, Duration.ofMillis(PERIOD), SampleExternalResource.class, r -> r.getName() + "#" + r.getValue())); } @@ -61,7 +62,7 @@ void pollsTheResourceAfterAwareOfIt() { @Test void registeringTaskOnAPredicate() { - setUpSource(new PerResourcePollingEventSource<>(supplier, resourceCache, PERIOD, + setUpSource(new PerResourcePollingEventSource<>(supplier, context, Duration.ofMillis(PERIOD), testCustomResource -> testCustomResource.getMetadata().getGeneration() > 1, SampleExternalResource.class, CacheKeyMapper.singleResourceCacheKeyMapper())); source.onResourceCreated(testCustomResource); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/ExternalStateReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/ExternalStateReconciler.java index e2efb32999..804906e3c1 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/ExternalStateReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/externalstate/ExternalStateReconciler.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator.sample.externalstate; +import java.time.Duration; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -122,7 +123,7 @@ public Map prepareEventSources( var id = configMap.getData().get(ID_KEY); var externalResource = externalService.read(id); return externalResource.map(Set::of).orElseGet(Collections::emptySet); - }, context.getPrimaryCache(), 300L, ExternalResource.class); + }, context, Duration.ofMillis(300L), ExternalResource.class); return EventSourceInitializer.nameEventSources(configMapEventSource, externalResourceEventSource); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/perresourceeventsource/PerResourcePollingEventSourceTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/perresourceeventsource/PerResourcePollingEventSourceTestReconciler.java index d22285d6a7..f8cb3ffa44 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/perresourceeventsource/PerResourcePollingEventSourceTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/perresourceeventsource/PerResourcePollingEventSourceTestReconciler.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator.sample.perresourceeventsource; +import java.time.Duration; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -41,7 +42,7 @@ public Map prepareEventSources( numberOfFetchExecutions.compute(resource.getMetadata().getName(), (s, v) -> v + 1); return Set.of(UUID.randomUUID().toString()); }, - context.getPrimaryCache(), POLL_PERIOD, String.class); + context, Duration.ofMillis(POLL_PERIOD), String.class); return EventSourceInitializer.nameEventSources(eventSource); } From e5a7e961702292988478f400c2706f44b69b6409 Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 29 May 2023 09:59:32 +0200 Subject: [PATCH 2/5] annotation improvement --- .../event/source/polling/PerResourcePollingEventSource.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java index 06c4cb8948..6424ff042d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java @@ -52,7 +52,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, CacheKeyMapper.singleResourceCacheKeyMapper()); } - @Deprecated + @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass) { this(resourceFetcher, resourceCache, period, null, resourceClass, @@ -68,7 +68,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, null, resourceClass, cacheKeyMapper); } - @Deprecated + @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass, CacheKeyMapper cacheKeyMapper) { @@ -86,7 +86,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, new ScheduledThreadPoolExecutor(DEFAULT_EXECUTOR_THREAD_NUMBER)); } - @Deprecated + @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Predicate

registerPredicate, Class resourceClass, From 95f3f0463e82302f50ca1023e433ff517384fa95 Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 29 May 2023 13:40:35 +0200 Subject: [PATCH 3/5] javadoc --- .../PerResourcePollingEventSource.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java index 6424ff042d..f5abfbe9a9 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java @@ -52,6 +52,15 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, CacheKeyMapper.singleResourceCacheKeyMapper()); } + /** + * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and + * {@link Duration} for period parameter. What provides a more intuitive API. + * + * @param resourceFetcher fetches resource related to a primary resource + * @param resourceCache cache of the primary resource + * @param period default polling period + * @param resourceClass class of the target resource + */ @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass) { @@ -68,6 +77,17 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, null, resourceClass, cacheKeyMapper); } + /** + * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and + * {@link Duration} for period parameter. What provides a more intuitive API. + * + * @param resourceFetcher fetches resource related to a primary resource + * @param resourceCache cache of the primary resource + * @param period default polling period + * @param resourceClass class of the target resource + * @param cacheKeyMapper use to distinguish resource in case more resources are handled for a + * single primary resource + */ @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, Class resourceClass, @@ -86,6 +106,19 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, new ScheduledThreadPoolExecutor(DEFAULT_EXECUTOR_THREAD_NUMBER)); } + /** + * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and + * {@link Duration} for period parameter. What provides a more intuitive API. + * + * @param resourceFetcher fetches resource related to a primary resource + * @param resourceCache cache of the primary resource + * @param period default polling period + * @param resourceClass class of the target resource + * @param cacheKeyMapper use to distinguish resource in case more resources are handled for a + * single primary resource + * @param registerPredicate used to determine if the related resource for a custom resource should + * be polled or not. + */ @Deprecated(forRemoval = true) public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, Cache

resourceCache, long period, @@ -106,6 +139,21 @@ public PerResourcePollingEventSource( resourceClass, cacheKeyMapper, executorService); } + /** + * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and + * {@link Duration} for period parameter. What provides a more intuitive API. + * + * @param resourceFetcher fetches resource related to a primary resource + * @param resourceCache cache of the primary resource + * @param period default polling period + * @param resourceClass class of the target resource + * @param cacheKeyMapper use to distinguish resource in case more resources are handled for a + * single primary resource + * @param registerPredicate used to determine if the related resource for a custom resource should + * be polled or not. + * @param executorService custom executor service + */ + @Deprecated public PerResourcePollingEventSource( ResourceFetcher resourceFetcher, From 497c866b248da97a48dde2933bdbc575c734a4d0 Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 29 May 2023 16:51:11 +0200 Subject: [PATCH 4/5] minor fix --- .../event/source/polling/PerResourcePollingEventSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java index f5abfbe9a9..5bc8b0d6d2 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java @@ -154,7 +154,7 @@ public PerResourcePollingEventSource( * @param executorService custom executor service */ - @Deprecated + @Deprecated(forRemoval = true) public PerResourcePollingEventSource( ResourceFetcher resourceFetcher, Cache

resourceCache, long period, From 58e57966afb5cc48eb2b0501876f68bafe310050 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 30 May 2023 18:06:42 +0200 Subject: [PATCH 5/5] fix: grammar --- .../PerResourcePollingEventSource.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java index 5bc8b0d6d2..6da1ec0e58 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/polling/PerResourcePollingEventSource.java @@ -1,8 +1,16 @@ package io.javaoperatorsdk.operator.processing.event.source.polling; import java.time.Duration; -import java.util.*; -import java.util.concurrent.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import org.slf4j.Logger; @@ -54,7 +62,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, /** * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and - * {@link Duration} for period parameter. What provides a more intuitive API. + * {@link Duration} for period parameter as it provides a more intuitive API. * * @param resourceFetcher fetches resource related to a primary resource * @param resourceCache cache of the primary resource @@ -79,7 +87,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, /** * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and - * {@link Duration} for period parameter. What provides a more intuitive API. + * {@link Duration} for period parameter as it provides a more intuitive API. * * @param resourceFetcher fetches resource related to a primary resource * @param resourceCache cache of the primary resource @@ -108,7 +116,7 @@ public PerResourcePollingEventSource(ResourceFetcher resourceFetcher, /** * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and - * {@link Duration} for period parameter. What provides a more intuitive API. + * {@link Duration} for period parameter as it provides a more intuitive API. * * @param resourceFetcher fetches resource related to a primary resource * @param resourceCache cache of the primary resource @@ -141,7 +149,7 @@ public PerResourcePollingEventSource( /** * @deprecated use the variant which uses {@link EventSourceContext} instead of {@link Cache} and - * {@link Duration} for period parameter. What provides a more intuitive API. + * {@link Duration} for period parameter as it provides a more intuitive API. * * @param resourceFetcher fetches resource related to a primary resource * @param resourceCache cache of the primary resource