Skip to content

Commit d635c50

Browse files
committed
refactor: parameterize CustomResourceEventSource by the CustomResource
1 parent 8455d5a commit d635c50

File tree

3 files changed

+34
-28
lines changed

3 files changed

+34
-28
lines changed

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,13 @@ public class DefaultEventSourceManager implements EventSourceManager {
3838
}
3939
}
4040

41-
public <R extends CustomResource> DefaultEventSourceManager(
41+
public <R extends CustomResource<?, ?>> DefaultEventSourceManager(
4242
ResourceController<R> controller,
4343
ControllerConfiguration<R> configuration,
4444
MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client) {
4545
this(new DefaultEventHandler(controller, configuration, client), true);
4646
registerEventSource(
47-
CUSTOM_RESOURCE_EVENT_SOURCE_NAME,
48-
new CustomResourceEventSource(
49-
client,
50-
configuration.getEffectiveNamespaces(),
51-
configuration.isGenerationAware(),
52-
configuration.getFinalizer(),
53-
configuration.getCustomResourceClass()));
47+
CUSTOM_RESOURCE_EVENT_SOURCE_NAME, new CustomResourceEventSource<>(client, configuration));
5448
}
5549

5650
@Override

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

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
44
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getVersion;
55

6+
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
67
import io.fabric8.kubernetes.client.CustomResource;
78
import io.fabric8.kubernetes.client.Watch;
89
import io.fabric8.kubernetes.client.Watcher;
910
import io.fabric8.kubernetes.client.WatcherException;
1011
import io.fabric8.kubernetes.client.dsl.MixedOperation;
12+
import io.fabric8.kubernetes.client.dsl.Resource;
1113
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationsImpl;
1214
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1315
import io.javaoperatorsdk.operator.processing.KubernetesResourceUtils;
@@ -21,12 +23,12 @@
2123
import org.slf4j.LoggerFactory;
2224

