From 3b04c47b24903803300327db18813c9512600239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Wed, 22 Nov 2023 13:18:40 +0100 Subject: [PATCH 01/15] chore: change version to 4.7.0-SNAPSHOT (#2132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- bootstrapper-maven-plugin/pom.xml | 2 +- caffeine-bounded-cache-support/pom.xml | 2 +- micrometer-support/pom.xml | 2 +- operator-framework-bom/pom.xml | 2 +- operator-framework-core/pom.xml | 2 +- operator-framework-junit5/pom.xml | 2 +- operator-framework/pom.xml | 2 +- pom.xml | 2 +- sample-operators/leader-election/pom.xml | 2 +- sample-operators/mysql-schema/pom.xml | 2 +- sample-operators/pom.xml | 2 +- sample-operators/tomcat-operator/pom.xml | 2 +- sample-operators/webpage/pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/bootstrapper-maven-plugin/pom.xml b/bootstrapper-maven-plugin/pom.xml index a077bb82ad..6edcf2ec1f 100644 --- a/bootstrapper-maven-plugin/pom.xml +++ b/bootstrapper-maven-plugin/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT bootstrapper diff --git a/caffeine-bounded-cache-support/pom.xml b/caffeine-bounded-cache-support/pom.xml index fb5e2c98a1..a63c5889fe 100644 --- a/caffeine-bounded-cache-support/pom.xml +++ b/caffeine-bounded-cache-support/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT 4.0.0 diff --git a/micrometer-support/pom.xml b/micrometer-support/pom.xml index 3e640e3e7f..6f6669999a 100644 --- a/micrometer-support/pom.xml +++ b/micrometer-support/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT 4.0.0 diff --git a/operator-framework-bom/pom.xml b/operator-framework-bom/pom.xml index e54776b161..75ead60afa 100644 --- a/operator-framework-bom/pom.xml +++ b/operator-framework-bom/pom.xml @@ -5,7 +5,7 @@ io.javaoperatorsdk operator-framework-bom - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT Operator SDK - Bill of Materials pom Java SDK for implementing Kubernetes operators diff --git a/operator-framework-core/pom.xml b/operator-framework-core/pom.xml index 92396da92a..6ddeff175b 100644 --- a/operator-framework-core/pom.xml +++ b/operator-framework-core/pom.xml @@ -6,7 +6,7 @@ io.javaoperatorsdk java-operator-sdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT ../pom.xml diff --git a/operator-framework-junit5/pom.xml b/operator-framework-junit5/pom.xml index a80d03d69e..9366485f25 100644 --- a/operator-framework-junit5/pom.xml +++ b/operator-framework-junit5/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT 4.0.0 diff --git a/operator-framework/pom.xml b/operator-framework/pom.xml index ff38d5fc66..430cc508b2 100644 --- a/operator-framework/pom.xml +++ b/operator-framework/pom.xml @@ -5,7 +5,7 @@ java-operator-sdk io.javaoperatorsdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8d193cafcb..4581e76ea0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ io.javaoperatorsdk java-operator-sdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT Operator SDK for Java Java SDK for implementing Kubernetes operators pom diff --git a/sample-operators/leader-election/pom.xml b/sample-operators/leader-election/pom.xml index af8589be61..ea18538d30 100644 --- a/sample-operators/leader-election/pom.xml +++ b/sample-operators/leader-election/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT sample-leader-election diff --git a/sample-operators/mysql-schema/pom.xml b/sample-operators/mysql-schema/pom.xml index c69c388299..7dba03f3d9 100644 --- a/sample-operators/mysql-schema/pom.xml +++ b/sample-operators/mysql-schema/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT sample-mysql-schema-operator diff --git a/sample-operators/pom.xml b/sample-operators/pom.xml index f7b1b4dfcb..56c7834d03 100644 --- a/sample-operators/pom.xml +++ b/sample-operators/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk java-operator-sdk - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT sample-operators diff --git a/sample-operators/tomcat-operator/pom.xml b/sample-operators/tomcat-operator/pom.xml index ffb17e2cda..89e243ba0a 100644 --- a/sample-operators/tomcat-operator/pom.xml +++ b/sample-operators/tomcat-operator/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT sample-tomcat-operator diff --git a/sample-operators/webpage/pom.xml b/sample-operators/webpage/pom.xml index 8cbac1f178..e0becee1a5 100644 --- a/sample-operators/webpage/pom.xml +++ b/sample-operators/webpage/pom.xml @@ -7,7 +7,7 @@ io.javaoperatorsdk sample-operators - 4.6.1-SNAPSHOT + 4.7.0-SNAPSHOT sample-webpage-operator From 9e0e81043495b48f93c79127c796b312f65834be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Wed, 22 Nov 2023 13:58:53 +0100 Subject: [PATCH 02/15] feat: GenericKubernetesResource based DependentResource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../GenericKubernetesDependentResource.java | 21 ++++++++++ ...enericKubernetesDependentStandaloneIT.java | 40 +++++++++++++++++++ .../ConfigMapGenericKubernetesDependent.java | 31 ++++++++++++++ ...etesDependentStandaloneCustomResource.java | 15 +++++++ ...bernetesDependentStandaloneReconciler.java | 28 +++++++++++++ 5 files changed, 135 insertions(+) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java 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 new file mode 100644 index 0000000000..df1bcb4634 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java @@ -0,0 +1,21 @@ +package io.javaoperatorsdk.operator.processing.dependent.kubernetes; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.api.model.HasMetadata; + +public class GenericKubernetesDependentResource

+ extends KubernetesDependentResource { + + private final String apiVersion; + private final String kind; + + + public GenericKubernetesDependentResource(String apiVersion, String kind) { + super(GenericKubernetesResource.class); + this.apiVersion = apiVersion; + this.kind = kind; + } + + + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java new file mode 100644 index 0000000000..eef748d518 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -0,0 +1,40 @@ +package io.javaoperatorsdk.operator; + +import org.junit.jupiter.api.Test; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; +import io.fabric8.kubernetes.client.informers.ResourceEventHandler; + +public class GenericKubernetesDependentStandaloneIT { + + + @Test + void testInformer() { + GenericKubernetesResource res = new GenericKubernetesResource(); + res.setApiVersion("v1"); + res.setKind("ConfigMap"); + + try (var client = new KubernetesClientBuilder().build()) { + client.resource(res).inform().addEventHandler(new ResourceEventHandler<>() { + @Override + public void onAdd(GenericKubernetesResource genericKubernetesResource) { + System.out.println(genericKubernetesResource); + } + + @Override + public void onUpdate(GenericKubernetesResource genericKubernetesResource, + GenericKubernetesResource t1) { + System.out.println(genericKubernetesResource); + } + + @Override + public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) { + System.out.println(genericKubernetesResource); + } + }); + } + } + + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java new file mode 100644 index 0000000000..a456660dd8 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java @@ -0,0 +1,31 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter; +import io.javaoperatorsdk.operator.processing.dependent.Creator; +import io.javaoperatorsdk.operator.processing.dependent.Updater; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesDependentResource; + +public class ConfigMapGenericKubernetesDependent extends + GenericKubernetesDependentResource + implements + Creator, + Updater, + Deleter { + + + public ConfigMapGenericKubernetesDependent() { + super("v1", "ConfigMap"); + } + + @Override + protected GenericKubernetesResource desired( + GenericKubernetesDependentStandaloneCustomResource primary, + Context context) { + + return null; + } + + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java new file mode 100644 index 0000000000..76976bda99 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; + +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.ShortNames; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("sample.javaoperatorsdk") +@Version("v1") +@ShortNames("gkd") +public class GenericKubernetesDependentStandaloneCustomResource + extends CustomResource + implements Namespaced { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java new file mode 100644 index 0000000000..ba83389e47 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java @@ -0,0 +1,28 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; + +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.sample.bulkdependent.CRUDConfigMapBulkDependentResource; +import io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterBulkDependentResource; + +@ControllerConfiguration +public class GenericKubernetesDependentStandaloneReconciler + implements Reconciler { + + + private final ConfigMapDeleterBulkDependentResource dependent; + + public GenericKubernetesDependentStandaloneReconciler() { + dependent = new CRUDConfigMapBulkDependentResource(); + } + + @Override + public UpdateControl reconcile( + GenericKubernetesDependentStandaloneCustomResource resource, + Context context) { + + + + return UpdateControl.noUpdate(); + } + +} From fee9a7ad530cd45402b33055ed6bdbeb7b9981ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Wed, 22 Nov 2023 16:47:53 +0100 Subject: [PATCH 03/15] progess MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- ...enericKubernetesDependentStandaloneIT.java | 10 +++++++- ...bernetesDependentStandaloneReconciler.java | 23 +++++++++++-------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java index eef748d518..580215db6a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -1,13 +1,22 @@ package io.javaoperatorsdk.operator; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler; public class GenericKubernetesDependentStandaloneIT { + @RegisterExtension + LocallyRunOperatorExtension operator = + LocallyRunOperatorExtension.builder() + .withConfigurationService(o -> o.withCloseClientOnStop(false)) + .withReconciler(new GenericKubernetesDependentStandaloneReconciler()) + .build(); @Test void testInformer() { @@ -36,5 +45,4 @@ public void onDelete(GenericKubernetesResource genericKubernetesResource, boolea } } - } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java index ba83389e47..95f7986727 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java @@ -1,28 +1,31 @@ package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; +import java.util.Map; + import io.javaoperatorsdk.operator.api.reconciler.*; -import io.javaoperatorsdk.operator.sample.bulkdependent.CRUDConfigMapBulkDependentResource; -import io.javaoperatorsdk.operator.sample.bulkdependent.ConfigMapDeleterBulkDependentResource; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; @ControllerConfiguration public class GenericKubernetesDependentStandaloneReconciler - implements Reconciler { - + implements Reconciler, + EventSourceInitializer { - private final ConfigMapDeleterBulkDependentResource dependent; + private final ConfigMapGenericKubernetesDependent dependent = + new ConfigMapGenericKubernetesDependent(); - public GenericKubernetesDependentStandaloneReconciler() { - dependent = new CRUDConfigMapBulkDependentResource(); - } + public GenericKubernetesDependentStandaloneReconciler() {} @Override public UpdateControl reconcile( GenericKubernetesDependentStandaloneCustomResource resource, Context context) { - - return UpdateControl.noUpdate(); } + @Override + public Map prepareEventSources( + EventSourceContext context) { + return EventSourceInitializer.nameEventSources(dependent.eventSource(context).orElseThrow()); + } } From e376fa237f1b0aae6e91af1721c70dd97d3db0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Thu, 30 Nov 2023 14:50:47 +0100 Subject: [PATCH 04/15] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../micrometer/MicrometerMetrics.java | 6 +- .../config/DefaultResourceConfiguration.java | 6 +- .../api/config/ExecutorServiceManager.java | 2 +- .../informer/InformerConfiguration.java | 36 +++++++++- .../operator/processing/GroupVersionKind.java | 24 +++++-- .../GenericKubernetesDependentResource.java | 26 +++++-- .../KubernetesDependentResource.java | 1 - .../source/informer/InformerEventSource.java | 7 +- .../informer/ManagedInformerEventSource.java | 8 +-- ...enericKubernetesDependentStandaloneIT.java | 68 ++++++++++++++----- .../ConfigMapGenericKubernetesDependent.java | 23 +++++-- ...etesDependentStandaloneCustomResource.java | 2 +- ...bernetesDependentStandaloneReconciler.java | 2 + ...ericKubernetesDependentStandaloneSpec.java | 15 ++++ .../configmap.yaml | 6 ++ 15 files changed, 186 insertions(+), 46 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java create mode 100644 operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml diff --git a/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java b/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java index 61ff1562ee..b819bd0ca3 100644 --- a/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java +++ b/micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java @@ -291,9 +291,9 @@ private static String getScope(ResourceID resourceID) { } private static void addGVKTags(GroupVersionKind gvk, List tags, boolean prefixed) { - addTagOmittingOnEmptyValue(GROUP, gvk.group, tags, prefixed); - addTag(VERSION, gvk.version, tags, prefixed); - addTag(KIND, gvk.kind, tags, prefixed); + addTagOmittingOnEmptyValue(GROUP, gvk.getGroup(), tags, prefixed); + addTag(VERSION, gvk.getVersion(), tags, prefixed); + addTag(KIND, gvk.getKind(), tags, prefixed); } private void incrementCounter(ResourceID id, String counterName, Map metadata, diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java index 87d8a6cd80..d150cfdfff 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java @@ -3,6 +3,7 @@ import java.util.Optional; import java.util.Set; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.informers.cache.ItemStore; import io.javaoperatorsdk.operator.ReconcilerUtils; @@ -13,6 +14,7 @@ public class DefaultResourceConfiguration implements ResourceConfiguration { + public static final String GENERIC_KUBERNETES_RESOURCE = "generickubernetesresource"; private final Class resourceClass; private final String resourceTypeName; private final OnAddFilter onAddFilter; @@ -28,7 +30,9 @@ protected DefaultResourceConfiguration(Class resourceClass, OnUpdateFilter onUpdateFilter, GenericFilter genericFilter, ItemStore itemStore, Long informerListLimit) { this.resourceClass = resourceClass; - this.resourceTypeName = ReconcilerUtils.getResourceTypeName(resourceClass); + this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class) + ? GENERIC_KUBERNETES_RESOURCE + : ReconcilerUtils.getResourceTypeName(resourceClass); this.onAddFilter = onAddFilter; this.onUpdateFilter = onUpdateFilter; this.genericFilter = genericFilter; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java index 4685fb1d57..62f345426c 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ExecutorServiceManager.java @@ -78,7 +78,7 @@ public static void executeAndWaitForAllToComplete(Stream stream, // to find out any exceptions f.get(); } catch (ExecutionException e) { - throw new OperatorException(e.getCause()); + throw new OperatorException(e); } catch (InterruptedException e) { log.warn("Interrupted.", e); Thread.currentThread().interrupt(); 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 4b0007c96e..b2e5b147dd 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 @@ -4,12 +4,14 @@ import java.util.Optional; import java.util.Set; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.informers.cache.ItemStore; import io.javaoperatorsdk.operator.api.config.DefaultResourceConfiguration; import io.javaoperatorsdk.operator.api.config.ResourceConfiguration; import io.javaoperatorsdk.operator.api.config.Utils; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; import io.javaoperatorsdk.operator.processing.event.source.PrimaryToSecondaryMapper; import io.javaoperatorsdk.operator.processing.event.source.SecondaryToPrimaryMapper; import io.javaoperatorsdk.operator.processing.event.source.filter.GenericFilter; @@ -30,9 +32,11 @@ class DefaultInformerConfiguration extends private final SecondaryToPrimaryMapper secondaryToPrimaryMapper; private final boolean followControllerNamespaceChanges; private final OnDeleteFilter onDeleteFilter; + private final GroupVersionKind groupVersionKind; protected DefaultInformerConfiguration(String labelSelector, Class resourceClass, + GroupVersionKind groupVersionKind, PrimaryToSecondaryMapper primaryToSecondaryMapper, SecondaryToPrimaryMapper secondaryToPrimaryMapper, Set namespaces, boolean followControllerNamespaceChanges, @@ -44,7 +48,7 @@ protected DefaultInformerConfiguration(String labelSelector, super(resourceClass, namespaces, labelSelector, onAddFilter, onUpdateFilter, genericFilter, itemStore, informerListLimit); this.followControllerNamespaceChanges = followControllerNamespaceChanges; - + this.groupVersionKind = groupVersionKind; this.primaryToSecondaryMapper = primaryToSecondaryMapper; this.secondaryToPrimaryMapper = Objects.requireNonNullElse(secondaryToPrimaryMapper, @@ -72,6 +76,10 @@ public Optional> onDeleteFilter() { public

PrimaryToSecondaryMapper

getPrimaryToSecondaryMapper() { return (PrimaryToSecondaryMapper

) primaryToSecondaryMapper; } + + public Optional getGroupVersionKind() { + return Optional.ofNullable(groupVersionKind); + } } /** @@ -109,14 +117,17 @@ public

PrimaryToSecondaryMapper

getPrimaryToSecondary

PrimaryToSecondaryMapper

getPrimaryToSecondaryMapper(); + Optional getGroupVersionKind(); + @SuppressWarnings("unused") class InformerConfigurationBuilder { + private final Class resourceClass; + private final GroupVersionKind groupVersionKind; private PrimaryToSecondaryMapper primaryToSecondaryMapper; private SecondaryToPrimaryMapper secondaryToPrimaryMapper; private Set namespaces; private String labelSelector; - private final Class resourceClass; private OnAddFilter onAddFilter; private OnUpdateFilter onUpdateFilter; private OnDeleteFilter onDeleteFilter; @@ -127,6 +138,13 @@ class InformerConfigurationBuilder { private InformerConfigurationBuilder(Class resourceClass) { this.resourceClass = resourceClass; + this.groupVersionKind = null; + } + + @SuppressWarnings("unchecked") + private InformerConfigurationBuilder(GroupVersionKind groupVersionKind) { + this.resourceClass = (Class) GenericKubernetesResource.class; + this.groupVersionKind = groupVersionKind; } public

InformerConfigurationBuilder withPrimaryToSecondaryMapper( @@ -244,7 +262,7 @@ public InformerConfigurationBuilder withInformerListLimit(Long informerListLi } public InformerConfiguration build() { - return new DefaultInformerConfiguration<>(labelSelector, resourceClass, + return new DefaultInformerConfiguration<>(labelSelector, resourceClass, groupVersionKind, primaryToSecondaryMapper, secondaryToPrimaryMapper, namespaces, inheritControllerNamespacesOnChange, onAddFilter, onUpdateFilter, @@ -257,6 +275,11 @@ static InformerConfigurationBuilder from( return new InformerConfigurationBuilder<>(resourceClass); } + static InformerConfigurationBuilder from( + GroupVersionKind groupVersionKind) { + return new InformerConfigurationBuilder<>(groupVersionKind); + } + /** * Creates a configuration builder that inherits namespaces from the controller and follows * namespaces changes. @@ -272,6 +295,13 @@ static InformerConfigurationBuilder from( .withNamespacesInheritedFromController(eventSourceContext); } + @SuppressWarnings("unchecked") + static InformerConfigurationBuilder from( + GroupVersionKind groupVersionKind, EventSourceContext eventSourceContext) { + return (InformerConfigurationBuilder) new InformerConfigurationBuilder<>(groupVersionKind) + .withNamespacesInheritedFromController(eventSourceContext); + } + @SuppressWarnings("unchecked") @Override default Class getResourceClass() { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java index 1a8a4b595d..855ff1dfde 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java @@ -3,11 +3,11 @@ import io.fabric8.kubernetes.api.model.HasMetadata; public class GroupVersionKind { - public final String group; - public final String version; - public final String kind; + private final String group; + private final String version; + private final String kind; - GroupVersionKind(String group, String version, String kind) { + public GroupVersionKind(String group, String version, String kind) { this.group = group; this.version = version; this.kind = kind; @@ -17,4 +17,20 @@ public static GroupVersionKind gvkFor(Class resourceClass return new GroupVersionKind(HasMetadata.getGroup(resourceClass), HasMetadata.getVersion(resourceClass), HasMetadata.getKind(resourceClass)); } + + public String getGroup() { + return group; + } + + public String getVersion() { + return version; + } + + public String getKind() { + return kind; + } + + public String apiVersion() { + return group == null || group.isBlank() ? version : group + "/" + version; + } } 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 df1bcb4634..ea70f3ef6e 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 @@ -2,20 +2,34 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; public class GenericKubernetesDependentResource

extends KubernetesDependentResource { - private final String apiVersion; - private final String kind; + private GroupVersionKind groupVersionKind; - - public GenericKubernetesDependentResource(String apiVersion, String kind) { + public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) { super(GenericKubernetesResource.class); - this.apiVersion = apiVersion; - this.kind = kind; + this.groupVersionKind = groupVersionKind; } + // todo super functionality filters etc + @Override + protected InformerEventSource createEventSource( + EventSourceContext

context) { + var es = new InformerEventSource<>( + InformerConfiguration.from(groupVersionKind, context) + .build(), + context); + return es; + } + public GroupVersionKind getGroupVersionKind() { + return groupVersionKind; + } } 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 b587c72327..6d0d50c9f8 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 @@ -74,7 +74,6 @@ private void configureWith(String labelSelector, Set namespaces, .build(); configureWith(new InformerEventSource<>(ic, context)); - } @SuppressWarnings("unchecked") diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java index dfaec7c19e..81d31f7407 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSource.java @@ -8,6 +8,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; @@ -88,7 +89,11 @@ public InformerEventSource(InformerConfiguration configuration, KubernetesCli public InformerEventSource(InformerConfiguration configuration, KubernetesClient client, boolean parseResourceVersions) { - super(client.resources(configuration.getResourceClass()), configuration, parseResourceVersions); + super( + configuration.getGroupVersionKind() + .map(gvk -> client.genericKubernetesResources(gvk.apiVersion(), gvk.getKind())) + .orElseGet(() -> (MixedOperation) client.resources(configuration.getResourceClass())), + configuration, parseResourceVersions); // If there is a primary to secondary mapper there is no need for primary to secondary index. primaryToSecondaryMapper = configuration.getPrimaryToSecondaryMapper(); if (primaryToSecondaryMapper == null) { diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java index 7a1a6ba310..87e4113013 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java @@ -9,9 +9,7 @@ import org.slf4j.LoggerFactory; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.KubernetesResourceList; import io.fabric8.kubernetes.client.dsl.MixedOperation; -import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.javaoperatorsdk.operator.OperatorException; import io.javaoperatorsdk.operator.api.config.ConfigurationService; @@ -40,10 +38,12 @@ public abstract class ManagedInformerEventSource>> indexers = new HashMap<>(); protected TemporaryResourceCache temporaryResourceCache; - protected MixedOperation, Resource> client; + protected MixedOperation client; + + protected ManagedInformerEventSource( - MixedOperation, Resource> client, C configuration, + MixedOperation client, C configuration, boolean parseResourceVersions) { super(configuration.getResourceClass()); this.parseResourceVersions = parseResourceVersions; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java index 580215db6a..bab3a9cb8e 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -3,14 +3,24 @@ 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.GenericKubernetesResource; +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.client.KubernetesClientBuilder; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneCustomResource; import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneSpec; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; public class GenericKubernetesDependentStandaloneIT { + public static final String INITIAL_DATA = "Initial data"; + @RegisterExtension LocallyRunOperatorExtension operator = LocallyRunOperatorExtension.builder() @@ -18,30 +28,54 @@ public class GenericKubernetesDependentStandaloneIT { .withReconciler(new GenericKubernetesDependentStandaloneReconciler()) .build(); + @Test + void testReconcile() { + operator.create(testResource()); + + await().untilAsserted(() -> { + var cm = operator.get(ConfigMap.class, "test1"); + assertThat(cm).isNotNull(); + assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA); + }); + } + + GenericKubernetesDependentStandaloneCustomResource testResource() { + var resource = new GenericKubernetesDependentStandaloneCustomResource(); + resource.setMetadata(new ObjectMetaBuilder() + .withName("test1") + .build()); + resource.setSpec(new GenericKubernetesDependentStandaloneSpec()); + resource.getSpec().setValue(INITIAL_DATA); + + return resource; + } + + // @Test void testInformer() { GenericKubernetesResource res = new GenericKubernetesResource(); res.setApiVersion("v1"); res.setKind("ConfigMap"); try (var client = new KubernetesClientBuilder().build()) { - client.resource(res).inform().addEventHandler(new ResourceEventHandler<>() { - @Override - public void onAdd(GenericKubernetesResource genericKubernetesResource) { - System.out.println(genericKubernetesResource); - } - - @Override - public void onUpdate(GenericKubernetesResource genericKubernetesResource, - GenericKubernetesResource t1) { - System.out.println(genericKubernetesResource); - } - - @Override - public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) { - System.out.println(genericKubernetesResource); - } - }); + client.genericKubernetesResources("v1", "ConfigMap").inAnyNamespace().inform() + .addEventHandler(new ResourceEventHandler<>() { + @Override + public void onAdd(GenericKubernetesResource genericKubernetesResource) { + System.out.println(genericKubernetesResource); + } + + @Override + public void onUpdate(GenericKubernetesResource genericKubernetesResource, + GenericKubernetesResource t1) { + System.out.println(genericKubernetesResource); + } + + @Override + public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) { + System.out.println(genericKubernetesResource); + } + }); } } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java index a456660dd8..235f078b86 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java @@ -1,8 +1,13 @@ package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.javaoperatorsdk.operator.api.reconciler.Context; import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; import io.javaoperatorsdk.operator.processing.dependent.Creator; import io.javaoperatorsdk.operator.processing.dependent.Updater; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesDependentResource; @@ -14,9 +19,12 @@ public class ConfigMapGenericKubernetesDependent extends Updater, Deleter { + public static final String VERSION = "v1"; + public static final String KIND = "ConfigMap"; + public static final String KEY = "key"; public ConfigMapGenericKubernetesDependent() { - super("v1", "ConfigMap"); + super(new GroupVersionKind("", VERSION, KIND)); } @Override @@ -24,8 +32,15 @@ protected GenericKubernetesResource desired( GenericKubernetesDependentStandaloneCustomResource primary, Context context) { - return null; + try (InputStream is = this.getClass().getResourceAsStream("configmap.yaml")) { + var res = context.getClient().genericKubernetesResources(VERSION, KIND).load(is).item(); + res.getMetadata().setName(primary.getMetadata().getName()); + res.getMetadata().setNamespace(primary.getMetadata().getNamespace()); + Map data = (Map) res.getAdditionalProperties().get("data"); + data.put(KEY, primary.getSpec().getValue()); + return res; + } catch (IOException e) { + throw new IllegalStateException(e); + } } - - } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java index 76976bda99..8b53bd79a6 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java @@ -10,6 +10,6 @@ @Version("v1") @ShortNames("gkd") public class GenericKubernetesDependentStandaloneCustomResource - extends CustomResource + extends CustomResource implements Namespaced { } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java index 95f7986727..cee49c346f 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java @@ -20,6 +20,8 @@ public UpdateControl reconci GenericKubernetesDependentStandaloneCustomResource resource, Context context) { + dependent.reconcile(resource, context); + return UpdateControl.noUpdate(); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java new file mode 100644 index 0000000000..309e8b576c --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; + +public class GenericKubernetesDependentStandaloneSpec { + + private String value; + + public String getValue() { + return value; + } + + public GenericKubernetesDependentStandaloneSpec setValue(String value) { + this.value = value; + return this; + } +} diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml new file mode 100644 index 0000000000..3245e257ab --- /dev/null +++ b/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: "" +data: + key: "" \ No newline at end of file From 2430233e717f171bfc13c1c54c67542686cef312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 09:35:40 +0100 Subject: [PATCH 05/15] IT skeleton MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../config/DefaultResourceConfiguration.java | 1 + .../source/informer/InformerWrapper.java | 5 ++ .../informer/ManagedInformerEventSource.java | 6 +-- .../GenericKubernetesDependentManagedIT.java | 48 +++++++++++++++++++ ...enericKubernetesDependentStandaloneIT.java | 2 - .../ConfigMapGenericKubernetesDependent.java | 46 ++++++++++++++++++ ...ernetesDependentManagedCustomResource.java | 15 ++++++ ...cKubernetesDependentManagedReconciler.java | 19 ++++++++ ...GenericKubernetesDependentManagedSpec.java | 15 ++++++ .../ConfigMapGenericKubernetesDependent.java | 6 +-- ...bernetesDependentStandaloneReconciler.java | 2 +- .../configmap.yaml | 0 12 files changed, 155 insertions(+), 10 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java rename operator-framework/src/test/resources/{io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone => }/configmap.yaml (100%) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java index d150cfdfff..7bbc7f1a13 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java @@ -31,6 +31,7 @@ protected DefaultResourceConfiguration(Class resourceClass, ItemStore itemStore, Long informerListLimit) { this.resourceClass = resourceClass; this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class) + // todo better handling? ? GENERIC_KUBERNETES_RESOURCE : ReconcilerUtils.getResourceTypeName(resourceClass); this.onAddFilter = onAddFilter; diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java index 639eac1a59..46e5f09f1d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.informers.ExceptionHandler; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; @@ -113,6 +114,10 @@ public void start() throws OperatorException { private String versionedFullResourceName() { final var apiTypeClass = informer.getApiTypeClass(); + // todo better messages handling + if (apiTypeClass.isAssignableFrom(GenericKubernetesResource.class)) { + return "GenericKubernetesResource"; + } return ReconcilerUtils.getResourceTypeNameWithVersion(apiTypeClass); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java index 87e4113013..64d402ada5 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java @@ -33,15 +33,13 @@ public abstract class ManagedInformerEventSource cache; - private boolean parseResourceVersions; + private final boolean parseResourceVersions; private ConfigurationService configurationService; - private C configuration; + private final C configuration; private Map>> indexers = new HashMap<>(); protected TemporaryResourceCache temporaryResourceCache; protected MixedOperation client; - - protected ManagedInformerEventSource( MixedOperation client, C configuration, boolean parseResourceVersions) { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java new file mode 100644 index 0000000000..8d1bc6b23f --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java @@ -0,0 +1,48 @@ +package io.javaoperatorsdk.operator; + +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.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedCustomResource; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedReconciler; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +public class GenericKubernetesDependentManagedIT { + + public static final String INITIAL_DATA = "Initial data"; + + @RegisterExtension + LocallyRunOperatorExtension operator = + LocallyRunOperatorExtension.builder() + .withReconciler(new GenericKubernetesDependentManagedReconciler()) + .build(); + + @Test + void testReconcile() { + operator.create(testResource()); + + await().untilAsserted(() -> { + var cm = operator.get(ConfigMap.class, "test1"); + assertThat(cm).isNotNull(); + assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA); + }); + } + + GenericKubernetesDependentManagedCustomResource testResource() { + var resource = new GenericKubernetesDependentManagedCustomResource(); + resource.setMetadata(new ObjectMetaBuilder() + .withName("test1") + .build()); + resource.setSpec(new GenericKubernetesDependentManagedSpec()); + resource.getSpec().setValue(INITIAL_DATA); + return resource; + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java index bab3a9cb8e..a81edf1b6b 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -24,11 +24,9 @@ public class GenericKubernetesDependentStandaloneIT { @RegisterExtension LocallyRunOperatorExtension operator = LocallyRunOperatorExtension.builder() - .withConfigurationService(o -> o.withCloseClientOnStop(false)) .withReconciler(new GenericKubernetesDependentStandaloneReconciler()) .build(); - @Test void testReconcile() { operator.create(testResource()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java new file mode 100644 index 0000000000..93afb4e8a9 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java @@ -0,0 +1,46 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.javaoperatorsdk.operator.api.reconciler.Context; +import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; +import io.javaoperatorsdk.operator.processing.dependent.Creator; +import io.javaoperatorsdk.operator.processing.dependent.Updater; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.GenericKubernetesDependentResource; + +public class ConfigMapGenericKubernetesDependent extends + GenericKubernetesDependentResource + implements + Creator, + Updater, + GarbageCollected { + + public static final String VERSION = "v1"; + public static final String KIND = "ConfigMap"; + public static final String KEY = "key"; + + public ConfigMapGenericKubernetesDependent() { + super(new GroupVersionKind("", VERSION, KIND)); + } + + @Override + protected GenericKubernetesResource desired( + GenericKubernetesDependentManagedCustomResource primary, + Context context) { + + try (InputStream is = this.getClass().getResourceAsStream("/configmap.yaml")) { + var res = context.getClient().genericKubernetesResources(VERSION, KIND).load(is).item(); + res.getMetadata().setName(primary.getMetadata().getName()); + res.getMetadata().setNamespace(primary.getMetadata().getNamespace()); + Map data = (Map) res.getAdditionalProperties().get("data"); + data.put(KEY, primary.getSpec().getValue()); + return res; + } catch (IOException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java new file mode 100644 index 0000000000..0521c17f0b --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; + +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.ShortNames; +import io.fabric8.kubernetes.model.annotation.Version; + +@Group("sample.javaoperatorsdk") +@Version("v1") +@ShortNames("gkdm") +public class GenericKubernetesDependentManagedCustomResource + extends CustomResource + implements Namespaced { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java new file mode 100644 index 0000000000..f2251fbdf0 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java @@ -0,0 +1,19 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; + +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; + +@ControllerConfiguration( + dependents = {@Dependent(type = ConfigMapGenericKubernetesDependent.class)}) +public class GenericKubernetesDependentManagedReconciler + implements Reconciler { + + @Override + public UpdateControl reconcile( + GenericKubernetesDependentManagedCustomResource resource, + Context context) { + + return UpdateControl.noUpdate(); + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java new file mode 100644 index 0000000000..3073f3afc0 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; + +public class GenericKubernetesDependentManagedSpec { + + private String value; + + public String getValue() { + return value; + } + + public GenericKubernetesDependentManagedSpec setValue(String value) { + this.value = value; + return this; + } +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java index 235f078b86..331f90c047 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java @@ -6,7 +6,7 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.javaoperatorsdk.operator.api.reconciler.Context; -import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter; +import io.javaoperatorsdk.operator.api.reconciler.dependent.GarbageCollected; import io.javaoperatorsdk.operator.processing.GroupVersionKind; import io.javaoperatorsdk.operator.processing.dependent.Creator; import io.javaoperatorsdk.operator.processing.dependent.Updater; @@ -17,7 +17,7 @@ public class ConfigMapGenericKubernetesDependent extends implements Creator, Updater, - Deleter { + GarbageCollected { public static final String VERSION = "v1"; public static final String KIND = "ConfigMap"; @@ -32,7 +32,7 @@ protected GenericKubernetesResource desired( GenericKubernetesDependentStandaloneCustomResource primary, Context context) { - try (InputStream is = this.getClass().getResourceAsStream("configmap.yaml")) { + try (InputStream is = this.getClass().getResourceAsStream("/configmap.yaml")) { var res = context.getClient().genericKubernetesResources(VERSION, KIND).load(is).item(); res.getMetadata().setName(primary.getMetadata().getName()); res.getMetadata().setNamespace(primary.getMetadata().getNamespace()); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java index cee49c346f..8a68ac043a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java @@ -22,7 +22,7 @@ public UpdateControl reconci dependent.reconcile(resource, context); - return UpdateControl.noUpdate(); + return UpdateControl.noUpdate(); } @Override diff --git a/operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml b/operator-framework/src/test/resources/configmap.yaml similarity index 100% rename from operator-framework/src/test/resources/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/configmap.yaml rename to operator-framework/src/test/resources/configmap.yaml From 5f4abf81eef93bd9fa64a585b1df1b7d0e657817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 12:54:48 +0100 Subject: [PATCH 06/15] inetgration tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../GenericKubernetesDependentManagedIT.java | 32 +++------ ...enericKubernetesDependentStandaloneIT.java | 67 +++---------------- .../GenericKubernetesDependentTestBase.java | 50 ++++++++++++++ ...ernetesDependentManagedCustomResource.java | 2 +- ...va => GenericKubernetesDependentSpec.java} | 4 +- ...etesDependentStandaloneCustomResource.java | 3 +- ...ericKubernetesDependentStandaloneSpec.java | 15 ----- 7 files changed, 77 insertions(+), 96 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/{GenericKubernetesDependentManagedSpec.java => GenericKubernetesDependentSpec.java} (62%) delete mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java index 8d1bc6b23f..af887729ef 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java @@ -1,46 +1,36 @@ package io.javaoperatorsdk.operator; -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.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedCustomResource; import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedReconciler; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedSpec; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; -import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; - -public class GenericKubernetesDependentManagedIT { +public class GenericKubernetesDependentManagedIT + extends GenericKubernetesDependentTestBase { public static final String INITIAL_DATA = "Initial data"; @RegisterExtension - LocallyRunOperatorExtension operator = + LocallyRunOperatorExtension extension = LocallyRunOperatorExtension.builder() .withReconciler(new GenericKubernetesDependentManagedReconciler()) .build(); - @Test - void testReconcile() { - operator.create(testResource()); - - await().untilAsserted(() -> { - var cm = operator.get(ConfigMap.class, "test1"); - assertThat(cm).isNotNull(); - assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA); - }); + @Override + public LocallyRunOperatorExtension extension() { + return extension; } - GenericKubernetesDependentManagedCustomResource testResource() { + @Override + GenericKubernetesDependentManagedCustomResource testResource(String name, String data) { var resource = new GenericKubernetesDependentManagedCustomResource(); resource.setMetadata(new ObjectMetaBuilder() - .withName("test1") + .withName(name) .build()); - resource.setSpec(new GenericKubernetesDependentManagedSpec()); + resource.setSpec(new GenericKubernetesDependentSpec()); resource.getSpec().setValue(INITIAL_DATA); return resource; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java index a81edf1b6b..9b81f4374a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -1,80 +1,35 @@ package io.javaoperatorsdk.operator; -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.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; -import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneCustomResource; import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneSpec; -import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; - -public class GenericKubernetesDependentStandaloneIT { - - public static final String INITIAL_DATA = "Initial data"; +public class GenericKubernetesDependentStandaloneIT + extends GenericKubernetesDependentTestBase { @RegisterExtension - LocallyRunOperatorExtension operator = + LocallyRunOperatorExtension extension = LocallyRunOperatorExtension.builder() .withReconciler(new GenericKubernetesDependentStandaloneReconciler()) .build(); - @Test - void testReconcile() { - operator.create(testResource()); - - await().untilAsserted(() -> { - var cm = operator.get(ConfigMap.class, "test1"); - assertThat(cm).isNotNull(); - assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA); - }); + @Override + public LocallyRunOperatorExtension extension() { + return extension; } - GenericKubernetesDependentStandaloneCustomResource testResource() { + @Override + GenericKubernetesDependentStandaloneCustomResource testResource(String name, String data) { var resource = new GenericKubernetesDependentStandaloneCustomResource(); resource.setMetadata(new ObjectMetaBuilder() - .withName("test1") + .withName(name) .build()); - resource.setSpec(new GenericKubernetesDependentStandaloneSpec()); + resource.setSpec(new GenericKubernetesDependentSpec()); resource.getSpec().setValue(INITIAL_DATA); - return resource; } - - // @Test - void testInformer() { - GenericKubernetesResource res = new GenericKubernetesResource(); - res.setApiVersion("v1"); - res.setKind("ConfigMap"); - - try (var client = new KubernetesClientBuilder().build()) { - client.genericKubernetesResources("v1", "ConfigMap").inAnyNamespace().inform() - .addEventHandler(new ResourceEventHandler<>() { - @Override - public void onAdd(GenericKubernetesResource genericKubernetesResource) { - System.out.println(genericKubernetesResource); - } - - @Override - public void onUpdate(GenericKubernetesResource genericKubernetesResource, - GenericKubernetesResource t1) { - System.out.println(genericKubernetesResource); - } - - @Override - public void onDelete(GenericKubernetesResource genericKubernetesResource, boolean b) { - System.out.println(genericKubernetesResource); - } - }); - } - } - } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java new file mode 100644 index 0000000000..0d471a396f --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java @@ -0,0 +1,50 @@ +package io.javaoperatorsdk.operator; + +import org.junit.jupiter.api.Test; + +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.client.CustomResource; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +public abstract class GenericKubernetesDependentTestBase> { + + public static final String INITIAL_DATA = "Initial data"; + public static final String CHANGED_DATA = "Changed data"; + public static final String TEST_RESOURCE_NAME = "test1"; + + @Test + void testReconciliation() { + var resource = extension().create(testResource(TEST_RESOURCE_NAME, INITIAL_DATA)); + + await().untilAsserted(() -> { + var cm = extension().get(ConfigMap.class, TEST_RESOURCE_NAME); + assertThat(cm).isNotNull(); + assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, INITIAL_DATA); + }); + + resource.getSpec().setValue(CHANGED_DATA); + resource = extension().replace(resource); + + await().untilAsserted(() -> { + var cm = extension().get(ConfigMap.class, TEST_RESOURCE_NAME); + assertThat(cm.getData()).containsEntry(ConfigMapGenericKubernetesDependent.KEY, CHANGED_DATA); + }); + + extension().delete(resource); + + await().untilAsserted(() -> { + var cm = extension().get(ConfigMap.class, TEST_RESOURCE_NAME); + assertThat(cm).isNull(); + }); + } + + public abstract LocallyRunOperatorExtension extension(); + + abstract R testResource(String name, String data); + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java index 0521c17f0b..6ac3b56330 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java @@ -10,6 +10,6 @@ @Version("v1") @ShortNames("gkdm") public class GenericKubernetesDependentManagedCustomResource - extends CustomResource + extends CustomResource implements Namespaced { } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java similarity index 62% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java index 3073f3afc0..b6f80ceb6c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedSpec.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java @@ -1,6 +1,6 @@ package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; -public class GenericKubernetesDependentManagedSpec { +public class GenericKubernetesDependentSpec { private String value; @@ -8,7 +8,7 @@ public String getValue() { return value; } - public GenericKubernetesDependentManagedSpec setValue(String value) { + public GenericKubernetesDependentSpec setValue(String value) { this.value = value; return this; } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java index 8b53bd79a6..28ceef2e32 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java @@ -5,11 +5,12 @@ import io.fabric8.kubernetes.model.annotation.Group; import io.fabric8.kubernetes.model.annotation.ShortNames; import io.fabric8.kubernetes.model.annotation.Version; +import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; @Group("sample.javaoperatorsdk") @Version("v1") @ShortNames("gkd") public class GenericKubernetesDependentStandaloneCustomResource - extends CustomResource + extends CustomResource implements Namespaced { } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java deleted file mode 100644 index 309e8b576c..0000000000 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneSpec.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; - -public class GenericKubernetesDependentStandaloneSpec { - - private String value; - - public String getValue() { - return value; - } - - public GenericKubernetesDependentStandaloneSpec setValue(String value) { - this.value = value; - return this; - } -} From 21043b4cf4308ef4b0ea354bed02599ae90af343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 13:56:44 +0100 Subject: [PATCH 07/15] increase IT timeout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/GenericKubernetesDependentManagedIT.java | 6 +++--- .../operator/GenericKubernetesDependentStandaloneIT.java | 6 +++--- .../operator/GenericKubernetesDependentTestBase.java | 8 +++++--- .../GenericKubernetesDependentSpec.java | 2 +- .../ConfigMapGenericKubernetesDependent.java | 2 +- .../GenericKubernetesDependentManagedCustomResource.java | 3 ++- .../GenericKubernetesDependentManagedReconciler.java | 2 +- .../ConfigMapGenericKubernetesDependent.java | 2 +- ...enericKubernetesDependentStandaloneCustomResource.java | 4 ++-- .../GenericKubernetesDependentStandaloneReconciler.java | 2 +- 10 files changed, 20 insertions(+), 17 deletions(-) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{generickubernetesdependentresourcemanaged => generickubernetesresource}/GenericKubernetesDependentSpec.java (73%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java (94%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java (70%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java (86%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java (94%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java (70%) rename operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/{ => generickubernetesresource}/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java (91%) diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java index af887729ef..e2222d1a58 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java @@ -4,9 +4,9 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedCustomResource; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedReconciler; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedCustomResource; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentresourcemanaged.GenericKubernetesDependentManagedReconciler; public class GenericKubernetesDependentManagedIT extends GenericKubernetesDependentTestBase { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java index 9b81f4374a..708d2f119c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentStandaloneIT.java @@ -4,9 +4,9 @@ import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneCustomResource; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneCustomResource; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone.GenericKubernetesDependentStandaloneReconciler; public class GenericKubernetesDependentStandaloneIT extends GenericKubernetesDependentTestBase { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java index 0d471a396f..8ef0e6d76c 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java @@ -5,8 +5,10 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.client.CustomResource; import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; + +import java.time.Duration; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -37,7 +39,7 @@ void testReconciliation() { extension().delete(resource); - await().untilAsserted(() -> { + await().timeout(Duration.ofSeconds(30)).untilAsserted(() -> { var cm = extension().get(ConfigMap.class, TEST_RESOURCE_NAME); assertThat(cm).isNull(); }); diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/GenericKubernetesDependentSpec.java similarity index 73% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/GenericKubernetesDependentSpec.java index b6f80ceb6c..050e0cf520 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentSpec.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/GenericKubernetesDependentSpec.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; +package io.javaoperatorsdk.operator.sample.generickubernetesresource; public class GenericKubernetesDependentSpec { diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java similarity index 94% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java index 93afb4e8a9..d5ab470cfb 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/ConfigMapGenericKubernetesDependent.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentresourcemanaged; import java.io.IOException; import java.io.InputStream; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java similarity index 70% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java index 6ac3b56330..d7c44ddab3 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedCustomResource.java @@ -1,10 +1,11 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentresourcemanaged; 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.ShortNames; import io.fabric8.kubernetes.model.annotation.Version; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; @Group("sample.javaoperatorsdk") @Version("v1") diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java similarity index 86% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java index f2251fbdf0..64651ec23e 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentresourcemanaged/GenericKubernetesDependentManagedReconciler.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentresourcemanaged; import io.javaoperatorsdk.operator.api.reconciler.*; import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java similarity index 94% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java index 331f90c047..4efc968ef0 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/ConfigMapGenericKubernetesDependent.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone; import java.io.IOException; import java.io.InputStream; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java similarity index 70% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java index 28ceef2e32..38eaf804e4 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneCustomResource.java @@ -1,11 +1,11 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone; 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.ShortNames; import io.fabric8.kubernetes.model.annotation.Version; -import io.javaoperatorsdk.operator.sample.generickubernetesdependentresourcemanaged.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; @Group("sample.javaoperatorsdk") @Version("v1") diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java similarity index 91% rename from operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java rename to operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java index 8a68ac043a..1969ad8f2a 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesdependentstandalone/GenericKubernetesDependentStandaloneReconciler.java @@ -1,4 +1,4 @@ -package io.javaoperatorsdk.operator.sample.generickubernetesdependentstandalone; +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone; import java.util.Map; From 0f16ef4177386348b6819950f8eb4f7bb1456c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 14:35:07 +0100 Subject: [PATCH 08/15] pure resource handling test 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 | 10 ++- .../GenericKubernetesDependentManagedIT.java | 2 - .../GenericKubernetesDependentTestBase.java | 4 +- .../GenericKubernetesResourceHandlingIT.java | 36 +++++++++ ...ernetesResourceHandlingCustomResource.java | 16 ++++ ...cKubernetesResourceHandlingReconciler.java | 77 +++++++++++++++++++ 6 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesResourceHandlingIT.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingCustomResource.java create mode 100644 operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingReconciler.java 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 b2e5b147dd..bca39b189c 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 @@ -275,6 +275,9 @@ static InformerConfigurationBuilder from( return new InformerConfigurationBuilder<>(resourceClass); } + /** + * * For the case when want to use {@link GenericKubernetesResource} + */ static InformerConfigurationBuilder from( GroupVersionKind groupVersionKind) { return new InformerConfigurationBuilder<>(groupVersionKind); @@ -295,10 +298,13 @@ static InformerConfigurationBuilder from( .withNamespacesInheritedFromController(eventSourceContext); } + /** + * * For the case when want to use {@link GenericKubernetesResource} + */ @SuppressWarnings("unchecked") - static InformerConfigurationBuilder from( + static InformerConfigurationBuilder from( GroupVersionKind groupVersionKind, EventSourceContext eventSourceContext) { - return (InformerConfigurationBuilder) new InformerConfigurationBuilder<>(groupVersionKind) + return new InformerConfigurationBuilder(groupVersionKind) .withNamespacesInheritedFromController(eventSourceContext); } diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java index e2222d1a58..f06185d402 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentManagedIT.java @@ -11,8 +11,6 @@ public class GenericKubernetesDependentManagedIT extends GenericKubernetesDependentTestBase { - public static final String INITIAL_DATA = "Initial data"; - @RegisterExtension LocallyRunOperatorExtension extension = LocallyRunOperatorExtension.builder() diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java index 8ef0e6d76c..fea23b7796 100644 --- a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesDependentTestBase.java @@ -1,5 +1,7 @@ package io.javaoperatorsdk.operator; +import java.time.Duration; + import org.junit.jupiter.api.Test; import io.fabric8.kubernetes.api.model.ConfigMap; @@ -8,8 +10,6 @@ import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesdependentstandalone.ConfigMapGenericKubernetesDependent; -import java.time.Duration; - import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesResourceHandlingIT.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesResourceHandlingIT.java new file mode 100644 index 0000000000..b3ee935553 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/GenericKubernetesResourceHandlingIT.java @@ -0,0 +1,36 @@ +package io.javaoperatorsdk.operator; + +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; +import io.javaoperatorsdk.operator.junit.LocallyRunOperatorExtension; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesresourcehandling.GenericKubernetesResourceHandlingCustomResource; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesresourcehandling.GenericKubernetesResourceHandlingReconciler; + +public class GenericKubernetesResourceHandlingIT + extends GenericKubernetesDependentTestBase { + + @RegisterExtension + LocallyRunOperatorExtension extension = + LocallyRunOperatorExtension.builder() + .withReconciler(new GenericKubernetesResourceHandlingReconciler()) + .build(); + + @Override + public LocallyRunOperatorExtension extension() { + return extension; + } + + @Override + GenericKubernetesResourceHandlingCustomResource testResource(String name, String data) { + var resource = new GenericKubernetesResourceHandlingCustomResource(); + resource.setMetadata(new ObjectMetaBuilder() + .withName(name) + .build()); + resource.setSpec(new GenericKubernetesDependentSpec()); + resource.getSpec().setValue(INITIAL_DATA); + return resource; + } + +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingCustomResource.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingCustomResource.java new file mode 100644 index 0000000000..47b3a14a5a --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingCustomResource.java @@ -0,0 +1,16 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesresourcehandling; + +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.ShortNames; +import io.fabric8.kubernetes.model.annotation.Version; +import io.javaoperatorsdk.operator.sample.generickubernetesresource.GenericKubernetesDependentSpec; + +@Group("sample.javaoperatorsdk") +@Version("v1") +@ShortNames("gkrr") +public class GenericKubernetesResourceHandlingCustomResource + extends CustomResource + implements Namespaced { +} diff --git a/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingReconciler.java b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingReconciler.java new file mode 100644 index 0000000000..45be0281f6 --- /dev/null +++ b/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource/generickubernetesresourcehandling/GenericKubernetesResourceHandlingReconciler.java @@ -0,0 +1,77 @@ +package io.javaoperatorsdk.operator.sample.generickubernetesresource.generickubernetesresourcehandling; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; +import io.javaoperatorsdk.operator.api.reconciler.*; +import io.javaoperatorsdk.operator.processing.GroupVersionKind; +import io.javaoperatorsdk.operator.processing.event.source.EventSource; +import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; + +@ControllerConfiguration +public class GenericKubernetesResourceHandlingReconciler + implements Reconciler, + EventSourceInitializer { + + + public static final String VERSION = "v1"; + public static final String KIND = "ConfigMap"; + public static final String KEY = "key"; + + @Override + public UpdateControl reconcile( + GenericKubernetesResourceHandlingCustomResource primary, + Context context) { + + var secondary = context.getSecondaryResource(GenericKubernetesResource.class); + + secondary.ifPresentOrElse(r -> { + var desired = desiredConfigMap(primary, context); + if (!matches(r, desired)) { + context.getClient().genericKubernetesResources(VERSION, KIND).resource(desired).update(); + } + }, () -> context.getClient().genericKubernetesResources(VERSION, KIND) + .resource(desiredConfigMap(primary, context)).create()); + + return UpdateControl.noUpdate(); + } + + @SuppressWarnings("unchecked") + private boolean matches(GenericKubernetesResource actual, GenericKubernetesResource desired) { + var actualData = (HashMap) actual.getAdditionalProperties().get("data"); + var desiredData = (HashMap) desired.getAdditionalProperties().get("data"); + return actualData.equals(desiredData); + } + + GenericKubernetesResource desiredConfigMap( + GenericKubernetesResourceHandlingCustomResource primary, + Context context) { + try (InputStream is = this.getClass().getResourceAsStream("/configmap.yaml")) { + var res = context.getClient().genericKubernetesResources(VERSION, KIND).load(is).item(); + res.getMetadata().setName(primary.getMetadata().getName()); + res.getMetadata().setNamespace(primary.getMetadata().getNamespace()); + Map data = (Map) res.getAdditionalProperties().get("data"); + data.put(KEY, primary.getSpec().getValue()); + res.addOwnerReference(primary); + return res; + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + + @Override + public Map prepareEventSources( + EventSourceContext context) { + + var informerEventSource = new InformerEventSource<>(InformerConfiguration.from( + new GroupVersionKind("", VERSION, KIND), context).build(), + context); + + return EventSourceInitializer.nameEventSources(informerEventSource); + } +} From 7181b01deeec19753ac1bd80e61de7397fd8f1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 14:45:06 +0100 Subject: [PATCH 09/15] handling informer for GenericKubernetesDependentResource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../GenericKubernetesDependentResource.java | 14 ++------------ .../kubernetes/KubernetesDependentResource.java | 6 +++++- 2 files changed, 7 insertions(+), 13 deletions(-) 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 ea70f3ef6e..98f2346577 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 @@ -3,9 +3,7 @@ import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration; -import io.javaoperatorsdk.operator.api.reconciler.EventSourceContext; import io.javaoperatorsdk.operator.processing.GroupVersionKind; -import io.javaoperatorsdk.operator.processing.event.source.informer.InformerEventSource; public class GenericKubernetesDependentResource

extends KubernetesDependentResource { @@ -17,16 +15,8 @@ public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) { this.groupVersionKind = groupVersionKind; } - // todo super functionality filters etc - @Override - protected InformerEventSource createEventSource( - EventSourceContext

context) { - var es = new InformerEventSource<>( - InformerConfiguration.from(groupVersionKind, context) - .build(), - context); - - return es; + protected InformerConfiguration.InformerConfigurationBuilder informerConfigurationBuilder() { + return InformerConfiguration.from(groupVersionKind); } public GroupVersionKind getGroupVersionKind() { 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 6d0d50c9f8..f2cf25eade 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 @@ -67,7 +67,7 @@ private void configureWith(String labelSelector, Set namespaces, namespaces = context.getControllerConfiguration().getNamespaces(); } - var ic = InformerConfiguration.from(resourceType()) + var ic = informerConfigurationBuilder() .withLabelSelector(labelSelector) .withSecondaryToPrimaryMapper(getSecondaryToPrimaryMapper()) .withNamespaces(namespaces, inheritNamespacesOnChange) @@ -76,6 +76,10 @@ private void configureWith(String labelSelector, Set namespaces, configureWith(new InformerEventSource<>(ic, context)); } + protected InformerConfiguration.InformerConfigurationBuilder informerConfigurationBuilder() { + return InformerConfiguration.from(resourceType()); + } + @SuppressWarnings("unchecked") private SecondaryToPrimaryMapper getSecondaryToPrimaryMapper() { if (this instanceof SecondaryToPrimaryMapper) { From 8041c16e61d234d7a9dc45a99da6e19c9707fbe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 15:03:56 +0100 Subject: [PATCH 10/15] fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/api/config/DefaultResourceConfiguration.java | 3 ++- .../dependent/kubernetes/KubernetesDependentResource.java | 1 + .../processing/event/source/informer/InformerWrapper.java | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java index 7bbc7f1a13..c06b947feb 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java @@ -31,7 +31,8 @@ protected DefaultResourceConfiguration(Class resourceClass, ItemStore itemStore, Long informerListLimit) { this.resourceClass = resourceClass; this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class) - // todo better handling? + // in general this is irrelevant now for secondary resources it is used just by controller + // where GenericKubernetesResource now does not apply ? GENERIC_KUBERNETES_RESOURCE : ReconcilerUtils.getResourceTypeName(resourceClass); this.onAddFilter = onAddFilter; 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 f2cf25eade..a4305df502 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 @@ -76,6 +76,7 @@ private void configureWith(String labelSelector, Set namespaces, configureWith(new InformerEventSource<>(ic, context)); } + // just to seamlessly handle GenericKubernetesDependentResource protected InformerConfiguration.InformerConfigurationBuilder informerConfigurationBuilder() { return InformerConfiguration.from(resourceType()); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java index 46e5f09f1d..28cf33a041 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerWrapper.java @@ -114,9 +114,8 @@ public void start() throws OperatorException { private String versionedFullResourceName() { final var apiTypeClass = informer.getApiTypeClass(); - // todo better messages handling if (apiTypeClass.isAssignableFrom(GenericKubernetesResource.class)) { - return "GenericKubernetesResource"; + return GenericKubernetesResource.class.getSimpleName(); } return ReconcilerUtils.getResourceTypeNameWithVersion(apiTypeClass); } From 41c8f9f1ba7354b48d6c6b04e96d1449218fb16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 16:06:39 +0100 Subject: [PATCH 11/15] minor improvement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/api/config/DefaultResourceConfiguration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java index c06b947feb..f8ee9f4e84 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceConfiguration.java @@ -14,7 +14,6 @@ public class DefaultResourceConfiguration implements ResourceConfiguration { - public static final String GENERIC_KUBERNETES_RESOURCE = "generickubernetesresource"; private final Class resourceClass; private final String resourceTypeName; private final OnAddFilter onAddFilter; @@ -33,7 +32,7 @@ protected DefaultResourceConfiguration(Class resourceClass, this.resourceTypeName = resourceClass.isAssignableFrom(GenericKubernetesResource.class) // in general this is irrelevant now for secondary resources it is used just by controller // where GenericKubernetesResource now does not apply - ? GENERIC_KUBERNETES_RESOURCE + ? GenericKubernetesResource.class.getSimpleName() : ReconcilerUtils.getResourceTypeName(resourceClass); this.onAddFilter = onAddFilter; this.onUpdateFilter = onUpdateFilter; From 67c571aaa91e024f1b23dc77f55c2807a34ff2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 1 Dec 2023 16:14:06 +0100 Subject: [PATCH 12/15] docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- docs/documentation/dependent-resources.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/documentation/dependent-resources.md b/docs/documentation/dependent-resources.md index 06149cf8ba..7678e997e6 100644 --- a/docs/documentation/dependent-resources.md +++ b/docs/documentation/dependent-resources.md @@ -483,6 +483,16 @@ also be created, one per dependent resource. See [integration test](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/ExternalStateBulkIT.java) as a sample. + +## GenericKubernetesResource based Dependent Resources + +In rare circumstances resource handling where there is no class representation or just typeless handling might be needed. +Fabric8 Client provides [GenericKubernetesResource](https://github.com/fabric8io/kubernetes-client/blob/main/doc/CHEATSHEET.md#resource-typeless-api) +to support that. + +For dependent resource this is supported by [GenericKubernetesDependentResource](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java#L8-L8) +. See samples [here](https://github.com/java-operator-sdk/java-operator-sdk/tree/main/operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/generickubernetesresource). + ## Other Dependent Resource Features ### Caching and Event Handling in [KubernetesDependentResource](https://github.com/java-operator-sdk/java-operator-sdk/blob/main/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java) From dd53037dd5647c87915f787ce26c6203772ed1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 5 Dec 2023 14:21:11 +0100 Subject: [PATCH 13/15] gvk enhancement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/processing/GroupVersionKind.java | 12 +++++++++++ .../processing/GroupVersionKindTest.java | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/GroupVersionKindTest.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java index 855ff1dfde..4960ab5eb6 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java @@ -7,6 +7,18 @@ public class GroupVersionKind { private final String version; private final String kind; + public GroupVersionKind(String apiVersion, String kind) { + this.kind = kind; + String[] groupAndVersion = apiVersion.split("/"); + if (groupAndVersion.length == 1) { + this.group = null; + this.version = groupAndVersion[0]; + } else { + this.group = groupAndVersion[0]; + this.version = groupAndVersion[1]; + } + } + public GroupVersionKind(String group, String version, String kind) { this.group = group; this.version = version; diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/GroupVersionKindTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/GroupVersionKindTest.java new file mode 100644 index 0000000000..ad69cae800 --- /dev/null +++ b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/GroupVersionKindTest.java @@ -0,0 +1,21 @@ +package io.javaoperatorsdk.operator.processing; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class GroupVersionKindTest { + + @Test + void testInitFromApiVersion() { + var gvk = new GroupVersionKind("v1", "ConfigMap"); + assertThat(gvk.getGroup()).isNull(); + assertThat(gvk.getVersion()).isEqualTo("v1"); + + gvk = new GroupVersionKind("apps/v1", "Deployment"); + assertThat(gvk.getGroup()).isEqualTo("apps"); + assertThat(gvk.getVersion()).isEqualTo("v1"); + } + +} From b6e6f52e718a81371827be577e23ab1d32025bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 5 Dec 2023 15:01:31 +0100 Subject: [PATCH 14/15] equals & hash for gvk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/processing/GroupVersionKind.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java index 4960ab5eb6..4350cd1ee8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java @@ -1,5 +1,7 @@ package io.javaoperatorsdk.operator.processing; +import java.util.Objects; + import io.fabric8.kubernetes.api.model.HasMetadata; public class GroupVersionKind { @@ -45,4 +47,20 @@ public String getKind() { public String apiVersion() { return group == null || group.isBlank() ? version : group + "/" + version; } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + GroupVersionKind that = (GroupVersionKind) o; + return Objects.equals(group, that.group) && Objects.equals(version, that.version) + && Objects.equals(kind, that.kind); + } + + @Override + public int hashCode() { + return Objects.hash(group, version, kind); + } } From f00dd5ec36d5afb87de65f4d5713b482010f7f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Tue, 5 Dec 2023 15:06:52 +0100 Subject: [PATCH 15/15] to string for gvk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Attila Mészáros --- .../operator/processing/GroupVersionKind.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java index 4350cd1ee8..9e5cbea14d 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/GroupVersionKind.java @@ -63,4 +63,13 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(group, version, kind); } + + @Override + public String toString() { + return "GroupVersionKind{" + + "group='" + group + '\'' + + ", version='" + version + '\'' + + ", kind='" + kind + '\'' + + '}'; + } }