From 8be39129753c923207ac563b9b365e276564c9dd Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 15 Jul 2022 11:21:02 +0200 Subject: [PATCH 1/4] refactor: ReconciliationMaxInterval -> MaxReconciliationInterval --- .../AnnotationControllerConfiguration.java | 50 +++++++++++++++---- .../api/config/ControllerConfiguration.java | 9 ++++ .../ControllerConfigurationOverrider.java | 2 +- .../DefaultControllerConfiguration.java | 2 +- .../operator/api/reconciler/Constants.java | 7 +++ .../reconciler/ControllerConfiguration.java | 11 ++++ .../reconciler/MaxReconciliationInterval.java | 36 +++++++++++++ .../reconciler/ReconciliationMaxInterval.java | 6 ++- .../event/ReconciliationDispatcher.java | 2 +- .../event/ReconciliationDispatcherTest.java | 4 +- ...AnnotationControllerConfigurationTest.java | 22 ++++++++ .../MaxIntervalTestReconciler.java | 8 ++- 12 files changed, 140 insertions(+), 19 deletions(-) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java index 0e302b9ecd..37956e6d8d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java @@ -13,6 +13,9 @@ import java.util.function.Function; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.ReconcilerUtils; @@ -30,7 +33,14 @@ import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter; import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter; import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters; -import io.javaoperatorsdk.operator.processing.event.source.filter.*; +import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnAddFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnDeleteFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnDeleteFilter; +import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter; import io.javaoperatorsdk.operator.processing.retry.Retry; import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET; @@ -39,6 +49,9 @@ public class AnnotationControllerConfiguration

implements io.javaoperatorsdk.operator.api.config.ControllerConfiguration

