From c38e05b6a7de5753f389ad41f20c3b79c73c4207 Mon Sep 17 00:00:00 2001 From: csviri Date: Tue, 4 Oct 2022 11:01:36 +0200 Subject: [PATCH 1/6] feat: use event source in dependent resource --- .../AnnotationControllerConfiguration.java | 7 ++--- .../ControllerConfigurationOverrider.java | 5 ++-- .../dependent/DependentResourceSpec.java | 10 +++---- .../api/reconciler/dependent/Dependent.java | 11 +++---- .../dependent/DependentResource.java | 7 +---- .../dependent/AbstractDependentResource.java | 23 --------------- ...actEventSourceHolderDependentResource.java | 29 ++++++++++--------- .../kubernetes/KubernetesDependent.java | 1 - .../KubernetesDependentResource.java | 4 --- .../KubernetesDependentResourceConfig.java | 10 ++----- .../workflow/ManagedWorkflowSupport.java | 6 ++-- .../ControllerConfigurationOverriderTest.java | 2 +- .../AbstractDependentResourceTest.java | 7 +---- .../dependent/EmptyTestDependentResource.java | 2 +- .../AbstractWorkflowExecutorTest.java | 4 +-- .../workflow/ManagedWorkflowTestUtils.java | 3 +- ...pleManagedDependentResourceConfigMap1.java | 5 +--- ...pleManagedDependentResourceConfigMap2.java | 4 +-- ...pleManagedDependentResourceReconciler.java | 8 +++-- ...edExternalDependentResourceReconciler.java | 8 +++-- 20 files changed, 59 insertions(+), 97 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 fa2b5c1927..c3cec1588a 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 @@ -248,7 +248,7 @@ public List getDependentResources() { instantiateIfNotDefault(dependent.readyPostcondition(), Condition.class, context), instantiateIfNotDefault(dependent.reconcilePrecondition(), Condition.class, context), instantiateIfNotDefault(dependent.deletePostcondition(), Condition.class, context), - dependent.provideEventSource()); + dependent.useEventSourceWithName()); specsMap.put(name, spec); } @@ -287,7 +287,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 +313,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..df7ed0b1b7 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())); } @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(), + spec.getUseEventSourceWithName()); } 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..609b8a8ade 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 String getUseEventSourceWithName() { + return 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..ae4568239e 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,12 +49,7 @@ 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(); - + void useEventSourceWithName(String name); default Optional getSecondaryResource(P primary, Context

context) { return Optional.empty(); 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..5f1d524eb0 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 @@ -26,37 +26,33 @@ 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())); - } + if (eventSourceNameToUse != null) { + setEventSource( + (T) eventSourceRetriever.getResourceEventSourceFor(resourceType(), eventSourceNameToUse)); } } @@ -65,6 +61,11 @@ 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; @@ -117,9 +118,9 @@ public void setOnDeleteFilter(OnDeleteFilter onDeleteFilter) { this.onDeleteFilter = onDeleteFilter; } - public AbstractEventSourceHolderDependentResource setEventSourceToUse( - String eventSourceToUse) { - this.eventSourceToUse = eventSourceToUse; + public AbstractEventSourceHolderDependentResource setEventSourceNameToUse( + String eventSourceNameToUse) { + this.eventSourceNameToUse = eventSourceNameToUse; 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..9b5ccfb3ad 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 @@ -14,6 +14,7 @@ import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; +import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware; @@ -81,8 +82,9 @@ public DependentResource createAndConfigureFrom(DependentResourceSpec spec, if (dependentResource instanceof KubernetesClientAware) { ((KubernetesClientAware) dependentResource).setKubernetesClient(client); } - if (!spec.provideEventSource()) { - dependentResource.doNotProvideEventSource(); + if (!Constants.NO_VALUE_SET.equals(spec.getUseEventSourceWithName()) + && spec.getUseEventSourceWithName() != null) { + dependentResource.useEventSourceWithName(spec.getUseEventSourceWithName()); } if (dependentResource instanceof DependentResourceConfigurator) { final var configurator = (DependentResourceConfigurator) dependentResource; 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..15b78f715c 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 @@ -82,7 +82,7 @@ public Class resourceType() { } @Override - public void doNotProvideEventSource() {} + public void useEventSourceWithName(String name) {} } } 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..8b05c42f8e 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.*; @@ -81,10 +79,7 @@ public Class resourceType() { } @Override - protected ResourceEventSource provideEventSource( - EventSourceContext eventSourceContext) { - return null; - } + public void useEventSourceWithName(String name) {} @Override public Optional getSecondaryResource(TestCustomResource primary, 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..2d65b5cedb 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 @@ -21,7 +21,7 @@ public Class resourceType() { } @Override - public void doNotProvideEventSource() {} + public void useEventSourceWithName(String name) {} } 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..56491bf536 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 @@ -49,7 +49,7 @@ public Class resourceType() { } @Override - public void doNotProvideEventSource() {} + public void useEventSourceWithName(String name) {} @Override public String toString() { @@ -111,7 +111,7 @@ public Class resourceType() { } @Override - public void doNotProvideEventSource() {} + public void useEventSourceWithName(String name) {} @Override public String toString() { 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..2cfe9eebcd 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 @@ -3,6 +3,7 @@ import java.util.Set; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; +import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.processing.dependent.EmptyTestDependentResource; @SuppressWarnings("rawtypes") @@ -12,7 +13,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); + Constants.NO_VALUE_SET); } } 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, From e93103c11d684bcbacae219a6ffd181312e93675 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 4 Oct 2022 14:24:04 +0200 Subject: [PATCH 2/6] refactor: provide default empty implementation --- .../api/reconciler/dependent/DependentResource.java | 2 +- .../api/config/ControllerConfigurationOverriderTest.java | 3 --- .../processing/dependent/AbstractDependentResourceTest.java | 3 --- .../processing/dependent/EmptyTestDependentResource.java | 4 ---- .../dependent/workflow/AbstractWorkflowExecutorTest.java | 6 ------ 5 files changed, 1 insertion(+), 17 deletions(-) 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 ae4568239e..0484d2773b 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,7 +49,7 @@ default Optional> eventSource( return Optional.empty(); } - void useEventSourceWithName(String name); + default void useEventSourceWithName(String name) {} default Optional getSecondaryResource(P primary, Context

context) { return Optional.empty(); 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 15b78f715c..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 useEventSourceWithName(String name) {} } } 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 8b05c42f8e..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 @@ -78,9 +78,6 @@ public Class resourceType() { return ConfigMap.class; } - @Override - public void useEventSourceWithName(String name) {} - @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 2d65b5cedb..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 useEventSourceWithName(String name) {} - } 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 56491bf536..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 useEventSourceWithName(String name) {} - @Override public String toString() { return name; @@ -110,9 +107,6 @@ public Class resourceType() { return String.class; } - @Override - public void useEventSourceWithName(String name) {} - @Override public String toString() { return name; From 2c03a8c392f64bf0bd61cf2708d9caf711fd75c8 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 4 Oct 2022 14:25:24 +0200 Subject: [PATCH 3/6] refactor: avoid propagating Constants.NO_VALUE_SET --- .../api/config/AnnotationControllerConfiguration.java | 6 +++++- .../api/config/ControllerConfigurationOverrider.java | 4 ++-- .../api/config/dependent/DependentResourceSpec.java | 4 ++-- .../dependent/workflow/ManagedWorkflowSupport.java | 9 ++++----- .../dependent/workflow/ManagedWorkflowTestUtils.java | 3 +-- 5 files changed, 14 insertions(+), 12 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 c3cec1588a..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.useEventSourceWithName()); + eventSourceName); specsMap.put(name, spec); } 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 df7ed0b1b7..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.getUseEventSourceWithName())); + current.getDeletePostCondition(), current.getUseEventSourceWithName().orElse(null))); } @SuppressWarnings("unchecked") @@ -221,7 +221,7 @@ public ControllerConfiguration build() { return new DependentResourceSpec(spec.getDependentResourceClass(), c.setNamespaces(namespaces), name, spec.getDependsOn(), spec.getReadyCondition(), spec.getReconcileCondition(), spec.getDeletePostCondition(), - spec.getUseEventSourceWithName()); + (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 609b8a8ade..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 @@ -94,7 +94,7 @@ public Condition getDeletePostCondition() { return deletePostCondition; } - public String getUseEventSourceWithName() { - return useEventSourceWithName; + public Optional getUseEventSourceWithName() { + return Optional.ofNullable(useEventSourceWithName); } } 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 9b5ccfb3ad..9bf6e33b62 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 @@ -14,7 +14,6 @@ import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; -import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware; @@ -82,10 +81,10 @@ public DependentResource createAndConfigureFrom(DependentResourceSpec spec, if (dependentResource instanceof KubernetesClientAware) { ((KubernetesClientAware) dependentResource).setKubernetesClient(client); } - if (!Constants.NO_VALUE_SET.equals(spec.getUseEventSourceWithName()) - && spec.getUseEventSourceWithName() != null) { - dependentResource.useEventSourceWithName(spec.getUseEventSourceWithName()); - } + + spec.getUseEventSourceWithName() + .ifPresent(esName -> dependentResource.useEventSourceWithName((String) esName)); + 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/processing/dependent/workflow/ManagedWorkflowTestUtils.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowTestUtils.java index 2cfe9eebcd..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 @@ -3,7 +3,6 @@ import java.util.Set; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; -import io.javaoperatorsdk.operator.api.reconciler.Constants; import io.javaoperatorsdk.operator.processing.dependent.EmptyTestDependentResource; @SuppressWarnings("rawtypes") @@ -13,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, - Constants.NO_VALUE_SET); + null); } } From 22e7d9255eafce977791e0e05c5883e5b3c1f7d8 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 4 Oct 2022 16:59:53 +0200 Subject: [PATCH 4/6] refactor: EventSourceAware -> DeferrableEventSourceHolder, handle errors --- .../DeferrableEventSourceHolder.java | 14 +++++ .../dependent/DependentResource.java | 2 - .../dependent/EventSourceAware.java | 10 ---- .../operator/processing/Controller.java | 53 ++++++++++++------- ...actEventSourceHolderDependentResource.java | 25 +++++---- .../workflow/ManagedWorkflowSupport.java | 13 ++++- 6 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java delete mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceAware.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java new file mode 100644 index 0000000000..e28d1a4165 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.api.reconciler.dependent; + +import java.util.Optional; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; + +public interface DeferrableEventSourceHolder

