From 5024b2422863d635572c1b42e63f2c0b81836c02 Mon Sep 17 00:00:00 2001 From: csviri Date: Thu, 23 Feb 2023 10:44:12 +0100 Subject: [PATCH 1/6] feat: configure resource class and name for controller --- .../ControllerConfigurationOverrider.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index 4a3efbc4a6..a2aed5aede 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -36,20 +36,24 @@ public class ControllerConfigurationOverrider { private GenericFilter genericFilter; private RateLimiter rateLimiter; private Map configurations; + private Class resourceClass; + private String name; private ControllerConfigurationOverrider(ControllerConfiguration original) { - finalizer = original.getFinalizerName(); - generationAware = original.isGenerationAware(); - namespaces = new HashSet<>(original.getNamespaces()); - retry = original.getRetry(); - labelSelector = original.getLabelSelector(); - customResourcePredicate = original.getEventFilter(); - reconciliationMaxInterval = original.maxReconciliationInterval().orElse(null); + this.finalizer = original.getFinalizerName(); + this.generationAware = original.isGenerationAware(); + this.namespaces = new HashSet<>(original.getNamespaces()); + this.retry = original.getRetry(); + this.labelSelector = original.getLabelSelector(); + this.customResourcePredicate = original.getEventFilter(); + this.reconciliationMaxInterval = original.maxReconciliationInterval().orElse(null); this.onAddFilter = original.onAddFilter().orElse(null); this.onUpdateFilter = original.onUpdateFilter().orElse(null); this.genericFilter = original.genericFilter().orElse(null); this.original = original; this.rateLimiter = original.getRateLimiter(); + this.resourceClass = original.getResourceClass(); + this.name = original.getName(); } public ControllerConfigurationOverrider withFinalizer(String finalizer) { @@ -152,6 +156,16 @@ public ControllerConfigurationOverrider withGenericFilter(GenericFilter ge return this; } + public ControllerConfigurationOverrider withName(String name) { + this.name = name; + return this; + } + + public ControllerConfigurationOverrider withResourceClass(Class resourceClass) { + this.resourceClass = resourceClass; + return this; + } + public ControllerConfigurationOverrider replacingNamedDependentResourceConfig(String name, Object dependentResourceConfig) { @@ -165,13 +179,12 @@ public ControllerConfigurationOverrider replacingNamedDependentResourceConfig configurations = new HashMap<>(specs.size()); } configurations.put(spec, dependentResourceConfig); - return this; } public ControllerConfiguration build() { final var overridden = new ResolvedControllerConfiguration<>( - original.getResourceClass(), original.getName(), + resourceClass, name, generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter, reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter, original.getDependentResources(), From fa57cd7db6e80613156381d72a3978d71bcb8a08 Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 27 Feb 2023 10:18:21 +0100 Subject: [PATCH 2/6] CR updates --- .../api/config/ControllerConfigurationOverrider.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index a2aed5aede..74a1d78a07 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -36,7 +36,6 @@ public class ControllerConfigurationOverrider { private GenericFilter genericFilter; private RateLimiter rateLimiter; private Map configurations; - private Class resourceClass; private String name; private ControllerConfigurationOverrider(ControllerConfiguration original) { @@ -52,7 +51,6 @@ private ControllerConfigurationOverrider(ControllerConfiguration original) { this.genericFilter = original.genericFilter().orElse(null); this.original = original; this.rateLimiter = original.getRateLimiter(); - this.resourceClass = original.getResourceClass(); this.name = original.getName(); } @@ -161,11 +159,6 @@ public ControllerConfigurationOverrider withName(String name) { return this; } - public ControllerConfigurationOverrider withResourceClass(Class resourceClass) { - this.resourceClass = resourceClass; - return this; - } - public ControllerConfigurationOverrider replacingNamedDependentResourceConfig(String name, Object dependentResourceConfig) { @@ -183,8 +176,8 @@ public ControllerConfigurationOverrider replacingNamedDependentResourceConfig } public ControllerConfiguration build() { - final var overridden = new ResolvedControllerConfiguration<>( - resourceClass, name, + final var overridden = new ResolvedControllerConfiguration<>(original.getResourceClass(), + name, generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter, reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter, original.getDependentResources(), From 326fc1ed8e95538b84298a69ff6efc4327c0dcca Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 27 Feb 2023 10:55:51 +0100 Subject: [PATCH 3/6] revert removing resource class --- .../api/config/ControllerConfigurationOverrider.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index 74a1d78a07..c6a7e4d3e8 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -36,6 +36,7 @@ public class ControllerConfigurationOverrider { private GenericFilter genericFilter; private RateLimiter rateLimiter; private Map configurations; + private Class resourceClass; private String name; private ControllerConfigurationOverrider(ControllerConfiguration original) { @@ -51,6 +52,7 @@ private ControllerConfigurationOverrider(ControllerConfiguration original) { this.genericFilter = original.genericFilter().orElse(null); this.original = original; this.rateLimiter = original.getRateLimiter(); + this.resourceClass = original.getResourceClass(); this.name = original.getName(); } @@ -159,6 +161,11 @@ public ControllerConfigurationOverrider withName(String name) { return this; } + public ControllerConfigurationOverrider withResourceClass(Class resourceClass) { + this.resourceClass = resourceClass; + return this; + } + public ControllerConfigurationOverrider replacingNamedDependentResourceConfig(String name, Object dependentResourceConfig) { @@ -176,7 +183,7 @@ public ControllerConfigurationOverrider replacingNamedDependentResourceConfig } public ControllerConfiguration build() { - final var overridden = new ResolvedControllerConfiguration<>(original.getResourceClass(), + final var overridden = new ResolvedControllerConfiguration<>(resourceClass, name, generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter, reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter, From bc381e17c7c34ffb089b40f07f1fe86648d5929a Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 27 Feb 2023 13:09:07 +0100 Subject: [PATCH 4/6] Revert "revert removing resource class" This reverts commit 326fc1ed8e95538b84298a69ff6efc4327c0dcca. --- .../api/config/ControllerConfigurationOverrider.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java index c6a7e4d3e8..74a1d78a07 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationOverrider.java @@ -36,7 +36,6 @@ public class ControllerConfigurationOverrider { private GenericFilter genericFilter; private RateLimiter rateLimiter; private Map configurations; - private Class resourceClass; private String name; private ControllerConfigurationOverrider(ControllerConfiguration original) { @@ -52,7 +51,6 @@ private ControllerConfigurationOverrider(ControllerConfiguration original) { this.genericFilter = original.genericFilter().orElse(null); this.original = original; this.rateLimiter = original.getRateLimiter(); - this.resourceClass = original.getResourceClass(); this.name = original.getName(); } @@ -161,11 +159,6 @@ public ControllerConfigurationOverrider withName(String name) { return this; } - public ControllerConfigurationOverrider withResourceClass(Class resourceClass) { - this.resourceClass = resourceClass; - return this; - } - public ControllerConfigurationOverrider replacingNamedDependentResourceConfig(String name, Object dependentResourceConfig) { @@ -183,7 +176,7 @@ public ControllerConfigurationOverrider replacingNamedDependentResourceConfig } public ControllerConfiguration build() { - final var overridden = new ResolvedControllerConfiguration<>(resourceClass, + final var overridden = new ResolvedControllerConfiguration<>(original.getResourceClass(), name, generationAware, original.getAssociatedReconcilerClassName(), retry, rateLimiter, reconciliationMaxInterval, onAddFilter, onUpdateFilter, genericFilter, From 0e054c8213e85bd11eb2df63e6f18ce8ac301407 Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 27 Feb 2023 16:30:16 +0100 Subject: [PATCH 5/6] add resolver to config service --- .../api/config/BaseConfigurationService.java | 5 ++-- .../api/config/ConfigurationService.java | 4 +++ .../config/ConfigurationServiceOverrider.java | 13 +++++++++ .../api/config/ControllerConfiguration.java | 5 +--- .../config/DefaultResourceClassResolver.java | 15 +++++++++++ .../api/config/ResourceClassResolver.java | 10 +++++++ .../config/ControllerConfigurationTest.java | 27 ------------------- 7 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceClassResolver.java create mode 100644 operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ResourceClassResolver.java delete mode 100644 operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java index 2e8895ad87..e294e0babf 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java @@ -105,9 +105,10 @@ protected

ControllerConfiguration

configFor(Reconcile + " annotation for reconciler: " + reconciler); } + Class> reconcilerClass = (Class>) reconciler.getClass(); + final var resourceClass = ConfigurationServiceProvider.instance().getResourceClassResolver() + .getResourceClass(reconcilerClass); - final var resourceClass = (Class

) Utils.getFirstTypeArgumentFromSuperClassOrInterface( - reconciler.getClass(), Reconciler.class); final var name = ReconcilerUtils.getNameFor(reconciler); final var generationAware = valueOrDefault( annotation, diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java index e9249505ab..d7dccd5bb4 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java @@ -206,4 +206,8 @@ default Optional getInformerStoppedHandler() { default ManagedWorkflowFactory getWorkflowFactory() { return ManagedWorkflowFactory.DEFAULT; } + + default ResourceClassResolver getResourceClassResolver() { + return new DefaultResourceClassResolver(); + } } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java index 2b8aee9708..22a4b6e6bd 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationServiceOverrider.java @@ -30,6 +30,7 @@ public class ConfigurationServiceOverrider { private InformerStoppedHandler informerStoppedHandler; private Boolean stopOnInformerErrorDuringStartup; private Duration cacheSyncTimeout; + private ResourceClassResolver resourceClassResolver; ConfigurationServiceOverrider(ConfigurationService original) { this.original = original; @@ -113,6 +114,12 @@ public ConfigurationServiceOverrider withCacheSyncTimeout(Duration cacheSyncTime return this; } + public ConfigurationServiceOverrider withResourceClassResolver( + ResourceClassResolver resourceClassResolver) { + this.resourceClassResolver = resourceClassResolver; + return this; + } + public ConfigurationService build() { return new BaseConfigurationService(original.getVersion(), cloner, objectMapper) { @Override @@ -196,6 +203,12 @@ public boolean stopOnInformerErrorDuringStartup() { public Duration cacheSyncTimeout() { return cacheSyncTimeout != null ? cacheSyncTimeout : super.cacheSyncTimeout(); } + + @Override + public ResourceClassResolver getResourceClassResolver() { + return resourceClassResolver != null ? resourceClassResolver + : super.getResourceClassResolver(); + } }; } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index b2640777a7..de56b5553a 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -113,8 +113,5 @@ default ConfigurationService getConfigurationService() { @SuppressWarnings("unchecked") @Override - default Class

getResourceClass() { - return (Class

) Utils.getFirstTypeArgumentFromSuperClassOrInterface(getClass(), - ControllerConfiguration.class); - } + Class

getResourceClass(); } diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceClassResolver.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceClassResolver.java new file mode 100644 index 0000000000..c038e7d966 --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/DefaultResourceClassResolver.java @@ -0,0 +1,15 @@ +package io.javaoperatorsdk.operator.api.config; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; + +public class DefaultResourceClassResolver implements ResourceClassResolver { + + @SuppressWarnings("unchecked") + @Override + public Class getResourceClass( + Class> reconcilerClass) { + return (Class) Utils.getFirstTypeArgumentFromSuperClassOrInterface(reconcilerClass, + Reconciler.class); + } +} diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ResourceClassResolver.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ResourceClassResolver.java new file mode 100644 index 0000000000..e15d53016a --- /dev/null +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ResourceClassResolver.java @@ -0,0 +1,10 @@ +package io.javaoperatorsdk.operator.api.config; + +import io.fabric8.kubernetes.api.model.HasMetadata; +import io.javaoperatorsdk.operator.api.reconciler.Reconciler; + +public interface ResourceClassResolver { + + Class getResourceClass(Class> reconcilerClass); + +} diff --git a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java b/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java deleted file mode 100644 index 1e78288232..0000000000 --- a/operator-framework-core/src/test/java/io/javaoperatorsdk/operator/api/config/ControllerConfigurationTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.javaoperatorsdk.operator.api.config; - -import org.junit.jupiter.api.Test; - -import io.javaoperatorsdk.operator.sample.simple.TestCustomResource; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class ControllerConfigurationTest { - - @Test - void getCustomResourceClass() { - final ControllerConfiguration lambdasCannotBeUsedToExtractGenericParam = - () -> null; - assertThrows(RuntimeException.class, - lambdasCannotBeUsedToExtractGenericParam::getResourceClass); - - final ControllerConfiguration conf = new ControllerConfiguration<>() { - @Override - public String getAssociatedReconcilerClassName() { - return null; - } - }; - assertEquals(TestCustomResource.class, conf.getResourceClass()); - } -} From ed6a7c21955dd3f1ab841721e655a1537b6b292c Mon Sep 17 00:00:00 2001 From: csviri Date: Mon, 27 Feb 2023 17:02:07 +0100 Subject: [PATCH 6/6] impl revert --- .../operator/api/config/ControllerConfiguration.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java index de56b5553a..1363ef0101 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ControllerConfiguration.java @@ -113,5 +113,11 @@ default ConfigurationService getConfigurationService() { @SuppressWarnings("unchecked") @Override - Class

getResourceClass(); + default Class

getResourceClass() { + // note that this implementation at the end not used within the boundaries of the core + // framework, should be removed in the future, (and marked as an API changed, or behavior + // change) + return (Class

) Utils.getFirstTypeArgumentFromSuperClassOrInterface(getClass(), + ControllerConfiguration.class); + } }