{ + private static final Logger log = + LoggerFactory.getLogger(AnnotationControllerConfiguration.class); + protected final Reconciler

reconciler; private final ControllerConfiguration annotation; private List specs; @@ -136,17 +149,32 @@ public ResourceEventFilter

getEventFilter() { @Override public Optional reconciliationMaxInterval() { - if (annotation.reconciliationMaxInterval() != null) { - if (annotation.reconciliationMaxInterval().interval() <= 0) { - return Optional.empty(); - } - return Optional.of( - Duration.of( - annotation.reconciliationMaxInterval().interval(), - annotation.reconciliationMaxInterval().timeUnit().toChronoUnit())); - } else { - return io.javaoperatorsdk.operator.api.config.ControllerConfiguration.super.reconciliationMaxInterval(); + return maxReconciliationInterval(); + } + + @Override + public Optional maxReconciliationInterval() { + Duration oldStyle = null; + final var oldConfig = annotation.reconciliationMaxInterval(); + if (oldConfig != null && oldConfig.interval() > 0) { + oldStyle = Duration.of(oldConfig.interval(), oldConfig.timeUnit().toChronoUnit()); + } + + Duration duration = null; + final var newConfig = annotation.maxReconciliationInterval(); + if (newConfig != null && newConfig.interval() > 0) { + duration = Duration.of(newConfig.interval(), newConfig.timeUnit().toChronoUnit()); + } + + if (duration != null && oldStyle != null) { + log.debug( + "Both maxReconciliationInterval ({}) and deprecated reconciliationMaxInterval ({}) are used, keeping the non-deprecated value: {}", + duration, oldStyle, duration); + } + if (duration == null && oldStyle != null) { + return Optional.of(oldStyle); } + return Optional.ofNullable(duration); } @Override diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index 037703c355..1aaa8440ab 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -77,6 +77,15 @@ default List getDependentResources() { return Collections.emptyList(); } + default Optional maxReconciliationInterval() { + return Optional.of(Duration.ofHours(10L)); + } + + /** + * + * @deprecated use {@link #maxReconciliationInterval()} instead + */ + @Deprecated(forRemoval = true) default Optional reconciliationMaxInterval() { return Optional.of(Duration.ofHours(10L)); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index 5f03441ea8..4b0766d3dc 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -47,7 +47,7 @@ private ControllerConfigurationOverrider(ControllerConfiguration original) { retry = original.getRetry(); labelSelector = original.getLabelSelector(); customResourcePredicate = original.getEventFilter(); - reconciliationMaxInterval = original.reconciliationMaxInterval().orElse(null); + reconciliationMaxInterval = original.maxReconciliationInterval().orElse(null); // make the original specs modifiable final var dependentResources = original.getDependentResources(); namedDependentResourceSpecs = new LinkedHashMap<>(dependentResources.size()); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java index 826b837383..3f4d952133 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultControllerConfiguration.java @@ -108,7 +108,7 @@ public List getDependentResources() { } @Override - public Optional reconciliationMaxInterval() { + public Optional maxReconciliationInterval() { return Optional.ofNullable(reconciliationMaxInterval); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java index f8fa63961c..42dfd94e22 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java @@ -16,7 +16,14 @@ public final class Constants { public static final String NO_VALUE_SET = ""; public static final String WATCH_CURRENT_NAMESPACE = "JOSDK_WATCH_CURRENT"; public static final String WATCH_ALL_NAMESPACES = "JOSDK_ALL_NAMESPACES"; + + /** + * @deprecated use {@link #NO_MAX_RECONCILIATION_INTERVAL} instead + */ + @Deprecated(forRemoval = true) public static final long NO_RECONCILIATION_MAX_INTERVAL = -1L; + + public static final long NO_MAX_RECONCILIATION_INTERVAL = -1L; public static final String SAME_AS_CONTROLLER = "JOSDK_SAME_AS_CONTROLLER"; public static final String RESOURCE_GVK_KEY = "josdk.resource.gvk"; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java index a8192b8772..a3d93fb1e1 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java @@ -92,10 +92,21 @@ * to happen before one will be automatically triggered. * * @return the maximal interval configuration + * @deprecated use {@link #maxReconciliationInterval()} instead */ + @Deprecated(forRemoval = true) ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMaxInterval( interval = ReconciliationMaxInterval.DEFAULT_INTERVAL); + /** + * Optional configuration of the maximal interval the SDK will wait for a reconciliation request + * to happen before one will be automatically triggered. + * + * @return the maximal reconciliation interval configuration + */ + MaxReconciliationInterval maxReconciliationInterval() default @MaxReconciliationInterval( + interval = 10); + /** * Optional list of {@link Dependent} configurations which associate a resource type to a diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java new file mode 100644 index 0000000000..8e34f191dc --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java @@ -0,0 +1,36 @@ +package io.javaoperatorsdk.operator.api.reconciler; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface MaxReconciliationInterval { + + /** + * A max delay between two reconciliations. Having this value larger than zero, will ensure that a + * reconciliation is scheduled with a target interval after the last reconciliation. Note that + * this not applies for retries, in case of an exception reconciliation is not scheduled. This is + * not a fixed rate, in other words a new reconciliation is scheduled after each reconciliation. + *

+ * If an interval is specified by {@link UpdateControl} or {@link DeleteControl}, those take + * precedence. + *

+ * This is a fail-safe feature, in the sense that if informers are in place and the reconciler + * implementation is correct, this feature can be turned off. + *

+ * Use {@link Constants#NO_MAX_RECONCILIATION_INTERVAL} to turn off this feature. + * + * @return max delay between reconciliations + **/ + long interval(); + + /** + * @return time unit for max delay between reconciliations + */ + TimeUnit timeUnit() default TimeUnit.HOURS; + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java index 5e4e710661..2bbbaafccb 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java @@ -6,8 +6,12 @@ import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; +/** + * @deprecated use {@link MaxReconciliationInterval} instead + */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) +@Deprecated(forRemoval = true) public @interface ReconciliationMaxInterval { long DEFAULT_INTERVAL = 10; @@ -23,7 +27,7 @@ * This is a fail-safe feature, in the sense that if informers are in place and the reconciler * implementation is correct, this feature can be turned off. *

- * Use NO_RECONCILIATION_MAX_INTERVAL in {@link Constants} to turn off this feature. + * Use {@link Constants#NO_MAX_RECONCILIATION_INTERVAL} to turn off this feature. * * @return max delay between reconciliations **/ diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java index 778468f269..db529c48a0 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java @@ -270,7 +270,7 @@ private void updatePostExecutionControlWithReschedule( PostExecutionControl postExecutionControl, BaseControl baseControl) { baseControl.getScheduleDelay().ifPresentOrElse(postExecutionControl::withReSchedule, - () -> controller.getConfiguration().reconciliationMaxInterval() + () -> controller.getConfiguration().maxReconciliationInterval() .ifPresent(m -> postExecutionControl.withReSchedule(m.toMillis()))); } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java index f19ba918f3..ddd5ce583b 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java @@ -111,7 +111,7 @@ private ReconciliationDispatcher init(R customResourc when(configuration.getName()).thenReturn("EventDispatcherTestController"); when(configuration.getResourceClass()).thenReturn(resourceClass); when(configuration.getRetry()).thenReturn(new GenericRetry()); - when(configuration.reconciliationMaxInterval()) + when(configuration.maxReconciliationInterval()) .thenReturn(Optional.of(Duration.ofHours(RECONCILIATION_MAX_INTERVAL))); Controller controller = new Controller<>(reconciler, configuration, @@ -618,7 +618,7 @@ void canSkipSchedulingMaxDelayIf() { testCustomResource.addFinalizer(DEFAULT_FINALIZER); reconciler.reconcile = (r, c) -> UpdateControl.noUpdate(); - when(reconciliationDispatcher.configuration().reconciliationMaxInterval()) + when(reconciliationDispatcher.configuration().maxReconciliationInterval()) .thenReturn(Optional.empty()); PostExecutionControl control = diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java index 731c7b7cd3..7168fd0c25 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -18,7 +19,9 @@ import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.ReconciliationMaxInterval; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @@ -129,6 +132,11 @@ && findByNameOptional(dependents, DependentResource.defaultNameFor(ReadOnlyDepen .isPresent()); } + @Test + void newMaxIntervalShouldTakePrecedence() { + var config = new AnnotationControllerConfiguration<>(new MaxIntervalReconciler()); + assertEquals(50, config.maxReconciliationInterval().map(Duration::getSeconds).orElseThrow()); + } @Test void checkDefaultRateAndRetryConfigurations() { @@ -169,6 +177,20 @@ void checkingRetryingGraduallyWorks() { assertEquals(CheckRetryingGraduallyConfiguration.MAX_INTERVAL, genericRetry.getMaxInterval()); } + @ControllerConfiguration( + maxReconciliationInterval = @MaxReconciliationInterval(interval = 50, + timeUnit = TimeUnit.SECONDS), + reconciliationMaxInterval = @ReconciliationMaxInterval(interval = 20, + timeUnit = TimeUnit.SECONDS)) + private static class MaxIntervalReconciler implements Reconciler { + + @Override + public UpdateControl reconcile(ConfigMap resource, Context context) + throws Exception { + return null; + } + } + @ControllerConfiguration(namespaces = OneDepReconciler.CONFIGURED_NS, dependents = @Dependent(type = ReadOnlyDependent.class)) private static class OneDepReconciler implements Reconciler { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/maxinterval/MaxIntervalTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/maxinterval/MaxIntervalTestReconciler.java index f868148145..de77a0220c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/maxinterval/MaxIntervalTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/maxinterval/MaxIntervalTestReconciler.java @@ -3,10 +3,14 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; +import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; -@ControllerConfiguration(reconciliationMaxInterval = @ReconciliationMaxInterval(interval = 50, +@ControllerConfiguration(maxReconciliationInterval = @MaxReconciliationInterval(interval = 50, timeUnit = TimeUnit.MILLISECONDS)) public class MaxIntervalTestReconciler implements Reconciler, TestExecutionInfoProvider { From 2a94aa9d3fc4c5745b3f694609074ad7eef3f236 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 15 Jul 2022 11:24:10 +0200 Subject: [PATCH 2/4] refactor: move default value to new annotation and use it --- .../operator/api/config/ControllerConfiguration.java | 6 ++++-- .../operator/api/reconciler/ControllerConfiguration.java | 4 ++-- .../operator/api/reconciler/MaxReconciliationInterval.java | 2 ++ .../operator/api/reconciler/ReconciliationMaxInterval.java | 2 -- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index 1aaa8440ab..945cb01a0b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -8,6 +8,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.ReconcilerUtils; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; +import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval; import io.javaoperatorsdk.operator.processing.event.rate.LinearRateLimiter; import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter; import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter; @@ -53,6 +54,7 @@ default RetryConfiguration getRetryConfiguration() { return RetryConfiguration.DEFAULT; } + @SuppressWarnings("rawtypes") default RateLimiter getRateLimiter() { return DEFAULT_RATE_LIMITER; } @@ -78,7 +80,7 @@ default List getDependentResources() { } default Optional maxReconciliationInterval() { - return Optional.of(Duration.ofHours(10L)); + return Optional.of(Duration.ofHours(MaxReconciliationInterval.DEFAULT_INTERVAL)); } /** @@ -87,7 +89,7 @@ default Optional maxReconciliationInterval() { */ @Deprecated(forRemoval = true) default Optional reconciliationMaxInterval() { - return Optional.of(Duration.ofHours(10L)); + return Optional.of(Duration.ofHours(MaxReconciliationInterval.DEFAULT_INTERVAL)); } @SuppressWarnings("unused") diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java index a3d93fb1e1..ee61acd192 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java @@ -96,7 +96,7 @@ */ @Deprecated(forRemoval = true) ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMaxInterval( - interval = ReconciliationMaxInterval.DEFAULT_INTERVAL); + interval = MaxReconciliationInterval.DEFAULT_INTERVAL); /** * Optional configuration of the maximal interval the SDK will wait for a reconciliation request @@ -105,7 +105,7 @@ ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMax * @return the maximal reconciliation interval configuration */ MaxReconciliationInterval maxReconciliationInterval() default @MaxReconciliationInterval( - interval = 10); + interval = MaxReconciliationInterval.DEFAULT_INTERVAL); /** diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java index 8e34f191dc..056cdec805 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/MaxReconciliationInterval.java @@ -10,6 +10,8 @@ @Target({ElementType.TYPE}) public @interface MaxReconciliationInterval { + long DEFAULT_INTERVAL = 10; + /** * A max delay between two reconciliations. Having this value larger than zero, will ensure that a * reconciliation is scheduled with a target interval after the last reconciliation. Note that diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java index 2bbbaafccb..a6a27ecd09 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java @@ -13,8 +13,6 @@ @Target({ElementType.TYPE}) @Deprecated(forRemoval = true) public @interface ReconciliationMaxInterval { - long DEFAULT_INTERVAL = 10; - /** * A max delay between two reconciliations. Having this value larger than zero, will ensure that a * reconciliation is scheduled with a target interval after the last reconciliation. Note that From bdfa3155ecc650a02f759bf81064620685451fa7 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 15 Jul 2022 13:15:24 +0200 Subject: [PATCH 3/4] refactor: remove backwards compatibility as impact should be low --- docs/documentation/v3-1-migration.md | 5 +++ .../AnnotationControllerConfiguration.java | 25 +----------- .../api/config/ControllerConfiguration.java | 10 +---- .../reconciler/ControllerConfiguration.java | 11 ------ .../reconciler/ReconciliationMaxInterval.java | 39 ------------------- ...AnnotationControllerConfigurationTest.java | 5 +-- 6 files changed, 9 insertions(+), 86 deletions(-) delete mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java diff --git a/docs/documentation/v3-1-migration.md b/docs/documentation/v3-1-migration.md index 2a1ceac7e9..9a7d9f7a9f 100644 --- a/docs/documentation/v3-1-migration.md +++ b/docs/documentation/v3-1-migration.md @@ -7,6 +7,11 @@ permalink: /docs/v3-1-migration # Migrating from v3 to v3.1 +## ReconciliationMaxInterval Annotation has been renamed to MaxReconciliationInterval + +Associated methods on both the `ControllerConfiguration` class and annotation have also been +renamed accordingly. + ## Workflows Impact on Managed Dependent Resources Behavior Version 3.1 comes with a workflow engine that replaces the previous behavior of managed dependent diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java index 37956e6d8d..e64a23ab64 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java @@ -147,34 +147,13 @@ public ResourceEventFilter

getEventFilter() { return answer != null ? answer : ResourceEventFilters.passthrough(); } - @Override - public Optional reconciliationMaxInterval() { - return maxReconciliationInterval(); - } - @Override public Optional maxReconciliationInterval() { - Duration oldStyle = null; - final var oldConfig = annotation.reconciliationMaxInterval(); - if (oldConfig != null && oldConfig.interval() > 0) { - oldStyle = Duration.of(oldConfig.interval(), oldConfig.timeUnit().toChronoUnit()); - } - - Duration duration = null; final var newConfig = annotation.maxReconciliationInterval(); if (newConfig != null && newConfig.interval() > 0) { - duration = Duration.of(newConfig.interval(), newConfig.timeUnit().toChronoUnit()); - } - - if (duration != null && oldStyle != null) { - log.debug( - "Both maxReconciliationInterval ({}) and deprecated reconciliationMaxInterval ({}) are used, keeping the non-deprecated value: {}", - duration, oldStyle, duration); - } - if (duration == null && oldStyle != null) { - return Optional.of(oldStyle); + return Optional.of(Duration.of(newConfig.interval(), newConfig.timeUnit().toChronoUnit())); } - return Optional.ofNullable(duration); + return Optional.empty(); } @Override diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index 945cb01a0b..74c40ed9a8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -19,6 +19,7 @@ public interface ControllerConfiguration extends ResourceConfiguration { + @SuppressWarnings("rawtypes") RateLimiter DEFAULT_RATE_LIMITER = LinearRateLimiter.deactivatedRateLimiter(); default String getName() { @@ -83,15 +84,6 @@ default Optional maxReconciliationInterval() { return Optional.of(Duration.ofHours(MaxReconciliationInterval.DEFAULT_INTERVAL)); } - /** - * - * @deprecated use {@link #maxReconciliationInterval()} instead - */ - @Deprecated(forRemoval = true) - default Optional reconciliationMaxInterval() { - return Optional.of(Duration.ofHours(MaxReconciliationInterval.DEFAULT_INTERVAL)); - } - @SuppressWarnings("unused") default ConfigurationService getConfigurationService() { return ConfigurationServiceProvider.instance(); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java index ee61acd192..b760720396 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java @@ -87,17 +87,6 @@ **/ Class> genericFilter() default VoidGenericFilter.class; - /** - * Optional configuration of the maximal interval the SDK will wait for a reconciliation request - * to happen before one will be automatically triggered. - * - * @return the maximal interval configuration - * @deprecated use {@link #maxReconciliationInterval()} instead - */ - @Deprecated(forRemoval = true) - ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMaxInterval( - interval = MaxReconciliationInterval.DEFAULT_INTERVAL); - /** * Optional configuration of the maximal interval the SDK will wait for a reconciliation request * to happen before one will be automatically triggered. diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java deleted file mode 100644 index a6a27ecd09..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ReconciliationMaxInterval.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.javaoperatorsdk.operator.api.reconciler; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.concurrent.TimeUnit; - -/** - * @deprecated use {@link MaxReconciliationInterval} instead - */ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -@Deprecated(forRemoval = true) -public @interface ReconciliationMaxInterval { - /** - * A max delay between two reconciliations. Having this value larger than zero, will ensure that a - * reconciliation is scheduled with a target interval after the last reconciliation. Note that - * this not applies for retries, in case of an exception reconciliation is not scheduled. This is - * not a fixed rate, in other words a new reconciliation is scheduled after each reconciliation. - *

- * If an interval is specified by {@link UpdateControl} or {@link DeleteControl}, those take - * precedence. - *

- * This is a fail-safe feature, in the sense that if informers are in place and the reconciler - * implementation is correct, this feature can be turned off. - *

- * Use {@link Constants#NO_MAX_RECONCILIATION_INTERVAL} to turn off this feature. - * - * @return max delay between reconciliations - **/ - long interval(); - - /** - * @return time unit for max delay between reconciliations - */ - TimeUnit timeUnit() default TimeUnit.HOURS; - -} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java index 7168fd0c25..1f4385aad4 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java @@ -21,7 +21,6 @@ import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.MaxReconciliationInterval; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; -import io.javaoperatorsdk.operator.api.reconciler.ReconciliationMaxInterval; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; @@ -133,7 +132,7 @@ && findByNameOptional(dependents, DependentResource.defaultNameFor(ReadOnlyDepen } @Test - void newMaxIntervalShouldTakePrecedence() { + void maxIntervalCanBeConfigured() { var config = new AnnotationControllerConfiguration<>(new MaxIntervalReconciler()); assertEquals(50, config.maxReconciliationInterval().map(Duration::getSeconds).orElseThrow()); } @@ -179,8 +178,6 @@ void checkingRetryingGraduallyWorks() { @ControllerConfiguration( maxReconciliationInterval = @MaxReconciliationInterval(interval = 50, - timeUnit = TimeUnit.SECONDS), - reconciliationMaxInterval = @ReconciliationMaxInterval(interval = 20, timeUnit = TimeUnit.SECONDS)) private static class MaxIntervalReconciler implements Reconciler { From 3915b576f05ffff8e17946738256f92f01de18dc Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Fri, 15 Jul 2022 13:26:03 +0200 Subject: [PATCH 4/4] refactor: remove now unused fields --- .../api/config/AnnotationControllerConfiguration.java | 6 ------ .../javaoperatorsdk/operator/api/reconciler/Constants.java | 6 ------ 2 files changed, 12 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java index e64a23ab64..d6a323d5a9 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java @@ -13,9 +13,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.ReconcilerUtils; @@ -49,9 +46,6 @@ public class AnnotationControllerConfiguration

implements io.javaoperatorsdk.operator.api.config.ControllerConfiguration

{ - private static final Logger log = - LoggerFactory.getLogger(AnnotationControllerConfiguration.class); - protected final Reconciler

reconciler; private final ControllerConfiguration annotation; private List specs; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java index 42dfd94e22..55a9cbdbed 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Constants.java @@ -17,12 +17,6 @@ public final class Constants { public static final String WATCH_CURRENT_NAMESPACE = "JOSDK_WATCH_CURRENT"; public static final String WATCH_ALL_NAMESPACES = "JOSDK_ALL_NAMESPACES"; - /** - * @deprecated use {@link #NO_MAX_RECONCILIATION_INTERVAL} instead - */ - @Deprecated(forRemoval = true) - public static final long NO_RECONCILIATION_MAX_INTERVAL = -1L; - public static final long NO_MAX_RECONCILIATION_INTERVAL = -1L; public static final String SAME_AS_CONTROLLER = "JOSDK_SAME_AS_CONTROLLER";