Skip to content

Commit 395ddb1

Browse files
committed
feat: extract specific interfaces for primary/secondary retriever
1 parent 384585e commit 395ddb1

File tree

13 files changed

+99
-65
lines changed

13 files changed

+99
-65
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DefaultDependentResourceConfiguration.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
package io.javaoperatorsdk.operator.api.config.dependent;
22

33
import java.util.Set;
4-
import java.util.function.Function;
54

65
import io.fabric8.kubernetes.api.model.HasMetadata;
76
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
87
import io.javaoperatorsdk.operator.api.config.DefaultResourceConfiguration;
9-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
8+
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryRetriever;
9+
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
1010

1111
public class DefaultDependentResourceConfiguration<R extends HasMetadata>
1212
extends DefaultResourceConfiguration<R, DependentResourceConfiguration<R>>
1313
implements DependentResourceConfiguration<R> {
1414
private final boolean creatable;
1515
private final boolean updatable;
1616
private final boolean owned;
17-
private final Function<R, Set<ResourceID>> secondaryToPrimariesMapper;
18-
private final Function<HasMetadata, R> primaryToSecondaryMapper;
17+
private final PrimaryResourcesRetriever<R> associatedPrimaries;
18+
private final AssociatedSecondaryRetriever<R> associatedSecondary;
1919
private final boolean skipUpdateIfUnchanged;
2020

2121
public DefaultDependentResourceConfiguration(String crdName, Class<R> resourceClass,
2222
Set<String> namespaces, String labelSelector,
2323
ConfigurationService service, boolean creatable, boolean updatable, boolean owned,
24-
Function<R, Set<ResourceID>> secondaryToPrimariesMapper,
25-
Function<HasMetadata, R> primaryToSecondaryMapper, boolean skipUpdateIfUnchanged) {
24+
PrimaryResourcesRetriever<R> associatedPrimaries,
25+
AssociatedSecondaryRetriever<R> associatedSecondary, boolean skipUpdateIfUnchanged) {
2626
super(crdName, resourceClass, namespaces, labelSelector, service);
2727
this.creatable = creatable;
2828
this.updatable = updatable;
2929
this.owned = owned;
30-
this.secondaryToPrimariesMapper = secondaryToPrimariesMapper;
31-
this.primaryToSecondaryMapper = primaryToSecondaryMapper;
30+
this.associatedPrimaries = associatedPrimaries;
31+
this.associatedSecondary = associatedSecondary;
3232
this.skipUpdateIfUnchanged = skipUpdateIfUnchanged;
3333
}
3434

@@ -48,13 +48,13 @@ public boolean owned() {
4848
}
4949

5050
@Override
51-
public Function<R, Set<ResourceID>> getSecondaryToPrimaryResourcesMapper() {
52-
return secondaryToPrimariesMapper;
51+
public PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever() {
52+
return associatedPrimaries;
5353
}
5454

5555
@Override
56-
public Function<HasMetadata, R> getSecondaryResourceAssociatedWithPrimaryMapper() {
57-
return primaryToSecondaryMapper;
56+
public AssociatedSecondaryRetriever<R> getAssociatedResourceRetriever() {
57+
return associatedSecondary;
5858
}
5959

6060
@Override

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/dependent/DependentResourceConfiguration.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package io.javaoperatorsdk.operator.api.config.dependent;
22

3-
import java.util.Set;
4-
import java.util.function.Function;
5-
63
import io.fabric8.kubernetes.api.model.HasMetadata;
74
import io.javaoperatorsdk.operator.api.config.ResourceConfiguration;
8-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
5+
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryRetriever;
96
import io.javaoperatorsdk.operator.processing.event.source.Mappers;
7+
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
108

119
import static io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfiguration.CREATABLE_DEFAULT;
1210
import static io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceConfiguration.OWNED_DEFAULT;
@@ -27,11 +25,11 @@ default boolean owned() {
2725
return OWNED_DEFAULT;
2826
}
2927

30-
default Function<R, Set<ResourceID>> getSecondaryToPrimaryResourcesMapper() {
28+
default PrimaryResourcesRetriever<R> getPrimaryResourcesRetriever() {
3129
return Mappers.fromOwnerReference();
3230
}
3331

34-
Function<HasMetadata, R> getSecondaryResourceAssociatedWithPrimaryMapper();
32+
AssociatedSecondaryRetriever<R> getAssociatedResourceRetriever();
3533

3634
default boolean skipUpdateIfUnchanged() {
3735
return true;

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

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.javaoperatorsdk.operator.api.reconciler.dependent;
22

33
import java.util.Set;
4-
import java.util.function.Function;
54

65
import io.fabric8.kubernetes.api.model.HasMetadata;
76
import io.javaoperatorsdk.operator.processing.event.ResourceID;
7+
import io.javaoperatorsdk.operator.processing.event.source.AssociatedSecondaryRetriever;
8+
import io.javaoperatorsdk.operator.processing.event.source.EventSourceRegistry;
9+
import io.javaoperatorsdk.operator.processing.event.source.PrimaryResourcesRetriever;
810
import io.javaoperatorsdk.operator.processing.event.source.ResourceCache;
911
import io.javaoperatorsdk.operator.processing.event.source.ResourceEventFilter;
1012

@@ -30,9 +32,9 @@
3032

3133
Class<? extends Fetcher> fetcher() default DEFAULT_FETCHER.class;
3234

33-
Class<? extends Function<? extends HasMetadata, Set<ResourceID>>> associatedPrimariesMapper() default DEFAULT_PRIMARIES_MAPPER.class;
35+
Class<? extends PrimaryResourcesRetriever> associatedPrimariesRetriever() default DEFAULT_PRIMARIES_RETRIEVER.class;
3436

35-
Class<? extends Function<? extends HasMetadata, ? extends HasMetadata>> associatedSecondaryMapper() default DEFAULT_SECONDARY_MAPPER.class;
37+
Class<? extends AssociatedSecondaryRetriever> associatedSecondaryRetriever() default DEFAULT_SECONDARY_RETRIEVER.class;
3638

3739
boolean skipUpdateIfUnchanged() default SKIP_UPDATE_DEFAULT;
3840

@@ -87,18 +89,19 @@ public HasMetadata fetchFor(HasMetadata owner, ResourceCache cache) {
8789
}
8890
}
8991

90-
final class DEFAULT_PRIMARIES_MAPPER implements Function<HasMetadata, Set<ResourceID>> {
92+
final class DEFAULT_PRIMARIES_RETRIEVER implements PrimaryResourcesRetriever<HasMetadata> {
9193

9294
@Override
93-
public Set<ResourceID> apply(HasMetadata hasMetadata) {
95+
public Set<ResourceID> associatedPrimaryResources(HasMetadata dependentResource,
96+
EventSourceRegistry registry) {
9497
return null;
9598
}
9699
}
97100

98-
final class DEFAULT_SECONDARY_MAPPER implements Function<HasMetadata, HasMetadata> {
101+
final class DEFAULT_SECONDARY_RETRIEVER implements AssociatedSecondaryRetriever<HasMetadata> {
99102

100103
@Override
101-
public HasMetadata apply(HasMetadata hasMetadata) {
104+
public HasMetadata associatedSecondary(HasMetadata primary, EventSourceRegistry registry) {
102105
return null;
103106
}
104107
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ protected ResourceEventFilter initFilter(ResourceConfiguration configuration) {
154154
protected EventSourceWrapper wrapEventSource(
155155
FilterWatchListDeletable filteredBySelectorClient, Cloner cloner) {
156156
return new InformerEventSourceEventSourceWrapper(filteredBySelectorClient, cloner,
157-
dependentConfiguration.getSecondaryToPrimaryResourcesMapper(),
158-
dependentConfiguration.getSecondaryResourceAssociatedWithPrimaryMapper(),
157+
dependentConfiguration.getPrimaryResourcesRetriever(),
158+
dependentConfiguration.getAssociatedResourceRetriever(),
159159
dependentConfiguration.skipUpdateIfUnchanged());
160160
}
161161
};

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

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public final void registerEventSource(EventSource eventSource)
9595
try {
9696
eventSources.add(eventSource);
9797
eventSource.setEventHandler(eventProcessor);
98+
eventSource.setEventRegistry(this);
9899
} catch (Throwable e) {
99100
if (e instanceof IllegalStateException || e instanceof MissingCRDException) {
100101
// leave untouched

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

+11
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,20 @@
55
public abstract class AbstractEventSource implements EventSource {
66

77
protected volatile EventHandler eventHandler;
8+
protected volatile EventSourceRegistry eventSourceRegistry;
89

910
@Override
1011
public void setEventHandler(EventHandler eventHandler) {
1112
this.eventHandler = eventHandler;
1213
}
14+
15+
@Override
16+
public void setEventRegistry(EventSourceRegistry registry) {
17+
this.eventSourceRegistry = registry;
18+
}
19+
20+
@Override
21+
public EventSourceRegistry getEventRegistry() {
22+
return eventSourceRegistry;
23+
}
1324
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.javaoperatorsdk.operator.processing.event.source;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
5+
@FunctionalInterface
6+
public interface AssociatedSecondaryRetriever<T extends HasMetadata> {
7+
T associatedSecondary(HasMetadata primary, EventSourceRegistry registry);
8+
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ public interface EventSource extends LifecycleAware {
88

99
void setEventHandler(EventHandler eventHandler);
1010

11+
void setEventRegistry(EventSourceRegistry registry);
12+
13+
EventSourceRegistry getEventRegistry();
14+
1115
/**
1216
* Automatically called when a custom resource is deleted from the cluster.
1317
*

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

+15-16
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.event.source;
22

33
import java.util.Objects;
4-
import java.util.Set;
5-
import java.util.function.Function;
64

75
import org.slf4j.Logger;
86
import org.slf4j.LoggerFactory;
@@ -20,35 +18,35 @@ public class InformerEventSource<T extends HasMetadata> extends AbstractEventSou
2018
private static final Logger log = LoggerFactory.getLogger(InformerEventSource.class);
2119

2220
private final SharedInformer<T> sharedInformer;
23-
private final Function<T, Set<ResourceID>> secondaryToPrimaryResourcesIdSet;
24-
private final Function<HasMetadata, T> associatedWith;
21+
private final PrimaryResourcesRetriever<T> associatedPrimaries;
22+
private final AssociatedSecondaryRetriever<T> associatedWith;
2523
private final boolean skipUpdateEventPropagationIfNoChange;
2624
private final ResourceCache<T> cache;
2725

2826
public InformerEventSource(SharedInformer<T> sharedInformer,
29-
Function<T, Set<ResourceID>> resourceToTargetResourceIDSet, Cloner cloner) {
30-
this(sharedInformer, resourceToTargetResourceIDSet, null, true, cloner);
27+
PrimaryResourcesRetriever<T> associatedPrimaries, Cloner cloner) {
28+
this(sharedInformer, associatedPrimaries, null, true, cloner);
3129
}
3230

3331
public InformerEventSource(KubernetesClient client, Class<T> type,
34-
Function<T, Set<ResourceID>> resourceToTargetResourceIDSet, Cloner cloner) {
35-
this(client, type, resourceToTargetResourceIDSet, false, cloner);
32+
PrimaryResourcesRetriever<T> associatedPrimaries, Cloner cloner) {
33+
this(client, type, associatedPrimaries, false, cloner);
3634
}
3735

3836
InformerEventSource(KubernetesClient client, Class<T> type,
39-
Function<T, Set<ResourceID>> resourceToTargetResourceIDSet,
37+
PrimaryResourcesRetriever<T> associatedPrimaries,
4038
boolean skipUpdateEventPropagationIfNoChange, Cloner cloner) {
41-
this(client.informers().sharedIndexInformerFor(type, 0), resourceToTargetResourceIDSet, null,
39+
this(client.informers().sharedIndexInformerFor(type, 0), associatedPrimaries, null,
4240
skipUpdateEventPropagationIfNoChange, cloner);
4341
}
4442

4543
public InformerEventSource(SharedInformer<T> sharedInformer,
46-
Function<T, Set<ResourceID>> resourceToTargetResourceIDSet,
47-
Function<HasMetadata, T> associatedWith,
44+
PrimaryResourcesRetriever<T> associatedPrimaries,
45+
AssociatedSecondaryRetriever<T> associatedWith,
4846
boolean skipUpdateEventPropagationIfNoChange,
4947
Cloner cloner) {
5048
this.sharedInformer = sharedInformer;
51-
this.secondaryToPrimaryResourcesIdSet = resourceToTargetResourceIDSet;
49+
this.associatedPrimaries = associatedPrimaries;
5250
this.skipUpdateEventPropagationIfNoChange = skipUpdateEventPropagationIfNoChange;
5351
if (sharedInformer.isRunning()) {
5452
log.warn(
@@ -58,7 +56,7 @@ public InformerEventSource(SharedInformer<T> sharedInformer,
5856
this.cache = new InformerResourceCache<T>(sharedInformer, cloner);
5957

6058
this.associatedWith = Objects.requireNonNullElseGet(associatedWith,
61-
() -> cr -> cache.get(ResourceID.fromResource(cr)).orElse(null));
59+
() -> (cr, registry) -> cache.get(ResourceID.fromResource(cr)).orElse(null));
6260

6361
sharedInformer.addEventHandler(new ResourceEventHandler<>() {
6462
@Override
@@ -84,7 +82,8 @@ public void onDelete(T t, boolean b) {
8482
}
8583

8684
private void propagateEvent(T object) {
87-
var primaryResourceIdSet = secondaryToPrimaryResourcesIdSet.apply(object);
85+
var primaryResourceIdSet =
86+
associatedPrimaries.associatedPrimaryResources(object, eventSourceRegistry);
8887
if (primaryResourceIdSet.isEmpty()) {
8988
return;
9089
}
@@ -123,7 +122,7 @@ public ResourceCache<T> getCache() {
123122
* @return the informed resource associated with the specified primary resource
124123
*/
125124
public T getAssociated(HasMetadata resource) {
126-
return associatedWith.apply(resource);
125+
return associatedWith.associatedSecondary(resource, eventSourceRegistry);
127126
}
128127

129128
}

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package io.javaoperatorsdk.operator.processing.event.source;
22

33
import java.util.Optional;
4-
import java.util.Set;
5-
import java.util.function.Function;
64
import java.util.function.Predicate;
75
import java.util.stream.Stream;
86

@@ -21,8 +19,9 @@ public class InformerEventSourceEventSourceWrapper<T extends HasMetadata> implem
2119

2220
public InformerEventSourceEventSourceWrapper(
2321
FilterWatchListDeletable<T, KubernetesResourceList<T>> client, Cloner cloner,
24-
Function<T, Set<ResourceID>> secondaryToPrimaryResourcesIdSet,
25-
Function<HasMetadata, T> associatedWith, boolean skipUpdateEventPropagationIfNoChange) {
22+
PrimaryResourcesRetriever<T> secondaryToPrimaryResourcesIdSet,
23+
AssociatedSecondaryRetriever<T> associatedWith,
24+
boolean skipUpdateEventPropagationIfNoChange) {
2625
final var informer = client.runnableInformer(0);
2726
source = new InformerEventSource<>(informer,
2827
secondaryToPrimaryResourcesIdSet,

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

+8-9
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,35 @@
22

33
import java.util.Collections;
44
import java.util.Set;
5-
import java.util.function.Function;
65

76
import io.fabric8.kubernetes.api.model.HasMetadata;
87
import io.javaoperatorsdk.operator.processing.event.ResourceID;
98

109
public class Mappers {
1110

12-
public static <T extends HasMetadata> Function<T, Set<ResourceID>> fromAnnotation(
11+
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromAnnotation(
1312
String nameKey) {
1413
return fromMetadata(nameKey, null, false);
1514
}
1615

17-
public static <T extends HasMetadata> Function<T, Set<ResourceID>> fromAnnotation(
16+
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromAnnotation(
1817
String nameKey, String namespaceKey) {
1918
return fromMetadata(nameKey, namespaceKey, false);
2019
}
2120

22-
public static <T extends HasMetadata> Function<T, Set<ResourceID>> fromLabel(
21+
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromLabel(
2322
String nameKey) {
2423
return fromMetadata(nameKey, null, true);
2524
}
2625

27-
public static <T extends HasMetadata> Function<T, Set<ResourceID>> fromLabel(
26+
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromLabel(
2827
String nameKey, String namespaceKey) {
2928
return fromMetadata(nameKey, namespaceKey, true);
3029
}
3130

32-
private static <T extends HasMetadata> Function<T, Set<ResourceID>> fromMetadata(
31+
private static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromMetadata(
3332
String nameKey, String namespaceKey, boolean isLabel) {
34-
return resource -> {
33+
return (resource, registry) -> {
3534
final var metadata = resource.getMetadata();
3635
if (metadata == null) {
3736
return Collections.emptySet();
@@ -45,8 +44,8 @@ private static <T extends HasMetadata> Function<T, Set<ResourceID>> fromMetadata
4544
};
4645
}
4746

48-
public static <T extends HasMetadata> Function<T, Set<ResourceID>> fromOwnerReference() {
49-
return resource -> {
47+
public static <T extends HasMetadata> PrimaryResourcesRetriever<T> fromOwnerReference() {
48+
return (resource, registry) -> {
5049
var ownerReferences = resource.getMetadata().getOwnerReferences();
5150
if (!ownerReferences.isEmpty()) {
5251
return Set.of(new ResourceID(ownerReferences.get(0).getName(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.javaoperatorsdk.operator.processing.event.source;
2+
3+
import java.util.Set;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
import io.javaoperatorsdk.operator.processing.event.ResourceID;
7+
8+
@FunctionalInterface
9+
public interface PrimaryResourcesRetriever<T extends HasMetadata> {
10+
Set<ResourceID> associatedPrimaryResources(T dependentResource, EventSourceRegistry registry);
11+
}

0 commit comments

Comments
 (0)