8000 feat: initial reworking of configuration · sitesh-sumo/java-operator-sdk@88c17ee · GitHub
[go: up one dir, main page]

Skip to content

Commit 88c17ee

Browse files
committed
feat: initial reworking of configuration
1 parent 74cee29 commit 88c17ee

File tree

13 files changed

+191
-71
lines changed

13 files changed

+191
-71
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
import java.lang.annotation.Annotation;
4+
5+
public interface AnnotationConfigurable<C extends Annotation> {
6+
void initFrom(C configuration);
7+
}

operator-framework-core/ E30A src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.javaoperatorsdk.operator.api.config;
22

3+
import java.lang.annotation.Annotation;
34
import java.lang.reflect.InvocationTargetException;
45
import java.time.Duration;
56
import java.util.Arrays;
@@ -27,14 +28,14 @@
2728
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
2829
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
2930
import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition;
30-
import io.javaoperatorsdk.operator.processing.event.rate.PeriodRateLimiter;
3131
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
3232
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
3333
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters;
3434
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter;
3535
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter;
3636
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnDeleteFilter;
3737
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter;
38+
import io.javaoperatorsdk.operator.processing.retry.Retry;
3839

3940
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
4041

@@ -154,12 +155,33 @@ public Optional<Duration> reconciliationMaxInterval() {
154155

155156
@Override
156157
public RateLimiter getRateLimiter() {
157-
if (annotation.rateLimit() != null) {
158-
return new PeriodRateLimiter(Duration.of(annotation.rateLimit().refreshPeriod(),
159-
annotation.rateLimit().refreshPeriodTimeUnit().toChronoUnit()),
160-
annotation.rateLimit().limitForPeriod());
161-
} else {
162-
return io.javaoperatorsdk.operator.api.config.ControllerConfiguration.super.getRateLimiter();
158+
final Class<? extends RateLimiter> rateLimiterClass = annotation.rateLimiter();
159+
return instantiateAndConfigureIfNeeded(rateLimiterClass);
160+
}
161+
162+
@Override
163+
public Retry getRetry() {
164+
final Class<? extends Retry> retryClass = annotation.retry();
165+
return instantiateAndConfigureIfNeeded(retryClass);
166+
}
167+
168+
private <T> T instantiateAndConfigureIfNeeded(Class<? extends T> targetClass) {
169+
try {
170+
final var instance = targetClass.getConstructor().newInstance();
171+
if (instance instanceof AnnotationConfigurable) {
172+
AnnotationConfigurable configurable = (AnnotationConfigurable) instance;
173+
final Class<? extends Annotation> configurationClass =
174+
(Class<? extends Annotation>) Utils.getFirstTypeArgumentFromSuperClassOrInterface(
175+
targetClass, AnnotationConfigurable.class);
176+
final var configAnnotation = reconciler.getClass().getAnnotation(configurationClass);
177+
if (configAnnotation != null) {
178+
configurable.initFrom(configAnnotation);
179+
}
180+
}
181+
return instance;
182+
} catch (InstantiationException | IllegalAccessException | InvocationTargetException
183+
| NoSuchMethodException e) {
184+
throw new RuntimeException(e);
163185
}
164186
}
165187

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
public interface ControllerConfiguration<R extends HasMetadata> extends ResourceConfiguration<R> {
1919

2020
RateLimiter DEFAULT_RATE_LIMITER = new PeriodRateLimiter();
21+
Retry DEFAULT_RETRY = new GenericRetry();
2122

2223
default String getName() {
2324
return ReconcilerUtils.getDefaultReconcilerName(getAssociatedReconcilerClassName());
@@ -34,20 +35,7 @@ default boolean isGenerationAware() {
3435
String getAssociatedReconcilerClassName();
3536

3637
default Retry getRetry() {
37-
final var configuration = getRetryConfiguration();
38-
return RetryConfiguration.DEFAULT != configuration
39-
? GenericRetry.fromConfiguration(configuration)
40-
: GenericRetry.DEFAULT; // NOSONAR
41-
}
42-
43-
/**
44-
* Use getRetry instead.
45-
*
46-
* @return configuration for retry.
47-
*/
48-
@Deprecated
49-
default RetryConfiguration getRetryConfiguration() {
50-
return RetryConfiguration.DEFAULT;
38+
return DEFAULT_RETRY;
5139
}
5240

5341
default RateLimiter getRateLimiter() {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
1616
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
1717
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
18-
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
1918
import io.javaoperatorsdk.operator.processing.retry.Retry;
2019

2120
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
@@ -111,12 +110,6 @@ public ControllerConfigurationOverrider<R> withRetry(Retry retry) {
111110
return this;
112111
}
113112

114-
@Deprecated
115-
public ControllerConfigurationOverrider<R> withRetry(RetryConfiguration retry) {
116-
this.retry = GenericRetry.fromConfiguration(retry);
117-
return this;
118-
}
119-
120113
public ControllerConfigurationOverrider<R> withRateLimiter(RateLimiter rateLimiter) {
121114
this.rateLimiter = rateLimiter;
122115
return this;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultRetryConfiguration.java

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
package io.javaoperatorsdk.operator.api.config;
22

3-
public interface RetryConfiguration {
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
47

5-
RetryConfiguration DEFAULT = new DefaultRetryConfiguration();
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.TYPE)
10+
public @interface RetryConfiguration {
611

712
int DEFAULT_MAX_ATTEMPTS = 5;
813
long DEFAULT_INITIAL_INTERVAL = 2000L;
914
double DEFAULT_MULTIPLIER = 1.5D;
1015

11-
default int getMaxAttempts() {
12-
return DEFAULT_MAX_ATTEMPTS;
13-
}
16+
int maxAttempts() default DEFAULT_MAX_ATTEMPTS;
1417

15-
default long getInitialInterval() {
16-
return DEFAULT_INITIAL_INTERVAL;
17-
}
18+
long initialInterval() default DEFAULT_INITIAL_INTERVAL;
1819

19-
default double getIntervalMultiplier() {
20-
return DEFAULT_MULTIPLIER;
21-
}
20+
double intervalMultiplier() default DEFAULT_MULTIPLIER;
2221

23-
default long getMaxInterval() {
24-
return (long) (DEFAULT_INITIAL_INTERVAL * Math.pow(DEFAULT_MULTIPLIER, DEFAULT_MAX_ATTEMPTS));
25-
}
22+
long maxInterval() default -1;
2623
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ControllerConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99

1010
import io.fabric8.kubernetes.api.model.HasMetadata;
1111
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
12+
import io.javaoperatorsdk.operator.processing.event.rate.PeriodRateLimiter;
13+
import io.javaoperatorsdk.operator.processing.event.rate.RateLimiter;
1214
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1315
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidGenericFilter;
1416
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnAddFilter;
1517
import io.javaoperatorsdk.operator.processing.event.source.filter.VoidOnUpdateFilter;
18+
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
19+
import io.javaoperatorsdk.operator.processing.retry.Retry;
1620

1721
@Retention(RetentionPolicy.RUNTIME)
1822
@Target({ElementType.TYPE})
@@ -92,13 +96,15 @@ ReconciliationMaxInterval reconciliationMaxInterval() default @ReconciliationMax
9296
interval = 10);
9397

9498

95-
RateLimit rateLimit() default @RateLimit;
96-
9799
/**
98100
* Optional list of {@link Dependent} configurations which associate a resource type to a
99101
* {@link io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource} implementation
100102
*
101103
* @return the list of {@link Dependent} configurations
102104
*/
103105
Dependent[] dependents() default {};
106+
107+
Class<? extends Retry> retry() default GenericRetry.class;
108+
109+
Class<? extends RateLimiter> rateLimiter() default PeriodRateLimiter.class;
104110
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/rate/PeriodRateLimiter.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import java.util.Map;
77
import java.util.Optional;
88

9+
import io.javaoperatorsdk.operator.api.config.AnnotationConfigurable;
10+
import io.javaoperatorsdk.operator.api.reconciler.RateLimit;
911
import io.javaoperatorsdk.operator.processing.event.ResourceID;
1012

1113
/**
1214
* A Simple rate limiter that limits the number of permission for a time interval.
1315
*/
14-
public class PeriodRateLimiter implements RateLimiter {
16+
public class PeriodRateLimiter implements RateLimiter, AnnotationConfigurable<RateLimit> {
1517

1618
public static final int DEFAULT_REFRESH_PERIOD_SECONDS = 10;
1719
public static final int DEFAULT_LIMIT_FOR_PERIOD = 3;
@@ -22,9 +24,9 @@ public class PeriodRateLimiter implements RateLimiter {
2224
public static final int NO_LIMIT_PERIOD = -1;
2325

2426
private Duration refreshPeriod;
25-
private int limitForPeriod;
27+
protected int limitForPeriod;
2628

27-
private Map<ResourceID, RateState> limitData = new HashMap<>();
29+
private final Map<ResourceID, RateState> limitData = new HashMap<>();
2830

2931
public PeriodRateLimiter() {
3032
this(DEFAULT_REFRESH_PERIOD, DEFAULT_LIMIT_FOR_PERIOD);
@@ -58,4 +60,11 @@ public Optional<Duration> acquirePermission(ResourceID resourceID) {
5860
public void clear(ResourceID resourceID) {
5961
limitData.remove(resourceID);
6062
}
63+
64+
@Override
65+
public void initFrom(RateLimit configuration) {
66+
this.refreshPeriod = Duration.of(configuration.refreshPeriod(),
67+
configuration.refreshPeriodTimeUnit().toChronoUnit());
68+
this.limitForPeriod = configuration.limitForPeriod();
69+
}
6170
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/GenericRetry.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package io.javaoperatorsdk.operator.processing.retry;
22

3+
import io.javaoperatorsdk.operator.api.config.AnnotationConfigurable;
34
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
45

5-
public class GenericRetry implements Retry {
6+
public class GenericRetry implements Retry, AnnotationConfigurable<RetryConfiguration> {
67
private int maxAttempts = RetryConfiguration.DEFAULT_MAX_ATTEMPTS;
78
private long initialInterval = RetryConfiguration.DEFAULT_INITIAL_INTERVAL;
89
private double intervalMultiplier = RetryConfiguration.DEFAULT_MULTIPLIER;
910
private long maxInterval = -1;
1011

11-
public static final Retry DEFAULT = fromConfiguration(RetryConfiguration.DEFAULT);
12-
1312
public static GenericRetry defaultLimitedExponentialRetry() {
1413
return new GenericRetry();
1514
}
@@ -22,15 +21,6 @@ public static GenericRetry every10second10TimesRetry() {
2221
return new GenericRetry().withLinearRetry().setMaxAttempts(10).setInitialInterval(10000);
2322
}
2423

25-
public static Retry fromConfiguration(RetryConfiguration configuration) {
26-
return configuration == null ? defaultLimitedExponentialRetry()
27-
: new GenericRetry()
28-
.setInitialInterval(configuration.getInitialInterval())
29-
.setMaxAttempts(configuration.getMaxAttempts())
30-
.setIntervalMultiplier(configuration.getIntervalMultiplier())
31-
.setMaxInterval(configuration.getMaxInterval());
32-
}
33-
3424
@Override
3525
public GenericRetryExecution initExecution() {
3626
return new GenericRetryExecution(this);
@@ -85,4 +75,14 @@ public GenericRetry withLinearRetry() {
8575
this.intervalMultiplier = 1;
8676
return this;
8777
}
78+
79+
@Override
80+
public void initFrom(RetryConfiguration configuration) {
81+
this.initialInterval = configuration.initialInterval();
82+
this.maxAttempts = configuration.maxAttempts();
83+
this.intervalMultiplier = configuration.intervalMultiplier();
84+
this.maxInterval = configuration.maxInterval() < 0
85+
? (long) (initialInterval * Math.pow(intervalMultiplier, maxAttempts))
86+
: configuration.maxInterval();
87+
}
8888
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/retry/Retry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.retry;
22

3+
@FunctionalInterface
34
public interface Retry {
45

56
RetryExecution initExecution();

0 commit comments

Comments
 (0)
0