Skip to content

Commit 4dfec23

Browse files
authored
feat: expressive error for missing @ControllerConfiguration annotation (#1190)
1 parent 6428502 commit 4dfec23

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.stream.Collectors;
1212

1313
import io.fabric8.kubernetes.api.model.HasMetadata;
14+
import io.javaoperatorsdk.operator.OperatorException;
1415
import io.javaoperatorsdk.operator.ReconcilerUtils;
1516
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1617
import io.javaoperatorsdk.operator.api.reconciler.Constants;
@@ -35,6 +36,11 @@ public class AnnotationControllerConfiguration<R extends HasMetadata>
3536
public AnnotationControllerConfiguration(Reconciler<R> reconciler) {
3637
this.reconciler = reconciler;
3738
this.annotation = reconciler.getClass().getAnnotation(ControllerConfiguration.class);
39+
if (annotation == null) {
40+
throw new OperatorException(
41+
"Missing mandatory @" + ControllerConfiguration.class.getSimpleName() +
42+
" annotation for reconciler: " + reconciler);
43+
}
3844
}
3945

4046
@Override

operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import java.util.Optional;
55
import java.util.Set;
66

7+
import org.junit.jupiter.api.Assertions;
78
import org.junit.jupiter.api.Test;
89

910
import io.fabric8.kubernetes.api.model.ConfigMap;
11+
import io.javaoperatorsdk.operator.OperatorException;
1012
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1113
import io.javaoperatorsdk.operator.api.reconciler.Context;
1214
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
@@ -77,6 +79,13 @@ void getDependentResources() {
7779
assertTrue(maybeConfig.get() instanceof KubernetesDependentResourceConfig);
7880
}
7981

82+
@Test
83+
void missingAnnotationThrowsException() {
84+
Assertions.assertThrows(OperatorException.class, () -> {
85+
new AnnotationControllerConfiguration<>(new MissingAnnotationReconciler());
86+
});
87+
}
88+
8089
@SuppressWarnings("rawtypes")
8190
private DependentResourceSpec findByName(
8291
List<DependentResourceSpec> dependentResourceSpecList, String name) {
@@ -157,6 +166,7 @@ public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap>
157166
}
158167
}
159168

169+
@ControllerConfiguration
160170
private static class NoDepReconciler implements Reconciler<ConfigMap> {
161171

162172
@Override
@@ -185,4 +195,12 @@ public WithAnnotation() {
185195
}
186196
}
187197
}
198+
199+
private static class MissingAnnotationReconciler implements Reconciler<ConfigMap> {
200+
201+
@Override
202+
public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap> context) {
203+
return null;
204+
}
205+
}
188206
}

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,7 @@
1111
import io.fabric8.kubernetes.api.model.apps.Deployment;
1212
import io.fabric8.kubernetes.api.model.networking.v1.Ingress;
1313
import io.fabric8.kubernetes.client.KubernetesClient;
14-
import io.javaoperatorsdk.operator.api.reconciler.Context;
15-
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
16-
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler;
17-
import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl;
18-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
19-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
20-
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
21-
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
14+
import io.javaoperatorsdk.operator.api.reconciler.*;
2215
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
2316
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
2417
import io.javaoperatorsdk.operator.processing.event.source.EventSource;

0 commit comments

Comments
 (0)