Skip to content

Commit d206adc

Browse files
committed
improve: remove EventSourceInitializer
Signed-off-by: Attila Mészáros <csviri@gmail.com>
1 parent f2be686 commit d206adc

File tree

38 files changed

+153
-200
lines changed

38 files changed

+153
-200
lines changed

caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import com.github.benmanes.caffeine.cache.Caffeine;
2929

3030
public abstract class AbstractTestReconciler<P extends CustomResource<BoundedCacheTestSpec, BoundedCacheTestStatus>>
31-
implements Reconciler<P>, EventSourceInitializer<P> {
31+
implements Reconciler<P> {
3232

3333
private static final Logger log =
3434
LoggerFactory.getLogger(BoundedCacheClusterScopeTestReconciler.class);
@@ -82,7 +82,7 @@ public Map<String, EventSource> prepareEventSources(
8282
Mappers.fromOwnerReference(this instanceof BoundedCacheClusterScopeTestReconciler))
8383
.build(), context);
8484

85-
return EventSourceInitializer.nameEventSources(es);
85+
return Reconciler.nameEventSources(es);
8686
}
8787

8888
private void ensureStatus(P resource) {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializer.java

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import java.util.*;
44

55
import io.fabric8.kubernetes.api.model.HasMetadata;
6-
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
7-
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
86
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
9-
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;
107

118
/**
129
* An interface that a {@link Reconciler} can implement to have the SDK register the provided
@@ -26,64 +23,4 @@ public interface EventSourceInitializer<P extends HasMetadata> {
2623
*/
2724
Map<String, EventSource> prepareEventSources(EventSourceContext<P> context);
2825

29-
/**
30-
* Utility method to easily create map with generated name for event sources. This is for the use
31-
* case when the event sources are not access explicitly by name in the reconciler.
32-
*
33-
* @param eventSources to name
34-
* @return even source with default names
35-
*/
36-
static Map<String, EventSource> nameEventSources(EventSource... eventSources) {
37-
Map<String, EventSource> eventSourceMap = new HashMap<>(eventSources.length);
38-
for (EventSource eventSource : eventSources) {
39-
eventSourceMap.put(generateNameFor(eventSource), eventSource);
40-
}
41-
return eventSourceMap;
42-
}
43-
44-
@SuppressWarnings("unchecked")
45-
static <K extends HasMetadata> Map<String, EventSource> eventSourcesFromWorkflow(
46-
EventSourceContext<K> context,
47-
Workflow<K> workflow) {
48-
Map<String, EventSource> result = new HashMap<>();
49-
for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) {
50-
var eventSource = e.getValue().eventSource(context);
51-
eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es));
52-
}
53-
return result;
54-
}
55-
56-
@SuppressWarnings("rawtypes")
57-
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
58-
EventSourceContext<K> context, DependentResource... dependentResources) {
59-
return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources));
60-
}
61-
62-
@SuppressWarnings("unchecked,rawtypes")
63-
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
64-
EventSourceContext<K> context, Collection<DependentResource> dependentResources) {
65-
66-
if (dependentResources != null) {
67-
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.size());
68-
for (DependentResource dependentResource : dependentResources) {
69-
Optional<ResourceEventSource> es = dependentResource.eventSource(context);
70-
es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e));
71-
}
72-
return eventSourceMap;
73-
} else {
74-
return Collections.emptyMap();
75-
}
76-
}
77-
78-
/**
79-
* Used when event sources are not explicitly named when created/registered.
80-
*
81-
* @param eventSource EventSource
82-
* @return generated name
83-
*/
84-
static String generateNameFor(EventSource eventSource) {
85-
// we can have multiple event sources for the same class
86-
return eventSource.getClass().getName() + "#" + eventSource.hashCode();
87-
}
88-
8926
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Reconciler.java

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package io.javaoperatorsdk.operator.api.reconciler;
22

3+
import java.util.*;
4+
35
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
7+
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
8+
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
9+
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;
410

