From c1adeb0d9e9e567d413e19b6c0b6a0da0c461afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 10:11:58 +0200 Subject: [PATCH 1/9] feat: customize mapping annotation in kubernetes dependent resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../kubernetes/KubernetesDependentResource.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 174cf10619..900cd14f85 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 @@ -239,7 +239,7 @@ protected void addReferenceHandlingMetadata(R desired, P primary) { if (addOwnerReference()) { desired.addOwnerReference(primary); } else if (useDefaultAnnotationsToIdentifyPrimary()) { - addDefaultSecondaryToPrimaryMapperAnnotations(desired, primary); + addSecondaryToPrimaryMapperAnnotations(desired, primary); } } @@ -273,13 +273,18 @@ private boolean useDefaultAnnotationsToIdentifyPrimary() { return !(this instanceof SecondaryToPrimaryMapper) && !garbageCollected && isCreatable(); } - private void addDefaultSecondaryToPrimaryMapperAnnotations(R desired, P primary) { + protected void addSecondaryToPrimaryMapperAnnotations(R desired, P primary) { + addSecondaryToPrimaryMapperAnnotations(desired, primary, Mappers.DEFAULT_ANNOTATION_FOR_NAME, + Mappers.DEFAULT_ANNOTATION_FOR_NAMESPACE); + } + + protected void addSecondaryToPrimaryMapperAnnotations(R desired, P primary, String nameKey, + String namespaceKey) { var annotations = desired.getMetadata().getAnnotations(); - annotations.put(Mappers.DEFAULT_ANNOTATION_FOR_NAME, primary.getMetadata().getName()); + annotations.put(nameKey, primary.getMetadata().getName()); var primaryNamespaces = primary.getMetadata().getNamespace(); if (primaryNamespaces != null) { - annotations.put( - Mappers.DEFAULT_ANNOTATION_FOR_NAMESPACE, primary.getMetadata().getNamespace()); + annotations.put(namespaceKey, primary.getMetadata().getNamespace()); } } From 2016f8eda60a6af96409f5a3eb676e679fafc15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 11:38:39 +0200 Subject: [PATCH 2/9] progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../source/SecondaryToPrimaryMapper.java | 2 +- .../DependentCustomMappingAnnotationIT.java | 4 ++ ...stomMappingConfigMapDependentResource.java | 42 +++++++++++++++++++ .../DependentCustomMappingCustomResource.java | 14 +++++++ .../DependentCustomMappingReconciler.java | 23 ++++++++++ .../DependentCustomMappingSpec.java | 15 +++++++ ...DependentPrimaryIndexerTestReconciler.java | 4 +- .../dependent/SecretDependentResource.java | 6 +-- 8 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/SecondaryToPrimaryMapper.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/SecondaryToPrimaryMapper.java index 45573542c2..7b8853b4ae 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/SecondaryToPrimaryMapper.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/SecondaryToPrimaryMapper.java @@ -6,5 +6,5 @@ @FunctionalInterface public interface SecondaryToPrimaryMapper { - Set toPrimaryResourceIDs(R dependentResource); + Set toPrimaryResourceIDs(R resource); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java new file mode 100644 index 0000000000..2517e1a6e5 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java @@ -0,0 +1,4 @@ +package io.javaoperatorsdk.operator; + +public class DependentCustomMappingAnnotationIT { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java new file mode 100644 index 0000000000..7216a8f8f1 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java @@ -0,0 +1,42 @@ +package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; + +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.api.reconciler.Context; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDNoGCKubernetesDependentResource; +import io.javaoperatorsdk.operator.processing.event.ResourceID; +import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; +import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; + +import java.util.Map; +import java.util.Set; + +public class CustomMappingConfigMapDependentResource + extends CRUDNoGCKubernetesDependentResource + implements SecondaryToPrimaryMapper { + + private SecondaryToPrimaryMapper mapper = Mappers.fromAnnotation("customNameKey","customNamespaceKey"); + + public CustomMappingConfigMapDependentResource() { + super(ConfigMap.class); + } + + @Override + protected ConfigMap desired(DependentCustomMappingCustomResource primary, + Context context) { + return new ConfigMapBuilder() + .withMetadata(new ObjectMetaBuilder() + .withName(primary.getMetadata().getName()) + .withNamespace(primary.getMetadata().getNamespace()) + .build()) + .withData(Map.of("key", "val")) + .build(); + } + + @Override + public Set toPrimaryResourceIDs(ConfigMap resource) { + return mapper.toPrimaryResourceIDs(resource); + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingCustomResource.java new file mode 100644 index 0000000000..47776ed1e7 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingCustomResource.java @@ -0,0 +1,14 @@ +package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; + +import io.fabric8.kubernetes.api.model.Namespaced; +import io.fabric8.kubernetes.client.CustomResource; +import io.fabric8.kubernetes.model.annotation.Group; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("sample.javaoperatorsdk") +@Version("v1") +public class DependentCustomMappingCustomResource + extends CustomResource + implements Namespaced { + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java new file mode 100644 index 0000000000..4e9c85a0ba --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java @@ -0,0 +1,23 @@ +package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; + +import io.fabric8.kubernetes.client.KubernetesClient; +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; + +import java.util.Map; + +@ControllerConfiguration(dependents = {@Dependent(type = CustomMappingConfigMapDependentResource.class)}) +public class DependentCustomMappingReconciler + implements Reconciler { + + @Override + public UpdateControl reconcile( + DependentCustomMappingCustomResource resource, + Context context) throws Exception { + + return UpdateControl.noUpdate(); + } + + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java new file mode 100644 index 0000000000..7dd9606db6 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; + +public class DependentCustomMappingSpec { + + private String value; + + public String getValue() { + return value; + } + + public DependentCustomMappingSpec setValue(String value) { + this.value = value; + return this; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/DependentPrimaryIndexerTestReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/DependentPrimaryIndexerTestReconciler.java index e123500c42..89b2a43700 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/DependentPrimaryIndexerTestReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/primaryindexer/DependentPrimaryIndexerTestReconciler.java @@ -31,8 +31,8 @@ public ReadOnlyConfigMapDependent() { } @Override - public Set toPrimaryResourceIDs(ConfigMap dependentResource) { - return cache.byIndex(CONFIG_MAP_RELATION_INDEXER, dependentResource.getMetadata().getName()) + public Set toPrimaryResourceIDs(ConfigMap resource) { + return cache.byIndex(CONFIG_MAP_RELATION_INDEXER, resource.getMetadata().getName()) .stream() .map(ResourceID::fromResource) .collect(Collectors.toSet()); diff --git a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SecretDependentResource.java b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SecretDependentResource.java index 1aa2ad62e5..edaa5707ee 100644 --- a/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SecretDependentResource.java +++ b/sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/dependent/SecretDependentResource.java @@ -61,9 +61,9 @@ public Result match(Secret actual, MySQLSchema primary, Context toPrimaryResourceIDs(Secret dependentResource) { - String name = dependentResource.getMetadata().getName(); + public Set toPrimaryResourceIDs(Secret resource) { + String name = resource.getMetadata().getName(); return Set.of(new ResourceID(name.substring(0, name.length() - SECRET_SUFFIX.length()), - dependentResource.getMetadata().getNamespace())); + resource.getMetadata().getNamespace())); } } From c87015da7300a9d1c4558b744b86e6bd1ee66db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 11:56:51 +0200 Subject: [PATCH 3/9] format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../CustomMappingConfigMapDependentResource.java | 14 +++++++------- .../DependentCustomMappingReconciler.java | 7 ++----- .../DependentCustomMappingSpec.java | 16 ++++++++-------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java index 7216a8f8f1..f49e11d529 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java @@ -1,23 +1,23 @@ package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; +import java.util.Map; +import java.util.Set; + 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.api.reconciler.Context; -import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDNoGCKubernetesDependentResource; import io.javaoperatorsdk.operator.processing.event.ResourceID; import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; import io.javaoperatorsdk.operator.processing.event.source.informer.Mappers; -import java.util.Map; -import java.util.Set; - public class CustomMappingConfigMapDependentResource extends CRUDNoGCKubernetesDependentResource - implements SecondaryToPrimaryMapper { + implements SecondaryToPrimaryMapper { - private SecondaryToPrimaryMapper mapper = Mappers.fromAnnotation("customNameKey","customNamespaceKey"); + private SecondaryToPrimaryMapper mapper = + Mappers.fromAnnotation("customNameKey", "customNamespaceKey"); public CustomMappingConfigMapDependentResource() { super(ConfigMap.class); @@ -25,7 +25,7 @@ public CustomMappingConfigMapDependentResource() { @Override protected ConfigMap desired(DependentCustomMappingCustomResource primary, - Context context) { + Context context) { return new ConfigMapBuilder() .withMetadata(new ObjectMetaBuilder() .withName(primary.getMetadata().getName()) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java index 4e9c85a0ba..8c14f829ff 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingReconciler.java @@ -1,13 +1,10 @@ package io.javaoperatorsdk.operator.sample.dependentcustommappingannotation; -import io.fabric8.kubernetes.client.KubernetesClient; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; -import io.javaoperatorsdk.operator.processing.event.source.EventSource; -import java.util.Map; - -@ControllerConfiguration(dependents = {@Dependent(type = CustomMappingConfigMapDependentResource.class)}) +@ControllerConfiguration( + dependents = {@Dependent(type = CustomMappingConfigMapDependentResource.class)}) public class DependentCustomMappingReconciler implements Reconciler { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java index 7dd9606db6..bc5b92901f 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/DependentCustomMappingSpec.java @@ -2,14 +2,14 @@ public class DependentCustomMappingSpec { - private String value; + private String value; - public String getValue() { - return value; - } + public String getValue() { + return value; + } - public DependentCustomMappingSpec setValue(String value) { - this.value = value; - return this; - } + public DependentCustomMappingSpec setValue(String value) { + this.value = value; + return this; + } } From db492926a98c06561bcc9f7b189db33df5ca5697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 14:01:06 +0200 Subject: [PATCH 4/9] integration test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../KubernetesDependentResource.java | 8 +-- .../DependentCustomMappingAnnotationIT.java | 70 ++++++++++++++++++- ...stomMappingConfigMapDependentResource.java | 14 +++- 3 files changed, 85 insertions(+), 7 deletions(-) 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 900cd14f85..6679e16ab8 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 @@ -88,7 +88,7 @@ private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { return Mappers.fromOwnerReference(); - } else if (useDefaultAnnotationsToIdentifyPrimary()) { + } else if (useAnnotationsToIdentifyPrimary()) { return Mappers.fromDefaultAnnotations(); } else { throw new OperatorException("Provide a SecondaryToPrimaryMapper to associate " + @@ -238,7 +238,7 @@ protected Resource prepare(R desired, P primary, String actionName) { protected void addReferenceHandlingMetadata(R desired, P primary) { if (addOwnerReference()) { desired.addOwnerReference(primary); - } else if (useDefaultAnnotationsToIdentifyPrimary()) { + } else if (useAnnotationsToIdentifyPrimary()) { addSecondaryToPrimaryMapperAnnotations(desired, primary); } } @@ -269,8 +269,8 @@ protected InformerEventSource createEventSource(EventSourceContext

cont return eventSource().orElseThrow(); } - private boolean useDefaultAnnotationsToIdentifyPrimary() { - return !(this instanceof SecondaryToPrimaryMapper) && !garbageCollected && isCreatable(); + private boolean useAnnotationsToIdentifyPrimary() { + return !garbageCollected && isCreatable(); } protected void addSecondaryToPrimaryMapperAnnotations(R desired, P primary) { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java index 2517e1a6e5..238121916f 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java @@ -1,4 +1,72 @@ package io.javaoperatorsdk.operator; -public class DependentCustomMappingAnnotationIT { +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.CustomMappingConfigMapDependentResource; +import io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.DependentCustomMappingCustomResource; +import io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.DependentCustomMappingReconciler; +import io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.DependentCustomMappingSpec; + +import static io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.CustomMappingConfigMapDependentResource.CUSTOM_NAMESPACE_KEY; +import static io.javaoperatorsdk.operator.sample.dependentcustommappingannotation.CustomMappingConfigMapDependentResource.CUSTOM_NAME_KEY; +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +class DependentCustomMappingAnnotationIT { + + public static final String INITIAL_VALUE = "initial value"; + public static final String CHANGED_VALUE = "changed value"; + public static final String TEST_RESOURCE_NAME = "test1"; + + @RegisterExtension + LocallyRunOperatorExtension extension = + LocallyRunOperatorExtension.builder() + .withReconciler(DependentCustomMappingReconciler.class) + .build(); + + + @Test + void testCustomMappingAnnotationForDependent() { + var cr = extension.create(testResource()); + assertConfigMapData(INITIAL_VALUE); + + cr.getSpec().setValue(CHANGED_VALUE); + cr = extension.replace(cr); + assertConfigMapData(CHANGED_VALUE); + + extension.delete(cr); + + await().untilAsserted(()->{ + var resource = extension.get(ConfigMap.class, TEST_RESOURCE_NAME); + assertThat(resource).isNull(); + }); + } + + private void assertConfigMapData(String val) { + await().untilAsserted(() -> { + var resource = extension.get(ConfigMap.class, TEST_RESOURCE_NAME); + assertThat(resource).isNotNull(); + assertThat(resource.getMetadata().getAnnotations()) + .containsKey(CUSTOM_NAME_KEY) + .containsKey(CUSTOM_NAMESPACE_KEY); + assertThat(resource.getData()).containsEntry(CustomMappingConfigMapDependentResource.KEY, + INITIAL_VALUE); + }); + } + + + DependentCustomMappingCustomResource testResource() { + var dr = new DependentCustomMappingCustomResource(); + dr.setMetadata(new ObjectMetaBuilder().withName(TEST_RESOURCE_NAME).build()); + dr.setSpec(new DependentCustomMappingSpec()); + dr.getSpec().setValue(INITIAL_VALUE); + + return dr; + } + + } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java index f49e11d529..123d360068 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/dependentcustommappingannotation/CustomMappingConfigMapDependentResource.java @@ -16,8 +16,12 @@ public class CustomMappingConfigMapDependentResource extends CRUDNoGCKubernetesDependentResource implements SecondaryToPrimaryMapper { + public static final String CUSTOM_NAME_KEY = "customNameKey"; + public static final String CUSTOM_NAMESPACE_KEY = "customNamespaceKey"; + public static final String KEY = "key"; + private SecondaryToPrimaryMapper mapper = - Mappers.fromAnnotation("customNameKey", "customNamespaceKey"); + Mappers.fromAnnotation(CUSTOM_NAME_KEY, CUSTOM_NAMESPACE_KEY); public CustomMappingConfigMapDependentResource() { super(ConfigMap.class); @@ -31,7 +35,7 @@ protected ConfigMap desired(DependentCustomMappingCustomResource primary, .withName(primary.getMetadata().getName()) .withNamespace(primary.getMetadata().getNamespace()) .build()) - .withData(Map.of("key", "val")) + .withData(Map.of(KEY, primary.getSpec().getValue())) .build(); } @@ -39,4 +43,10 @@ protected ConfigMap desired(DependentCustomMappingCustomResource primary, public Set toPrimaryResourceIDs(ConfigMap resource) { return mapper.toPrimaryResourceIDs(resource); } + + @Override + protected void addSecondaryToPrimaryMapperAnnotations(ConfigMap desired, + DependentCustomMappingCustomResource primary) { + addSecondaryToPrimaryMapperAnnotations(desired, primary, CUSTOM_NAME_KEY, CUSTOM_NAMESPACE_KEY); + } } From c59aed2bccb618590daabbf3681cce8ed7056be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 14:17:27 +0200 Subject: [PATCH 5/9] IT fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/DependentCustomMappingAnnotationIT.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java index 238121916f..8a7d168b26 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/DependentCustomMappingAnnotationIT.java @@ -40,7 +40,7 @@ void testCustomMappingAnnotationForDependent() { extension.delete(cr); - await().untilAsserted(()->{ + await().untilAsserted(() -> { var resource = extension.get(ConfigMap.class, TEST_RESOURCE_NAME); assertThat(resource).isNull(); }); @@ -51,10 +51,10 @@ private void assertConfigMapData(String val) { var resource = extension.get(ConfigMap.class, TEST_RESOURCE_NAME); assertThat(resource).isNotNull(); assertThat(resource.getMetadata().getAnnotations()) - .containsKey(CUSTOM_NAME_KEY) - .containsKey(CUSTOM_NAMESPACE_KEY); + .containsKey(CUSTOM_NAME_KEY) + .containsKey(CUSTOM_NAMESPACE_KEY); assertThat(resource.getData()).containsEntry(CustomMappingConfigMapDependentResource.KEY, - INITIAL_VALUE); + val); }); } From fed53b51dc5b1b8edce3999d5d224c8d6125e2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 15:33:16 +0200 Subject: [PATCH 6/9] improvement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/kubernetes/KubernetesDependentResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6679e16ab8..909d72da14 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 @@ -84,7 +84,7 @@ private void configureWith(String labelSelector, Set namespaces, @SuppressWarnings("unchecked") private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { - if (this instanceof SecondaryToPrimaryMapper) { + if (this instanceof SecondaryToPrimaryMapper && useAnnotationsToIdentifyPrimary()) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { return Mappers.fromOwnerReference(); From 0a0f4698697072b76aa28d6844e296bda536dd32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 15:37:10 +0200 Subject: [PATCH 7/9] naming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/kubernetes/KubernetesDependentResource.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 909d72da14..8d8270ddc1 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 @@ -84,11 +84,11 @@ private void configureWith(String labelSelector, Set namespaces, @SuppressWarnings("unchecked") private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { - if (this instanceof SecondaryToPrimaryMapper && useAnnotationsToIdentifyPrimary()) { + if (this instanceof SecondaryToPrimaryMapper && useNonOwnerRefBasedSecondaryToPrimaryMapping()) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { return Mappers.fromOwnerReference(); - } else if (useAnnotationsToIdentifyPrimary()) { + } else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) { return Mappers.fromDefaultAnnotations(); } else { throw new OperatorException("Provide a SecondaryToPrimaryMapper to associate " + @@ -238,7 +238,7 @@ protected Resource prepare(R desired, P primary, String actionName) { protected void addReferenceHandlingMetadata(R desired, P primary) { if (addOwnerReference()) { desired.addOwnerReference(primary); - } else if (useAnnotationsToIdentifyPrimary()) { + } else if (useNonOwnerRefBasedSecondaryToPrimaryMapping()) { addSecondaryToPrimaryMapperAnnotations(desired, primary); } } @@ -269,7 +269,7 @@ protected InformerEventSource createEventSource(EventSourceContext

cont return eventSource().orElseThrow(); } - private boolean useAnnotationsToIdentifyPrimary() { + private boolean useNonOwnerRefBasedSecondaryToPrimaryMapping() { return !garbageCollected && isCreatable(); } From 5b3263c4f53dbabf68549a360cac0f8834be695e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 3 Oct 2023 16:05:14 +0200 Subject: [PATCH 8/9] format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/kubernetes/KubernetesDependentResource.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 8d8270ddc1..eaa1c9fe40 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 @@ -84,7 +84,8 @@ private void configureWith(String labelSelector, Set namespaces, @SuppressWarnings("unchecked") private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { - if (this instanceof SecondaryToPrimaryMapper && useNonOwnerRefBasedSecondaryToPrimaryMapping()) { + if (this instanceof SecondaryToPrimaryMapper + && useNonOwnerRefBasedSecondaryToPrimaryMapping()) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { return Mappers.fromOwnerReference(); From a060844764d265390e3a0f61c1bdab7f67a2ee00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Wed, 4 Oct 2023 10:25:49 +0200 Subject: [PATCH 9/9] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../dependent/kubernetes/KubernetesDependentResource.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 eaa1c9fe40..912d876aba 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 @@ -84,8 +84,7 @@ private void configureWith(String labelSelector, Set namespaces, @SuppressWarnings("unchecked") private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { - if (this instanceof SecondaryToPrimaryMapper - && useNonOwnerRefBasedSecondaryToPrimaryMapping()) { + if (this instanceof SecondaryToPrimaryMapper) { return (SecondaryToPrimaryMapper) this; } else if (garbageCollected) { return Mappers.fromOwnerReference();