Skip to content

Commit 3a821d4

Browse files
committed
feat: allow reconcilers to override their configuration at runtime
If a reconciler implements `ConfigurableReconciler`, then QOSDK will derive a new configuration for the reconciler by calling `updateConfigurationFrom` before registering the reconciler with this new configuration. (cherry picked from commit 5b354c0)
1 parent a8b079f commit 3a821d4

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

core/runtime/src/main/java/io/quarkiverse/operatorsdk/runtime/OperatorProducer.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212

1313
import io.fabric8.kubernetes.api.model.HasMetadata;
1414
import io.javaoperatorsdk.operator.Operator;
15+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
16+
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
1517
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
18+
import io.quarkiverse.operatorsdk.runtime.api.ConfigurableReconciler;
1619
import io.quarkus.arc.DefaultBean;
1720

1821
@Singleton
@@ -30,6 +33,7 @@ public class OperatorProducer {
3033
* @param reconcilers the detected {@link Reconciler} implementations
3134
* @return a properly configured {@link Operator} instance
3235
*/
36+
@SuppressWarnings({ "rawtypes", "unchecked" })
3337
@Produces
3438
@DefaultBean
3539
@ApplicationScoped
@@ -48,7 +52,14 @@ Operator operator(QuarkusConfigurationService configuration, Instance<Reconciler
4852

4953
Operator operator = new Operator(configuration);
5054
for (Reconciler<? extends HasMetadata> reconciler : reconcilers) {
51-
operator.register(reconciler);
55+
if (reconciler instanceof ConfigurableReconciler configurable) {
56+
ControllerConfiguration conf = configuration.getConfigurationFor(reconciler);
57+
final var override = ControllerConfigurationOverrider.override(conf);
58+
conf = configurable.updateConfigurationFrom(override);
59+
operator.register(reconciler, conf);
60+
} else {
61+
operator.register(reconciler);
62+
}
5263
}
5364

5465
// if we set a termination timeout, install a shutdown hook
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.quarkiverse.operatorsdk.runtime.api;
2+
3+
import io.fabric8.kubernetes.api.model.HasMetadata;
4+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
5+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
6+
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
7+
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
8+
9+
/**
10+
* Implement to change a {@link io.javaoperatorsdk.operator.api.reconciler.Reconciler}'s
11+
* configuration at runtime
12+
*
13+
* @param <P> the primary resource type of the reconciler
14+
* @since 7.2
15+
*/
16+
public interface ConfigurableReconciler<P extends HasMetadata> {
17+
/**
18+
* Updates the reconciler's configuration by applying the modifications specified by the provided
19+
* {@link ControllerConfigurationOverrider} and then replacing the existing configuration in the
20+
* {@link ConfigurationService} for this reconciler. Note that this method will not be applied if
21+
* there is no configuration (as determined by {@link
22+
* ConfigurationService#getConfigurationFor(Reconciler)} for the reconciler.
23+
*
24+
* @param configOverrider provides the modifications to apply to the existing reconciler's
25+
* configuration
26+
* @return the updated {@link ControllerConfiguration} to use to register the associated {@link Reconciler}
27+
*/
28+
ControllerConfiguration<P> updateConfigurationFrom(ControllerConfigurationOverrider<P> configOverrider);
29+
}

0 commit comments

Comments
 (0)