diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/Mappers.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/Mappers.java index 8ec9b42af0..23a79b8f62 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/Mappers.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/Mappers.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.Set; +import java.util.stream.Collectors; import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.processing.event.ResourceID; @@ -93,4 +94,26 @@ public static ResourceID fromString(String cacheKey) { throw new IllegalArgumentException("Cannot extract a ResourceID from " + cacheKey); } } + + /** + * Produces a mapper that will associate a secondary resource with all owners of the primary type. + */ + public static SecondaryToPrimaryMapper fromOwnerType( + Class clazz) { + String kind = HasMetadata.getKind(clazz); + return resource -> { + var meta = resource.getMetadata(); + if (meta == null) { + return Set.of(); + } + var owners = meta.getOwnerReferences(); + if (owners == null || owners.isEmpty()) { + return Set.of(); + } + return owners.stream() + .filter(it -> kind.equals(it.getKind())) + .map(it -> new ResourceID(it.getName(), resource.getMetadata().getNamespace())) + .collect(Collectors.toSet()); + }; + } }