Skip to content

Commit dafb814

Browse files
committed
feat: allow reconcilers to override their own configuration
Signed-off-by: Chris Laprun <[email protected]>
1 parent 2acb3f3 commit dafb814

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,18 @@ protected <R extends HasMetadata> void throwExceptionOnNameCollision(
112112
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
113113
Reconciler<R> reconciler) {
114114
final var key = keyFor(reconciler);
115-
final var configuration = configurations.get(key);
115+
var configuration = configurations.get(key);
116116
if (configuration == null) {
117117
logMissingReconcilerWarning(key, getReconcilersNameMessage());
118+
} else {
119+
if (reconciler instanceof ConfigurableReconciler<?> configurableReconciler) {
120+
final var overrider = ControllerConfigurationOverrider.override(configuration);
121+
configurableReconciler.updateConfigurationFrom(overrider);
122+
configuration = overrider.build();
123+
configurations.put(key, configuration);
124+
}
118125
}
126+
119127
return configuration;
120128
}
121129

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
5+
public interface ConfigurableReconciler<P extends HasMetadata> {
6+
void updateConfigurationFrom(ControllerConfigurationOverrider<P> configOverrider);
7+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/config/BaseConfigurationServiceTest.java

+30
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import io.javaoperatorsdk.operator.ReconcilerUtils;
1818
import io.javaoperatorsdk.operator.api.config.AnnotationConfigurable;
1919
import io.javaoperatorsdk.operator.api.config.BaseConfigurationService;
20+
import io.javaoperatorsdk.operator.api.config.ConfigurableReconciler;
21+
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
2022
import io.javaoperatorsdk.operator.api.config.dependent.ConfigurationConverter;
2123
import io.javaoperatorsdk.operator.api.config.dependent.Configured;
2224
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
@@ -311,6 +313,34 @@ void shouldUseSSAShouldAlsoWorkWithManualConfiguration() {
311313
configurationService.shouldUseSSA(reconciler.getSsaConfigMapDependent()));
312314
}
313315

316+
@Test
317+
void shouldOverrideConfigurationForConfigurableReconciler() {
318+
final var reconciler = new TestConfigurableReconciler();
319+
var config = configurationService.getConfigurationFor(reconciler);
320+
assertThat(config.getInformerConfig().getLabelSelector()).isNull();
321+
322+
config = configurationService.getConfigurationFor(reconciler);
323+
assertThat(config.getInformerConfig().getLabelSelector())
324+
.isEqualTo(TestConfigurableReconciler.selector);
325+
}
326+
327+
private static class TestConfigurableReconciler
328+
implements Reconciler<ConfigMap>, ConfigurableReconciler<ConfigMap> {
329+
private static final String selector = "foo=bar";
330+
331+
@Override
332+
public UpdateControl<ConfigMap> reconcile(ConfigMap resource, Context<ConfigMap> context)
333+
throws Exception {
334+
return null;
335+
}
336+
337+
@Override
338+
public void updateConfigurationFrom(
339+
ControllerConfigurationOverrider<ConfigMap> configOverrider) {
340+
configOverrider.withLabelSelector(selector);
341+
}
342+
}
343+
314344
@SuppressWarnings("unchecked")
315345
private static int getValue(
316346
io.javaoperatorsdk.operator.api.config.ControllerConfiguration<?> configuration, int index) {

0 commit comments

Comments
 (0)