Skip to content

Commit c922227

Browse files
committed
fix: update configuration service when overriding configuration
Signed-off-by: Chris Laprun <claprun@redhat.com>
1 parent c5441fb commit c922227

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/Operator.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
1717
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1818
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
19+
import io.javaoperatorsdk.operator.api.config.UpdatableConfigurationService;
1920
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
2021
import io.javaoperatorsdk.operator.processing.Controller;
2122
import io.javaoperatorsdk.operator.processing.LifecycleAware;
@@ -26,7 +27,7 @@ public class Operator implements LifecycleAware {
2627

2728
private final ControllerManager controllerManager;
2829
private final LeaderElectionManager leaderElectionManager;
29-
private final ConfigurationService configurationService;
30+
private final UpdatableConfigurationService configurationService;
3031
private volatile boolean started = false;
3132

3233
public Operator() {
@@ -45,7 +46,7 @@ public Operator() {
4546
* @param configurationService a {@link ConfigurationService} providing the configuration for the
4647
* operator
4748
*/
48-
public Operator(ConfigurationService configurationService) {
49+
public Operator(UpdatableConfigurationService configurationService) {
4950
this.configurationService = configurationService;
5051

5152
final var executorServiceManager = configurationService.getExecutorServiceManager();
@@ -65,7 +66,7 @@ public Operator(Consumer<ConfigurationServiceOverrider> overrider) {
6566
this(initConfigurationService(null, overrider));
6667
}
6768

68-
private static ConfigurationService initConfigurationService(
69+
private static UpdatableConfigurationService initConfigurationService(
6970
KubernetesClient client, Consumer<ConfigurationServiceOverrider> overrider) {
7071
// initialize the client if the user didn't provide one
7172
if (client == null) {
@@ -82,7 +83,7 @@ private static ConfigurationService initConfigurationService(
8283
overrider = o -> o.withKubernetesClient(kubernetesClient);
8384
}
8485

85-
return ConfigurationService.newOverriddenConfigurationService(overrider);
86+
return UpdatableConfigurationService.newOverriddenConfigurationService(overrider);
8687
}
8788

8889
/**
@@ -209,6 +210,12 @@ public <P extends HasMetadata> RegisteredController<P> register(
209210
+ configurationService.getKnownReconcilerNames());
210211
}
211212

213+
// update the reconciler's configuration in the ConfigurationService if needed
214+
final var existing = configurationService.getConfigurationFor(reconciler);
215+
if (!configuration.equals(existing)) {
216+
configurationService.replace(configuration);
217+
}
218+
212219
final var controller = new Controller<>(reconciler, configuration, getKubernetesClient());
213220

214221
controllerManager.add(controller);

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* An abstract implementation of {@link ConfigurationService} meant to ease custom implementations
1515
*/
1616
@SuppressWarnings("rawtypes")
17-
public class AbstractConfigurationService implements ConfigurationService {
17+
public class AbstractConfigurationService implements UpdatableConfigurationService {
1818
private final Map<String, ControllerConfiguration> configurations = new ConcurrentHashMap<>();
1919
private final Version version;
2020
private KubernetesClient client;
@@ -71,15 +71,16 @@ public AbstractConfigurationService(
7171
protected void init(
7272
Cloner cloner, ExecutorServiceManager executorServiceManager, KubernetesClient client) {
7373
this.client = client;
74-
this.cloner = cloner != null ? cloner : ConfigurationService.super.getResourceCloner();
74+
this.cloner = cloner != null ? cloner : UpdatableConfigurationService.super.getResourceCloner();
7575
this.executorServiceManager = executorServiceManager;
7676
}
7777

7878
protected <R extends HasMetadata> void register(ControllerConfiguration<R> config) {
7979
put(config, true);
8080
}
8181

82-
protected <R extends HasMetadata> void replace(ControllerConfiguration<R> config) {
82+
@Override
83+
public <R extends HasMetadata> void replace(ControllerConfiguration<R> config) {
8384
put(config, false);
8485
}
8586

@@ -162,7 +163,7 @@ public Cloner getResourceCloner() {
162163
public KubernetesClient getKubernetesClient() {
163164
// lazy init to avoid needing initializing a client when not needed (in tests, in particular)
164165
if (client == null) {
165-
client = ConfigurationService.super.getKubernetesClient();
166+
client = UpdatableConfigurationService.super.getKubernetesClient();
166167
}
167168
return client;
168169
}
@@ -171,7 +172,7 @@ public KubernetesClient getKubernetesClient() {
171172
public ExecutorServiceManager getExecutorServiceManager() {
172173
// lazy init to avoid initializing thread pools for nothing in an overriding scenario
173174
if (executorServiceManager == null) {
174-
executorServiceManager = ConfigurationService.super.getExecutorServiceManager();
175+
executorServiceManager = UpdatableConfigurationService.super.getExecutorServiceManager();
175176
}
176177
return executorServiceManager;
177178
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
import java.util.function.Consumer;
4+
5+
import io.fabric8.kubernetes.api.model.HasMetadata;
6+
7+
public interface UpdatableConfigurationService extends ConfigurationService {
8+
<R extends HasMetadata> void replace(ControllerConfiguration<R> config);
9+
10+
static UpdatableConfigurationService newOverriddenConfigurationService(
11+
Consumer<ConfigurationServiceOverrider> overrider) {
12+
final var baseConfiguration = new BaseConfigurationService();
13+
if (overrider != null) {
14+
final var toOverride = new ConfigurationServiceOverrider(baseConfiguration);
15+
overrider.accept(toOverride);
16+
return (UpdatableConfigurationService) toOverride.build();
17+
}
18+
return baseConfiguration;
19+
}
20+
}

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/OperatorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.javaoperatorsdk.operator;
22

3+
import java.util.Set;
4+
35
import org.junit.jupiter.api.BeforeEach;
46
import org.junit.jupiter.api.Test;
57

@@ -51,6 +53,15 @@ void shouldBePossibleToRetrieveRegisteredControllerByName() {
5153
assertEquals(maybeController.get(), registeredControllers.stream().findFirst().orElseThrow());
5254
}
5355

56+
@Test
57+
void overriddenConfigurationShouldBeUpdatedInConfigurationService() {
58+
final var reconciler = new FooReconciler();
59+
operator.register(new FooReconciler(), override -> override.settingNamespace("test"));
60+
final var config = operator.getConfigurationService().getConfigurationFor(reconciler);
61+
final var namespaces = config.getInformerConfig().getNamespaces();
62+
assertEquals(Set.of("test"), namespaces);
63+
}
64+
5465
@ControllerConfiguration
5566
private static class FooReconciler implements Reconciler<ConfigMap> {
5667

0 commit comments

Comments
 (0)