From 251233692c19f213ea8e3306254ec7d6ef17bfe5 Mon Sep 17 00:00:00 2001 From: Bram Meerten Date: Fri, 13 Oct 2023 19:19:26 +0200 Subject: [PATCH] feat: Make @Configured, @GradualRetry and @RateLimited Inherited (#2091) Signed-off-by: Bram Meerten --- .../processing/event/rate/RateLimited.java | 2 + .../processing/retry/GradualRetry.java | 2 + .../config/BaseConfigurationServiceTest.java | 47 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimited.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimited.java index 7f425b73d9..66ab6849ed 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimited.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimited.java @@ -1,11 +1,13 @@ package io.javaoperatorsdk.operator.processing.event.rate; import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit; +@Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface RateLimited { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GradualRetry.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GradualRetry.java index 66f6372b32..f5033fc7aa 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GradualRetry.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GradualRetry.java @@ -1,10 +1,12 @@ package io.javaoperatorsdk.operator.processing.retry; import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +@Inherited @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface GradualRetry { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java index 339d2a02b4..e107623347 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java @@ -190,6 +190,24 @@ void configuringRateAndRetryViaAnnotationsShouldWork() { assertEquals(Duration.ofSeconds(3), rateLimiter.getRefreshPeriod()); } + @Test + void configuringRateLimitAndGradualRetryViaSuperClassShouldWork() { + var config = configFor(new GradualRetryAndRateLimitedOnSuperClass()); + final var retry = config.getRetry(); + final var testRetry = assertInstanceOf(GenericRetry.class, retry); + assertEquals( + BaseClassWithGradualRetryAndRateLimited.RETRY_MAX_ATTEMPTS, + testRetry.getMaxAttempts()); + + final var rateLimiter = assertInstanceOf(LinearRateLimiter.class, config.getRateLimiter()); + assertEquals( + BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_MAX_RECONCILIATIONS, + rateLimiter.getLimitForPeriod()); + assertEquals( + Duration.ofSeconds(BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_WITHIN_SECONDS), + rateLimiter.getRefreshPeriod()); + } + @Test void checkingRetryingGraduallyWorks() { var config = configFor(new CheckRetryingGraduallyConfiguration()); @@ -250,6 +268,7 @@ public UpdateControl reconcile(ConfigMap resource, Context @ControllerConfiguration( dependents = @Dependent(type = ReadOnlyDependent.class, name = NamedDepReconciler.NAME)) private static class NamedDepReconciler implements Reconciler { + private static final String NAME = "foo"; @Override @@ -325,6 +344,7 @@ public UpdateControl reconcile(ConfigMap resource, Context } public static class TestRetry implements Retry, AnnotationConfigurable { + private int value; public TestRetry() {} @@ -347,6 +367,7 @@ public void initFrom(TestRetryConfiguration configuration) { @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) private @interface TestRetryConfiguration { + int value() default 42; } @@ -382,7 +403,30 @@ public UpdateControl reconcile(ConfigMap resource, Context } } + @ControllerConfiguration + private static class GradualRetryAndRateLimitedOnSuperClass + extends BaseClassWithGradualRetryAndRateLimited + implements Reconciler { + + @Override + public UpdateControl reconcile(ConfigMap resource, Context context) { + return null; + } + } + + @RateLimited( + maxReconciliations = BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_MAX_RECONCILIATIONS, + within = BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_WITHIN_SECONDS) + @GradualRetry(maxAttempts = BaseClassWithGradualRetryAndRateLimited.RETRY_MAX_ATTEMPTS) + private static class BaseClassWithGradualRetryAndRateLimited { + + public static final int RATE_LIMITED_MAX_RECONCILIATIONS = 7; + public static final int RATE_LIMITED_WITHIN_SECONDS = 3; + public static final int RETRY_MAX_ATTEMPTS = 3; + } + private static class ControllerConfigurationOnSuperClass extends BaseClass { + } @ControllerConfiguration @@ -443,10 +487,12 @@ private static class ChildCustomAnnotatedDep extends CustomAnnotatedDep { @Retention(RetentionPolicy.RUNTIME) private @interface CustomAnnotation { + int value(); } private static class CustomConfig { + private final int value; private CustomConfig(int value) { @@ -460,6 +506,7 @@ public int getValue() { private static class CustomConfigConverter implements ConfigurationConverter { + static final int CONVERTER_PROVIDED_DEFAULT = 7; @Override