Skip to content

Commit

Permalink
introduce event source utils
Browse files Browse the repository at this point in the history
Signed-off-by: Attila Mészáros <csviri@gmail.com>
  • Loading branch information
csviri committed Mar 11, 2024
1 parent dcf17df commit aa84517
Show file tree
Hide file tree
Showing 31 changed files with 106 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public Map<String, EventSource> prepareEventSources(
Mappers.fromOwnerReference(this instanceof BoundedCacheClusterScopeTestReconciler))
.build(), context);

return Reconciler.nameEventSources(es);
return EventSourceUtils.nameEventSources(es);
}

private void ensureStatus(P resource) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package io.javaoperatorsdk.operator.api.reconciler;

import java.util.*;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;

public class EventSourceUtils {
/**
* Utility method to easily create map with generated name for event sources. This is for the use
* case when the event sources are not access explicitly by name in the reconciler.
*
* @param eventSources to name
* @return even source with default names
*/
public static Map<String, EventSource> nameEventSources(EventSource... eventSources) {
Map<String, EventSource> eventSourceMap = new HashMap<>(eventSources.length);
for (EventSource eventSource : eventSources) {
eventSourceMap.put(generateNameFor(eventSource), eventSource);
}
return eventSourceMap;
}

@SuppressWarnings("unchecked")
public static <K extends HasMetadata> Map<String, EventSource> eventSourcesFromWorkflow(
EventSourceContext<K> context,
Workflow<K> workflow) {
Map<String, EventSource> result = new HashMap<>();
for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) {
var eventSource = e.getValue().eventSource(context);
eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es));
}
return result;
}

@SuppressWarnings("rawtypes")
public static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
EventSourceContext<K> context, DependentResource... dependentResources) {
return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources));
}

@SuppressWarnings("unchecked,rawtypes")
public static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
EventSourceContext<K> context, Collection<DependentResource> dependentResources) {

if (dependentResources != null) {
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.size());
for (DependentResource dependentResource : dependentResources) {
Optional<ResourceEventSource> es = dependentResource.eventSource(context);
es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e));
}
return eventSourceMap;
} else {
return Collections.emptyMap();
}
}

