Skip to content

Commit 50b715e

Browse files
author
Bram Meerten
committed
feat: Make @configured, @GradualRetry and @ratelimited Inherited (#2091)
Signed-off-by: Bram Meerten <[email protected]>
1 parent 9701907 commit 50b715e

File tree

5 files changed

+59
-13
lines changed

5 files changed

+59
-13
lines changed

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/Configured.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.javaoperatorsdk.operator.api.config.dependent;
22

33
import java.lang.annotation.Annotation;
4+
import java.lang.annotation.Inherited;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
67

8+
@Inherited
79
@Retention(RetentionPolicy.RUNTIME)
810
public @interface Configured {
911

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfigurationResolver.java

+2-11
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,8 @@ public static <C extends ControllerConfiguration<? extends HasMetadata>> Object
8484
private static ConfiguredClassPair getConfigured(
8585
Class<? extends DependentResource> dependentResourceClass) {
8686
Class<? extends DependentResource> currentClass = dependentResourceClass;
87-
Configured configured;
88-
ConfiguredClassPair result = null;
89-
while (DependentResource.class.isAssignableFrom(currentClass)) {
90-
configured = currentClass.getAnnotation(Configured.class);
91-
if (configured != null) {
92-
result = new ConfiguredClassPair(configured, currentClass);
93-
break;
94-
}
95-
currentClass = (Class<? extends DependentResource>) currentClass.getSuperclass();
96-
}
97-
return result;
87+
Configured configured = dependentResourceClass.getAnnotation(Configured.class);
88+
return configured != null ? new ConfiguredClassPair(configured, currentClass) : null;
9889
}
9990

10091
private static <C extends ControllerConfiguration<? extends HasMetadata>> ConverterAnnotationPair getOrCreateConverter(

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/RateLimited.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package io.javaoperatorsdk.operator.processing.event.rate;
22

33
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Inherited;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
67
import java.lang.annotation.Target;
78
import java.util.concurrent.TimeUnit;
89

10+
@Inherited
911
@Retention(RetentionPolicy.RUNTIME)
1012
@Target({ElementType.TYPE})
1113
public @interface RateLimited {

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GradualRetry.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.javaoperatorsdk.operator.processing.retry;
22

33
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Inherited;
45
import java.lang.annotation.Retention;
56
import java.lang.annotation.RetentionPolicy;
67
import java.lang.annotation.Target;
78

9+
@Inherited
810
@Retention(RetentionPolicy.RUNTIME)
911
@Target(ElementType.TYPE)
1012
public @interface GradualRetry {

Diff for: operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java

+51-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void addingDuplicatedDependentsWithNameShouldWork() {
156156
assertEquals(2, dependents.size());
157157
assertTrue(findByNameOptional(dependents, NamedDuplicatedDepReconciler.NAME).isPresent()
158158
&& findByNameOptional(dependents, DependentResource.defaultNameFor(ReadOnlyDependent.class))
159-
.isPresent());
159+
.isPresent());
160160
}
161161

162162
@Test
@@ -190,6 +190,24 @@ void configuringRateAndRetryViaAnnotationsShouldWork() {
190190
assertEquals(Duration.ofSeconds(3), rateLimiter.getRefreshPeriod());
191191
}
192192

193+
@Test
194+
void configuringRateLimitAndGradualRetryViaSuperClassShouldWork() {
195+
var config = configFor(new GradualRetryAndRateLimitedOnSuperClass());
196+
final var retry = config.getRetry();
197+
final var testRetry = assertInstanceOf(GenericRetry.class, retry);
198+
assertEquals(
199+
BaseClassWithGradualRetryAndRateLimited.RETRY_MAX_ATTEMPTS,
200+
testRetry.getMaxAttempts());
201+
202+
final var rateLimiter = assertInstanceOf(LinearRateLimiter.class, config.getRateLimiter());
203+
assertEquals(
204+
BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_MAX_RECONCILIATIONS,
205+
rateLimiter.getLimitForPeriod());
206+
assertEquals(
207+
Duration.ofSeconds(BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_WITHIN_SECONDS),
208+
rateLimiter.getRefreshPeriod());
209+
}
210+
193211
@Test
194212
void checkingRetryingGraduallyWorks() {
195213
var config = configFor(new CheckRetryingGraduallyConfiguration());
@@ -250,6 +268,7 @@ public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap>
250268
@ControllerConfiguration(
251269
dependents = @Dependent(type = ReadOnlyDependent.class, name = NamedDepReconciler.NAME))
252270
private static class NamedDepReconciler implements Reconciler<ConfigMap> {
271+
253272
private static final String NAME = "foo";
254273

255274
@Override
@@ -325,9 +344,11 @@ public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap>
325344
}
326345

327346
public static class TestRetry implements Retry, AnnotationConfigurable<TestRetryConfiguration> {
347+
328348
private int value;
329349

330-
public TestRetry() {}
350+
public TestRetry() {
351+
}
331352

332353
@Override
333354
public RetryExecution initExecution() {
@@ -347,6 +368,7 @@ public void initFrom(TestRetryConfiguration configuration) {
347368
@Target(ElementType.TYPE)
348369
@Retention(RetentionPolicy.RUNTIME)
349370
private @interface TestRetryConfiguration {
371+
350372
int value() default 42;
351373
}
352374

@@ -382,7 +404,31 @@ public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap>
382404
}
383405
}
384406

407+
@ControllerConfiguration
408+
private static class GradualRetryAndRateLimitedOnSuperClass
409+
extends BaseClassWithGradualRetryAndRateLimited
410+
implements Reconciler<ConfigMap> {
411+
412+
@Override
413+
public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap> context) {
414+
return null;
415+
}
416+
}
417+
418+
@RateLimited(
419+
maxReconciliations = BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_MAX_RECONCILIATIONS,
420+
within = BaseClassWithGradualRetryAndRateLimited.RATE_LIMITED_WITHIN_SECONDS
421+
)
422+
@GradualRetry(maxAttempts = BaseClassWithGradualRetryAndRateLimited.RETRY_MAX_ATTEMPTS)
423+
private static class BaseClassWithGradualRetryAndRateLimited {
424+
425+
public static final int RATE_LIMITED_MAX_RECONCILIATIONS = 7;
426+
public static final int RATE_LIMITED_WITHIN_SECONDS = 3;
427+
public static final int RETRY_MAX_ATTEMPTS = 3;
428+
}
429+
385430
private static class ControllerConfigurationOnSuperClass extends BaseClass {
431+
386432
}
387433

388434
@ControllerConfiguration
@@ -443,10 +489,12 @@ private static class ChildCustomAnnotatedDep extends CustomAnnotatedDep {
443489

444490
@Retention(RetentionPolicy.RUNTIME)
445491
private @interface CustomAnnotation {
492+
446493
int value();
447494
}
448495

449496
private static class CustomConfig {
497+
450498
private final int value;
451499

452500
private CustomConfig(int value) {
@@ -460,6 +508,7 @@ public int getValue() {
460508

461509
private static class CustomConfigConverter
462510
implements ConfigurationConverter<CustomAnnotation, CustomConfig, CustomAnnotatedDep> {
511+
463512
static final int CONVERTER_PROVIDED_DEFAULT = 7;
464513

465514
@Override

0 commit comments

Comments
 (0)