Skip to content

Commit 13a6c83

Browse files
authored
feat: retrieve ConfigurationService from ConfigurationServiceProvider (#1010)
1 parent 0c4f0a5 commit 13a6c83

File tree

63 files changed

+471
-457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+471
-457
lines changed

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

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import io.fabric8.kubernetes.client.KubernetesClient;
1515
import io.fabric8.kubernetes.client.Version;
1616
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
17+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
18+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
1719
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1820
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
1921
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
@@ -25,14 +27,33 @@
2527
public class Operator implements LifecycleAware {
2628
private static final Logger log = LoggerFactory.getLogger(Operator.class);
2729
private final KubernetesClient kubernetesClient;
28-
private final ConfigurationService configurationService;
2930
private final ControllerManager controllers = new ControllerManager();
3031

32+
public Operator() {
33+
this(new DefaultKubernetesClient(), ConfigurationServiceProvider.instance());
34+
}
35+
36+
public Operator(KubernetesClient kubernetesClient) {
37+
this(kubernetesClient, ConfigurationServiceProvider.instance());
38+
}
3139

40+
/**
41+
* @deprecated Use {@link #Operator(Consumer)} instead
42+
*/
43+
@Deprecated
3244
public Operator(ConfigurationService configurationService) {
3345
this(new DefaultKubernetesClient(), configurationService);
3446
}
3547

48+
public Operator(Consumer<ConfigurationServiceOverrider> overrider) {
49+
this(new DefaultKubernetesClient(), overrider);
50+
}
51+
52+
public Operator(KubernetesClient client, Consumer<ConfigurationServiceOverrider> overrider) {
53+
this(client);
54+
ConfigurationServiceProvider.overrideCurrent(overrider);
55+
}
56+
3657
/**
3758
* Note that Operator by default closes the client on stop, this can be changed using
3859
* {@link ConfigurationService}
@@ -42,7 +63,7 @@ public Operator(ConfigurationService configurationService) {
4263
*/
4364
public Operator(KubernetesClient kubernetesClient, ConfigurationService configurationService) {
4465
this.kubernetesClient = kubernetesClient;
45-
this.configurationService = configurationService;
66+
ConfigurationServiceProvider.set(configurationService);
4667
}
4768

4869
/** Adds a shutdown hook that automatically calls {@link #stop()} ()} when the app shuts down. */
@@ -54,10 +75,6 @@ public KubernetesClient getKubernetesClient() {
5475
return kubernetesClient;
5576
}
5677

57-
public ConfigurationService getConfigurationService() {
58-
return configurationService;
59-
}
60-
6178
public List<Controller> getControllers() {
6279
return new ArrayList<>(controllers.controllers.values());
6380
}
@@ -70,7 +87,7 @@ public List<Controller> getControllers() {
7087
public void start() {
7188
controllers.shouldStart();
7289

73-
final var version = configurationService.getVersion();
90+
final var version = ConfigurationServiceProvider.instance().getVersion();
7491
log.info(
7592
"Operator SDK {} (commit: {}) built on {} starting...",
7693
version.getSdkVersion(),
@@ -80,12 +97,13 @@ public void start() {
8097
final var clientVersion = Version.clientVersion();
8198
log.info("Client version: {}", clientVersion);
8299

83-
ExecutorServiceManager.init(configurationService);
100+
ExecutorServiceManager.init();
84101
controllers.start();
85102
}
86103

87104
@Override
88105
public void stop() throws OperatorException {
106+
final var configurationService = ConfigurationServiceProvider.instance();
89107
log.info(
90108
"Operator SDK {} is shutting down...", configurationService.getVersion().getSdkVersion());
91109

@@ -107,7 +125,8 @@ public void stop() throws OperatorException {
107125
*/
108126
public <R extends HasMetadata> void register(Reconciler<R> reconciler)
109127
throws OperatorException {
110-
final var controllerConfiguration = configurationService.getConfigurationFor(reconciler);
128+
final var controllerConfiguration =
129+
ConfigurationServiceProvider.instance().getConfigurationFor(reconciler);
111130
register(reconciler, controllerConfiguration);
112131
}
113132

@@ -132,7 +151,8 @@ public <R extends HasMetadata> void register(Reconciler<R> reconciler,
132151
"Cannot register reconciler with name " + reconciler.getClass().getCanonicalName() +
133152
" reconciler named " + ReconcilerUtils.getNameFor(reconciler)
134153
+ " because its configuration cannot be found.\n" +
135-
" Known reconcilers are: " + configurationService.getKnownReconcilerNames());
154+
" Known reconcilers are: "
155+
+ ConfigurationServiceProvider.instance().getKnownReconcilerNames());
136156
}
137157

138158
final var controller = new Controller<>(reconciler, configuration, kubernetesClient);
@@ -158,7 +178,8 @@ public <R extends HasMetadata> void register(Reconciler<R> reconciler,
158178
*/
159179
public <R extends HasMetadata> void register(Reconciler<R> reconciler,
160180
Consumer<ControllerConfigurationOverrider<R>> configOverrider) {
161-
final var controllerConfiguration = configurationService.getConfigurationFor(reconciler);
181+
final var controllerConfiguration =
182+
ConfigurationServiceProvider.instance().getConfigurationFor(reconciler);
162183
var configToOverride = ControllerConfigurationOverrider.override(controllerConfiguration);
163184
configOverrider.accept(configToOverride);
164185
register(reconciler, configToOverride.build());

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ protected <R extends HasMetadata> void replace(ControllerConfiguration<R> config
2626
put(config, false);
2727
}
2828

29+
@SuppressWarnings("unchecked")
2930
private <R extends HasMetadata> void put(
3031
ControllerConfiguration<R> config, boolean failIfExisting) {
3132
final var name = config.getName();
@@ -36,7 +37,6 @@ private <R extends HasMetadata> void put(
3637
}
3738
}
3839
configurations.put(name, config);
39-
config.setConfigurationService(this);
4040
}
4141

4242
protected <R extends HasMetadata> void throwExceptionOnNameCollision(
@@ -50,6 +50,7 @@ protected <R extends HasMetadata> void throwExceptionOnNameCollision(
5050
+ newReconcilerClassName);
5151
}
5252

53+
@SuppressWarnings("unchecked")
5354
@Override
5455
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
5556
Reconciler<R> reconciler) {

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public class AnnotationControllerConfiguration<R extends HasMetadata>
2626

2727
protected final Reconciler<R> reconciler;
2828
private final ControllerConfiguration annotation;
29-
private ConfigurationService service;
3029
private List<DependentResourceSpec<?, ?>> specs;
3130

3231
public AnnotationControllerConfiguration(Reconciler<R> reconciler) {
@@ -77,16 +76,6 @@ public String getLabelSelector() {
7776
return valueOrDefault(annotation, ControllerConfiguration::labelSelector, "");
7877
}
7978

80-
@Override
81-
public ConfigurationService getConfigurationService() {
82-
return service;
83-
}
84-
85-
@Override
86-
public void setConfigurationService(ConfigurationService service) {
87-
this.service = service;
88-
}
89-
9079
@Override
9180
public String getAssociatedReconcilerClassName() {
9281
return reconciler.getClass().getCanonicalName();
@@ -172,8 +161,8 @@ public static <T> T valueOrDefault(
172161
kubeDependent,
173162
KubernetesDependent::addOwnerReference,
174163
KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT);
175-
config = new KubernetesDependentResourceConfig(
176-
addOwnerReference, namespaces, labelSelector, getConfigurationService());
164+
config =
165+
new KubernetesDependentResourceConfig(addOwnerReference, namespaces, labelSelector);
177166
}
178167
specs.add(new DependentResourceSpec(dependentType, config));
179168
}

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

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import java.util.Set;
44
import java.util.concurrent.ExecutorService;
5+
import java.util.function.Consumer;
56

6-
import io.fabric8.kubernetes.api.model.HasMetadata;
77
import io.fabric8.kubernetes.client.Config;
88
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
9-
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
109

10+
@SuppressWarnings("unused")
1111
public class ConfigurationServiceOverrider {
1212
private final ConfigurationService original;
1313
private Metrics metrics;
@@ -19,8 +19,7 @@ public class ConfigurationServiceOverrider {
1919
private boolean closeClientOnStop;
2020
private ExecutorService executorService = null;
2121

22-
public ConfigurationServiceOverrider(
23-
ConfigurationService original) {
22+
ConfigurationServiceOverrider(ConfigurationService original) {
2423
this.original = original;
2524
this.clientConfig = original.getClientConfiguration();
2625
this.checkCR = original.checkCRDAndValidateLocalModel();
@@ -73,26 +72,12 @@ public ConfigurationServiceOverrider withExecutorService(ExecutorService executo
7372
}
7473

7574
public ConfigurationService build() {
76-
return new ConfigurationService() {
77-
@Override
78-
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
79-
Reconciler<R> reconciler) {
80-
ControllerConfiguration<R> controllerConfiguration =
81-
original.getConfigurationFor(reconciler);
82-
controllerConfiguration.setConfigurationService(this);
83-
return controllerConfiguration;
84-
}
85-
75+
return new BaseConfigurationService(original.getVersion()) {
8676
@Override
8777
public Set<String> getKnownReconcilerNames() {
8878
return original.getKnownReconcilerNames();
8979
}
9080

91-
@Override
92-
public Version getVersion() {
93-
return original.getVersion();
94-
}
95-
9681
@Override
9782
public Config getClientConfiguration() {
9883
return clientConfig;
@@ -133,12 +118,16 @@ public ExecutorService getExecutorService() {
133118
if (executorService != null) {
134119
return executorService;
135120
} else {
136-
return ConfigurationService.super.getExecutorService();
121+
return super.getExecutorService();
137122
}
138123
}
139124
};
140125
}
141126

127+
/**
128+
* @deprecated Use {@link ConfigurationServiceProvider#overrideCurrent(Consumer)} instead
129+
*/
130+
@Deprecated(since = "2.2.0")
142131
public static ConfigurationServiceOverrider override(ConfigurationService original) {
143132
return new ConfigurationServiceOverrider(original);
144133
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
import java.util.function.Consumer;
4+
5+
public class ConfigurationServiceProvider {
6+
static final ConfigurationService DEFAULT =
7+
new BaseConfigurationService(Utils.loadFromProperties());
8+
private static ConfigurationService instance;
9+
private static ConfigurationService defaultConfigurationService = DEFAULT;
10+
private static boolean alreadyConfigured = false;
11+
12+
private ConfigurationServiceProvider() {}
13+
14+
public synchronized static ConfigurationService instance() {
15+
if (instance == null) {
16+
set(defaultConfigurationService);
17+
}
18+
return instance;
19+
}
20+
21+
public synchronized static void set(ConfigurationService instance) {
22+
set(instance, false);
23+
}
24+
25+
private static void set(ConfigurationService instance, boolean overriding) {
26+
final var current = ConfigurationServiceProvider.instance;
27+
if (!overriding) {
28+
if (current != null && !current.equals(instance)) {
29+
throw new IllegalStateException(
30+
"A ConfigurationService has already been set and cannot be set again. Current: "
31+
+ current.getClass().getCanonicalName());
32+
}
33+
} else {
34+
if (alreadyConfigured) {
35+
throw new IllegalStateException(
36+
"The ConfigurationService has already been overridden once and cannot be changed again. Current: "
37+
+ current.getClass().getCanonicalName());
38+
} else {
39+
alreadyConfigured = true;
40+
}
41+
}
42+
43+
ConfigurationServiceProvider.instance = instance;
44+
}
45+
46+
public synchronized static void overrideCurrent(
47+
Consumer<ConfigurationServiceOverrider> overrider) {
48+
final var toOverride =
49+
new ConfigurationServiceOverrider(ConfigurationServiceProvider.instance());
50+
overrider.accept(toOverride);
51+
ConfigurationServiceProvider.set(toOverride.build(), true);
52+
}
53+
54+
public synchronized static void setDefault(ConfigurationService defaultConfigurationService) {
55+
ConfigurationServiceProvider.defaultConfigurationService = defaultConfigurationService;
56+
}
57+
58+
synchronized static ConfigurationService getDefault() {
59+
return defaultConfigurationService;
60+
}
61+
62+
public synchronized static void reset() {
63+
defaultConfigurationService = DEFAULT;
64+
instance = null;
65+
alreadyConfigured = false;
66+
}
67+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,8 @@ default ResourceEventFilter<R> getEventFilter() {
5858
default Optional<Duration> reconciliationMaxInterval() {
5959
return Optional.of(Duration.ofHours(10L));
6060
}
61+
62+
default ConfigurationService getConfigurationService() {
63+
return ConfigurationServiceProvider.instance();
64+
}
6165
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ public ControllerConfiguration<R> build() {
135135
customResourcePredicate,
136136
original.getResourceClass(),
137137
reconciliationMaxInterval,
138-
original.getConfigurationService(),
139138
dependentResourceSpecs);
140139
}
141140

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1111
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;
1212

13+
@SuppressWarnings("rawtypes")
1314
public class DefaultControllerConfiguration<R extends HasMetadata>
1415
extends DefaultResourceConfiguration<R>
1516
implements ControllerConfiguration<R> {
@@ -37,7 +38,6 @@ public DefaultControllerConfiguration(
3738
ResourceEventFilter<R> resourceEventFilter,
3839
Class<R> resourceClass,
3940
Duration reconciliationMaxInterval,
40-
ConfigurationService service,
4141
List<DependentResourceSpec<?, ?>> dependents) {
4242
super(labelSelector, resourceClass, namespaces);
4343
this.associatedControllerClassName = associatedControllerClassName;
@@ -52,7 +52,6 @@ public DefaultControllerConfiguration(
5252
: retryConfiguration;
5353
this.resourceEventFilter = resourceEventFilter;
5454

55-
setConfigurationService(service);
5655
this.dependents = dependents != null ? dependents : Collections.emptyList();
5756
}
5857

@@ -86,16 +85,6 @@ public RetryConfiguration getRetryConfiguration() {
8685
return retryConfiguration;
8786
}
8887

89-
90-
@Override
91-
public void setConfigurationService(ConfigurationService service) {
92-
if (getConfigurationService() != null) {
93-
throw new IllegalStateException("A ConfigurationService is already associated with '" + name
94-
+ "' ControllerConfiguration. Cannot change it once set!");
95-
}
96-
super.setConfigurationService(service);
97-
}
98-
9988
@Override
10089
public ResourceEventFilter<R> getEventFilter() {
10190
return resourceEventFilter;

0 commit comments

Comments
 (0)