Skip to content

Commit 88b92ac

Browse files
committed
feat: allow easier configuration of matcher
Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent f6f0183 commit 88b92ac

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,18 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
3737
implements ConfiguredDependentResource<KubernetesDependentResourceConfig<R>> {
3838

3939
private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class);
40+
41+
@SuppressWarnings("rawtypes")
42+
private static final SSABasedGenericKubernetesResourceMatcher defaultMatcher =
43+
SSABasedGenericKubernetesResourceMatcher.getInstance();
44+
4045
private final boolean garbageCollected = this instanceof GarbageCollected;
4146
private KubernetesDependentResourceConfig<R> kubernetesDependentResourceConfig;
4247
private volatile Boolean useSSA;
4348

49+
@SuppressWarnings("unchecked")
50+
private SSABasedGenericKubernetesResourceMatcher<R> matcher = defaultMatcher;
51+
4452
public KubernetesDependentResource(Class<R> resourceType) {
4553
this(resourceType, null);
4654
}
@@ -54,6 +62,13 @@ public void configureWith(KubernetesDependentResourceConfig<R> config) {
5462
this.kubernetesDependentResourceConfig = config;
5563
}
5664

65+
public void setMatcher(SSABasedGenericKubernetesResourceMatcher<R> matcher) {
66+
if (this.matcher != defaultMatcher) {
67+
throw new IllegalStateException("Can only set a matcher once.");
68+
}
69+
this.matcher = matcher;
70+
}
71+
5772
@SuppressWarnings("unused")
5873
public R create(R desired, P primary, Context<P> context) {
5974
if (useSSA(context)) {
@@ -111,9 +126,7 @@ public Result<R> match(R actualResource, R desired, P primary, Context<P> contex
111126
final boolean matches;
112127
addMetadata(true, actualResource, desired, primary, context);
113128
if (useSSA(context)) {
114-
matches =
115-
SSABasedGenericKubernetesResourceMatcher.getInstance()
116-
.matches(actualResource, desired, context);
129+
matches = matcher.matches(actualResource, desired, context);
117130
} else {
118131
matches =
119132
GenericKubernetesResourceMatcher.match(desired, actualResource, false, false, context)

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcherTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.javaoperatorsdk.operator.api.reconciler.Context;
2323

2424
import static org.assertj.core.api.Assertions.assertThat;
25+
import static org.mockito.ArgumentMatchers.any;
2526
import static org.mockito.Mockito.mock;
2627
import static org.mockito.Mockito.when;
2728

@@ -39,6 +40,7 @@ void setup() {
3940
when(mockedContext.getClient()).thenReturn(client);
4041

4142
final var configurationService = mock(ConfigurationService.class);
43+
when(configurationService.shouldUseSSA(any(), any(), any())).thenReturn(true);
4244
final var controllerConfiguration = mock(ControllerConfiguration.class);
4345
when(controllerConfiguration.getConfigurationService()).thenReturn(configurationService);
4446
when(controllerConfiguration.fieldManager()).thenReturn("controller");
@@ -239,17 +241,31 @@ void testSanitizeState_daemonSetWithResources_withMismatch() {
239241
@ParameterizedTest
240242
@ValueSource(booleans = {true, false})
241243
void testCustomMatcher_returnsExpectedMatchBasedOnReadOnlyLabel(boolean readOnly) {
244+
var dr = new ConfigMapDR();
242245
var desiredConfigMap =
243246
loadResource("configmap.empty-owner-reference-desired.yaml", ConfigMap.class);
244247
desiredConfigMap.getData().put("key1", "another value");
245248
var actualConfigMap = loadResource("configmap.empty-owner-reference.yaml", ConfigMap.class);
246249
actualConfigMap.getMetadata().getLabels().put("readonly", Boolean.toString(readOnly));
247250

248-
var matcher = new ReadOnlyAwareMatcher<ConfigMap>();
249-
assertThat(matcher.matches(actualConfigMap, desiredConfigMap, mockedContext))
251+
ConfigMap ignoredPrimary = null;
252+
assertThat(
253+
dr.match(
254+
actualConfigMap,
255+
desiredConfigMap,
256+
ignoredPrimary,
257+
(Context<ConfigMap>) mockedContext)
258+
.matched())
250259
.isEqualTo(readOnly);
251260
}
252261

262+
private static class ConfigMapDR extends KubernetesDependentResource<ConfigMap, ConfigMap> {
263+
public ConfigMapDR() {
264+
super(ConfigMap.class);
265+
setMatcher(new ReadOnlyAwareMatcher<>());
266+
}
267+
}
268+
253269
private static class ReadOnlyAwareMatcher<T extends HasMetadata>
254270
extends SSABasedGenericKubernetesResourceMatcher<T> {
255271
@Override

0 commit comments

Comments
 (0)