Skip to content

Commit a4e3472

Browse files
committed
discriminator improvements (#2013)
1 parent a1e7591 commit a4e3472

File tree

5 files changed

+89
-46
lines changed

5 files changed

+89
-46
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.javaoperatorsdk.operator.api.reconciler;
2+
3+
import java.util.Optional;
4+
import java.util.function.Function;
5+
6+
import io.fabric8.kubernetes.api.model.HasMetadata;
7+
import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource;
8+
9+
/**
10+
* Uses a custom index of {@link InformerEventSource} to access the target resource. The index needs
11+
* to be explicitly created when the event source is defined. This approach improves the performance
12+
* to access the resource.
13+
*/
14+
public class IndexDiscriminator<R extends HasMetadata, P extends HasMetadata>
15+
implements ResourceDiscriminator<R, P> {
16+
17+
private final String indexName;
18+
private final String eventSourceName;
19+
private final Function<P, String> keyMapper;
20+
21+
public IndexDiscriminator(String indexName, Function<P, String> keyMapper) {
22+
this(indexName, null, keyMapper);
23+
}
24+
25+
public IndexDiscriminator(String indexName, String eventSourceName,
26+
Function<P, String> keyMapper) {
27+
this.indexName = indexName;
28+
this.eventSourceName = eventSourceName;
29+
this.keyMapper = keyMapper;
30+
}
31+
32+
@Override
33+
public Optional<R> distinguish(Class<R> resource,
34+
P primary,
35+
Context<P> context) {
36+
37+
InformerEventSource<R, P> eventSource =
38+
(InformerEventSource<R, P>) context
39+
.eventSourceRetriever()
40+
.getResourceEventSourceFor(resource, eventSourceName);
41+
var resources = eventSource.byIndex(indexName, keyMapper.apply(primary));
42+
if (resources.isEmpty()) {
43+
return Optional.empty();
44+
} else if (resources.size() > 1) {
45+
throw new IllegalStateException("More than one resource found");
46+
} else {
47+
return Optional.of(resources.get(0));
48+
}
49+
}
50+
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceIDMatcherDiscriminator.java

+23-3
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,41 @@
55

66
import io.fabric8.kubernetes.api.model.HasMetadata;
77
import io.javaoperatorsdk.operator.processing.event.ResourceID;
8+
import io.javaoperatorsdk.operator.processing.event.source.Cache;
89

910
public class ResourceIDMatcherDiscriminator<R extends HasMetadata, P extends HasMetadata>
1011
implements ResourceDiscriminator<R, P> {
1112

13+
14+
private final String eventSourceName;
1215
private final Function<P, ResourceID> mapper;
1316

1417
public ResourceIDMatcherDiscriminator(Function<P, ResourceID> mapper) {
18+
this(null, mapper);
19+
}
20+
21+
public ResourceIDMatcherDiscriminator(String eventSourceName, Function<P, ResourceID> mapper) {
22+
this.eventSourceName = eventSourceName;
1523
this.mapper = mapper;
1624
}
1725

26+
@SuppressWarnings("unchecked")
1827
@Override
1928
public Optional<R> distinguish(Class<R> resource, P primary, Context<P> context) {
2029
var resourceID = mapper.apply(primary);
21-
return context.getSecondaryResourcesAsStream(resource)
22-
.filter(resourceID::isSameResource)
23-
.findFirst();
30+
if (eventSourceName != null) {
31+
return ((Cache<R>) context.eventSourceRetriever().getResourceEventSourceFor(resource,
32+
eventSourceName))
33+
.get(resourceID);
34+
} else {
35+
var eventSources = context.eventSourceRetriever().getResourceEventSourcesFor(resource);
36+
if (eventSources.size() == 1) {
37+
return ((Cache<R>) eventSources.get(0)).get(resourceID);
38+
} else {
39+
return context.getSecondaryResourcesAsStream(resource)
40+
.filter(resourceID::isSameResource)
41+
.findFirst();
42+
}
43+
}
2444
}
2545
}

Diff for: operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/indexdiscriminator/IndexDiscriminator.java

-41
This file was deleted.

Diff for: operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/indexdiscriminator/IndexDiscriminatorTestReconciler.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ public Map<String, EventSource> prepareEventSources(
8181

8282
firstDependentResourceConfigMap
8383
.setResourceDiscriminator(
84-
new IndexDiscriminator(CONFIG_MAP_INDEX_1, FIRST_CONFIG_MAP_SUFFIX_1));
84+
new TestIndexDiscriminator(CONFIG_MAP_INDEX_1, FIRST_CONFIG_MAP_SUFFIX_1));
8585
secondDependentResourceConfigMap
8686
.setResourceDiscriminator(
87-
new IndexDiscriminator(CONFIG_MAP_INDEX_2, FIRST_CONFIG_MAP_SUFFIX_2));
87+
new TestIndexDiscriminator(CONFIG_MAP_INDEX_2, FIRST_CONFIG_MAP_SUFFIX_2));
8888
return EventSourceInitializer.nameEventSources(eventSource);
8989
}
9090

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.javaoperatorsdk.operator.sample.indexdiscriminator;
2+
3+
import io.fabric8.kubernetes.api.model.ConfigMap;
4+
import io.javaoperatorsdk.operator.api.reconciler.IndexDiscriminator;
5+
6+
import static io.javaoperatorsdk.operator.sample.indexdiscriminator.IndexDiscriminatorTestReconciler.configMapKeyFromPrimary;
7+
8+
public class TestIndexDiscriminator
9+
extends IndexDiscriminator<ConfigMap, IndexDiscriminatorTestCustomResource> {
10+
11+
public TestIndexDiscriminator(String indexName, String nameSuffix) {
12+
super(indexName, p -> configMapKeyFromPrimary(p, nameSuffix));
13+
}
14+
}

0 commit comments

Comments
 (0)