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 fa2b5c1927..913b727eaa 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 @@ -242,13 +242,17 @@ public List getDependentResources() { throw new IllegalArgumentException( "A DependentResource named '" + name + "' already exists: " + spec); } + + var eventSourceName = dependent.useEventSourceWithName(); + eventSourceName = Constants.NO_VALUE_SET.equals(eventSourceName) ? null : eventSourceName; + final var context = "DependentResource of type '" + dependentType.getName() + "'"; spec = new DependentResourceSpec(dependentType, config, name, Set.of(dependent.dependsOn()), instantiateIfNotDefault(dependent.readyPostcondition(), Condition.class, context), instantiateIfNotDefault(dependent.reconcilePrecondition(), Condition.class, context), instantiateIfNotDefault(dependent.deletePostcondition(), Condition.class, context), - dependent.provideEventSource()); + eventSourceName); specsMap.put(name, spec); } @@ -287,7 +291,6 @@ private Object createKubernetesResourceConfig(Class OnDeleteFilter onDeleteFilter = null; GenericFilter genericFilter = null; ResourceDiscriminator resourceDiscriminator = null; - String eventSourceNameToUse = null; if (kubeDependent != null) { if (!Arrays.equals(KubernetesDependent.DEFAULT_NAMESPACES, kubeDependent.namespaces())) { @@ -314,14 +317,12 @@ private Object createKubernetesResourceConfig(Class resourceDiscriminator = instantiateIfNotDefault(kubeDependent.resourceDiscriminator(), ResourceDiscriminator.class, context); - eventSourceNameToUse = Constants.NO_VALUE_SET.equals(kubeDependent.eventSourceToUse()) ? null - : kubeDependent.eventSourceToUse(); } config = new KubernetesDependentResourceConfig(namespaces, labelSelector, configuredNS, resourceDiscriminator, onAddFilter, - onUpdateFilter, onDeleteFilter, genericFilter, eventSourceNameToUse); + onUpdateFilter, onDeleteFilter, genericFilter); return config; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index ee153c879a..511596db00 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -174,7 +174,7 @@ private void replaceConfig(String name, Object newConfig, DependentResourceSpec< namedDependentResourceSpecs.put(name, new DependentResourceSpec<>(current.getDependentResourceClass(), newConfig, name, current.getDependsOn(), current.getReadyCondition(), current.getReconcileCondition(), - current.getDeletePostCondition(), current.provideEventSource())); + current.getDeletePostCondition(), current.getUseEventSourceWithName().orElse(null))); } @SuppressWarnings("unchecked") @@ -220,7 +220,8 @@ public ControllerConfiguration build() { KubernetesDependentResourceConfig c) { return new DependentResourceSpec(spec.getDependentResourceClass(), c.setNamespaces(namespaces), name, spec.getDependsOn(), spec.getReadyCondition(), - spec.getReconcileCondition(), spec.getDeletePostCondition(), spec.provideEventSource()); + spec.getReconcileCondition(), spec.getDeletePostCondition(), + (String) spec.getUseEventSourceWithName().orElse(null)); } public static ControllerConfigurationOverrider override( diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceSpec.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceSpec.java index 71476cc2d3..426c1d3325 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceSpec.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceSpec.java @@ -23,12 +23,12 @@ public class DependentResourceSpec, C> { private final Condition deletePostCondition; - private final boolean provideEventSource; + private final String useEventSourceWithName; public DependentResourceSpec(Class dependentResourceClass, C dependentResourceConfig, String name, Set dependsOn, Condition readyCondition, Condition reconcileCondition, Condition deletePostCondition, - boolean provideEventSource) { + String useEventSourceWithName) { this.dependentResourceClass = dependentResourceClass; this.dependentResourceConfig = dependentResourceConfig; this.name = name; @@ -36,7 +36,7 @@ public DependentResourceSpec(Class dependentResourceClass, C dependentResourc this.readyCondition = readyCondition; this.reconcileCondition = reconcileCondition; this.deletePostCondition = deletePostCondition; - this.provideEventSource = provideEventSource; + this.useEventSourceWithName = useEventSourceWithName; } public Class getDependentResourceClass() { @@ -94,7 +94,7 @@ public Condition getDeletePostCondition() { return deletePostCondition; } - public boolean provideEventSource() { - return provideEventSource; + public Optional getUseEventSourceWithName() { + return Optional.ofNullable(useEventSourceWithName); } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/Dependent.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/Dependent.java index 00d2ad1882..1a52cbcfc3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/Dependent.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/Dependent.java @@ -1,5 +1,6 @@ package io.javaoperatorsdk.operator.api.reconciler.dependent; +import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.processing.dependent.workflow.Condition; import static io.javaoperatorsdk.operator.api.reconciler.Constants.NO_VALUE_SET; @@ -59,11 +60,11 @@ String[] dependsOn() default {}; /** - * Setting this to false means that the event source provided by the dependent resource won't be - * used. This is helpful if more dependent resources created for the same type, and want to share - * a common event source. In that case an event source needs to be explicitly registered. + * Setting here a name of the event source means that dependent resource will use an event source + * registered with that name. So won't create one. This is helpful if more dependent resources + * created for the same type, and want to share a common event source. * - * @return if the event source (if any) provided by the dependent resource should be used or not. + * @return event source name (if any) provided by the dependent resource should be used. */ - boolean provideEventSource() default true; + String useEventSourceWithName() default NO_VALUE_SET; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java index d098137b46..ea7759b8c4 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DependentResource.java @@ -49,13 +49,6 @@ default Optional> eventSource( return Optional.empty(); } - /** - * Calling this method, instructs the implementation to not provide an event source, even if it - * normally does. - */ - void doNotProvideEventSource(); - - default Optional getSecondaryResource(P primary, Context

context) { return Optional.empty(); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceAware.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceAware.java deleted file mode 100644 index 09b13d90c5..0000000000 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceAware.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.javaoperatorsdk.operator.api.reconciler.dependent; - -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; - -public interface EventSourceAware

{ - - void selectEventSources(EventSourceRetriever

eventSourceRetriever); - -} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceNotFoundException.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceNotFoundException.java new file mode 100644 index 0000000000..26681e2ca6 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceNotFoundException.java @@ -0,0 +1,16 @@ +package io.javaoperatorsdk.operator.api.reconciler.dependent; + +import io.javaoperatorsdk.operator.OperatorException; + +public class EventSourceNotFoundException extends OperatorException { + + private String eventSourceName; + + public EventSourceNotFoundException(String eventSourceName) { + this.eventSourceName = eventSourceName; + } + + public String getEventSourceName() { + return eventSourceName; + } +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java new file mode 100644 index 0000000000..13ac93e2bf --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java @@ -0,0 +1,17 @@ +package io.javaoperatorsdk.operator.api.reconciler.dependent; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; + +public interface EventSourceReferencer

{ + + default void useEventSourceWithName(String name) {} + + /** + * Throws {@link EventSourceNotFoundException} an exception if the target event source to use is + * not found. + */ + void resolveEventSource(EventSourceRetriever

eventSourceRetriever) + throws EventSourceNotFoundException; + +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java index 57ce0a3a5e..53bce9bace 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java @@ -1,5 +1,8 @@ package io.javaoperatorsdk.operator.processing; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -32,8 +35,9 @@ import io.javaoperatorsdk.operator.api.reconciler.Ignore; import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.UpdateControl; -import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceAware; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceNotFoundException; import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedDependentResourceContext; import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflow; import io.javaoperatorsdk.operator.processing.dependent.workflow.WorkflowCleanupResult; @@ -214,25 +218,40 @@ public void initAndRegisterEventSources(EventSourceContext

context) { final var ownSources = provider.prepareEventSources(context); ownSources.forEach(eventSourceManager::registerEventSource); } - managedWorkflow - .getDependentResourcesByName().entrySet().stream() - .forEach(drEntry -> { - if (drEntry.getValue() instanceof EventSourceProvider) { - final var provider = (EventSourceProvider) drEntry.getValue(); - final var source = provider.initEventSource(context); - eventSourceManager.registerEventSource(drEntry.getKey(), source); - } else { - Optional eventSource = - drEntry.getValue().eventSource(context); - eventSource.ifPresent(es -> { - eventSourceManager.registerEventSource(drEntry.getKey(), es); - }); - } - }); - managedWorkflow.getDependentResourcesByName().entrySet().stream().map(Map.Entry::getValue) - .filter(EventSourceAware.class::isInstance) - .forEach(dr -> ((EventSourceAware) dr) - .selectEventSources(eventSourceManager)); + + // register created event sources + final var dependentResourcesByName = managedWorkflow.getDependentResourcesByName(); + final var size = dependentResourcesByName.size(); + if (size > 0) { + dependentResourcesByName.forEach((key, value) -> { + if (value instanceof EventSourceProvider) { + final var provider = (EventSourceProvider) value; + final var source = provider.initEventSource(context); + eventSourceManager.registerEventSource(key, source); + } else { + Optional eventSource = value.eventSource(context); + eventSource.ifPresent(es -> eventSourceManager.registerEventSource(key, es)); + } + }); + + // resolve event sources referenced by name for dependents that reuse an existing event source + final Map> unresolvable = new HashMap<>(size); + dependentResourcesByName.values().stream() + .filter(EventSourceReferencer.class::isInstance) + .map(EventSourceReferencer.class::cast) + .forEach(dr -> { + try { + ((EventSourceReferencer

) dr) + .resolveEventSource(eventSourceManager); + } catch (EventSourceNotFoundException e) { + unresolvable.computeIfAbsent(e.getEventSourceName(), s -> new ArrayList<>()).add(dr); + } + }); + if (!unresolvable.isEmpty()) { + throw new IllegalStateException( + "Couldn't resolve referenced EventSources: " + unresolvable); + } + } } @Override diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java index fe7717e846..63e522ad7d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResource.java @@ -9,13 +9,11 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.api.reconciler.Ignore; import io.javaoperatorsdk.operator.api.reconciler.ResourceDiscriminator; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.ReconcileResult; import io.javaoperatorsdk.operator.processing.event.ResourceID; -import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource; @Ignore public abstract class AbstractDependentResource @@ -29,7 +27,6 @@ public abstract class AbstractDependentResource protected Creator creator; protected Updater updater; protected BulkDependentResource bulkDependentResource; - private boolean returnEventSource = true; protected List> resourceDiscriminator = new ArrayList<>(1); @@ -41,23 +38,6 @@ public AbstractDependentResource() { bulkDependentResource = bulk ? (BulkDependentResource) this : null; } - @Override - public void doNotProvideEventSource() { - this.returnEventSource = false; - } - - @Override - public Optional> eventSource(EventSourceContext

eventSourceContext) { - if (!returnEventSource) { - return Optional.empty(); - } else { - return Optional.of(provideEventSource(eventSourceContext)); - } - } - - protected abstract ResourceEventSource provideEventSource( - EventSourceContext

eventSourceContext); - @Override public ReconcileResult reconcile(P primary, Context

context) { if (bulk) { @@ -239,7 +219,4 @@ protected int lastKnownBulkSize() { return resourceDiscriminator.size(); } - protected boolean getReturnEventSource() { - return returnEventSource; - } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java index a90017897a..f514a00950 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java @@ -5,7 +5,8 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.api.reconciler.Ignore; -import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceAware; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceNotFoundException; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer; import io.javaoperatorsdk.operator.api.reconciler.dependent.RecentOperationCacheFiller; import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; import io.javaoperatorsdk.operator.processing.event.ResourceID; @@ -17,7 +18,7 @@ @Ignore public abstract class AbstractEventSourceHolderDependentResource> - extends AbstractDependentResource implements EventSourceAware

{ + extends AbstractDependentResource implements EventSourceReferencer

{ private T eventSource; private final Class resourceType; @@ -26,45 +27,50 @@ public abstract class AbstractEventSourceHolderDependentResource onUpdateFilter; protected OnDeleteFilter onDeleteFilter; protected GenericFilter genericFilter; - protected String eventSourceToUse; + protected String eventSourceNameToUse; protected AbstractEventSourceHolderDependentResource(Class resourceType) { this.resourceType = resourceType; } - - public ResourceEventSource provideEventSource(EventSourceContext

context) { + public Optional> eventSource(EventSourceContext

context) { // some sub-classes (e.g. KubernetesDependentResource) can have their event source created // before this method is called in the managed case, so only create the event source if it // hasn't already been set. // The filters are applied automatically only if event source is created automatically. So if an // event source // is shared between dependent resources this does not override the existing filters. - if (eventSource == null) { + if (eventSource == null && eventSourceNameToUse == null) { setEventSource(createEventSource(context)); applyFilters(); } - return eventSource; + return Optional.ofNullable(eventSource); } @SuppressWarnings("unchecked") @Override - public void selectEventSources(EventSourceRetriever

eventSourceRetriever) { - if (!getReturnEventSource()) { - if (eventSourceToUse != null) { - setEventSource( - (T) eventSourceRetriever.getResourceEventSourceFor(resourceType(), eventSourceToUse)); - } else { - setEventSource((T) eventSourceRetriever.getResourceEventSourceFor(resourceType())); + public void resolveEventSource(EventSourceRetriever

eventSourceRetriever) { + if (eventSourceNameToUse != null && eventSource == null) { + final var source = + eventSourceRetriever.getResourceEventSourceFor(resourceType(), eventSourceNameToUse); + if (source == null) { + throw new EventSourceNotFoundException(eventSourceNameToUse); } + setEventSource((T) source); } } /** To make this backwards compatible even for respect of overriding */ + @SuppressWarnings("unchecked") public T initEventSource(EventSourceContext

context) { return (T) eventSource(context).orElseThrow(); } + @Override + public void useEventSourceWithName(String name) { + this.eventSourceNameToUse = name; + } + @Override public Class resourceType() { return resourceType; @@ -116,10 +122,4 @@ public void setOnUpdateFilter(OnUpdateFilter onUpdateFilter) { public void setOnDeleteFilter(OnDeleteFilter onDeleteFilter) { this.onDeleteFilter = onDeleteFilter; } - - public AbstractEventSourceHolderDependentResource setEventSourceToUse( - String eventSourceToUse) { - this.eventSourceToUse = eventSourceToUse; - return this; - } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java index 2ccd4da82a..004a56b5f6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependent.java @@ -73,5 +73,4 @@ Class resourceDiscriminator() default ResourceDiscriminator.class; - String eventSourceToUse() default NO_VALUE_SET; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index 37d2246a58..d019e79a7f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -60,10 +60,6 @@ public void configureWith(KubernetesDependentResourceConfig config) { if (discriminator != null) { setResourceDiscriminator(discriminator); } - config.getEventSourceToUse().ifPresent(n -> { - doNotProvideEventSource(); - setEventSourceToUse(n); - }); } private void configureWith(String labelSelector, Set namespaces, diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java index 8d092fdfa5..5cab02d28c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResourceConfig.java @@ -1,6 +1,5 @@ package io.javaoperatorsdk.operator.processing.dependent.kubernetes; -import java.util.Optional; import java.util.Set; import io.javaoperatorsdk.operator.api.reconciler.Constants; @@ -18,7 +17,6 @@ public class KubernetesDependentResourceConfig { private String labelSelector = NO_VALUE_SET; private boolean namespacesWereConfigured = false; private ResourceDiscriminator resourceDiscriminator; - private String eventSourceToUse; private OnAddFilter onAddFilter; @@ -34,7 +32,7 @@ public KubernetesDependentResourceConfig(Set namespaces, String labelSel boolean configuredNS, ResourceDiscriminator resourceDiscriminator, OnAddFilter onAddFilter, OnUpdateFilter onUpdateFilter, - OnDeleteFilter onDeleteFilter, GenericFilter genericFilter, String eventSourceToUse) { + OnDeleteFilter onDeleteFilter, GenericFilter genericFilter) { this.namespaces = namespaces; this.labelSelector = labelSelector; this.namespacesWereConfigured = configuredNS; @@ -43,12 +41,11 @@ public KubernetesDependentResourceConfig(Set namespaces, String labelSel this.onDeleteFilter = onDeleteFilter; this.genericFilter = genericFilter; this.resourceDiscriminator = resourceDiscriminator; - this.eventSourceToUse = eventSourceToUse; } public KubernetesDependentResourceConfig(Set namespaces, String labelSelector) { this(namespaces, labelSelector, true, null, null, null, - null, null, null); + null, null); } public KubernetesDependentResourceConfig setNamespaces(Set namespaces) { @@ -97,7 +94,4 @@ public ResourceDiscriminator getResourceDiscriminator() { return resourceDiscriminator; } - public Optional getEventSourceToUse() { - return Optional.ofNullable(eventSourceToUse); - } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupport.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupport.java index 8ca56960b5..a6e6d27ce3 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupport.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupport.java @@ -15,6 +15,7 @@ import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; +import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware; import io.javaoperatorsdk.operator.processing.dependent.workflow.builder.WorkflowBuilder; @@ -81,9 +82,20 @@ public DependentResource createAndConfigureFrom(DependentResourceSpec spec, if (dependentResource instanceof KubernetesClientAware) { ((KubernetesClientAware) dependentResource).setKubernetesClient(client); } - if (!spec.provideEventSource()) { - dependentResource.doNotProvideEventSource(); - } + + spec.getUseEventSourceWithName() + .ifPresent(esName -> { + final var name = (String) esName; + if (dependentResource instanceof EventSourceReferencer) { + ((EventSourceReferencer) dependentResource).useEventSourceWithName(name); + } else { + throw new IllegalStateException( + "DependentResource " + spec + " wants to use EventSource named " + name + + " but doesn't implement support for this feature by implementing " + + EventSourceReferencer.class.getSimpleName()); + } + }); + if (dependentResource instanceof DependentResourceConfigurator) { final var configurator = (DependentResourceConfigurator) dependentResource; spec.getDependentResourceConfiguration().ifPresent(configurator::configureWith); diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java index 312d307cc1..4dd6938728 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverriderTest.java @@ -80,9 +80,6 @@ public ReconcileResult reconcile(ConfigMap primary, Context c public Class resourceType() { return Object.class; } - - @Override - public void doNotProvideEventSource() {} } } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResourceTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResourceTest.java index 0fd85c5afc..b93abd45c0 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResourceTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/AbstractDependentResourceTest.java @@ -7,9 +7,7 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.processing.event.ResourceID; -import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource; import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; import static org.junit.jupiter.api.Assertions.*; @@ -80,12 +78,6 @@ public Class resourceType() { return ConfigMap.class; } - @Override - protected ResourceEventSource provideEventSource( - EventSourceContext eventSourceContext) { - return null; - } - @Override public Optional getSecondaryResource(TestCustomResource primary, Context context) { diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/EmptyTestDependentResource.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/EmptyTestDependentResource.java index dd42a80392..4fe88296ac 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/EmptyTestDependentResource.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/EmptyTestDependentResource.java @@ -19,9 +19,5 @@ public ReconcileResult reconcile(TestCustomResource primary, public Class resourceType() { return Deployment.class; } - - @Override - public void doNotProvideEventSource() {} - } diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java index 2ecb6bde24..9c10c06cc0 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/AbstractWorkflowExecutorTest.java @@ -48,9 +48,6 @@ public Class resourceType() { return String.class; } - @Override - public void doNotProvideEventSource() {} - @Override public String toString() { return name; @@ -110,9 +107,6 @@ public Class resourceType() { return String.class; } - @Override - public void doNotProvideEventSource() {} - @Override public String toString() { return name; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java index 72a3886963..e3b97afb3c 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java @@ -12,7 +12,7 @@ public class ManagedWorkflowTestUtils { public static DependentResourceSpec createDRS(String name, String... dependOns) { return new DependentResourceSpec(EmptyTestDependentResource.class, null, name, Set.of(dependOns), null, null, null, - true); + null); } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap1.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap1.java index 0d450c1871..98f8033076 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap1.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap1.java @@ -9,10 +9,7 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; -import static io.javaoperatorsdk.operator.sample.multiplemanageddependentsametype.MultipleManagedDependentResourceReconciler.CONFIG_MAP_EVENT_SOURCE; - -@KubernetesDependent(eventSourceToUse = CONFIG_MAP_EVENT_SOURCE, - resourceDiscriminator = ConfigMap1Discriminator.class) +@KubernetesDependent(resourceDiscriminator = ConfigMap1Discriminator.class) public class MultipleManagedDependentResourceConfigMap1 extends CRUDKubernetesDependentResource { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap2.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap2.java index 11902fc518..d4cdd4170f 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap2.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceConfigMap2.java @@ -9,11 +9,9 @@ import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; -import static io.javaoperatorsdk.operator.sample.multiplemanageddependentsametype.MultipleManagedDependentResourceReconciler.CONFIG_MAP_EVENT_SOURCE; import static io.javaoperatorsdk.operator.sample.multiplemanageddependentsametype.MultipleManagedDependentResourceReconciler.DATA_KEY; -@KubernetesDependent(eventSourceToUse = CONFIG_MAP_EVENT_SOURCE, - resourceDiscriminator = ConfigMap2Discriminator.class) +@KubernetesDependent(resourceDiscriminator = ConfigMap2Discriminator.class) public class MultipleManagedDependentResourceConfigMap2 extends CRUDKubernetesDependentResource { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceReconciler.java index edfa7ad2bd..2d9b4f3ee9 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanageddependentsametype/MultipleManagedDependentResourceReconciler.java @@ -11,9 +11,13 @@ import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; +import static io.javaoperatorsdk.operator.sample.multiplemanageddependentsametype.MultipleManagedDependentResourceReconciler.CONFIG_MAP_EVENT_SOURCE; + @ControllerConfiguration(dependents = { - @Dependent(type = MultipleManagedDependentResourceConfigMap1.class), - @Dependent(type = MultipleManagedDependentResourceConfigMap2.class) + @Dependent(type = MultipleManagedDependentResourceConfigMap1.class, + useEventSourceWithName = CONFIG_MAP_EVENT_SOURCE), + @Dependent(type = MultipleManagedDependentResourceConfigMap2.class, + useEventSourceWithName = CONFIG_MAP_EVENT_SOURCE) }) public class MultipleManagedDependentResourceReconciler implements Reconciler, diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanagedexternaldependenttype/MultipleManagedExternalDependentResourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanagedexternaldependenttype/MultipleManagedExternalDependentResourceReconciler.java index 573df92287..349409ec73 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanagedexternaldependenttype/MultipleManagedExternalDependentResourceReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplemanagedexternaldependenttype/MultipleManagedExternalDependentResourceReconciler.java @@ -15,9 +15,13 @@ import io.javaoperatorsdk.operator.support.ExternalServiceMock; import io.javaoperatorsdk.operator.support.TestExecutionInfoProvider; +import static io.javaoperatorsdk.operator.sample.multiplemanagedexternaldependenttype.MultipleManagedExternalDependentResourceReconciler.CONFIG_MAP_EVENT_SOURCE; + @ControllerConfiguration(dependents = { - @Dependent(type = ExternalDependentResource1.class, provideEventSource = false), - @Dependent(type = ExternalDependentResource2.class, provideEventSource = false) + @Dependent(type = ExternalDependentResource1.class, + useEventSourceWithName = CONFIG_MAP_EVENT_SOURCE), + @Dependent(type = ExternalDependentResource2.class, + useEventSourceWithName = CONFIG_MAP_EVENT_SOURCE) }) public class MultipleManagedExternalDependentResourceReconciler implements Reconciler,