Skip to content

Commit ccf3053

Browse files
committed
refactor: move check for missing CRD to CustomResourceEventSource
This indeed makes more sense like this as this should only happen when attempting to register watches for the primary resources.
1 parent b6db6ab commit ccf3053

File tree

3 files changed

+31
-30
lines changed

3 files changed

+31
-30
lines changed

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

+3-16
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.slf4j.LoggerFactory;
1616

1717
import io.fabric8.kubernetes.client.CustomResource;
18-
import io.fabric8.kubernetes.client.KubernetesClientException;
1918
import io.javaoperatorsdk.operator.MissingCRDException;
2019
import io.javaoperatorsdk.operator.OperatorException;
2120
import io.javaoperatorsdk.operator.processing.ConfiguredController;
@@ -35,21 +34,18 @@ public class DefaultEventSourceManager<R extends CustomResource<?, ?>>
3534
private final Map<String, EventSource> eventSources = new ConcurrentHashMap<>();
3635
private final DefaultEventHandler<R> defaultEventHandler;
3736
private TimerEventSource<R> retryTimerEventSource;
38-
private final String targetCRDName;
3937

40-
DefaultEventSourceManager(DefaultEventHandler<R> defaultEventHandler, boolean supportRetry,
41-
String targetCRDName) {
38+
DefaultEventSourceManager(DefaultEventHandler<R> defaultEventHandler, boolean supportRetry) {
4239
this.defaultEventHandler = defaultEventHandler;
4340
defaultEventHandler.setEventSourceManager(this);
4441
if (supportRetry) {
4542
this.retryTimerEventSource = new TimerEventSource<>();
4643
registerEventSource(RETRY_TIMER_EVENT_SOURCE_NAME, retryTimerEventSource);
4744
}
48-
this.targetCRDName = targetCRDName;
4945
}
5046

5147
public DefaultEventSourceManager(ConfiguredController<R> controller) {
52-
this(new DefaultEventHandler<>(controller), true, controller.getConfiguration().getCRDName());
48+
this(new DefaultEventHandler<>(controller), true);
5349
registerEventSource(CUSTOM_RESOURCE_EVENT_SOURCE_NAME,
5450
new CustomResourceEventSource<>(controller));
5551
}
@@ -88,19 +84,10 @@ public final void registerEventSource(String name, EventSource eventSource)
8884
eventSource.setEventHandler(defaultEventHandler);
8985
eventSource.start();
9086
} catch (Throwable e) {
91-
if (e instanceof IllegalStateException) {
87+
if (e instanceof IllegalStateException || e instanceof MissingCRDException) {
9288
// leave untouched
9389
throw e;
9490
}
95-
if (e instanceof KubernetesClientException) {
96-
KubernetesClientException ke = (KubernetesClientException) e;
97-
if (404 == ke.getCode()) {
98-
// only throw MissingCRDException if the 404 error occurs on the target CRD
99-
if (targetCRDName.equals(ke.getFullResourceName())) {
100-
throw new MissingCRDException(targetCRDName, null);
101-
}
102-
}
103-
}
10491
throw new OperatorException("Couldn't register event source named '" + name + "'", e);
10592
} finally {
10693
lock.unlock();

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

+27-11
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111

1212
import io.fabric8.kubernetes.api.model.ListOptions;
1313
import io.fabric8.kubernetes.client.CustomResource;
14+
import io.fabric8.kubernetes.client.KubernetesClientException;
1415
import io.fabric8.kubernetes.client.Watch;
1516
import io.fabric8.kubernetes.client.Watcher;
1617
import io.fabric8.kubernetes.client.WatcherException;
1718
import io.fabric8.kubernetes.client.utils.Utils;
19+
import io.javaoperatorsdk.operator.MissingCRDException;
1820
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1921
import io.javaoperatorsdk.operator.processing.ConfiguredController;
2022
import io.javaoperatorsdk.operator.processing.CustomResourceCache;
@@ -55,17 +57,31 @@ public void start() {
5557
options.setLabelSelector(labelSelector);
5658
}
5759

58-
if (ControllerConfiguration.allNamespacesWatched(targetNamespaces)) {
59-
var w = client.inAnyNamespace().watch(options, this);
60-
watches.add(w);
61-
log.debug("Registered {} -> {} for any namespace", controller, w);
62-
} else {
63-
targetNamespaces.forEach(
64-
ns -> {
65-
var w = client.inNamespace(ns).watch(options, this);
66-
watches.add(w);
67-
log.debug("Registered {} -> {} for namespace: {}", controller, w, ns);
68-
});
60+
try {
61+
if (ControllerConfiguration.allNamespacesWatched(targetNamespaces)) {
62+
var w = client.inAnyNamespace().watch(options, this);
63+
watches.add(w);
64+
log.debug("Registered {} -> {} for any namespace", controller, w);
65+
} else {
66+
targetNamespaces.forEach(
67+
ns -> {
68+
var w = client.inNamespace(ns).watch(options, this);
69+
watches.add(w);
70+
log.debug("Registered {} -> {} for namespace: {}", controller, w, ns);
71+
});
72+
}
73+
} catch (Exception e) {
74+
if (e instanceof KubernetesClientException) {
75+
KubernetesClientException ke = (KubernetesClientException) e;
76+
if (404 == ke.getCode()) {
77+
// only throw MissingCRDException if the 404 error occurs on the target CRD
78+
final var targetCRDName = controller.getConfiguration().getCRDName();
79+
if (targetCRDName.equals(ke.getFullResourceName())) {
80+
throw new MissingCRDException(targetCRDName, null);
81+
}
82+
}
83+
}
84+
throw e;
6985
}
7086
}
7187

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import io.javaoperatorsdk.operator.TestUtils;
1010
import io.javaoperatorsdk.operator.processing.DefaultEventHandler;
1111
import io.javaoperatorsdk.operator.processing.KubernetesResourceUtils;
12-
import io.javaoperatorsdk.operator.sample.simple.TestCustomResource;
1312

1413
import static io.javaoperatorsdk.operator.processing.KubernetesResourceUtils.getUID;
1514
import static org.assertj.core.api.Assertions.assertThat;
@@ -25,8 +24,7 @@ class DefaultEventSourceManagerTest {
2524

2625
private DefaultEventHandler defaultEventHandlerMock = mock(DefaultEventHandler.class);
2726
private DefaultEventSourceManager defaultEventSourceManager =
28-
new DefaultEventSourceManager(defaultEventHandlerMock, false,
29-
CustomResource.getCRDName(TestCustomResource.class));
27+
new DefaultEventSourceManager(defaultEventHandlerMock, false);
3028

3129
@Test
3230
public void registersEventSource() {

0 commit comments

Comments
 (0)