Skip to content

Commit 4cf58a5

Browse files
committed
feat: expose logic to determine whether a kube dependent resource uses SSA or not
Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent f8e965c commit 4cf58a5

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2424
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceFactory;
2525
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent;
26+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResource;
27+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependentResourceConfig;
28+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.ResourceUpdaterMatcher;
2629
import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory;
2730

2831
/** An interface from which to retrieve configuration information. */
@@ -358,6 +361,32 @@ default boolean ssaBasedCreateUpdateMatchForDependentResources() {
358361
return true;
359362
}
360363

364+
/**
365+
* This is mostly useful as an integration point for downstream projects to be able to reuse the
366+
* logic used to determine whether a given {@link KubernetesDependentResource} should use SSA or
367+
* not.
368+
*
369+
* @param dependentResource the {@link KubernetesDependentResource} under consideration
370+
* @return {@code true} if SSA should be used for
371+
* @param <R> the dependent resource type
372+
* @param <P> the primary resource type
373+
* @since 4.9.4
374+
*/
375+
default <R extends HasMetadata, P extends HasMetadata> boolean shouldUseSSA(
376+
KubernetesDependentResource<R, P> dependentResource) {
377+
if (dependentResource instanceof ResourceUpdaterMatcher) {
378+
return false;
379+
}
380+
Optional<Boolean> useSSAConfig = dependentResource.configuration()
381+
.flatMap(KubernetesDependentResourceConfig::useSSA);
382+
// don't use SSA for certain resources by default, only if explicitly overriden
383+
if (useSSAConfig.isEmpty()
384+
&& defaultNonSSAResource().contains(dependentResource.resourceType())) {
385+
return false;
386+
}
387+
return useSSAConfig.orElse(ssaBasedCreateUpdateMatchForDependentResources());
388+
}
389+
361390
/**
362391
* Returns the set of default resources for which Server-Side Apply (SSA) will not be used, even
363392
* if it is the default behavior for dependent resources as specified by

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesDependentResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public class GenericKubernetesDependentResource<P extends HasMetadata>
99
extends KubernetesDependentResource<GenericKubernetesResource, P> {
1010

11-
private GroupVersionKind groupVersionKind;
11+
private final GroupVersionKind groupVersionKind;
1212

1313
public GenericKubernetesDependentResource(GroupVersionKind groupVersionKind) {
1414
super(GenericKubernetesResource.class);
@@ -19,6 +19,7 @@ protected InformerConfiguration.InformerConfigurationBuilder<GenericKubernetesRe
1919
return InformerConfiguration.from(groupVersionKind);
2020
}
2121

22+
@SuppressWarnings("unused")
2223
public GroupVersionKind getGroupVersionKind() {
2324
return groupVersionKind;
2425
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,13 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
3838
private final ResourceUpdaterMatcher<R> updaterMatcher;
3939
private final boolean garbageCollected = this instanceof GarbageCollected;
4040
private KubernetesDependentResourceConfig<R> kubernetesDependentResourceConfig;
41-
42-
private final boolean usingCustomResourceUpdateMatcher;
41+
private volatile Boolean useSSA;
4342

4443
@SuppressWarnings("unchecked")
4544
public KubernetesDependentResource(Class<R> resourceType) {
4645
super(resourceType);
4746

48-
usingCustomResourceUpdateMatcher = this instanceof ResourceUpdaterMatcher;
49-
updaterMatcher = usingCustomResourceUpdateMatcher
47+
updaterMatcher = this instanceof ResourceUpdaterMatcher
5048
? (ResourceUpdaterMatcher<R>) this
5149
: GenericResourceUpdaterMatcher.updaterMatcherFor(resourceType);
5250
}
@@ -194,18 +192,10 @@ protected void addMetadata(boolean forMatch, R actualResource, final R target, P
194192
}
195193

196194
protected boolean useSSA(Context<P> context) {
197-
if (usingCustomResourceUpdateMatcher) {
198-
return false;
199-
}
200-
Optional<Boolean> useSSAConfig =
201-
configuration().flatMap(KubernetesDependentResourceConfig::useSSA);
202-
var configService = context.getControllerConfiguration().getConfigurationService();
203-
// don't use SSA for certain resources by default, only if explicitly overriden
204-
if (useSSAConfig.isEmpty() && configService.defaultNonSSAResource().contains(resourceType())) {
205-
return false;
195+
if (useSSA == null) {
196+
useSSA = context.getControllerConfiguration().getConfigurationService().shouldUseSSA(this);
206197
}
207-
return useSSAConfig.orElse(context.getControllerConfiguration().getConfigurationService()
208-
.ssaBasedCreateUpdateMatchForDependentResources());
198+
return useSSA;
209199
}
210200

211201
private boolean usePreviousAnnotation(Context<P> context) {

0 commit comments

Comments
 (0)