From 7b0870a1d30822501f0d1c76e97f45750bafe8c2 Mon Sep 17 00:00:00 2001 From: Chris Laprun Date: Tue, 27 Aug 2024 21:53:22 +0200 Subject: [PATCH] feat: expose logic to determine whether a kube dependent resource uses SSA or not (#2516) Signed-off-by: Chris Laprun --- .../api/config/ConfigurationService.java | 29 +++++++++++++++++++ .../GenericKubernetesDependentResource.java | 3 +- .../KubernetesDependentResource.java | 20 ++++--------- 3 files changed, 36 insertions(+), 16 deletions(-) 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 2deef93e2e..53d2c4bb50 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 @@ -23,6 +23,9 @@ import io.javaoperatorsdk.operator.api.reconciler.Reconciler; import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceFactory; import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig; +import io.javaoperatorsdk.operator.processing.dependent.kubernetes.ResourceUpdaterMatcher; import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory; /** An interface from which to retrieve configuration information. */ @@ -358,6 +361,32 @@ default boolean ssaBasedCreateUpdateMatchForDependentResources() { return true; } + /** + * This is mostly useful as an integration point for downstream projects to be able to reuse the + * logic used to determine whether a given {@link KubernetesDependentResource} should use SSA or + * not. + * + * @param dependentResource the {@link KubernetesDependentResource} under consideration + * @return {@code true} if SSA should be used for + * @param the dependent resource type + * @param

the primary resource type + * @since 4.9.4 + */ + default boolean shouldUseSSA( + KubernetesDependentResource dependentResource) { + if (dependentResource instanceof ResourceUpdaterMatcher) { + return false; + } + Optional useSSAConfig = dependentResource.configuration() + .flatMap(KubernetesDependentResourceConfig::useSSA); + // don't use SSA for certain resources by default, only if explicitly overriden + if (useSSAConfig.isEmpty() + && defaultNonSSAResource().contains(dependentResource.resourceType())) { + return false; + } + return useSSAConfig.orElse(ssaBasedCreateUpdateMatchForDependentResources()); + } + /** * Returns the set of default resources for which Server-Side Apply (SSA) will not be used, even * if it is the default behavior for dependent resources as specified by 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 98f2346577..57d3036804 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 @@ -8,7 +8,7 @@ public class GenericKubernetesDependentResource

extends KubernetesDependentResource { - private GroupVersionKind groupVersionKind; + private final GroupVersionKind groupVersionKind; public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) { super(GenericKubernetesResource.class); @@ -19,6 +19,7 @@ protected InformerConfiguration.InformerConfigurationBuilder updaterMatcher; private final boolean garbageCollected = this instanceof GarbageCollected; private KubernetesDependentResourceConfig kubernetesDependentResourceConfig; - - private final boolean usingCustomResourceUpdateMatcher; + private volatile Boolean useSSA; @SuppressWarnings("unchecked") public KubernetesDependentResource(Class resourceType) { super(resourceType); - usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher; - updaterMatcher = usingCustomResourceUpdateMatcher + updaterMatcher = this instanceof ResourceUpdaterMatcher ? (ResourceUpdaterMatcher) this : GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType); } @@ -194,18 +192,10 @@ protected void addMetadata(boolean forMatch, R actualResource, final R target, P } protected boolean useSSA(Context

context) { - if (usingCustomResourceUpdateMatcher) { - return false; - } - Optional useSSAConfig = - configuration().flatMap(KubernetesDependentResourceConfig::useSSA); - var configService = context.getControllerConfiguration().getConfigurationService(); - // don't use SSA for certain resources by default, only if explicitly overriden - if (useSSAConfig.isEmpty() && configService.defaultNonSSAResource().contains(resourceType())) { - return false; + if (useSSA == null) { + useSSA = context.getControllerConfiguration().getConfigurationService().shouldUseSSA(this); } - return useSSAConfig.orElse(context.getControllerConfiguration().getConfigurationService() - .ssaBasedCreateUpdateMatchForDependentResources()); + return useSSA; } private boolean usePreviousAnnotation(Context

context) {