Skip to content

feat: retrieve ConfigurationService from ConfigurationServiceProvider #1010

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Mar 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
aa9d3c2
feat: retrieve ConfigurationService from ConfigurationServiceProvider
metacosm Mar 9, 2022
c0a8064
feat: make it possible to reset ConfigurationServiceProvider
metacosm Mar 9, 2022
f7d1d42
feat: provide a default default :)
metacosm Mar 9, 2022
fc9093c
fix: tests
metacosm Mar 9, 2022
255d7f3
feat: start using ConfigurationServiceProvider
metacosm Mar 9, 2022
d27c76f
fix: remove now unneeded loading of DefaultConfigurationService
metacosm Mar 9, 2022
dad795e
refactor: make it easier to debug things
metacosm Mar 10, 2022
49a19dd
refactor: remove ConfigurationService from ResourceConfiguration
metacosm Mar 10, 2022
056f80d
fix: lambda form doesn't record parameter type
metacosm Mar 10, 2022
23cb8de
fix: configure and properly reset ConfigurationServiceProvider
metacosm Mar 10, 2022
5ebf42e
fix: suppliers were improperly defined
metacosm Mar 10, 2022
bd720d9
fix: properly override ConfigurationService for the test and reset after
metacosm Mar 10, 2022
9f22a06
feat: improve ConfigurationServiceProvider implementation, add tests
metacosm Mar 10, 2022
6c22407
fix: format
metacosm Mar 10, 2022
635f491
fix: Operator should only set ConfigurationService, not hold onto it
metacosm Mar 10, 2022
b44086e
fix: more ConfigurationService holding removal
metacosm Mar 10, 2022
40d9124
fix: make sure that ConfigurationServiceProvider is reset
metacosm Mar 11, 2022
aadba2b
refactor: remove configurationService method
metacosm Mar 11, 2022
64659e6
refactor: more access to configuration via ConfigurationServiceProvider
metacosm Mar 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.Version;
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
Expand All @@ -25,14 +27,33 @@
public class Operator implements LifecycleAware {
private static final Logger log = LoggerFactory.getLogger(Operator.class);
private final KubernetesClient kubernetesClient;
private final ConfigurationService configurationService;
private final ControllerManager controllers = new ControllerManager();

public Operator() {
this(new DefaultKubernetesClient(), ConfigurationServiceProvider.instance());
}

public Operator(KubernetesClient kubernetesClient) {
this(kubernetesClient, ConfigurationServiceProvider.instance());
}

/**
* @deprecated Use {@link #Operator(Consumer)} instead
*/
@Deprecated
public Operator(ConfigurationService configurationService) {
this(new DefaultKubernetesClient(), configurationService);
}

public Operator(Consumer<ConfigurationServiceOverrider> overrider) {
this(new DefaultKubernetesClient(), overrider);
}

public Operator(KubernetesClient client, Consumer<ConfigurationServiceOverrider> overrider) {
this(client);
ConfigurationServiceProvider.overrideCurrent(overrider);
}

/**
* Note that Operator by default closes the client on stop, this can be changed using
* {@link ConfigurationService}
Expand All @@ -42,7 +63,7 @@ public Operator(ConfigurationService configurationService) {
*/
public Operator(KubernetesClient kubernetesClient, ConfigurationService configurationService) {
this.kubernetesClient = kubernetesClient;
this.configurationService = configurationService;
ConfigurationServiceProvider.set(configurationService);
}

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

public ConfigurationService getConfigurationService() {
return configurationService;
}

public List<Controller> getControllers() {
return new ArrayList<>(controllers.controllers.values());
}
Expand All @@ -70,7 +87,7 @@ public List<Controller> getControllers() {
public void start() {
controllers.shouldStart();

final var version = configurationService.getVersion();
final var version = ConfigurationServiceProvider.instance().getVersion();
log.info(
"Operator SDK {} (commit: {}) built on {} starting...",
version.getSdkVersion(),
Expand All @@ -80,12 +97,13 @@ public void start() {
final var clientVersion = Version.clientVersion();
log.info("Client version: {}", clientVersion);

ExecutorServiceManager.init(configurationService);
ExecutorServiceManager.init();
controllers.start();
}

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

Expand All @@ -107,7 +125,8 @@ public void stop() throws OperatorException {
*/
public <R extends HasMetadata> void register(Reconciler<R> reconciler)
throws OperatorException {
final var controllerConfiguration = configurationService.getConfigurationFor(reconciler);
final var controllerConfiguration =
ConfigurationServiceProvider.instance().getConfigurationFor(reconciler);
register(reconciler, controllerConfiguration);
}

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

final var controller = new Controller<>(reconciler, configuration, kubernetesClient);
Expand All @@ -158,7 +178,8 @@ public <R extends HasMetadata> void register(Reconciler<R> reconciler,
*/
public <R extends HasMetadata> void register(Reconciler<R> reconciler,
Consumer<ControllerConfigurationOverrider<R>> configOverrider) {
final var controllerConfiguration = configurationService.getConfigurationFor(reconciler);
final var controllerConfiguration =
ConfigurationServiceProvider.instance().getConfigurationFor(reconciler);
var configToOverride = ControllerConfigurationOverrider.override(controllerConfiguration);
configOverrider.accept(configToOverride);
register(reconciler, configToOverride.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ protected <R extends HasMetadata> void replace(ControllerConfiguration<R> config
put(config, false);
}

@SuppressWarnings("unchecked")
private <R extends HasMetadata> void put(
ControllerConfiguration<R> config, boolean failIfExisting) {
final var name = config.getName();
Expand All @@ -36,7 +37,6 @@ private <R extends HasMetadata> void put(
}
}
configurations.put(name, config);
config.setConfigurationService(this);
}

protected <R extends HasMetadata> void throwExceptionOnNameCollision(
Expand All @@ -50,6 +50,7 @@ protected <R extends HasMetadata> void throwExceptionOnNameCollision(
+ newReconcilerClassName);
}

@SuppressWarnings("unchecked")
@Override
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
Reconciler<R> reconciler) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ public class AnnotationControllerConfiguration<R extends HasMetadata>

protected final Reconciler<R> reconciler;
private final ControllerConfiguration annotation;
private ConfigurationService service;
private List<DependentResourceSpec<?, ?>> specs;

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

@Override
public ConfigurationService getConfigurationService() {
return service;
}

@Override
public void setConfigurationService(ConfigurationService service) {
this.service = service;
}

@Override
public String getAssociatedReconcilerClassName() {
return reconciler.getClass().getCanonicalName();
Expand Down Expand Up @@ -172,8 +161,8 @@ public static <T> T valueOrDefault(
kubeDependent,
KubernetesDependent::addOwnerReference,
KubernetesDependent.ADD_OWNER_REFERENCE_DEFAULT);
config = new KubernetesDependentResourceConfig(
addOwnerReference, namespaces, labelSelector, getConfigurationService());
config =
new KubernetesDependentResourceConfig(addOwnerReference, namespaces, labelSelector);
}
specs.add(new DependentResourceSpec(dependentType, config));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.client.Config;
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;

@SuppressWarnings("unused")
public class ConfigurationServiceOverrider {
private final ConfigurationService original;
private Metrics metrics;
Expand All @@ -19,8 +19,7 @@ public class ConfigurationServiceOverrider {
private boolean closeClientOnStop;
private ExecutorService executorService = null;

public ConfigurationServiceOverrider(
ConfigurationService original) {
ConfigurationServiceOverrider(ConfigurationService original) {
this.original = original;
this.clientConfig = original.getClientConfiguration();
this.checkCR = original.checkCRDAndValidateLocalModel();
Expand Down Expand Up @@ -73,26 +72,12 @@ public ConfigurationServiceOverrider withExecutorService(ExecutorService executo
}

public ConfigurationService build() {
return new ConfigurationService() {
@Override
public <R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(
Reconciler<R> reconciler) {
ControllerConfiguration<R> controllerConfiguration =
original.getConfigurationFor(reconciler);
controllerConfiguration.setConfigurationService(this);
return controllerConfiguration;
}

return new BaseConfigurationService(original.getVersion()) {
@Override
public Set<String> getKnownReconcilerNames() {
return original.getKnownReconcilerNames();
}

@Override
public Version getVersion() {
return original.getVersion();
}

@Override
public Config getClientConfiguration() {
return clientConfig;
Expand Down Expand Up @@ -133,12 +118,16 @@ public ExecutorService getExecutorService() {
if (executorService != null) {
return executorService;
} else {
return ConfigurationService.super.getExecutorService();
return super.getExecutorService();
}
}
};
}

/**
* @deprecated Use {@link ConfigurationServiceProvider#overrideCurrent(Consumer)} instead
*/
@Deprecated(since = "2.2.0")
public static ConfigurationServiceOverrider override(ConfigurationService original) {
return new ConfigurationServiceOverrider(original);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package io.javaoperatorsdk.operator.api.config;

import java.util.function.Consumer;

public class ConfigurationServiceProvider {
static final ConfigurationService DEFAULT =
new BaseConfigurationService(Utils.loadFromProperties());
private static ConfigurationService instance;
private static ConfigurationService defaultConfigurationService = DEFAULT;
private static boolean alreadyConfigured = false;

private ConfigurationServiceProvider() {}

public synchronized static ConfigurationService instance() {
if (instance == null) {
set(defaultConfigurationService);
}
return instance;
}

public synchronized static void set(ConfigurationService instance) {
set(instance, false);
}

private static void set(ConfigurationService instance, boolean overriding) {
final var current = ConfigurationServiceProvider.instance;
if (!overriding) {
if (current != null && !current.equals(instance)) {
throw new IllegalStateException(
"A ConfigurationService has already been set and cannot be set again. Current: "
+ current.getClass().getCanonicalName());
}
} else {
if (alreadyConfigured) {
throw new IllegalStateException(
"The ConfigurationService has already been overridden once and cannot be changed again. Current: "
+ current.getClass().getCanonicalName());
} else {
alreadyConfigured = true;
}
}

ConfigurationServiceProvider.instance = instance;
}

public synchronized static void overrideCurrent(
Consumer<ConfigurationServiceOverrider> overrider) {
final var toOverride =
new ConfigurationServiceOverrider(ConfigurationServiceProvider.instance());
overrider.accept(toOverride);
ConfigurationServiceProvider.set(toOverride.build(), true);
}

public synchronized static void setDefault(ConfigurationService defaultConfigurationService) {
ConfigurationServiceProvider.defaultConfigurationService = defaultConfigurationService;
}

synchronized static ConfigurationService getDefault() {
return defaultConfigurationService;
}

public synchronized static void reset() {
defaultConfigurationService = DEFAULT;
instance = null;
alreadyConfigured = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,8 @@ default ResourceEventFilter<R> getEventFilter() {
default Optional<Duration> reconciliationMaxInterval() {
return Optional.of(Duration.ofHours(10L));
}

default ConfigurationService getConfigurationService() {
return ConfigurationServiceProvider.instance();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@ public ControllerConfiguration<R> build() {
customResourcePredicate,
original.getResourceClass(),
reconciliationMaxInterval,
original.getConfigurationService(),
dependentResourceSpecs);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
import io.javaoperatorsdk.operator.processing.event.source.controller.ResourceEventFilter;

@SuppressWarnings("rawtypes")
public class DefaultControllerConfiguration<R extends HasMetadata>
extends DefaultResourceConfiguration<R>
implements ControllerConfiguration<R> {
Expand Down Expand Up @@ -37,7 +38,6 @@ public DefaultControllerConfiguration(
ResourceEventFilter<R> resourceEventFilter,
Class<R> resourceClass,
Duration reconciliationMaxInterval,
ConfigurationService service,
List<DependentResourceSpec<?, ?>> dependents) {
super(labelSelector, resourceClass, namespaces);
this.associatedControllerClassName = associatedControllerClassName;
Expand All @@ -52,7 +52,6 @@ public DefaultControllerConfiguration(
: retryConfiguration;
this.resourceEventFilter = resourceEventFilter;

setConfigurationService(service);
this.dependents = dependents != null ? dependents : Collections.emptyList();
}

Expand Down Expand Up @@ -86,16 +85,6 @@ public RetryConfiguration getRetryConfiguration() {
return retryConfiguration;
}


@Override
public void setConfigurationService(ConfigurationService service) {
if (getConfigurationService() != null) {
throw new IllegalStateException("A ConfigurationService is already associated with '" + name
+ "' ControllerConfiguration. Cannot change it once set!");
}
super.setConfigurationService(service);
}

@Override
public ResourceEventFilter<R> getEventFilter() {
return resourceEventFilter;
Expand Down
Loading