Skip to content

Commit 1181af2

Browse files
committed
refactor: propagate use of ConfiguredController, generify some
1 parent e137cce commit 1181af2

File tree

5 files changed

+90
-89
lines changed

5 files changed

+90
-89
lines changed

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

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

3-
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
4-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
5-
import io.fabric8.kubernetes.client.dsl.Resource;
63
import java.io.Closeable;
74
import java.io.IOException;
85
import java.util.Objects;
96

7+
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
108
import io.fabric8.kubernetes.api.model.apiextensions.v1.CustomResourceDefinition;
119
import io.fabric8.kubernetes.client.CustomResource;
1210
import io.fabric8.kubernetes.client.KubernetesClient;
11+
import io.fabric8.kubernetes.client.dsl.MixedOperation;
12+
import io.fabric8.kubernetes.client.dsl.Resource;
1313
import io.javaoperatorsdk.operator.CustomResourceUtils;
1414
import io.javaoperatorsdk.operator.MissingCRDException;
1515
import io.javaoperatorsdk.operator.OperatorException;
@@ -118,9 +118,7 @@ public void start() throws OperatorException {
118118
}
119119

120120
try {
121-
DefaultEventSourceManager eventSourceManager =
122-
new DefaultEventSourceManager(
123-
controller, configuration, k8sClient.resources(resClass));
121+
DefaultEventSourceManager<R> eventSourceManager = new DefaultEventSourceManager<>(this);
124122
controller.init(eventSourceManager);
125123
} catch (MissingCRDException e) {
126124
throwMissingCRDException(crdName, specVersion, controllerName);

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

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,7 @@
44
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getName;
55
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
66

7-
import io.fabric8.kubernetes.client.CustomResource;
8-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
9-
import io.javaoperatorsdk.operator.Metrics;
10-
import io.javaoperatorsdk.operator.api.ResourceController;
11-
import io.javaoperatorsdk.operator.api.RetryInfo;
12-
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
137
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
14-
import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager;
15-
import io.javaoperatorsdk.operator.processing.event.Event;
16-
import io.javaoperatorsdk.operator.processing.event.EventHandler;
17-
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
18-
import io.javaoperatorsdk.operator.processing.retry.Retry;
19-
import io.javaoperatorsdk.operator.processing.retry.RetryExecution;
20-
import io.micrometer.core.instrument.Clock;
218
import java.util.HashMap;
229
import java.util.HashSet;
2310
import java.util.Map;
@@ -27,41 +14,52 @@
2714
import java.util.concurrent.TimeUnit;
2815
import java.util.concurrent.locks.ReentrantLock;
2916
import java.util.function.Predicate;
17+
3018
import org.slf4j.Logger;
3119
import org.slf4j.LoggerFactory;
3220

21+
import io.fabric8.kubernetes.client.CustomResource;
22+
import io.javaoperatorsdk.operator.api.RetryInfo;
23+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
24+
import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager;
25+
import io.javaoperatorsdk.operator.processing.event.Event;
26+
import io.javaoperatorsdk.operator.processing.event.EventHandler;
27+
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
28+
import io.javaoperatorsdk.operator.processing.retry.Retry;
29+
import io.javaoperatorsdk.operator.processing.retry.RetryExecution;
30+
3331
/**
3432
* Event handler that makes sure that events are processed in a "single threaded" way per resource
3533
* UID, while buffering events which are received during an execution.
3634
*/
37-
public class DefaultEventHandler implements EventHandler {
35+
public class DefaultEventHandler<R extends CustomResource<?, ?>> implements EventHandler {
3836

3937
private static final Logger log = LoggerFactory.getLogger(DefaultEventHandler.class);
4038

4139
private final EventBuffer eventBuffer;
4240
private final Set<String> underProcessing = new HashSet<>();
4341
private final ScheduledThreadPoolExecutor executor;
44-
private final EventDispatcher eventDispatcher;
42+
private final EventDispatcher<R> eventDispatcher;
4543
private final Retry retry;
4644
private final Map<String, RetryExecution> retryState = new HashMap<>();
4745
private final String controllerName;
4846
private final int terminationTimeout;
4947
private final ReentrantLock lock = new ReentrantLock();
50-
private DefaultEventSourceManager eventSourceManager;
51-
private ControllerConfiguration configuration;
48+
private DefaultEventSourceManager<R> eventSourceManager;
49+
private final ControllerConfiguration configuration;
5250

53-
public DefaultEventHandler(
54-
ResourceController controller, ControllerConfiguration configuration, MixedOperation client) {
51+
public DefaultEventHandler(ConfiguredController<R> controller) {
5552
this(
56-
new EventDispatcher(controller, configuration, client),
57-
configuration.getName(),
58-
GenericRetry.fromConfiguration(configuration.getRetryConfiguration()),
59-
configuration.getConfigurationService().concurrentReconciliationThreads(),
60-
configuration.getConfigurationService().getTerminationTimeoutSeconds(), configuration);
53+
new EventDispatcher<>(controller),
54+
controller.getConfiguration().getName(),
55+
GenericRetry.fromConfiguration(controller.getConfiguration().getRetryConfiguration()),
56+
controller.getConfiguration().getConfigurationService().concurrentReconciliationThreads(),
57+
controller.getConfiguration().getConfigurationService().getTerminationTimeoutSeconds(),
58+
controller.getConfiguration());
6159
}
6260

6361
DefaultEventHandler(
64-
EventDispatcher eventDispatcher,
62+
EventDispatcher<R> eventDispatcher,
6563
String relatedControllerName,
6664
Retry retry,
6765
int concurrentReconciliationThreads, ControllerConfiguration configuration) {
@@ -74,7 +72,7 @@ public DefaultEventHandler(
7472
}
7573

7674
private DefaultEventHandler(
77-
EventDispatcher eventDispatcher,
75+
EventDispatcher<R> eventDispatcher,
7876
String relatedControllerName,
7977
Retry retry,
8078
int concurrentReconciliationThreads,
@@ -104,7 +102,7 @@ public void close() {
104102
}
105103
}
106104

107-
public void setEventSourceManager(DefaultEventSourceManager eventSourceManager) {
105+
public void setEventSourceManager(DefaultEventSourceManager<R> eventSourceManager) {
108106
this.eventSourceManager = eventSourceManager;
109107
}
110108

@@ -159,7 +157,7 @@ private RetryInfo retryInfo(String customResourceUid) {
159157
}
160158

161159
void eventProcessingFinished(
162-
ExecutionScope executionScope, PostExecutionControl postExecutionControl) {
160+
ExecutionScope<R> executionScope, PostExecutionControl postExecutionControl) {
163161
try {
164162
lock.lock();
165163
log.debug(
@@ -223,7 +221,7 @@ private void handleRetryOnException(ExecutionScope executionScope) {
223221
});
224222
}
225223

226-
private void markSuccessfulExecutionRegardingRetry(ExecutionScope executionScope) {
224+
private void markSuccessfulExecutionRegardingRetry(ExecutionScope<R> executionScope) {
227225
log.debug(
228226
"Marking successful execution for resource: {}",
229227
getName(executionScope.getCustomResource()));
@@ -233,7 +231,7 @@ private void markSuccessfulExecutionRegardingRetry(ExecutionScope executionScope
233231
.cancelOnceSchedule(executionScope.getCustomResourceUid());
234232
}
235233

236-
private RetryExecution getOrInitRetryExecution(ExecutionScope executionScope) {
234+
private RetryExecution getOrInitRetryExecution(ExecutionScope<R> executionScope) {
237235
RetryExecution retryExecution = retryState.get(executionScope.getCustomResourceUid());
238236
if (retryExecution == null) {
239237
retryExecution = retry.initExecution();
@@ -259,9 +257,9 @@ private RetryExecution getOrInitRetryExecution(ExecutionScope executionScope) {
259257
* would override an additional change coming from a different client.
260258
*/
261259
private void cacheUpdatedResourceIfChanged(
262-
ExecutionScope executionScope, PostExecutionControl postExecutionControl) {
260+
ExecutionScope<R> executionScope, PostExecutionControl postExecutionControl) {
263261
if (postExecutionControl.customResourceUpdatedDuringExecution()) {
264-
CustomResource originalCustomResource = executionScope.getCustomResource();
262+
R originalCustomResource = executionScope.getCustomResource();
265263
CustomResource customResourceAfterExecution =
266264
postExecutionControl.getUpdatedCustomResource().get();
267265
String originalResourceVersion = getVersion(originalCustomResource);

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
66
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
77

8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
811
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
912
import io.fabric8.kubernetes.client.CustomResource;
1013
import io.fabric8.kubernetes.client.KubernetesClientException;
@@ -17,32 +20,25 @@
1720
import io.javaoperatorsdk.operator.api.UpdateControl;
1821
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1922
import io.javaoperatorsdk.operator.processing.event.EventList;
20-
import org.slf4j.Logger;
21-
import org.slf4j.LoggerFactory;
2223

2324
/**
2425
* Dispatches events to the Controller and handles Finalizers for a single type of Custom Resource.
2526
*/
26-
class EventDispatcher<R extends CustomResource> {
27+
class EventDispatcher<R extends CustomResource<?, ?>> {
2728

2829
private static final Logger log = LoggerFactory.getLogger(EventDispatcher.class);
2930

30-
private final ResourceController<R> controller;
31-
private final ControllerConfiguration<R> configuration;
31+
private final ConfiguredController<R> controller;
3232
private final CustomResourceFacade<R> customResourceFacade;
3333

34-
EventDispatcher(
35-
ResourceController<R> controller,
36-
ControllerConfiguration<R> configuration,
34+
EventDispatcher(ConfiguredController<R> controller,
3735
CustomResourceFacade<R> customResourceFacade) {
3836
this.controller = controller;
3937
this.customResourceFacade = customResourceFacade;
40-
this.configuration = configuration;
4138
}
4239

43-
public EventDispatcher(
44-
ResourceController controller, ControllerConfiguration configuration, MixedOperation client) {
45-
this(controller, configuration, new CustomResourceFacade<>(client));
40+
public EventDispatcher(ConfiguredController<R> controller) {
41+
this(controller, new CustomResourceFacade<>(controller.getCRClient()));
4642
}
4743

4844
public PostExecutionControl handleExecution(ExecutionScope<R> executionScope) {
@@ -92,6 +88,10 @@ private PostExecutionControl handleDispatch(ExecutionScope<R> executionScope) {
9288
}
9389
}
9490

91+
private ControllerConfiguration<R> configuration() {
92+
return controller.getConfiguration();
93+
}
94+
9595
/**
9696
* Determines whether the given resource should be dispatched to the controller's
9797
* {@link ResourceController#deleteResource(CustomResource, Context)} method
@@ -103,12 +103,12 @@ private PostExecutionControl handleDispatch(ExecutionScope<R> executionScope) {
103103
private boolean shouldNotDispatchToDelete(R resource) {
104104
// we don't dispatch to delete if the controller is configured to use a finalizer but that
105105
// finalizer is not present (which means it's already been removed)
106-
return configuration.useFinalizer() && !resource.hasFinalizer(configuration.getFinalizer());
106+
return configuration().useFinalizer() && !resource.hasFinalizer(configuration().getFinalizer());
107107
}
108108

109109
private PostExecutionControl handleCreateOrUpdate(
110110
ExecutionScope<R> executionScope, R resource, Context<R> context) {
111-
if (configuration.useFinalizer() && !resource.hasFinalizer(configuration.getFinalizer())) {
111+
if (configuration().useFinalizer() && !resource.hasFinalizer(configuration().getFinalizer())) {
112112
/*
113113
* We always add the finalizer if missing and the controller is configured to use a finalizer.
114114
* We execute the controller processing only for processing the event sent as a results of the
@@ -125,10 +125,10 @@ private PostExecutionControl handleCreateOrUpdate(
125125
executionScope);
126126

127127
UpdateControl<R> updateControl =
128-
configuration
128+
configuration()
129129
.getConfigurationService()
130130
.getMetrics()
131-
.timeControllerCreateOrUpdate(controller, configuration, resource, context);
131+
.timeControllerCreateOrUpdate(controller, configuration(), resource, context);
132132
R updatedCustomResource = null;
133133
if (updateControl.isUpdateCustomResourceAndStatusSubResource()) {
134134
updatedCustomResource = updateCustomResource(updateControl.getCustomResource());
@@ -160,14 +160,14 @@ private PostExecutionControl handleDelete(R resource, Context<R> context) {
160160
getVersion(resource));
161161

162162
DeleteControl deleteControl =
163-
configuration
163+
configuration()
164164
.getConfigurationService()
165165
.getMetrics()
166-
.timeControllerDelete(controller, configuration, resource, context);
167-
final var useFinalizer = configuration.useFinalizer();
166+
.timeControllerDelete(controller, configuration(), resource, context);
167+
final var useFinalizer = configuration().useFinalizer();
168168
if (useFinalizer) {
169169
if (deleteControl == DeleteControl.DEFAULT_DELETE
170-
&& resource.hasFinalizer(configuration.getFinalizer())) {
170+
&& resource.hasFinalizer(configuration().getFinalizer())) {
171171
R customResource = removeFinalizer(resource);
172172
// todo: should we patch the resource to remove the finalizer instead of updating it
173173
return PostExecutionControl.customResourceUpdated(customResource);
@@ -185,7 +185,7 @@ private PostExecutionControl handleDelete(R resource, Context<R> context) {
185185
private void updateCustomResourceWithFinalizer(R resource) {
186186
log.debug(
187187
"Adding finalizer for resource: {} version: {}", getUID(resource), getVersion(resource));
188-
resource.addFinalizer(configuration.getFinalizer());
188+
resource.addFinalizer(configuration().getFinalizer());
189189
replace(resource);
190190
}
191191

@@ -200,7 +200,7 @@ private R removeFinalizer(R resource) {
200200
"Removing finalizer on resource: {} with version: {}",
201201
getUID(resource),
202202
getVersion(resource));
203-
resource.removeFinalizer(configuration.getFinalizer());
203+
resource.removeFinalizer(configuration().getFinalizer());
204204
return customResourceFacade.replaceWithLock(resource);
205205
}
206206

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

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
package io.javaoperatorsdk.operator.processing.event;
22

3-
import io.fabric8.kubernetes.client.CustomResource;
4-
import io.fabric8.kubernetes.client.KubernetesClientException;
5-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
6-
import io.javaoperatorsdk.operator.MissingCRDException;
7-
import io.javaoperatorsdk.operator.OperatorException;
8-
import io.javaoperatorsdk.operator.api.ResourceController;
9-
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
10-
import io.javaoperatorsdk.operator.processing.CustomResourceCache;
11-
import io.javaoperatorsdk.operator.processing.DefaultEventHandler;
12-
import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource;
13-
import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource;
143
import java.util.Collections;
154
import java.util.List;
165
import java.util.Map;
@@ -20,21 +9,33 @@
209
import java.util.concurrent.ConcurrentHashMap;
2110
import java.util.concurrent.locks.ReentrantLock;
2211
import java.util.function.Predicate;
12+
2313
import org.slf4j.Logger;
2414
import org.slf4j.LoggerFactory;
2515

26-
public class DefaultEventSourceManager implements EventSourceManager {
16+
import io.fabric8.kubernetes.client.CustomResource;
17+
import io.fabric8.kubernetes.client.KubernetesClientException;
18+
import io.javaoperatorsdk.operator.MissingCRDException;
19+
import io.javaoperatorsdk.operator.OperatorException;
20+
import io.javaoperatorsdk.operator.processing.ConfiguredController;
21+
import io.javaoperatorsdk.operator.processing.CustomResourceCache;
22+
import io.javaoperatorsdk.operator.processing.DefaultEventHandler;
23+
import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource;
24+
import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource;
25+
26+
public class DefaultEventSourceManager<R extends CustomResource<?, ?>>
27+
implements EventSourceManager {
2728

2829
public static final String RETRY_TIMER_EVENT_SOURCE_NAME = "retry-timer-event-source";
2930
private static final String CUSTOM_RESOURCE_EVENT_SOURCE_NAME = "custom-resource-event-source";
3031
private static final Logger log = LoggerFactory.getLogger(DefaultEventSourceManager.class);
3132

3233
private final ReentrantLock lock = new ReentrantLock();
3334
private final Map<String, EventSource> eventSources = new ConcurrentHashMap<>();
34-
private final DefaultEventHandler defaultEventHandler;
35+
private final DefaultEventHandler<R> defaultEventHandler;
3536
private TimerEventSource retryTimerEventSource;
3637

37-
DefaultEventSourceManager(DefaultEventHandler defaultEventHandler, boolean supportRetry) {
38+
DefaultEventSourceManager(DefaultEventHandler<R> defaultEventHandler, boolean supportRetry) {
3839
this.defaultEventHandler = defaultEventHandler;
3940
defaultEventHandler.setEventSourceManager(this);
4041
if (supportRetry) {
@@ -43,12 +44,11 @@ public class DefaultEventSourceManager implements EventSourceManager {
4344
}
4445
}
4546

46-
@SuppressWarnings({"rawtypes", "unchecked"})
47-
public <R extends CustomResource<?, ?>> DefaultEventSourceManager(
48-
ResourceController controller, ControllerConfiguration configuration, MixedOperation client) {
49-
this(new DefaultEventHandler(controller, configuration, client), true);
47+
public DefaultEventSourceManager(ConfiguredController<R> controller) {
48+
this(new DefaultEventHandler<>(controller), true);
5049
registerEventSource(
51-
CUSTOM_RESOURCE_EVENT_SOURCE_NAME, new CustomResourceEventSource<>(client, configuration));
50+
CUSTOM_RESOURCE_EVENT_SOURCE_NAME,
51+
new CustomResourceEventSource<>(controller.getCRClient(), controller.getConfiguration()));
5252
}
5353

5454
@Override

0 commit comments

Comments
 (0)