Skip to content

Commit fdfaa63

Browse files
committed
feat: provide de-duplicated secondary resources stream on Context
Alternative without requiring collecting to a Map Signed-off-by: Chris Laprun <metacosm@gmail.com>
1 parent ade5d7f commit fdfaa63

File tree

1 file changed

+36
-11
lines changed
  • operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler

1 file changed

+36
-11
lines changed

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

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.javaoperatorsdk.operator.api.reconciler;
1717

18+
import java.util.HashMap;
1819
import java.util.Map;
1920
import java.util.Optional;
2021
import java.util.Set;
@@ -29,6 +30,7 @@
2930

3031
import io.fabric8.kubernetes.api.model.HasMetadata;
3132
import io.fabric8.kubernetes.client.KubernetesClient;
33+
import io.javaoperatorsdk.operator.ReconcilerUtilsInternal;
3234
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
3335
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
3436
import io.javaoperatorsdk.operator.api.reconciler.dependent.managed.DefaultManagedWorkflowAndDependentResourceContext;
@@ -38,8 +40,6 @@
3840
import io.javaoperatorsdk.operator.processing.event.NoEventSourceForClassException;
3941
import io.javaoperatorsdk.operator.processing.event.ResourceID;
4042

41-
import static io.javaoperatorsdk.operator.ReconcilerUtilsInternal.compareResourceVersions;
42-
4343
public class DefaultContext<P extends HasMetadata> implements Context<P> {
4444
private static final Logger log = LoggerFactory.getLogger(DefaultContext.class);
4545

@@ -84,22 +84,47 @@ public <R> Stream<R> getSecondaryResourcesAsStream(Class<R> expectedType, boolea
8484
throw new IllegalArgumentException("Can only de-duplicate HasMetadata descendants");
8585
}
8686

87+
final var idToLatest = deduplicate ? new HashMap<ResourceID, String>() : null;
8788
final var stream =
8889
controller.getEventSourceManager().getEventSourcesFor(expectedType).stream()
8990
.<R>mapMulti(
90-
(es, consumer) -> es.getSecondaryResources(primaryResource).forEach(consumer));
91+
(es, consumer) ->
92+
es.getSecondaryResources(primaryResource)
93+
.forEach(
94+
r -> {
95+
var reject = false;
96+
if (deduplicate) {
97+
final boolean[] rejectAr = new boolean[1];
98+
final var hm = (HasMetadata) r;
99+
final var resourceVersion = hm.getMetadata().getResourceVersion();
100+
idToLatest.merge(
101+
ResourceID.fromResource(hm),
102+
resourceVersion,
103+
(existing, replacement) -> {
104+
final var comparison =
105+
ReconcilerUtilsInternal.compareResourceVersions(
106+
existing, replacement);
107+
rejectAr[0] =
108+
comparison == 0; // rejecting resource if version is equal
109+
return comparison >= 0 ? existing : replacement;
110+
});
111+
reject = rejectAr[0];
112+
}
113+
// only keep resources that don't have the same id and resource
114+
// version
115+
if (!reject) {
116+
consumer.accept(r);
117+
}
118+
}));
91119
if (deduplicate) {
92120
//noinspection unchecked
93121
return stream
94122
.map(HasMetadata.class::cast)
95-
.collect(
96-
Collectors.toUnmodifiableMap(
97-
ResourceID::fromResource,
98-
Function.identity(),
99-
(existing, replacement) ->
100-
compareResourceVersions(existing, replacement) >= 0 ? existing : replacement))
101-
.values()
102-
.stream()
123+
.filter(
124+
hm -> {
125+
final var resourceVersion = hm.getMetadata().getResourceVersion();
126+
return resourceVersion.equals(idToLatest.get(ResourceID.fromResource(hm)));
127+
})
103128
.map(hasMetadata -> (R) hasMetadata);
104129
} else {
105130
return stream;

0 commit comments

Comments
 (0)