From 5c579ce08a87d44f67b92d27df3e482a2fb44b57 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Thu, 25 May 2023 14:48:03 +0200 Subject: [PATCH] feat: add ability to stream secondary resources from Context --- .../operator/api/reconciler/Context.java | 5 ++++ .../api/reconciler/DefaultContext.java | 9 +++++-- .../ResourceIDMatcherDiscriminator.java | 2 +- .../processing/event/EventSources.java | 2 +- ...ConfigMapDeleterBulkDependentResource.java | 24 ++++++++++--------- .../ExternalBulkDependentResource.java | 7 ++++-- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Context.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Context.java index 031b930775..0f59cb440b 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Context.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/Context.java @@ -2,6 +2,7 @@ import java.util.Optional; import java.util.Set; +import java.util.stream.Stream; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.KubernetesClient; @@ -19,6 +20,10 @@ default Optional getSecondaryResource(Class expectedType) { Set getSecondaryResources(Class expectedType); + default Stream getSecondaryResourcesAsStream(Class expectedType) { + return getSecondaryResources(expectedType).stream(); + } + @Deprecated(forRemoval = true) Optional getSecondaryResource(Class expectedType, String eventSourceName); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/DefaultContext.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/DefaultContext.java index 8e17b09fc6..52dca3cd6f 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/DefaultContext.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/DefaultContext.java @@ -3,6 +3,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.KubernetesClient; @@ -35,10 +36,14 @@ public Optional getRetryInfo() { @Override public Set getSecondaryResources(Class expectedType) { + return getSecondaryResourcesAsStream(expectedType).collect(Collectors.toSet()); + } + + @Override + public Stream getSecondaryResourcesAsStream(Class expectedType) { return controller.getEventSourceManager().getResourceEventSourcesFor(expectedType).stream() .map(es -> es.getSecondaryResources(primaryResource)) - .flatMap(Set::stream) - .collect(Collectors.toSet()); + .flatMap(Set::stream); } @Override diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceIDMatcherDiscriminator.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceIDMatcherDiscriminator.java index f28633252a..d23459e271 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceIDMatcherDiscriminator.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/ResourceIDMatcherDiscriminator.java @@ -18,7 +18,7 @@ public ResourceIDMatcherDiscriminator(Function mapper) { @Override public Optional distinguish(Class resource, P primary, Context

context) { var resourceID = mapper.apply(primary); - return context.getSecondaryResources(resource).stream() + return context.getSecondaryResourcesAsStream(resource) .filter(resourceID::isSameResource) .findFirst(); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java index e140544586..71d800dab8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventSources.java @@ -165,7 +165,7 @@ public ResourceEventSource get(Class dependentType, String name) { @SuppressWarnings("rawtypes") private String keyAsString(Class dependentType, String name) { - return name != null && name.length() > 0 + return name != null && !name.isEmpty() ? "(" + dependentType.getName() + ", " + name + ")" : dependentType.getName(); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java index a04224790c..28bb358d5a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/ConfigMapDeleterBulkDependentResource.java @@ -1,6 +1,9 @@ package io.javaoperatorsdk.operator.sample.bulkdependent; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; @@ -59,15 +62,14 @@ public ConfigMap desired(BulkDependentTestCustomResource primary, String key, @Override public Map getSecondaryResources(BulkDependentTestCustomResource primary, Context context) { - var configMaps = context.getSecondaryResources(ConfigMap.class); - Map result = new HashMap<>(configMaps.size()); - configMaps.forEach(cm -> { - String name = cm.getMetadata().getName(); - if (name.startsWith(primary.getMetadata().getName())) { - String key = name.substring(name.lastIndexOf(INDEX_DELIMITER) + 1); - result.put(key, cm); - } - }); - return result; + return context.getSecondaryResourcesAsStream(ConfigMap.class) + .filter(cm -> getName(cm).startsWith(primary.getMetadata().getName())) + .collect(Collectors.toMap( + cm -> getName(cm).substring(getName(cm).lastIndexOf(INDEX_DELIMITER) + 1), + Function.identity())); + } + + private static String getName(ConfigMap cm) { + return cm.getMetadata().getName(); } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java index afad17b1d9..dbad6dcfb8 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/external/ExternalBulkDependentResource.java @@ -1,6 +1,9 @@ package io.javaoperatorsdk.operator.sample.bulkdependent.external; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import io.javaoperatorsdk.operator.api.reconciler.Context; @@ -75,7 +78,7 @@ public Map desiredResources(BulkDependentTestCustomRes public Map getSecondaryResources( BulkDependentTestCustomResource primary, Context context) { - return context.getSecondaryResources(resourceType()).stream() + return context.getSecondaryResourcesAsStream(resourceType()) .filter(r -> r.getId() .startsWith(primary.getMetadata().getName() + EXTERNAL_RESOURCE_NAME_DELIMITER + primary.getMetadata().getNamespace() +