From 8f1d70abf606a7043c78051ff1d14f6d97a2a5df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 30 Apr 2024 10:49:01 +0200 Subject: [PATCH 1/6] improve: secondaryToPrimary check type of owner reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../informer/InformerConfiguration.java | 2 +- .../operator/processing/event/ResourceID.java | 14 --------- .../event/source/informer/Mappers.java | 29 ++++++++++++++----- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java index f5ebf284de..a0996016f0 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java @@ -52,7 +52,7 @@ protected DefaultInformerConfiguration(String labelSelector, this.primaryToSecondaryMapper = primaryToSecondaryMapper; this.secondaryToPrimaryMapper = Objects.requireNonNullElse(secondaryToPrimaryMapper, - Mappers.fromOwnerReferences(false)); + Mappers.fromOwnerReferences()); this.onDeleteFilter = onDeleteFilter; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java index 39374cb433..071dd49f29 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ResourceID.java @@ -14,20 +14,6 @@ public static ResourceID fromResource(HasMetadata resource) { resource.getMetadata().getNamespace()); } - public static Optional fromFirstOwnerReference(HasMetadata resource) { - return fromFirstOwnerReference(resource, false); - } - - public static Optional fromFirstOwnerReference(HasMetadata resource, - boolean clusterScoped) { - var ownerReferences = resource.getMetadata().getOwnerReferences(); - if (!ownerReferences.isEmpty()) { - return Optional.of(fromOwnerReference(resource, ownerReferences.get(0), clusterScoped)); - } else { - return Optional.empty(); - } - } - public static ResourceID fromOwnerReference(HasMetadata resource, OwnerReference ownerReference, boolean clusterScoped) { return new ResourceID(ownerReference.getName(), 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 65f9c86cb8..e5e153fefc 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 @@ -1,6 +1,7 @@ package io.javaoperatorsdk.operator.processing.event.source.informer; import java.util.Collections; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -42,24 +43,36 @@ public static SecondaryToPrimaryMapper fromLabel( return fromMetadata(nameKey, namespaceKey, true); } - public static SecondaryToPrimaryMapper fromOwnerReference() { - return fromOwnerReference(false); + public static SecondaryToPrimaryMapper fromOwnerReference(HasMetadata primaryResource) { + return fromOwnerReference(false, primaryResource); } /** - * @param clusterScope if the owner is a cluster scoped resource + * @param clusterScoped if the owner is a cluster scoped resource * @return mapper * @param type of the secondary resource, where the owner reference is */ public static SecondaryToPrimaryMapper fromOwnerReference( - boolean clusterScope) { - return resource -> ResourceID.fromFirstOwnerReference(resource, clusterScope).map(Set::of) - .orElseGet(Collections::emptySet); + boolean clusterScoped, HasMetadata primaryResource) { + return resource -> { + var ownerReference = resource.getMetadata().getOwnerReferences().stream().filter(r -> + r.getKind().equals(primaryResource.getKind()) && r.getApiVersion().equals(primaryResource.getApiVersion()) + ).findAny(); + return ownerReference.map(or -> ResourceID.fromOwnerReference(resource, or, clusterScoped)) + .stream().collect(Collectors.toSet()); + }; + } + + public static SecondaryToPrimaryMapper fromOwnerReferences(HasMetadata primaryResource) { + return fromOwnerReferences(primaryResource,false); } - public static SecondaryToPrimaryMapper fromOwnerReferences( + public static SecondaryToPrimaryMapper fromOwnerReferences(HasMetadata primaryResource, boolean clusterScope) { - return resource -> resource.getMetadata().getOwnerReferences().stream() + return resource -> resource.getMetadata().getOwnerReferences() + .stream() + .filter(r->r.getKind().equals(primaryResource.getKind()) + && r.getApiVersion().equals(primaryResource.getApiVersion())) .map(or -> ResourceID.fromOwnerReference(resource, or, clusterScope)) .collect(Collectors.toSet()); } From 9af507665e217ed0184834c718a15d17e68c0363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 30 Apr 2024 13:44:45 +0200 Subject: [PATCH 2/6] refactors and fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../cache/sample/AbstractTestReconciler.java | 3 +- .../informer/InformerConfiguration.java | 41 +++++++++++-------- .../api/reconciler/EventSourceContext.java | 9 +++- .../operator/processing/Controller.java | 3 +- .../GenericKubernetesDependentResource.java | 2 +- .../KubernetesDependentResource.java | 4 +- .../event/source/informer/Mappers.java | 41 ++++++++----------- ...ClusterScopedCustomResourceReconciler.java | 3 +- ...CreateUpdateEventFilterTestReconciler.java | 2 +- ...formerEventSourceTestCustomReconciler.java | 2 +- ...ultipleSecondaryEventSourceReconciler.java | 2 +- .../PrimaryIndexerTestReconciler.java | 2 +- 12 files changed, 62 insertions(+), 52 deletions(-) diff --git a/caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java b/caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java index c3743ef409..18cd486fb2 100644 --- a/caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java +++ b/caffeine-bounded-cache-support/src/test/java/io/javaoperatorsdk/operator/processing/event/source/cache/sample/AbstractTestReconciler.java @@ -80,7 +80,8 @@ public List prepareEventSources( var es = new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context) .withItemStore(boundedItemStore) .withSecondaryToPrimaryMapper( - Mappers.fromOwnerReference(this instanceof BoundedCacheClusterScopeTestReconciler)) + Mappers.fromOwnerReferences(context.getPrimaryResourceClass(), + this instanceof BoundedCacheClusterScopeTestReconciler)) .build(), context); return List.of(es); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java index a0996016f0..9e28881c7c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java @@ -50,9 +50,7 @@ protected DefaultInformerConfiguration(String labelSelector, this.followControllerNamespaceChanges = followControllerNamespaceChanges; this.groupVersionKind = groupVersionKind; this.primaryToSecondaryMapper = primaryToSecondaryMapper; - this.secondaryToPrimaryMapper = - Objects.requireNonNullElse(secondaryToPrimaryMapper, - Mappers.fromOwnerReferences()); + this.secondaryToPrimaryMapper = secondaryToPrimaryMapper; this.onDeleteFilter = onDeleteFilter; } @@ -135,16 +133,21 @@ class InformerConfigurationBuilder { private boolean inheritControllerNamespacesOnChange = false; private ItemStore itemStore; private Long informerListLimit; + private final Class primaryResourceClass; - private InformerConfigurationBuilder(Class resourceClass) { + private InformerConfigurationBuilder(Class resourceClass, + Class primaryResourceClass) { this.resourceClass = resourceClass; + this.primaryResourceClass = primaryResourceClass; this.groupVersionKind = null; } @SuppressWarnings("unchecked") - private InformerConfigurationBuilder(GroupVersionKind groupVersionKind) { + private InformerConfigurationBuilder(GroupVersionKind groupVersionKind, + Class primaryResourceClass) { this.resourceClass = (Class) GenericKubernetesResource.class; this.groupVersionKind = groupVersionKind; + this.primaryResourceClass = primaryResourceClass; } public

InformerConfigurationBuilder withPrimaryToSecondaryMapper( @@ -264,23 +267,17 @@ public InformerConfigurationBuilder withInformerListLimit(Long informerListLi public InformerConfiguration build() { return new DefaultInformerConfiguration<>(labelSelector, resourceClass, groupVersionKind, primaryToSecondaryMapper, - secondaryToPrimaryMapper, + Objects.requireNonNullElse(secondaryToPrimaryMapper, + Mappers.fromOwnerReferences(HasMetadata.getApiVersion(primaryResourceClass), + HasMetadata.getKind(primaryResourceClass), false)), namespaces, inheritControllerNamespacesOnChange, onAddFilter, onUpdateFilter, onDeleteFilter, genericFilter, itemStore, informerListLimit); } } static InformerConfigurationBuilder from( - Class resourceClass) { - return new InformerConfigurationBuilder<>(resourceClass); - } - - /** - * * For the case when want to use {@link GenericKubernetesResource} - */ - static InformerConfigurationBuilder from( - GroupVersionKind groupVersionKind) { - return new InformerConfigurationBuilder<>(groupVersionKind); + Class resourceClass, Class primaryResourceClass) { + return new InformerConfigurationBuilder<>(resourceClass, primaryResourceClass); } /** @@ -294,7 +291,8 @@ static InformerConfigurationBuilder from( */ static InformerConfigurationBuilder from( Class resourceClass, EventSourceContext eventSourceContext) { - return new InformerConfigurationBuilder<>(resourceClass) + return new InformerConfigurationBuilder<>(resourceClass, + eventSourceContext.getPrimaryResourceClass()) .withNamespacesInheritedFromController(eventSourceContext); } @@ -304,10 +302,17 @@ static InformerConfigurationBuilder from( @SuppressWarnings("unchecked") static InformerConfigurationBuilder from( GroupVersionKind groupVersionKind, EventSourceContext eventSourceContext) { - return new InformerConfigurationBuilder(groupVersionKind) + return new InformerConfigurationBuilder(groupVersionKind, + eventSourceContext.getPrimaryResourceClass()) .withNamespacesInheritedFromController(eventSourceContext); } + static InformerConfigurationBuilder from( + GroupVersionKind groupVersionKind, Class primaryResourceClass) { + return new InformerConfigurationBuilder<>(groupVersionKind, + primaryResourceClass); + } + @SuppressWarnings("unchecked") @Override default Class getResourceClass() { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceContext.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceContext.java index e8062e9651..4f0f08b3b8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceContext.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/reconciler/EventSourceContext.java @@ -16,13 +16,16 @@ public class EventSourceContext

{ private final IndexerResourceCache

primaryCache; private final ControllerConfiguration

controllerConfiguration; private final KubernetesClient client; + private final Class

primaryResourceClass; public EventSourceContext(IndexerResourceCache

primaryCache, ControllerConfiguration

controllerConfiguration, - KubernetesClient client) { + KubernetesClient client, + Class

primaryResourceClass) { this.primaryCache = primaryCache; this.controllerConfiguration = controllerConfiguration; this.client = client; + this.primaryResourceClass = primaryResourceClass; } /** @@ -54,4 +57,8 @@ public ControllerConfiguration

getControllerConfiguration() { public KubernetesClient getClient() { return client; } + + public Class

getPrimaryResourceClass() { + return primaryResourceClass; + } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java index 04c4586ea2..917ad5bd22 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java @@ -103,7 +103,8 @@ public Controller(Reconciler

reconciler, eventSourceManager.postProcessDefaultEventSourcesAfterProcessorInitializer(); controllerHealthInfo = new ControllerHealthInfo(eventSourceManager); eventSourceContext = new EventSourceContext<>( - eventSourceManager.getControllerEventSource(), configuration, kubernetesClient); + eventSourceManager.getControllerEventSource(), configuration, kubernetesClient, + configuration.getResourceClass()); initAndRegisterEventSources(eventSourceContext); configurationService.getMetrics().controllerRegistered(this); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java index 9897ee71e2..ee27445231 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java @@ -17,7 +17,7 @@ public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) { } protected InformerConfiguration.InformerConfigurationBuilder informerConfigurationBuilder() { - return InformerConfiguration.from(groupVersionKind); + return InformerConfiguration.from(groupVersionKind, getPrimaryResourceType()); } @SuppressWarnings("unchecked") diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java index f2c5c0b1a1..f10e4a1af6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java @@ -91,7 +91,7 @@ private void configureWith(String labelSelector, Set namespaces, // just to seamlessly handle GenericKubernetesDependentResource protected InformerConfiguration.InformerConfigurationBuilder informerConfigurationBuilder() { - return InformerConfiguration.from(resourceType()); + return InformerConfiguration.from(resourceType(), getPrimaryResourceType()); } @SuppressWarnings("unchecked") @@ -99,7 +99,7 @@ private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { if (this instanceof SecondaryToPrimaryMapper) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { - return Mappers.fromOwnerReferences(clustered); + return Mappers.fromOwnerReferences(getPrimaryResourceType(), clustered); } else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) { return Mappers.fromDefaultAnnotations(); } else { 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 e5e153fefc..d67b667065 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 @@ -1,7 +1,6 @@ package io.javaoperatorsdk.operator.processing.event.source.informer; import java.util.Collections; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -43,36 +42,32 @@ public static SecondaryToPrimaryMapper fromLabel( return fromMetadata(nameKey, namespaceKey, true); } - public static SecondaryToPrimaryMapper fromOwnerReference(HasMetadata primaryResource) { - return fromOwnerReference(false, primaryResource); + public static SecondaryToPrimaryMapper fromOwnerReferences( + Class primaryResourceType, boolean clusterScoped) { + return fromOwnerReferences(HasMetadata.getApiVersion(primaryResourceType), + HasMetadata.getKind(primaryResourceType), + clusterScoped); } - /** - * @param clusterScoped if the owner is a cluster scoped resource - * @return mapper - * @param type of the secondary resource, where the owner reference is - */ - public static SecondaryToPrimaryMapper fromOwnerReference( - boolean clusterScoped, HasMetadata primaryResource) { - return resource -> { - var ownerReference = resource.getMetadata().getOwnerReferences().stream().filter(r -> - r.getKind().equals(primaryResource.getKind()) && r.getApiVersion().equals(primaryResource.getApiVersion()) - ).findAny(); - return ownerReference.map(or -> ResourceID.fromOwnerReference(resource, or, clusterScoped)) - .stream().collect(Collectors.toSet()); - }; + public static SecondaryToPrimaryMapper fromOwnerReferences( + HasMetadata primaryResource) { + return fromOwnerReferences(primaryResource, false); } - public static SecondaryToPrimaryMapper fromOwnerReferences(HasMetadata primaryResource) { - return fromOwnerReferences(primaryResource,false); + public static SecondaryToPrimaryMapper fromOwnerReferences( + HasMetadata primaryResource, + boolean clusterScoped) { + return fromOwnerReferences(primaryResource.getApiVersion(), primaryResource.getKind(), + clusterScoped); } - public static SecondaryToPrimaryMapper fromOwnerReferences(HasMetadata primaryResource, + public static SecondaryToPrimaryMapper fromOwnerReferences( + String apiVersion, String kind, boolean clusterScope) { return resource -> resource.getMetadata().getOwnerReferences() - .stream() - .filter(r->r.getKind().equals(primaryResource.getKind()) - && r.getApiVersion().equals(primaryResource.getApiVersion())) + .stream() + .filter(r -> r.getKind().equals(kind) + && r.getApiVersion().equals(apiVersion)) .map(or -> ResourceID.fromOwnerReference(resource, or, clusterScope)) .collect(Collectors.toSet()); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/clusterscopedresource/ClusterScopedCustomResourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/clusterscopedresource/ClusterScopedCustomResourceReconciler.java index de5153d540..ec872bd6b2 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/clusterscopedresource/ClusterScopedCustomResourceReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/clusterscopedresource/ClusterScopedCustomResourceReconciler.java @@ -56,7 +56,8 @@ private ConfigMap desired(ClusterScopedCustomResource resource) { public List prepareEventSources( EventSourceContext context) { var ies = new InformerEventSource<>(InformerConfiguration.from(ConfigMap.class, context) - .withSecondaryToPrimaryMapper(Mappers.fromOwnerReference(true)) + .withSecondaryToPrimaryMapper( + Mappers.fromOwnerReferences(context.getPrimaryResourceClass(), true)) .withLabelSelector(TEST_LABEL_KEY + "=" + TEST_LABEL_VALUE) .build(), context); return List.of(ies); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/createupdateeventfilter/CreateUpdateEventFilterTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/createupdateeventfilter/CreateUpdateEventFilterTestReconciler.java index dc152d29f6..8567f49916 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/createupdateeventfilter/CreateUpdateEventFilterTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/createupdateeventfilter/CreateUpdateEventFilterTestReconciler.java @@ -93,7 +93,7 @@ private ConfigMap createConfigMap(CreateUpdateEventFilterTestCustomResource reso public List prepareEventSources( EventSourceContext context) { InformerConfiguration informerConfiguration = - InformerConfiguration.from(ConfigMap.class) + InformerConfiguration.from(ConfigMap.class, context) .withLabelSelector("integrationtest = " + this.getClass().getSimpleName()) .build(); final var informerEventSource = diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomReconciler.java index c7cac63cad..232426403d 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/informereventsource/InformerEventSourceTestCustomReconciler.java @@ -36,7 +36,7 @@ public List prepareEventSources( EventSourceContext context) { InformerConfiguration config = - InformerConfiguration.from(ConfigMap.class) + InformerConfiguration.from(ConfigMap.class, context) .withSecondaryToPrimaryMapper(Mappers.fromAnnotation(RELATED_RESOURCE_NAME)) .build(); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplesecondaryeventsource/MultipleSecondaryEventSourceReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplesecondaryeventsource/MultipleSecondaryEventSourceReconciler.java index 62c9ef3b7b..88f97a8235 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplesecondaryeventsource/MultipleSecondaryEventSourceReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/multiplesecondaryeventsource/MultipleSecondaryEventSourceReconciler.java @@ -64,7 +64,7 @@ public int getNumberOfExecutions() { public List prepareEventSources( EventSourceContext context) { - var config = InformerConfiguration.from(ConfigMap.class) + var config = InformerConfiguration.from(ConfigMap.class, context) .withNamespaces(context.getControllerConfiguration().getNamespaces()) .withLabelSelector("multisecondary") .withSecondaryToPrimaryMapper(s -> { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/PrimaryIndexerTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/PrimaryIndexerTestReconciler.java index 78af3dbd66..547c224e55 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/PrimaryIndexerTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/PrimaryIndexerTestReconciler.java @@ -22,7 +22,7 @@ public List prepareEventSources( context.getPrimaryCache().addIndexer(CONFIG_MAP_RELATION_INDEXER, indexer); var informerConfiguration = - InformerConfiguration.from(ConfigMap.class) + InformerConfiguration.from(ConfigMap.class, context) .withSecondaryToPrimaryMapper( (ConfigMap secondaryResource) -> context .getPrimaryCache() From 8f8a309820713d9f0b92662f6cfb39779f419016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 30 Apr 2024 14:01:21 +0200 Subject: [PATCH 3/6] unit tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../event/source/informer/Mappers.java | 5 ++ .../event/source/informer/MappersTest.java | 56 +++++++++++++++++++ .../simple/TestCustomResourceOtherV1.java | 2 +- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/MappersTest.java 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 d67b667065..24c4d18837 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 @@ -42,6 +42,11 @@ public static SecondaryToPrimaryMapper fromLabel( return fromMetadata(nameKey, namespaceKey, true); } + public static SecondaryToPrimaryMapper fromOwnerReferences( + Class primaryResourceType) { + return fromOwnerReferences(primaryResourceType, false); + } + public static SecondaryToPrimaryMapper fromOwnerReferences( Class primaryResourceType, boolean clusterScoped) { return fromOwnerReferences(HasMetadata.getApiVersion(primaryResourceType), diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/MappersTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/MappersTest.java new file mode 100644 index 0000000000..12e7b54706 --- /dev/null +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/MappersTest.java @@ -0,0 +1,56 @@ +package io.javaoperatorsdk.operator.processing.event.source.informer; + +import java.util.UUID; + +import org.junit.jupiter.api.Test; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.javaoperatorsdk.operator.TestUtils; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; +import io.javaoperatorsdk.operator.sample.simple.TestCustomResourceOtherV1; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class MappersTest { + + + @Test + void secondaryToPrimaryMapperFromOwnerReference() { + var primary = TestUtils.testCustomResource(); + primary.getMetadata().setUid(UUID.randomUUID().toString()); + var secondary = getConfigMap(primary); + secondary.addOwnerReference(primary); + + var res = Mappers.fromOwnerReferences(TestCustomResource.class) + .toPrimaryResourceIDs(secondary); + + assertThat(res).contains(ResourceID.fromResource(primary)); + } + + @Test + void secondaryToPrimaryMapperFromOwnerReferenceFiltersByType() { + var primary = TestUtils.testCustomResource(); + primary.getMetadata().setUid(UUID.randomUUID().toString()); + var secondary = getConfigMap(primary); + secondary.addOwnerReference(primary); + + var res = Mappers.fromOwnerReferences(TestCustomResourceOtherV1.class) + .toPrimaryResourceIDs(secondary); + + assertThat(res).isEmpty(); + } + + + private static ConfigMap getConfigMap(TestCustomResource primary) { + return new ConfigMapBuilder() + .withMetadata(new ObjectMetaBuilder() + .withName("test1") + .withNamespace(primary.getMetadata().getNamespace()) + .build()) + .build(); + } +} diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomResourceOtherV1.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomResourceOtherV1.java index f768ba491f..90e226abc8 100644 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomResourceOtherV1.java +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomResourceOtherV1.java @@ -7,7 +7,7 @@ @Group("sample.javaoperatorsdk.io") @Version("v1") -@Kind("TestCustomResource") // this is needed to override the automatically generated kind +@Kind("TestCustomResourceOtherV1") // this is needed to override the automatically generated kind public class TestCustomResourceOtherV1 extends CustomResource { From 77c148c1de853365eaba09098651af9afa16fbce Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Wed, 15 May 2024 17:45:44 +0200 Subject: [PATCH 4/6] refactor: minor Signed-off-by: Chris Laprun --- .../config/informer/InformerConfiguration.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java index 9e28881c7c..5371975ec5 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/informer/InformerConfiguration.java @@ -137,15 +137,18 @@ class InformerConfigurationBuilder { private InformerConfigurationBuilder(Class resourceClass, Class primaryResourceClass) { - this.resourceClass = resourceClass; - this.primaryResourceClass = primaryResourceClass; - this.groupVersionKind = null; + this(resourceClass, primaryResourceClass, null); } @SuppressWarnings("unchecked") private InformerConfigurationBuilder(GroupVersionKind groupVersionKind, Class primaryResourceClass) { - this.resourceClass = (Class) GenericKubernetesResource.class; + this((Class) GenericKubernetesResource.class, primaryResourceClass, groupVersionKind); + } + + private InformerConfigurationBuilder(Class resourceClass, + Class primaryResourceClass, GroupVersionKind groupVersionKind) { + this.resourceClass = resourceClass; this.groupVersionKind = groupVersionKind; this.primaryResourceClass = primaryResourceClass; } @@ -297,9 +300,8 @@ static InformerConfigurationBuilder from( } /** - * * For the case when want to use {@link GenericKubernetesResource} + * For the case when want to use {@link GenericKubernetesResource} */ - @SuppressWarnings("unchecked") static InformerConfigurationBuilder from( GroupVersionKind groupVersionKind, EventSourceContext eventSourceContext) { return new InformerConfigurationBuilder(groupVersionKind, @@ -309,8 +311,7 @@ static InformerConfigurationBuilder from( static InformerConfigurationBuilder from( GroupVersionKind groupVersionKind, Class primaryResourceClass) { - return new InformerConfigurationBuilder<>(groupVersionKind, - primaryResourceClass); + return new InformerConfigurationBuilder<>(groupVersionKind, primaryResourceClass); } @SuppressWarnings("unchecked") From c11c5469bb903f92b12e7e42cd7273440a97686e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Thu, 16 May 2024 08:40:57 +0200 Subject: [PATCH 5/6] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../bulkdependent/readonly/ReadOnlyBulkDependentResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java index b812b82ef1..2bb902a7bb 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java @@ -48,6 +48,6 @@ private static String getName(ConfigMap cm) { @Override public Set toPrimaryResourceIDs(ConfigMap resource) { - return Mappers.fromOwnerReferences(false).toPrimaryResourceIDs(resource); + return Mappers.fromOwnerReferences(ConfigMap.class, false).toPrimaryResourceIDs(resource); } } From fb449f6de80321cef757253add5a02c20701b047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Thu, 16 May 2024 09:13:38 +0200 Subject: [PATCH 6/6] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../bulkdependent/readonly/ReadOnlyBulkDependentResource.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java index 2bb902a7bb..0f4fb80b8a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/bulkdependent/readonly/ReadOnlyBulkDependentResource.java @@ -48,6 +48,7 @@ private static String getName(ConfigMap cm) { @Override public Set toPrimaryResourceIDs(ConfigMap resource) { - return Mappers.fromOwnerReferences(ConfigMap.class, false).toPrimaryResourceIDs(resource); + return Mappers.fromOwnerReferences(BulkDependentTestCustomResource.class, false) + .toPrimaryResourceIDs(resource); } }