5-
public interface Reconciler<R extends HasMetadata> {
11+
public interface Reconciler<P extends HasMetadata> {
612

713
/**
814
* The implementation of this operation is required to be idempotent. Always use the UpdateControl
@@ -14,6 +20,78 @@ public interface Reconciler<R extends HasMetadata> {
1420
* @return UpdateControl to manage updates on the custom resource (usually the status) after
1521
* reconciliation.
1622
*/
17-
UpdateControl<R> reconcile(R resource, Context<R> context) throws Exception;
23+
UpdateControl<P> reconcile(P resource, Context<P> context) throws Exception;
24+
1825

26+
/**
27+
* Prepares a map of {@link EventSource} implementations keyed by the name with which they need to
28+
* be registered by the SDK.
29+
*
30+
* @param context a {@link EventSourceContext} providing access to information useful to event
31+
* sources
32+
* @return a map of event sources to register
33+
*/
34+
default Map<String, EventSource> prepareEventSources(EventSourceContext<P> context) {
35+
return Map.of();
36+
}
37+
38+
/**
39+
* Utility method to easily create map with generated name for event sources. This is for the use
40+
* case when the event sources are not access explicitly by name in the reconciler.
41+
*
42+
* @param eventSources to name
43+
* @return even source with default names
44+
*/
45+
static Map<String, EventSource> nameEventSources(EventSource... eventSources) {
46+
Map<String, EventSource> eventSourceMap = new HashMap<>(eventSources.length);
47+
for (EventSource eventSource : eventSources) {
48+
eventSourceMap.put(generateNameFor(eventSource), eventSource);
49+
}
50+
return eventSourceMap;
51+
}
52+
53+
@SuppressWarnings("unchecked")
54+
static <K extends HasMetadata> Map<String, EventSource> eventSourcesFromWorkflow(
55+
EventSourceContext<K> context,
56+
Workflow<K> workflow) {
57+
Map<String, EventSource> result = new HashMap<>();
58+
for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) {
59+
var eventSource = e.getValue().eventSource(context);
60+
eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es));
61+
}
62+
return result;
63+
}
64+
65+
@SuppressWarnings("rawtypes")
66+
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
67+
EventSourceContext<K> context, DependentResource... dependentResources) {
68+
return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources));
69+
}
70+
71+
@SuppressWarnings("unchecked,rawtypes")
72+
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
73+
EventSourceContext<K> context, Collection<DependentResource> dependentResources) {
74+
75+
if (dependentResources != null) {
76+
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.size());
77+
for (DependentResource dependentResource : dependentResources) {
78+
Optional<ResourceEventSource> es = dependentResource.eventSource(context);
79+
es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e));
80+
}
81+
return eventSourceMap;
82+
} else {
83+
return Collections.emptyMap();
84+
}
85+
}
86+
87+
/**
88+
* Used when event sources are not explicitly named when created/registered.
89+
*
90+
* @param eventSource EventSource
91+
* @return generated name
92+
*/
93+
static String generateNameFor(EventSource eventSource) {
94+
// we can have multiple event sources for the same class
95+
return eventSource.getClass().getName() + "#" + eventSource.hashCode();
96+
}
1997
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package io.javaoperatorsdk.operator.processing;
22

3-
import java.util.ArrayList;
4-
import java.util.HashMap;
5-
import java.util.List;
6-
import java.util.Map;
7-
import java.util.Optional;
8-
import java.util.Set;
3+
import java.util.*;
94

105
import org.slf4j.Logger;
116
import org.slf4j.LoggerFactory;
@@ -25,16 +20,7 @@
2520
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
2621
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
2722
import io.javaoperatorsdk.operator.api.monitoring.Metrics.ControllerExecution;
28-
import io.javaoperatorsdk.operator.api.reconciler.Cleaner;
29-
import io.javaoperatorsdk.operator.api.reconciler.Constants;
30-
import io.javaoperatorsdk.operator.api.reconciler.Context;
31-
import io.javaoperatorsdk.operator.api.reconciler.ContextInitializer;
32-
import io.javaoperatorsdk.operator.api.reconciler.DeleteControl;
33-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
34-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
35-
import io.javaoperatorsdk.operator.api.reconciler.Ignore;
36-
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
37-
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
23+
import io.javaoperatorsdk.operator.api.reconciler.*;
3824
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceNotFoundException;
3925
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceProvider;
4026
import io.javaoperatorsdk.operator.api.reconciler.dependent.EventSourceReferencer;
@@ -230,11 +216,8 @@ private void initContextIfNeeded(P resource, Context<P> context) {
230216
}
231217