2325
/** This is a special case since is not bound to a single custom resource */
24-
public class CustomResourceEventSource extends AbstractEventSource
25-
implements Watcher<CustomResource> {
26+
public class CustomResourceEventSource<T extends CustomResource<?, ?>> extends AbstractEventSource
27+
implements Watcher<T> {
2628

2729
private static final Logger log = LoggerFactory.getLogger(CustomResourceEventSource.class);
2830

29-
private final MixedOperation client;
31+
private final CustomResourceOperationsImpl<T, KubernetesResourceList<T>> client;
3032
private final Set<String> targetNamespaces;
3133
private final boolean generationAware;
3234
private final String resourceFinalizer;
@@ -35,12 +37,23 @@ public class CustomResourceEventSource extends AbstractEventSource
3537
private final String resClass;
3638

3739
public CustomResourceEventSource(
38-
MixedOperation client,
40+
MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client,
41+
ControllerConfiguration<T> configuration) {
42+
this(
43+
client,
44+
configuration.getEffectiveNamespaces(),
45+
configuration.isGenerationAware(),
46+
configuration.getFinalizer(),
47+
configuration.getCustomResourceClass());
48+
}
49+
50+
CustomResourceEventSource(
51+
MixedOperation<T, KubernetesResourceList<T>, Resource<T>> client,
3952
Set<String> targetNamespaces,
4053
boolean generationAware,
4154
String resourceFinalizer,
42-
Class<?> resClass) {
43-
this.client = client;
55+
Class<T> resClass) {
56+
this.client = (CustomResourceOperationsImpl<T, KubernetesResourceList<T>>) client;
4457
this.targetNamespaces = targetNamespaces;
4558
this.generationAware = generationAware;
4659
this.resourceFinalizer = resourceFinalizer;
@@ -50,15 +63,14 @@ public CustomResourceEventSource(
5063

5164
@Override
5265
public void start() {
53-
CustomResourceOperationsImpl crClient = (CustomResourceOperationsImpl) client;
5466
if (ControllerConfiguration.allNamespacesWatched(targetNamespaces)) {
55-
var w = crClient.inAnyNamespace().watch(this);
67+
var w = client.inAnyNamespace().watch(this);
5668
watches.add(w);
5769
log.debug("Registered controller {} -> {} for any namespace", resClass, w);
5870
} else {
5971
targetNamespaces.forEach(
6072
ns -> {
61-
var w = crClient.inNamespace(ns).watch(this);
73+
var w = client.inNamespace(ns).watch(this);
6274
watches.add(w);
6375
log.debug("Registered controller {} -> {} for namespace: {}", resClass, w, ns);
6476
});
@@ -78,7 +90,7 @@ public void close() {
7890
}
7991

8092
@Override
81-
public void eventReceived(Watcher.Action action, CustomResource customResource) {
93+
public void eventReceived(Watcher.Action action, T customResource) {
8294
log.debug(
8395
"Event received for action: {}, resource: {}",
8496
action.name(),
@@ -104,14 +116,14 @@ public void eventReceived(Watcher.Action action, CustomResource customResource)
104116
}
105117
}
106118

107-
private void markLastGenerationProcessed(CustomResource resource) {
119+
private void markLastGenerationProcessed(T resource) {
108120
if (generationAware && resource.hasFinalizer(resourceFinalizer)) {
109121
lastGenerationProcessedSuccessfully.put(
110122
KubernetesResourceUtils.getUID(resource), resource.getMetadata().getGeneration());
111123
}
112124
}
113125

114-
private boolean skipBecauseOfGeneration(CustomResource customResource) {
126+
private boolean skipBecauseOfGeneration(T customResource) {
115127
if (!generationAware) {
116128
return false;
117129
}
@@ -122,7 +134,7 @@ private boolean skipBecauseOfGeneration(CustomResource customResource) {
122134
return !hasGenerationAlreadyBeenProcessed(customResource);
123135
}
124136

125-
private boolean hasGenerationAlreadyBeenProcessed(CustomResource resource) {
137+
private boolean hasGenerationAlreadyBeenProcessed(T resource) {
126138
Long lastGeneration = lastGenerationProcessedSuccessfully.get(resource.getMetadata().getUid());
127139
if (lastGeneration == null) {
128140
return true;

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import static org.mockito.Mockito.times;
66
import static org.mockito.Mockito.verify;
77

8+
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
89
import io.fabric8.kubernetes.client.Watcher;
9-
import io.fabric8.kubernetes.client.dsl.MixedOperation;
10+
import io.fabric8.kubernetes.client.dsl.internal.CustomResourceOperationsImpl;
1011
import io.javaoperatorsdk.operator.TestUtils;
1112
import io.javaoperatorsdk.operator.processing.event.EventHandler;
1213
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
@@ -18,12 +19,12 @@
1819
class CustomResourceEventSourceTest {
1920

2021
public static final String FINALIZER = "finalizer";
21-
MixedOperation mixedOperation = mock(MixedOperation.class);
22+
CustomResourceOperationsImpl<TestCustomResource, KubernetesResourceList<TestCustomResource>>
23+
client = mock(CustomResourceOperationsImpl.class);
2224
EventHandler eventHandler = mock(EventHandler.class);
2325

24-
private CustomResourceEventSource customResourceEventSource =
25-
new CustomResourceEventSource(
26-
mixedOperation, null, true, FINALIZER, TestCustomResource.class);
26+
private CustomResourceEventSource<TestCustomResource> customResourceEventSource =
27+
new CustomResourceEventSource<>(client, null, true, FINALIZER, TestCustomResource.class);
2728

2829
@BeforeEach
2930
public void setup() {
@@ -70,8 +71,7 @@ public void normalExecutionIfGenerationChanges() {
7071
@Test
7172
public void handlesAllEventIfNotGenerationAware() {
7273
customResourceEventSource =
73-
new CustomResourceEventSource(
74-
mixedOperation, null, false, FINALIZER, TestCustomResource.class);
74+
new CustomResourceEventSource<>(client, null, false, FINALIZER, TestCustomResource.class);
7575
setup();
7676

7777
TestCustomResource customResource1 = TestUtils.testCustomResource();

0 commit comments

Comments
 (0)