{ + + default void useEventSourceWithName(String name) {} + + Optional resolveEventSource(EventSourceRetriever

eventSourceRetriever); + +} 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 0484d2773b..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,8 +49,6 @@ default Optional> eventSource( return Optional.empty(); } - default void useEventSourceWithName(String name) {} - 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/processing/Controller.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java index 57ce0a3a5e..9a40197736 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,7 +35,7 @@ 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.DeferrableEventSourceHolder; import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedDependentResourceContext; import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflow; @@ -214,25 +217,35 @@ 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(DeferrableEventSourceHolder.class::isInstance) + .map(DeferrableEventSourceHolder.class::cast) + .forEach(dr -> ((DeferrableEventSourceHolder

) dr) + .resolveEventSource(eventSourceManager).ifPresent(unresolved -> unresolvable + .computeIfAbsent(unresolved, 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/AbstractEventSourceHolderDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/AbstractEventSourceHolderDependentResource.java index 5f1d524eb0..b0ac31e860 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,7 @@ 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.DeferrableEventSourceHolder; import io.javaoperatorsdk.operator.api.reconciler.dependent.RecentOperationCacheFiller; import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; import io.javaoperatorsdk.operator.processing.event.ResourceID; @@ -17,7 +17,7 @@ @Ignore public abstract class AbstractEventSourceHolderDependentResource> - extends AbstractDependentResource implements EventSourceAware

{ + extends AbstractDependentResource implements DeferrableEventSourceHolder

{ private T eventSource; private final Class resourceType; @@ -32,7 +32,6 @@ protected AbstractEventSourceHolderDependentResource(Class resourceType) { this.resourceType = resourceType; } - 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 @@ -49,14 +48,20 @@ public Optional> eventSource(EventSourceContext

con @SuppressWarnings("unchecked") @Override - public void selectEventSources(EventSourceRetriever

eventSourceRetriever) { - if (eventSourceNameToUse != null) { - setEventSource( - (T) eventSourceRetriever.getResourceEventSourceFor(resourceType(), eventSourceNameToUse)); + public Optional resolveEventSource(EventSourceRetriever

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

context) { return (T) eventSource(context).orElseThrow(); } @@ -117,10 +122,4 @@ public void setOnUpdateFilter(OnUpdateFilter onUpdateFilter) { public void setOnDeleteFilter(OnDeleteFilter onDeleteFilter) { this.onDeleteFilter = onDeleteFilter; } - - public AbstractEventSourceHolderDependentResource setEventSourceNameToUse( - String eventSourceNameToUse) { - this.eventSourceNameToUse = eventSourceNameToUse; - return this; - } } 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 9bf6e33b62..8f010f0914 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 @@ -14,6 +14,7 @@ import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; +import io.javaoperatorsdk.operator.api.reconciler.dependent.DeferrableEventSourceHolder; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DependentResourceConfigurator; import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.KubernetesClientAware; @@ -83,7 +84,17 @@ public DependentResource createAndConfigureFrom(DependentResourceSpec spec, } spec.getUseEventSourceWithName() - .ifPresent(esName -> dependentResource.useEventSourceWithName((String) esName)); + .ifPresent(esName -> { + final var name = (String) esName; + if (dependentResource instanceof DeferrableEventSourceHolder) { + ((DeferrableEventSourceHolder) 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 " + + DeferrableEventSourceHolder.class.getSimpleName()); + } + }); if (dependentResource instanceof DependentResourceConfigurator) { final var configurator = (DependentResourceConfigurator) dependentResource; From 8a9e0f65ef18e8ec6ce748966ebb7780353fd6f6 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 4 Oct 2022 17:09:44 +0200 Subject: [PATCH 5/6] refactor: DeferrableEventSourceHolder -> EventSourceReferencer --- ...entSourceHolder.java => EventSourceReferencer.java} | 2 +- .../operator/processing/Controller.java | 10 +++++----- .../AbstractEventSourceHolderDependentResource.java | 4 ++-- .../dependent/workflow/ManagedWorkflowSupport.java | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) rename operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/{DeferrableEventSourceHolder.java => EventSourceReferencer.java} (83%) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java similarity index 83% rename from operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java rename to operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java index e28d1a4165..55a9c7193c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/DeferrableEventSourceHolder.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceReferencer.java @@ -5,7 +5,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; -public interface DeferrableEventSourceHolder

{ +public interface EventSourceReferencer

{ default void useEventSourceWithName(String name) {} 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 9a40197736..73be1cf3ee 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 @@ -35,8 +35,8 @@ 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.DeferrableEventSourceHolder; 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; @@ -234,11 +234,11 @@ public void initAndRegisterEventSources(EventSourceContext

context) { }); // resolve event sources referenced by name for dependents that reuse an existing event source - final Map> unresolvable = new HashMap<>(size); + final Map> unresolvable = new HashMap<>(size); dependentResourcesByName.values().stream() - .filter(DeferrableEventSourceHolder.class::isInstance) - .map(DeferrableEventSourceHolder.class::cast) - .forEach(dr -> ((DeferrableEventSourceHolder

) dr) + .filter(EventSourceReferencer.class::isInstance) + .map(EventSourceReferencer.class::cast) + .forEach(dr -> ((EventSourceReferencer

) dr) .resolveEventSource(eventSourceManager).ifPresent(unresolved -> unresolvable .computeIfAbsent(unresolved, s -> new ArrayList<>()).add(dr))); if (!unresolvable.isEmpty()) { 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 b0ac31e860..2a03ba8e07 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,7 @@ 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.DeferrableEventSourceHolder; +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 +17,7 @@ @Ignore public abstract class AbstractEventSourceHolderDependentResource> - extends AbstractDependentResource implements DeferrableEventSourceHolder

{ + extends AbstractDependentResource implements EventSourceReferencer

{ private T eventSource; private final Class resourceType; 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 8f010f0914..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 @@ -14,8 +14,8 @@ import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider; import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec; -import io.javaoperatorsdk.operator.api.reconciler.dependent.DeferrableEventSourceHolder; 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; @@ -86,13 +86,13 @@ public DependentResource createAndConfigureFrom(DependentResourceSpec spec, spec.getUseEventSourceWithName() .ifPresent(esName -> { final var name = (String) esName; - if (dependentResource instanceof DeferrableEventSourceHolder) { - ((DeferrableEventSourceHolder) dependentResource).useEventSourceWithName(name); + 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 " - + DeferrableEventSourceHolder.class.getSimpleName()); + + EventSourceReferencer.class.getSimpleName()); } }); From 9c2c03ed53d7e56166a5b1bd5343476c4ff5d94e Mon Sep 17 00:00:00 2001 From: csviri Date: Wed, 5 Oct 2022 10:06:24 +0200 Subject: [PATCH 6/6] using exception instead of optional in event source reference --- .../dependent/EventSourceNotFoundException.java | 16 ++++++++++++++++ .../dependent/EventSourceReferencer.java | 9 ++++++--- .../operator/processing/Controller.java | 12 +++++++++--- ...stractEventSourceHolderDependentResource.java | 6 +++--- 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/dependent/EventSourceNotFoundException.java 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 index 55a9c7193c..13ac93e2bf 100644 --- 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 @@ -1,7 +1,5 @@ package io.javaoperatorsdk.operator.api.reconciler.dependent; -import java.util.Optional; - import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; @@ -9,6 +7,11 @@ public interface EventSourceReferencer

{ default void useEventSourceWithName(String name) {} - Optional resolveEventSource(EventSourceRetriever

eventSourceRetriever); + /** + * 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 73be1cf3ee..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 @@ -35,6 +35,7 @@ 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.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; @@ -238,9 +239,14 @@ public void initAndRegisterEventSources(EventSourceContext

context) { dependentResourcesByName.values().stream() .filter(EventSourceReferencer.class::isInstance) .map(EventSourceReferencer.class::cast) - .forEach(dr -> ((EventSourceReferencer

) dr) - .resolveEventSource(eventSourceManager).ifPresent(unresolved -> unresolvable - .computeIfAbsent(unresolved, s -> new ArrayList<>()).add(dr))); + .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); 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 2a03ba8e07..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,6 +5,7 @@ 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.EventSourceNotFoundException; import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer; import io.javaoperatorsdk.operator.api.reconciler.dependent.RecentOperationCacheFiller; import io.javaoperatorsdk.operator.processing.event.EventSourceRetriever; @@ -48,16 +49,15 @@ public Optional> eventSource(EventSourceContext

con @SuppressWarnings("unchecked") @Override - public Optional resolveEventSource(EventSourceRetriever

eventSourceRetriever) { + public void resolveEventSource(EventSourceRetriever

eventSourceRetriever) { if (eventSourceNameToUse != null && eventSource == null) { final var source = eventSourceRetriever.getResourceEventSourceFor(resourceType(), eventSourceNameToUse); if (source == null) { - return Optional.of(eventSourceNameToUse); + throw new EventSourceNotFoundException(eventSourceNameToUse); } setEventSource((T) source); } - return Optional.empty(); } /** To make this backwards compatible even for respect of overriding */