Skip to content

Commit 1815525

Browse files
committed
feat: retry and retry configuration decoupling (#1285)
1 parent 2743ff7 commit 1815525

File tree

10 files changed

+54
-32
lines changed

10 files changed

+54
-32
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1212
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilters;
13+
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
14+
import io.javaoperatorsdk.operator.processing.retry.Retry;
1315

1416
public interface ControllerConfiguration<R extends HasMetadata> extends ResourceConfiguration<R> {
1517

@@ -27,6 +29,16 @@ default boolean isGenerationAware() {
2729

2830
String getAssociatedReconcilerClassName();
2931

32+
default Retry getRetry() {
33+
return GenericRetry.fromConfiguration(getRetryConfiguration()); // NOSONAR
34+
}
35+
36+
/**
37+
* Use getRetry instead.
38+
*
39+
* @return configuration for retry.
40+
*/
41+
@Deprecated
3042
default RetryConfiguration getRetryConfiguration() {
3143
return RetryConfiguration.DEFAULT;
3244
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1010
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
12+
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
13+
import io.javaoperatorsdk.operator.processing.retry.Retry;
1214

1315
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
1416
import static io.javaoperatorsdk.operator.api.reconciler.Constants.WATCH_CURRENT_NAMESPACE_SET;
@@ -19,7 +21,7 @@ public class ControllerConfigurationOverrider<R extends HasMetadata> {
1921
private String finalizer;
2022
private boolean generationAware;
2123
private Set<String> namespaces;
22-
private RetryConfiguration retry;
24+
private Retry retry;
2325
private String labelSelector;
2426
private ResourceEventFilter<R> customResourcePredicate;
2527
private final ControllerConfiguration<R> original;
@@ -30,7 +32,7 @@ private ControllerConfigurationOverrider(ControllerConfiguration<R> original) {
3032
finalizer = original.getFinalizerName();
3133
generationAware = original.isGenerationAware();
3234
namespaces = new HashSet<>(original.getNamespaces());
33-
retry = original.getRetryConfiguration();
35+
retry = original.getRetry();
3436
labelSelector = original.getLabelSelector();
3537
customResourcePredicate = original.getEventFilter();
3638
reconciliationMaxInterval = original.reconciliationMaxInterval().orElse(null);
@@ -90,11 +92,17 @@ public ControllerConfigurationOverrider<R> watchingAllNamespaces() {
9092
return this;
9193
}
9294

93-
public ControllerConfigurationOverrider<R> withRetry(RetryConfiguration retry) {
95+
public ControllerConfigurationOverrider<R> withRetry(Retry retry) {
9496
this.retry = retry;
9597
return this;
9698
}
9799

100+
@Deprecated
101+
public ControllerConfigurationOverrider<R> withRetry(RetryConfiguration retry) {
102+
this.retry = GenericRetry.fromConfiguration(retry);
103+
return this;
104+
}
105+
98106
public ControllerConfigurationOverrider<R> withLabelSelector(String labelSelector) {
99107
this.labelSelector = labelSelector;
100108
return this;

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.fabric8.kubernetes.api.model.HasMetadata;
1010
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
12+
import io.javaoperatorsdk.operator.processing.retry.Retry;
1213

1314
@SuppressWarnings("rawtypes")
1415
public class DefaultControllerConfiguration<R extends HasMetadata>
@@ -20,7 +21,7 @@ public class DefaultControllerConfiguration<R extends HasMetadata>
2021
private final String crdName;
2122
private final String finalizer;
2223
private final boolean generationAware;
23-
private final RetryConfiguration retryConfiguration;
24+
private final Retry retry;
2425
private final ResourceEventFilter<R> resourceEventFilter;
2526
private final List<DependentResourceSpec> dependents;
2627
private final Duration reconciliationMaxInterval;
@@ -33,7 +34,7 @@ public DefaultControllerConfiguration(
3334
String finalizer,
3435
boolean generationAware,
3536
Set<String> namespaces,
36-
RetryConfiguration retryConfiguration,
37+
Retry retry,
3738
String labelSelector,
3839
ResourceEventFilter<R> resourceEventFilter,
3940
Class<R> resourceClass,
@@ -46,10 +47,10 @@ public DefaultControllerConfiguration(
4647
this.finalizer = finalizer;
4748
this.generationAware = generationAware;
4849
this.reconciliationMaxInterval = reconciliationMaxInterval;
49-
this.retryConfiguration =
50-
retryConfiguration == null
51-
? ControllerConfiguration.super.getRetryConfiguration()
52-
: retryConfiguration;
50+
this.retry =
51+
retry == null
52+
? ControllerConfiguration.super.getRetry()
53+
: retry;
5354
this.resourceEventFilter = resourceEventFilter;
5455

5556
this.dependents = dependents != null ? dependents : Collections.emptyList();
@@ -81,8 +82,8 @@ public String getAssociatedReconcilerClassName() {
8182
}
8283

8384
@Override
84-
public RetryConfiguration getRetryConfiguration() {
85-
return retryConfiguration;
85+
public Retry getRetry() {
86+
return retry;
8687
}
8788

8889
@Override

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceAction;
2626
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEvent;
2727
import io.javaoperatorsdk.operator.processing.event.source.timer.TimerEventSource;
28-
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
2928
import io.javaoperatorsdk.operator.processing.retry.Retry;
3029
import io.javaoperatorsdk.operator.processing.retry.RetryExecution;
3130

@@ -54,8 +53,7 @@ class EventProcessor<R extends HasMetadata> implements EventHandler, LifecycleAw
5453
ExecutorServiceManager.instance().executorService(),
5554
eventSourceManager.getController().getConfiguration().getName(),
5655
new ReconciliationDispatcher<>(eventSourceManager.getController()),
57-
GenericRetry.fromConfiguration(
58-
eventSourceManager.getController().getConfiguration().getRetryConfiguration()),
56+
eventSourceManager.getController().getConfiguration().getRetry(),
5957
ConfigurationServiceProvider.instance().getMetrics(),
6058
eventSourceManager);
6159
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public int getAttemptCount() {
178178

179179
@Override
180180
public boolean isLastAttempt() {
181-
return controller.getConfiguration().getRetryConfiguration() == null;
181+
return controller.getConfiguration().getRetry() == null;
182182
}
183183
});
184184
((DefaultContext<R>) context).setRetryInfo(retryInfo);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
44

55
public class GenericRetry implements Retry {
6-
private int maxAttempts = DEFAULT_MAX_ATTEMPTS;
7-
private long initialInterval = DEFAULT_INITIAL_INTERVAL;
8-
private double intervalMultiplier = DEFAULT_MULTIPLIER;
6+
private int maxAttempts = RetryConfiguration.DEFAULT_MAX_ATTEMPTS;
7+
private long initialInterval = RetryConfiguration.DEFAULT_INITIAL_INTERVAL;
8+
private double intervalMultiplier = RetryConfiguration.DEFAULT_MULTIPLIER;
99
private long maxInterval = -1;
1010

1111
public static GenericRetry defaultLimitedExponentialRetry() {
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package io.javaoperatorsdk.operator.processing.retry;
22

3-
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
4-
5-
public interface Retry extends RetryConfiguration {
3+
public interface Retry {
64

75
RetryExecution initExecution();
6+
87
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/EventProcessorTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.slf4j.LoggerFactory;
1616

1717
import io.fabric8.kubernetes.api.model.HasMetadata;
18+
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
1819
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
1920
import io.javaoperatorsdk.operator.processing.event.source.controller.ControllerResourceEventSource;
2021
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceAction;
@@ -104,7 +105,7 @@ void schedulesAnEventRetryOnException() {
104105
eventProcessorWithRetry.eventProcessingFinished(executionScope, postExecutionControl);
105106

106107
verify(retryTimerEventSourceMock, times(1))
107-
.scheduleOnce(eq(customResource), eq(GenericRetry.DEFAULT_INITIAL_INTERVAL));
108+
.scheduleOnce(eq(customResource), eq(RetryConfiguration.DEFAULT_INITIAL_INTERVAL));
108109
}
109110

110111
@Test
@@ -135,7 +136,7 @@ void executesTheControllerInstantlyAfterErrorIfNewEventsReceived() {
135136
List<ExecutionScope> allValues = executionScopeArgumentCaptor.getAllValues();
136137
assertThat(allValues).hasSize(2);
137138
verify(retryTimerEventSourceMock, never())
138-
.scheduleOnce(eq(customResource), eq(GenericRetry.DEFAULT_INITIAL_INTERVAL));
139+
.scheduleOnce(eq(customResource), eq(RetryConfiguration.DEFAULT_INITIAL_INTERVAL));
139140
}
140141

141142
@Test

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcherTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
2626
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
2727
import io.javaoperatorsdk.operator.api.config.MockControllerConfiguration;
28-
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
2928
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
3029
import io.javaoperatorsdk.operator.api.reconciler.Context;
3130
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
@@ -36,6 +35,7 @@
3635
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
3736
import io.javaoperatorsdk.operator.processing.Controller;
3837
import io.javaoperatorsdk.operator.processing.event.ReconciliationDispatcher.CustomResourceFacade;
38+
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
3939
import io.javaoperatorsdk.operator.sample.observedgeneration.ObservedGenCustomResource;
4040
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
4141

@@ -110,7 +110,7 @@ private <R extends HasMetadata> ReconciliationDispatcher<R> init(R customResourc
110110
when(configuration.getFinalizerName()).thenReturn(DEFAULT_FINALIZER);
111111
when(configuration.getName()).thenReturn("EventDispatcherTestController");
112112
when(configuration.getResourceClass()).thenReturn(resourceClass);
113-
when(configuration.getRetryConfiguration()).thenReturn(RetryConfiguration.DEFAULT);
113+
when(configuration.getRetry()).thenReturn(new GenericRetry());
114114
when(configuration.reconciliationMaxInterval())
115115
.thenReturn(Optional.of(Duration.ofHours(RECONCILIATION_MAX_INTERVAL)));
116116

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/retry/GenericRetryExecutionTest.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,36 @@
44

55
import org.junit.jupiter.api.Test;
66

7-
import static io.javaoperatorsdk.operator.processing.retry.GenericRetry.DEFAULT_INITIAL_INTERVAL;
7+
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
8+
89
import static org.assertj.core.api.Assertions.assertThat;
910

1011
public class GenericRetryExecutionTest {
1112

1213
@Test
1314
public void forFirstBackOffAlwaysReturnsInitialInterval() {
14-
assertThat(getDefaultRetryExecution().nextDelay().get()).isEqualTo(DEFAULT_INITIAL_INTERVAL);
15+
assertThat(getDefaultRetryExecution().nextDelay().get())
16+
.isEqualTo(RetryConfiguration.DEFAULT_INITIAL_INTERVAL);
1517
}
1618

1719
@Test
1820
public void delayIsMultipliedEveryNextDelayCall() {
1921
RetryExecution retryExecution = getDefaultRetryExecution();
2022

2123
Optional<Long> res = callNextDelayNTimes(retryExecution, 1);
22-
assertThat(res.get()).isEqualTo(DEFAULT_INITIAL_INTERVAL);
24+
assertThat(res.get()).isEqualTo(RetryConfiguration.DEFAULT_INITIAL_INTERVAL);
2325

2426
res = retryExecution.nextDelay();
2527
assertThat(res.get())
26-
.isEqualTo((long) (DEFAULT_INITIAL_INTERVAL * GenericRetry.DEFAULT_MULTIPLIER));
28+
.isEqualTo((long) (RetryConfiguration.DEFAULT_INITIAL_INTERVAL
29+
* RetryConfiguration.DEFAULT_MULTIPLIER));
2730

2831
res = retryExecution.nextDelay();
2932
assertThat(res.get())
3033
.isEqualTo(
31-
(long) (DEFAULT_INITIAL_INTERVAL
32-
* GenericRetry.DEFAULT_MULTIPLIER
33-
* GenericRetry.DEFAULT_MULTIPLIER));
34+
(long) (RetryConfiguration.DEFAULT_INITIAL_INTERVAL
35+
* RetryConfiguration.DEFAULT_MULTIPLIER
36+
* RetryConfiguration.DEFAULT_MULTIPLIER));
3437
}
3538

3639
@Test

0 commit comments

Comments
 (0)