232218
public void initAndRegisterEventSources(EventSourceContext<P> context) {
233-
if (reconciler instanceof EventSourceInitializer) {
234-
final var provider = (EventSourceInitializer<P>) this.reconciler;
235-
final var ownSources = provider.prepareEventSources(context);
236-
ownSources.forEach(eventSourceManager::registerEventSource);
237-
}
219+
final var ownSources = this.reconciler.prepareEventSources(context);
220+
ownSources.forEach(eventSourceManager::registerEventSource);
238221

239222
// register created event sources
240223
final var dependentResourcesByName =

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSourceManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
1515
import io.javaoperatorsdk.operator.api.config.NamespaceChangeable;
1616
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
17-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
17+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
1818
import io.javaoperatorsdk.operator.processing.Controller;
1919
import io.javaoperatorsdk.operator.processing.LifecycleAware;
2020
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
@@ -150,7 +150,7 @@ public final synchronized void registerEventSource(String name, EventSource even
150150
Objects.requireNonNull(eventSource, "EventSource must not be null");
151151
try {
152152
if (name == null || name.isBlank()) {
153-
name = EventSourceInitializer.generateNameFor(eventSource);
153+
name = Reconciler.generateNameFor(eventSource);
154154
}
155155
if (eventSource instanceof ManagedInformerEventSource) {
156156
var managedInformerEventSource = ((ManagedInformerEventSource) eventSource);

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/NamedEventSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.util.Optional;
55

66
import io.javaoperatorsdk.operator.OperatorException;
7-
import io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer;
7+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
88
import io.javaoperatorsdk.operator.processing.event.source.Configurable;
99
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
1010
import io.javaoperatorsdk.operator.processing.event.source.EventSourceStartPriority;
@@ -19,7 +19,7 @@ class NamedEventSource implements EventSource, EventSourceMetadata {
1919
NamedEventSource(EventSource original, String name) {
2020
this.original = original;
2121
this.name = name;
22-
nameSet = !name.equals(EventSourceInitializer.generateNameFor(original));
22+
nameSet = !name.equals(Reconciler.generateNameFor(original));
2323
}
2424

2525
@Override

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/EventSource.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
/**
99
* Creates an event source to trigger your reconciler whenever something happens to a secondary or
1010
* external resource that would not normally trigger your reconciler (as the primary resources are
11-
* not changed). To register EventSources with so that your reconciler is triggered, please make
12-
* your reconciler implement
13-
* {@link io.javaoperatorsdk.operator.api.reconciler.EventSourceInitializer}.
11+
* not changed). To register EventSources with so that your reconciler is triggered.
1412
*/
1513
public interface EventSource extends LifecycleAware, EventSourceHealthIndicator {
1614

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceInitializerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class EventSourceInitializerTest {
1515
void defaultNameDifferentForOtherInstance() {
1616
var eventSource1 = new PollingEventSource(HashMap::new, 1000, String.class);
1717
var eventSource2 = new PollingEventSource(HashMap::new, 1000, String.class);
18-
var eventSourceName1 = EventSourceInitializer.generateNameFor(eventSource1);
19-
var eventSourceName2 = EventSourceInitializer.generateNameFor(eventSource2);
18+
var eventSourceName1 = Reconciler.generateNameFor(eventSource1);
19+
var eventSourceName2 = Reconciler.generateNameFor(eventSource2);
2020

2121
assertThat(eventSourceName1).isNotEqualTo(eventSourceName2);
2222
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/controller/ControllerResourceEventSourceTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import io.javaoperatorsdk.operator.TestUtils;
1212
import io.javaoperatorsdk.operator.api.config.BaseConfigurationService;
1313
import io.javaoperatorsdk.operator.api.config.ResolvedControllerConfiguration;
14+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
15+
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
1416
import io.javaoperatorsdk.operator.processing.Controller;
1517
import io.javaoperatorsdk.operator.processing.event.EventHandler;
1618
import io.javaoperatorsdk.operator.processing.event.EventSourceManager;
@@ -152,18 +154,21 @@ void genericFilterFiltersOutAddUpdateAndDeleteEvents() {
152154
@SuppressWarnings("unchecked")
153155
private static class TestController extends Controller<TestCustomResource> {
154156

157+
private static final Reconciler<TestCustomResource> reconciler =
158+
(resource, context) -> UpdateControl.noUpdate();
159+
155160
private final EventSourceManager<TestCustomResource> eventSourceManager =
156161
mock(EventSourceManager.class);
157162

158163
public TestController(OnAddFilter<TestCustomResource> onAddFilter,
159164
OnUpdateFilter<TestCustomResource> onUpdateFilter,
160165
GenericFilter<TestCustomResource> genericFilter) {
161-
super(null, new TestConfiguration(true, onAddFilter, onUpdateFilter, genericFilter),
166+
super(reconciler, new TestConfiguration(true, onAddFilter, onUpdateFilter, genericFilter),
162167
MockKubernetesClient.client(TestCustomResource.class));
163168
}
164169

165170
public TestController(boolean generationAware) {
166-
super(null, new TestConfiguration(generationAware, null, null, null),
171+
super(reconciler, new TestConfiguration(generationAware, null, null, null),
167172
MockKubernetesClient.client(TestCustomResource.class));
168173
}
169174

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/StandaloneBulkDependentReconciler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99

1010
@ControllerConfiguration
1111
public class StandaloneBulkDependentReconciler
12-
implements Reconciler<BulkDependentTestCustomResource>, TestExecutionInfoProvider,
13-
EventSourceInitializer<BulkDependentTestCustomResource> {
12+
implements Reconciler<BulkDependentTestCustomResource>, TestExecutionInfoProvider {
1413

1514
private final AtomicInteger numberOfExecutions = new AtomicInteger(0);
1615

@@ -38,7 +37,7 @@ public int getNumberOfExecutions() {
3837
@Override
3938
public Map<String, EventSource> prepareEventSources(
4039
EventSourceContext<BulkDependentTestCustomResource> context) {
41-
return EventSourceInitializer
40+
return Reconciler
4241
.nameEventSources(dependent.initEventSource(context));
4342
}
4443
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/changenamespace/ChangeNamespaceTestReconciler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
@ControllerConfiguration
1515
public class ChangeNamespaceTestReconciler
16-
implements Reconciler<ChangeNamespaceTestCustomResource>,
17-
EventSourceInitializer<ChangeNamespaceTestCustomResource> {
16+
implements Reconciler<ChangeNamespaceTestCustomResource> {
1817

1918
private final ConcurrentHashMap<ResourceID, Integer> numberOfResourceReconciliations =
2019
new ConcurrentHashMap<>();
@@ -27,7 +26,7 @@ public Map<String, EventSource> prepareEventSources(
2726
new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context)
2827
.build(), context);
2928

30-
return EventSourceInitializer.nameEventSources(configMapES);
29+
return Reconciler.nameEventSources(configMapES);
3130
}
3231

3332
@Override

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/clusterscopedresource/ClusterScopedCustomResourceReconciler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
@ControllerConfiguration
1515
public class ClusterScopedCustomResourceReconciler
16-
implements Reconciler<ClusterScopedCustomResource>,
17-
EventSourceInitializer<ClusterScopedCustomResource> {
16+
implements Reconciler<ClusterScopedCustomResource> {
1817

1918
public static final String DATA_KEY = "data-key";
2019

@@ -59,6 +58,6 @@ public Map<String, EventSource> prepareEventSources(
5958
.withSecondaryToPrimaryMapper(Mappers.fromOwnerReference(true))
6059
.withLabelSelector(TEST_LABEL_KEY + "=" + TEST_LABEL_VALUE)
6160
.build(), context);
62-
return EventSourceInitializer.nameEventSources(ies);
61+
return Reconciler.nameEventSources(ies);
6362
}
6463
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/complexdependent/ComplexDependentReconciler.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
dependsOn = {"second-svc", "first"},
3333
readyPostcondition = StatefulSetReadyCondition.class),
3434
})
35-
public class ComplexDependentReconciler implements Reconciler<ComplexDependentCustomResource>,
36-
EventSourceInitializer<ComplexDependentCustomResource> {
35+
public class ComplexDependentReconciler implements Reconciler<ComplexDependentCustomResource> {
3736

3837
public static final String SERVICE_EVENT_SOURCE_NAME = "serviceEventSource";
3938
public static final String STATEFUL_SET_EVENT_SOURCE_NAME = "statefulSetEventSource";

0 commit comments

Comments
 (0)