/**
* Used when event sources are not explicitly named when created/registered.
*
* @param eventSource EventSource
* @return generated name
*/
public static String generateNameFor(EventSource eventSource) {
// we can have multiple event sources for the same class
return eventSource.getClass().getName() + "#" + eventSource.hashCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import java.util.*;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
import io.javaoperatorsdk.operator.processing.dependent.workflow.Workflow;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventSource;

public interface Reconciler<P extends HasMetadata> {

Expand Down Expand Up @@ -35,63 +32,4 @@ default Map<String, EventSource> prepareEventSources(EventSourceContext<P> conte
return Map.of();
}

/**
* Utility method to easily create map with generated name for event sources. This is for the use
* case when the event sources are not access explicitly by name in the reconciler.
*
* @param eventSources to name
* @return even source with default names
*/
static Map<String, EventSource> nameEventSources(EventSource... eventSources) {
Map<String, EventSource> eventSourceMap = new HashMap<>(eventSources.length);
for (EventSource eventSource : eventSources) {
eventSourceMap.put(generateNameFor(eventSource), eventSource);
}
return eventSourceMap;
}

@SuppressWarnings("unchecked")
static <K extends HasMetadata> Map<String, EventSource> eventSourcesFromWorkflow(
EventSourceContext<K> context,
Workflow<K> workflow) {
Map<String, EventSource> result = new HashMap<>();
for (var e : workflow.getDependentResourcesByNameWithoutActivationCondition().entrySet()) {
var eventSource = e.getValue().eventSource(context);
eventSource.ifPresent(es -> result.put(e.getKey(), (EventSource) es));
}
return result;
}

@SuppressWarnings("rawtypes")
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
EventSourceContext<K> context, DependentResource... dependentResources) {
return nameEventSourcesFromDependentResource(context, Arrays.asList(dependentResources));
}

@SuppressWarnings("unchecked,rawtypes")
static <K extends HasMetadata> Map<String, EventSource> nameEventSourcesFromDependentResource(
EventSourceContext<K> context, Collection<DependentResource> dependentResources) {

if (dependentResources != null) {
Map<String, EventSource> eventSourceMap = new HashMap<>(dependentResources.size());
for (DependentResource dependentResource : dependentResources) {
Optional<ResourceEventSource> es = dependentResource.eventSource(context);
es.ifPresent(e -> eventSourceMap.put(generateNameFor(e), e));
}
return eventSourceMap;
} else {
return Collections.emptyMap();
}
}

/**
* Used when event sources are not explicitly named when created/registered.
*
* @param eventSource EventSource
* @return generated name
*/
static String generateNameFor(EventSource eventSource) {
// we can have multiple event sources for the same class
return eventSource.getClass().getName() + "#" + eventSource.hashCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
import io.javaoperatorsdk.operator.api.config.NamespaceChangeable;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceUtils;
import io.javaoperatorsdk.operator.processing.Controller;
import io.javaoperatorsdk.operator.processing.LifecycleAware;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
Expand Down Expand Up @@ -150,7 +150,7 @@ public final synchronized void registerEventSource(String name, EventSource even
Objects.requireNonNull(eventSource, "EventSource must not be null");
try {
if (name == null || name.isBlank()) {
name = Reconciler.generateNameFor(eventSource);
name = EventSourceUtils.generateNameFor(eventSource);
}
if (eventSource instanceof ManagedInformerEventSource) {
var managedInformerEventSource = ((ManagedInformerEventSource) eventSource);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.util.Optional;

import io.javaoperatorsdk.operator.OperatorException;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceUtils;
import io.javaoperatorsdk.operator.processing.event.source.Configurable;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
import io.javaoperatorsdk.operator.processing.event.source.EventSourceStartPriority;
Expand All @@ -19,7 +19,7 @@ class NamedEventSource implements EventSource, EventSourceMetadata {
NamedEventSource(EventSource original, String name) {
this.original = original;
this.name = name;
nameSet = !name.equals(Reconciler.generateNameFor(original));
nameSet = !name.equals(EventSourceUtils.generateNameFor(original));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ class EventSourceInitializerTest {
void defaultNameDifferentForOtherInstance() {
var eventSource1 = new PollingEventSource(HashMap::new, 1000, String.class);
var eventSource2 = new PollingEventSource(HashMap::new, 1000, String.class);
var eventSourceName1 = Reconciler.generateNameFor(eventSource1);
var eventSourceName2 = Reconciler.generateNameFor(eventSource2);
var eventSourceName1 = EventSourceUtils.generateNameFor(eventSource1);
var eventSourceName2 = EventSourceUtils.generateNameFor(eventSource2);

assertThat(eventSourceName1).isNotEqualTo(eventSourceName2);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public int getNumberOfExecutions() {
@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<BulkDependentTestCustomResource> context) {
return Reconciler
return EventSourceUtils
.nameEventSources(dependent.initEventSource(context));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public Map<String, EventSource> prepareEventSources(
new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context)
.build(), context);

return Reconciler.nameEventSources(configMapES);
return EventSourceUtils.nameEventSources(configMapES);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ public Map<String, EventSource> prepareEventSources(
.withSecondaryToPrimaryMapper(Mappers.fromOwnerReference(true))
.withLabelSelector(TEST_LABEL_KEY + "=" + TEST_LABEL_VALUE)
.build(), context);
return Reconciler.nameEventSources(ies);
return EventSourceUtils.nameEventSources(ies);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public Map<String, EventSource> prepareEventSources(
informerEventSource = new InformerEventSource<>(informerConfiguration, context.getClient());
this.configMapDR.setEventSource(informerEventSource);

return Reconciler.nameEventSources(informerEventSource);
return EventSourceUtils.nameEventSources(informerEventSource);
}

public int getNumberOfExecutions() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public UpdateControl<DependentReInitializationCustomResource> reconcile(
@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<DependentReInitializationCustomResource> context) {
return Reconciler.nameEventSourcesFromDependentResource(context,
return EventSourceUtils.nameEventSourcesFromDependentResource(context,
configMapDependentResource);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public int getNumberOfExecutions() {
@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<DependnetSSACustomResource> context) {
return Reconciler.nameEventSourcesFromDependentResource(context,
return EventSourceUtils.nameEventSourcesFromDependentResource(context,
ssaConfigMapDependent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public Map<String, EventSource> prepareEventSources(
EventSourceContext<ExternalStateCustomResource> context) {
var configMapEventSource = new InformerEventSource<>(
InformerConfiguration.from(ConfigMap.class, context).build(), context);
return Reconciler.nameEventSources(configMapEventSource);
return EventSourceUtils.nameEventSources(configMapEventSource);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public Map<String, EventSource> prepareEventSources(
return externalResource.map(Set::of).orElseGet(Collections::emptySet);
}, context, Duration.ofMillis(300L), ExternalResource.class);

return Reconciler.nameEventSources(configMapEventSource,
return EventSourceUtils.nameEventSources(configMapEventSource,
externalResourceEventSource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@

import io.fabric8.kubernetes.api.model.ConfigMap;
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.*;
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
Expand Down Expand Up @@ -41,7 +37,7 @@ public Map<String, EventSource> prepareEventSources(
EventSourceContext<ExternalStateBulkDependentCustomResource> context) {
var configMapEventSource = new InformerEventSource<>(
InformerConfiguration.from(ConfigMap.class, context).build(), context);
return Reconciler.nameEventSources(configMapEventSource);
return EventSourceUtils.nameEventSources(configMapEventSource);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ public Map<String, EventSource> prepareEventSources(
.equals(CONFIG_MAP_FILTER_VALUE))
.build(), context);

return Reconciler.nameEventSources(configMapES);
return EventSourceUtils.nameEventSources(configMapES);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ public UpdateControl<GenericKubernetesDependentStandaloneCustomResource> reconci
@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<GenericKubernetesDependentStandaloneCustomResource> context) {
return Reconciler.nameEventSources(dependent.eventSource(context).orElseThrow());
return EventSourceUtils.nameEventSources(dependent.eventSource(context).orElseThrow());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ public Map<String, EventSource> prepareEventSources(
new GroupVersionKind("", VERSION, KIND), context).build(),
context);

return Reconciler.nameEventSources(informerEventSource);
return EventSourceUtils.nameEventSources(informerEventSource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public Map<String, EventSource> prepareEventSources(
secondDependentResourceConfigMap
.setResourceDiscriminator(
new TestIndexDiscriminator(CONFIG_MAP_INDEX_2, FIRST_CONFIG_MAP_SUFFIX_2));
return Reconciler.nameEventSources(eventSource);
return EventSourceUtils.nameEventSources(eventSource);
}

public static String configMapKey(ConfigMap configMap) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,7 @@

import io.fabric8.kubernetes.api.model.ConfigMap;
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.Context;
import io.javaoperatorsdk.operator.api.reconciler.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
import io.javaoperatorsdk.operator.api.reconciler.UpdateControl;
import io.javaoperatorsdk.operator.api.reconciler.*;
import io.javaoperatorsdk.operator.processing.event.source.EventSource;
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers;
Expand Down Expand Up @@ -44,7 +40,7 @@ public Map<String, EventSource> prepareEventSources(
.withSecondaryToPrimaryMapper(Mappers.fromAnnotation(RELATED_RESOURCE_NAME))
.build();

return Reconciler
return EventSourceUtils
.nameEventSources(new InformerEventSource<>(config, context));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public DependentGarbageCollectionTestReconciler() {
@Override
public Map<String, EventSource> prepareEventSources(
EventSourceContext<DependentGarbageCollectionTestCustomResource> context) {
return Reconciler.nameEventSourcesFromDependentResource(context,
return EventSourceUtils.nameEventSourcesFromDependentResource(context,
configMapDependent);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,6 @@ public Map<String, EventSource> prepareEventSources(
firstDependentResourceConfigMap.configureWith(eventSource);
secondDependentResourceConfigMap.configureWith(eventSource);

return Reconciler.nameEventSources(eventSource);
return EventSourceUtils.nameEventSources(eventSource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public Map<String, EventSource> prepareEventSources(
}).build();
InformerEventSource<ConfigMap, MultipleSecondaryEventSourceCustomResource> configMapEventSource =
new InformerEventSource<>(config, context);
return Reconciler.nameEventSources(configMapEventSource);
return EventSourceUtils.nameEventSources(configMapEventSource);
}

ConfigMap configMap(String name, MultipleSecondaryEventSourceCustomResource resource) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public Map<String, EventSource> prepareEventSources(
return Set.of(UUID.randomUUID().toString());
},
context, Duration.ofMillis(POLL_PERIOD), String.class);
return Reconciler.nameEventSources(eventSource);
return EventSourceUtils.nameEventSources(eventSource);
}

public int getNumberOfExecutions(String name) {
Expand Down
Loading

0 comments on commit aa84517

Please sign in to comment.