From f5b30f72c77c088c7421e99c48c26f0de8efd8a3 Mon Sep 17 00:00:00 2001 From: csviri Date: Tue, 3 May 2022 16:14:49 +0200 Subject: [PATCH 1/3] feat: expressive error for missing @ControllerConfiguration annotation --- .../AnnotationControllerConfiguration.java | 5 +++++ .../AnnotationControllerConfigurationTest.java | 18 ++++++++++++++++++ .../WebPageStandaloneDependentsReconciler.java | 5 ++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java index ddd69dff53..6490d76e7e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.ReconcilerUtils; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; import io.javaoperatorsdk.operator.api.reconciler.Constants; @@ -35,6 +36,10 @@ public class AnnotationControllerConfiguration public AnnotationControllerConfiguration(Reconciler reconciler) { this.reconciler = reconciler; this.annotation = reconciler.getClass().getAnnotation(ControllerConfiguration.class); + if (annotation == null) { + throw new OperatorException("Missing mandatory " + + "@ControllerConfiguration annotation from the reconciler: " + reconciler); + } } @Override diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java index ad97653946..fc7fb887db 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/config/runtime/AnnotationControllerConfigurationTest.java @@ -4,9 +4,11 @@ import java.util.Optional; import java.util.Set; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; @@ -77,6 +79,13 @@ void getDependentResources() { assertTrue(maybeConfig.get() instanceof KubernetesDependentResourceConfig); } + @Test + void missingAnnotationThrowsException() { + Assertions.assertThrows(OperatorException.class, () -> { + new AnnotationControllerConfiguration<>(new MissingAnnotationReconciler()); + }); + } + @SuppressWarnings("rawtypes") private DependentResourceSpec findByName( List dependentResourceSpecList, String name) { @@ -157,6 +166,7 @@ public UpdateControl reconcile(ConfigMap resource, Context } } + @ControllerConfiguration private static class NoDepReconciler implements Reconciler { @Override @@ -185,4 +195,12 @@ public WithAnnotation() { } } } + + private static class MissingAnnotationReconciler implements Reconciler { + + @Override + public UpdateControl reconcile(ConfigMap resource, Context context) { + return null; + } + } } diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java index 845e10bcaf..cd2be709c7 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java @@ -12,7 +12,6 @@ import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler; import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; @@ -28,8 +27,8 @@ /** * Shows how to implement reconciler using standalone dependent resources. */ -@ControllerConfiguration( - labelSelector = WebPageStandaloneDependentsReconciler.DEPENDENT_RESOURCE_LABEL_SELECTOR) +// @ControllerConfiguration( +// labelSelector = WebPageStandaloneDependentsReconciler.DEPENDENT_RESOURCE_LABEL_SELECTOR) public class WebPageStandaloneDependentsReconciler implements Reconciler, ErrorStatusHandler, EventSourceInitializer { From 4d5e9288681e267c4169aae90287d2bc87640b2e Mon Sep 17 00:00:00 2001 From: csviri Date: Tue, 3 May 2022 16:23:01 +0200 Subject: [PATCH 2/3] fix --- .../WebPageStandaloneDependentsReconciler.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java index cd2be709c7..e090c6d4aa 100644 --- a/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java +++ b/sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageStandaloneDependentsReconciler.java @@ -11,13 +11,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.client.KubernetesClient; -import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusHandler; -import io.javaoperatorsdk.operator.api.reconciler.ErrorStatusUpdateControl; -import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; -import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer; -import io.javaoperatorsdk.operator.api.reconciler.Reconciler; -import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; +import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; import io.javaoperatorsdk.operator.processing.event.source.EventSource; @@ -27,8 +21,8 @@ /** * Shows how to implement reconciler using standalone dependent resources. */ -// @ControllerConfiguration( -// labelSelector = WebPageStandaloneDependentsReconciler.DEPENDENT_RESOURCE_LABEL_SELECTOR) +@ControllerConfiguration( + labelSelector = WebPageStandaloneDependentsReconciler.DEPENDENT_RESOURCE_LABEL_SELECTOR) public class WebPageStandaloneDependentsReconciler implements Reconciler, ErrorStatusHandler, EventSourceInitializer { From c12c56437a7f3b40a79d2cb2cab989ae80862483 Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 4 May 2022 09:31:34 +0200 Subject: [PATCH 3/3] fix form pr --- .../api/config/AnnotationControllerConfiguration.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java index 6490d76e7e..03f97982be 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/AnnotationControllerConfiguration.java @@ -37,8 +37,9 @@ public AnnotationControllerConfiguration(Reconciler reconciler) { this.reconciler = reconciler; this.annotation = reconciler.getClass().getAnnotation(ControllerConfiguration.class); if (annotation == null) { - throw new OperatorException("Missing mandatory " + - "@ControllerConfiguration annotation from the reconciler: " + reconciler); + throw new OperatorException( + "Missing mandatory @" + ControllerConfiguration.class.getSimpleName() + + " annotation for reconciler: " + reconciler); } }