Skip to content

Commit 3c3c5bd

Browse files
authored
All Resource Event Sources can handle multiple seconday resources for a primary resources (#1169)
1 parent dca90ed commit 3c3c5bd

27 files changed

+517
-335
lines changed

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

+2-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.javaoperatorsdk.operator.api.reconciler;
22

3-
import java.util.Collections;
4-
import java.util.List;
53
import java.util.Optional;
64
import java.util.Set;
75
import java.util.stream.Collectors;
@@ -10,7 +8,6 @@
108
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
119
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.ManagedDependentResourceContext;
1210
import io.javaoperatorsdk.operator.processing.Controller;
13-
import io.javaoperatorsdk.operator.processing.MultiResourceOwner;
1411

1512
public class DefaultContext<P extends HasMetadata> implements Context<P> {
1613

@@ -37,17 +34,8 @@ public Optional<RetryInfo> getRetryInfo() {
3734
@SuppressWarnings("unchecked")
3835
public <T> Set<T> getSecondaryResources(Class<T> expectedType) {
3936
return controller.getEventSourceManager().getEventSourcesFor(expectedType).stream()
40-
.map(
41-
es -> {
42-
if (es instanceof MultiResourceOwner) {
43-
return ((MultiResourceOwner<T, P>) es).getSecondaryResources(primaryResource);
44-
} else {
45-
return es.getSecondaryResource(primaryResource)
46-
.map(List::of)
47-
.orElse(Collections.emptyList());
48-
}
49-
})
50-
.flatMap(List::stream)
37+
.map(es -> es.getSecondaryResources(primaryResource))
38+
.flatMap(Set::stream)
5139
.collect(Collectors.toSet());
5240
}
5341

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ public interface RecentOperationCacheFiller<R> {
66

77
void handleRecentResourceCreate(ResourceID resourceID, R resource);
88

9-
void handleRecentResourceUpdate(ResourceID resourceID, R resource, R previousResourceVersion);
9+
void handleRecentResourceUpdate(ResourceID resourceID, R resource, R previousVersionOfResource);
1010
}

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

-23
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/AbstractCachingDependentResource.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import io.fabric8.kubernetes.api.model.HasMetadata;
66
import io.javaoperatorsdk.operator.processing.dependent.AbstractEventSourceHolderDependentResource;
7-
import io.javaoperatorsdk.operator.processing.event.ExternalResourceCachingEventSource;
7+
import io.javaoperatorsdk.operator.processing.event.source.ExternalResourceCachingEventSource;
88

99
public abstract class AbstractCachingDependentResource<R, P extends HasMetadata>
1010
extends
@@ -15,8 +15,6 @@ protected AbstractCachingDependentResource(Class<R> resourceType) {
1515
this.resourceType = resourceType;
1616
}
1717

18-
public abstract Optional<R> fetchResource(P primaryResource);
19-
2018
@Override
2119
public Class<R> resourceType() {
2220
return resourceType;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/AbstractPollingDependentResource.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package io.javaoperatorsdk.operator.processing.dependent.external;
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper;
45

56
public abstract class AbstractPollingDependentResource<R, P extends HasMetadata>
6-
extends AbstractCachingDependentResource<R, P> {
7+
extends AbstractCachingDependentResource<R, P> implements CacheKeyMapper<R> {
78

89
public static final int DEFAULT_POLLING_PERIOD = 5000;
910
private long pollingPeriod;
@@ -24,4 +25,10 @@ public void setPollingPeriod(long pollingPeriod) {
2425
public long getPollingPeriod() {
2526
return pollingPeriod;
2627
}
28+
29+
// for now dependent resources support event sources only with one owned resource.
30+
@Override
31+
public String keyFor(R resource) {
32+
return CacheKeyMapper.singleResourceCacheKeyMapper().keyFor(resource);
33+
}
2734
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/external/PerResourcePollingDependentResource.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
44
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
5-
import io.javaoperatorsdk.operator.processing.event.ExternalResourceCachingEventSource;
5+
import io.javaoperatorsdk.operator.processing.event.source.ExternalResourceCachingEventSource;
66
import io.javaoperatorsdk.operator.processing.event.source.polling.PerResourcePollingEventSource;
77

88
public abstract class PerResourcePollingDependentResource<R, P extends HasMetadata>
99
extends AbstractPollingDependentResource<R, P>
1010
implements PerResourcePollingEventSource.ResourceFetcher<R, P> {
11+
12+
1113
public PerResourcePollingDependentResource(Class<R> resourceType) {
1214
super(resourceType);
1315
}
@@ -20,6 +22,7 @@ public PerResourcePollingDependentResource(Class<R> resourceType, long pollingPe
2022
protected ExternalResourceCachingEventSource<R, P> createEventSource(
2123
EventSourceContext<P> context) {
2224
return new PerResourcePollingEventSource<>(this, context.getPrimaryCache(),
23-
getPollingPeriod(), resourceType());
25+
getPollingPeriod(), resourceType(), this);
2426
}
27+
2528
}
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
package io.javaoperatorsdk.operator.processing.dependent.external;
22

3-
import java.util.Map;
4-
import java.util.function.Supplier;
5-
63
import io.fabric8.kubernetes.api.model.HasMetadata;
74
import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext;
8-
import io.javaoperatorsdk.operator.processing.event.ExternalResourceCachingEventSource;
9-
import io.javaoperatorsdk.operator.processing.event.ResourceID;
5+
import io.javaoperatorsdk.operator.processing.event.source.CacheKeyMapper;
6+
import io.javaoperatorsdk.operator.processing.event.source.ExternalResourceCachingEventSource;
107
import io.javaoperatorsdk.operator.processing.event.source.polling.PollingEventSource;
118

129
public abstract class PollingDependentResource<R, P extends HasMetadata>
13-
extends AbstractPollingDependentResource<R, P> implements Supplier<Map<ResourceID, R>> {
10+
extends AbstractPollingDependentResource<R, P>
11+
implements PollingEventSource.GenericResourceFetcher<R> {
12+
13+
private final CacheKeyMapper<R> cacheKeyMapper;
1414

15-
public PollingDependentResource(Class<R> resourceType) {
15+
public PollingDependentResource(Class<R> resourceType, CacheKeyMapper<R> cacheKeyMapper) {
1616
super(resourceType);
17+
this.cacheKeyMapper = cacheKeyMapper;
1718
}
1819

19-
public PollingDependentResource(Class<R> resourceType, long pollingPeriod) {
20+
public PollingDependentResource(Class<R> resourceType, long pollingPeriod,
21+
CacheKeyMapper<R> cacheKeyMapper) {
2022
super(resourceType, pollingPeriod);
23+
this.cacheKeyMapper = cacheKeyMapper;
2124
}
2225

2326
@Override
2427
protected ExternalResourceCachingEventSource<R, P> createEventSource(
2528
EventSourceContext<P> context) {
26-
return new PollingEventSource<>(this, getPollingPeriod(), resourceType());
29+
return new PollingEventSource<>(this, getPollingPeriod(), resourceType(), cacheKeyMapper);
2730
}
31+
2832
}

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

-60
This file was deleted.

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

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.javaoperatorsdk.operator.processing.event.EventHandler;
55

66
public abstract class AbstractEventSource implements EventSource {
7-
87
private EventHandler handler;
98
private volatile boolean running = false;
109

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
44

5-
public abstract class AbstractResourceEventSource<P extends HasMetadata, R>
5+
public abstract class AbstractResourceEventSource<R, P extends HasMetadata>
66
extends AbstractEventSource
77
implements ResourceEventSource<R, P> {
88
private final Class<R> resourceClass;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.javaoperatorsdk.operator.processing.event.source;
2+
3+
public interface CacheKeyMapper<R> {
4+
5+
String keyFor(R resource);
6+
7+
/**
8+
* Used if a polling event source handles only single secondary resource. See also docs for:
9+
* {@link ExternalResourceCachingEventSource}
10+
*
11+
* @return static id mapper, all resources are mapped for same id.
12+
* @param <T> secondary resource type
13+
*/
14+
static <T> CacheKeyMapper<T> singleResourceCacheKeyMapper() {
15+
return r -> "id";
16+
}
17+
18+
}

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

+2-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* @param <R> represents the type of resources (usually external non-kubernetes ones) being handled.
1515
*/
1616
public abstract class CachingEventSource<R, P extends HasMetadata>
17-
extends AbstractResourceEventSource<P, R> implements Cache<R> {
17+
extends AbstractResourceEventSource<R, P> implements Cache<R> {
1818

1919
protected UpdatableCache<R> cache;
2020

@@ -43,12 +43,9 @@ public Stream<R> list(Predicate<R> predicate) {
4343
return cache.list(predicate);
4444
}
4545

46-
protected UpdatableCache<R> initCache() {
47-
return new ConcurrentHashMapCache<>();
48-
}
49-
5046
public Optional<R> getCachedValue(ResourceID resourceID) {
5147
return cache.get(resourceID);
5248
}
5349

50+
protected abstract UpdatableCache<R> initCache();
5451
}

0 commit comments

Comments
 (0)