diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/EventSourceInitializer.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/EventSourceInitializer.java new file mode 100644 index 0000000000..e7500b9e47 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/EventSourceInitializer.java @@ -0,0 +1,16 @@ +package io.javaoperatorsdk.operator.api; + +import io.fabric8.kubernetes.client.CustomResource; +import io.javaoperatorsdk.operator.processing.event.EventSourceManager; + +public interface EventSourceInitializer> { + + /** + * In this typically you might want to register event sources. But can access + * CustomResourceEventSource, what might be handy for some edge cases. + * + * @param eventSourceManager the {@link EventSourceManager} where event sources can be registered. + */ + void prepareEventSources(EventSourceManager eventSourceManager); + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java index 5779cc4eb9..817cb554fc 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/ResourceController.java @@ -1,7 +1,6 @@ package io.javaoperatorsdk.operator.api; import io.fabric8.kubernetes.client.CustomResource; -import io.javaoperatorsdk.operator.processing.event.EventSourceManager; public interface ResourceController { @@ -49,11 +48,4 @@ default DeleteControl deleteResource(R resource, Context context) { */ UpdateControl createOrUpdateResource(R resource, Context context); - /** - * In init typically you might want to register event sources. - * - * @param eventSourceManager the {@link EventSourceManager} which handles this controller and with - * which event sources can be registered - */ - default void init(EventSourceManager eventSourceManager) {} } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ConfiguredController.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ConfiguredController.java index 3ce90ebb67..dd2c74354e 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ConfiguredController.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ConfiguredController.java @@ -14,20 +14,17 @@ import io.javaoperatorsdk.operator.Metrics.ControllerExecution; import io.javaoperatorsdk.operator.MissingCRDException; import io.javaoperatorsdk.operator.OperatorException; -import io.javaoperatorsdk.operator.api.Context; -import io.javaoperatorsdk.operator.api.DeleteControl; -import io.javaoperatorsdk.operator.api.ResourceController; -import io.javaoperatorsdk.operator.api.UpdateControl; +import io.javaoperatorsdk.operator.api.*; import io.javaoperatorsdk.operator.api.config.ControllerConfiguration; import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; public class ConfiguredController> implements ResourceController, - Closeable { + Closeable, EventSourceInitializer { private final ResourceController controller; private final ControllerConfiguration configuration; private final KubernetesClient kubernetesClient; - private EventSourceManager eventSourceManager; + private DefaultEventSourceManager eventSourceManager; public ConfiguredController(ResourceController controller, ControllerConfiguration configuration, @@ -97,7 +94,7 @@ public UpdateControl execute() { } @Override - public void init(EventSourceManager eventSourceManager) { + public void prepareEventSources(EventSourceManager eventSourceManager) { throw new UnsupportedOperationException("This method should never be called directly"); } @@ -169,7 +166,9 @@ public void start() throws OperatorException { try { eventSourceManager = new DefaultEventSourceManager<>(this); - controller.init(eventSourceManager); + if (controller instanceof EventSourceInitializer) { + ((EventSourceInitializer) controller).prepareEventSources(eventSourceManager); + } } catch (MissingCRDException e) { throwMissingCRDException(crdName, specVersion, controllerName); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/DefaultEventSourceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/DefaultEventSourceManager.java index d72bd6ec7e..c3ab127a50 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/DefaultEventSourceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/DefaultEventSourceManager.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator.processing.event; +import java.io.Closeable; import java.util.*; import java.util.concurrent.locks.ReentrantLock; @@ -15,7 +16,7 @@ import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource; public class DefaultEventSourceManager> - implements EventSourceManager { + implements EventSourceManager, Closeable { private static final Logger log = LoggerFactory.getLogger(DefaultEventSourceManager.class); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java index 7e049e7c51..e06ab2e3d1 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java @@ -1,14 +1,12 @@ package io.javaoperatorsdk.operator.processing.event; -import java.io.Closeable; -import java.io.IOException; import java.util.Set; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.processing.event.internal.CustomResourceEventSource; -public interface EventSourceManager> extends Closeable { +public interface EventSourceManager> { /** * Add the {@link EventSource} identified by the given name to the event manager. @@ -25,6 +23,4 @@ void registerEventSource(EventSource eventSource) CustomResourceEventSource getCustomResourceEventSource(); - @Override - default void close() throws IOException {} } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/event/EventSourceTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/event/EventSourceTestCustomResourceController.java index 33e590f75f..caa5ad9fda 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/event/EventSourceTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/event/EventSourceTestCustomResourceController.java @@ -7,17 +7,15 @@ import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.ControllerUtils; -import io.javaoperatorsdk.operator.api.Context; -import io.javaoperatorsdk.operator.api.Controller; -import io.javaoperatorsdk.operator.api.ResourceController; -import io.javaoperatorsdk.operator.api.UpdateControl; +import io.javaoperatorsdk.operator.api.*; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; import io.javaoperatorsdk.operator.processing.event.internal.TimerEventSource; import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; @Controller public class EventSourceTestCustomResourceController - implements ResourceController, TestExecutionInfoProvider { + implements ResourceController, EventSourceInitializer, + TestExecutionInfoProvider { public static final String FINALIZER_NAME = ControllerUtils.getDefaultFinalizerName( @@ -31,7 +29,7 @@ public class EventSourceTestCustomResourceController new TimerEventSource<>(); @Override - public void init(EventSourceManager eventSourceManager) { + public void prepareEventSources(EventSourceManager eventSourceManager) { eventSourceManager.registerEventSource(timerEventSource); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomResourceController.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomResourceController.java index a2284adfa1..772c93cac3 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomResourceController.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomResourceController.java @@ -5,10 +5,7 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.client.KubernetesClient; -import io.javaoperatorsdk.operator.api.Context; -import io.javaoperatorsdk.operator.api.Controller; -import io.javaoperatorsdk.operator.api.ResourceController; -import io.javaoperatorsdk.operator.api.UpdateControl; +import io.javaoperatorsdk.operator.api.*; import io.javaoperatorsdk.operator.junit.KubernetesClientAware; import io.javaoperatorsdk.operator.processing.event.EventSourceManager; import io.javaoperatorsdk.operator.processing.event.internal.InformerEventSource; @@ -22,7 +19,8 @@ */ @Controller(finalizerName = NO_FINALIZER) public class InformerEventSourceTestCustomResourceController implements - ResourceController, KubernetesClientAware { + ResourceController, KubernetesClientAware, + EventSourceInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(InformerEventSourceTestCustomResourceController.class); @@ -34,7 +32,7 @@ public class InformerEventSourceTestCustomResourceController implements private InformerEventSource eventSource; @Override - public void init(EventSourceManager eventSourceManager) { + public void prepareEventSources(EventSourceManager eventSourceManager) { eventSource = new InformerEventSource<>(kubernetesClient, ConfigMap.class, Mappers.fromAnnotation(RELATED_RESOURCE_UID)); eventSourceManager.registerEventSource(eventSource);