Skip to content

Commit afe2bf3

Browse files
committed
wip
1 parent 0dbca4b commit afe2bf3

15 files changed

+82
-47
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,13 @@ public <P extends HasMetadata> RegisteredController<P> register(Reconciler<P> re
216216
}
217217

218218
final var controller =
219-
new Controller<>(reconciler, configuration, kubernetesClient, executorServiceManager);
219+
new Controller<>(reconciler, configuration, kubernetesClient, executorServiceManager,
220+
configurationService);
220221

221222
controllerManager.add(controller);
222223

223224
final var watchedNS = configuration.watchAllNamespaces() ? "[all namespaces]"
224-
: configuration.getEffectiveNamespaces();
225+
: configuration.getEffectiveNamespaces(configurationService);
225226

226227
log.info(
227228
"Registered reconciler: '{}' for resource: '{}' for namespace(s): {}",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.javaoperatorsdk.operator.api.config;
2+
3+
public interface ConfigurationServiceAware {
4+
5+
void setConfigurationService(ConfigurationService configurationService);
6+
7+
}

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

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

3-
import java.util.function.Consumer;
4-
53
/**
64
* For internal usage only, to avoid passing the operator configuration around. Preferred way to get
75
* to the ConfigurationService is via the reconciliation context.
@@ -45,15 +43,15 @@ private static void set(ConfigurationService instance, boolean overriding) {
4543
ConfigurationServiceProvider.instance = instance;
4644
}
4745

48-
// public synchronized static ConfigurationService overrideCurrent(
49-
// Consumer<ConfigurationServiceOverrider> overrider) {
50-
// if (overrider != null) {
51-
// final var toOverride = new ConfigurationServiceOverrider(instance());
52-
// overrider.accept(toOverride);
53-
// set(toOverride.build(), true);
54-
// }
55-
// return instance();
56-
// }
46+
// public synchronized static ConfigurationService overrideCurrent(
47+
// Consumer<ConfigurationServiceOverrider> overrider) {
48+
// if (overrider != null) {
49+
// final var toOverride = new ConfigurationServiceOverrider(instance());
50+
// overrider.accept(toOverride);
51+
// set(toOverride.build(), true);
52+
// }
53+
// return instance();
54+
// }
5755

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ static Set<String> ensureValidNamespaces(Collection<String> namespaces) {
110110
*
111111
* @return a Set of namespace names the associated controller will watch
112112
*/
113-
default Set<String> getEffectiveNamespaces() {
113+
default Set<String> getEffectiveNamespaces(ConfigurationService configurationService) {
114114
var targetNamespaces = getNamespaces();
115115
if (watchCurrentNamespace()) {
116116
final String namespace =
117-
ConfigurationServiceProvider.instance().getClientConfiguration().getNamespace();
117+
configurationService.getClientConfiguration().getNamespace();
118118
if (namespace == null) {
119119
throw new OperatorException(
120120
"Couldn't retrieve the currently connected namespace. Make sure it's correctly set in your ~/.kube/config file, using, e.g. 'kubectl config set-context <your context> --namespace=<your namespace>'");

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ public InformerConfigurationBuilder<R> withNamespaces(Set<String> namespaces,
175175
*/
176176
public <P extends HasMetadata> InformerConfigurationBuilder<R> withNamespacesInheritedFromController(
177177
EventSourceContext<P> context) {
178-
namespaces = context.getControllerConfiguration().getEffectiveNamespaces();
178+
namespaces = context.getControllerConfiguration().getEffectiveNamespaces(
179+
context.getControllerConfiguration().getConfigurationService());
179180
this.inheritControllerNamespacesOnChange = true;
180181
return this;
181182
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/Controller.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public Controller(Reconciler<P> reconciler,
8484

8585
this.configurationService = configurationService;
8686
eventSourceManager = new EventSourceManager<>(this, executorServiceManager);
87-
eventProcessor = new EventProcessor<>(eventSourceManager, executorServiceManager);
87+
eventProcessor =
88+
new EventProcessor<>(eventSourceManager, executorServiceManager, configurationService);
8889
eventSourceManager.postProcessDefaultEventSourcesAfterProcessorInitializer();
8990
controllerHealthInfo = new ControllerHealthInfo(eventSourceManager);
9091
final var context = new EventSourceContext<>(
@@ -392,7 +393,7 @@ private void throwMissingCRDException(String crdName, String specVersion, String
392393
*/
393394
private void failOnMissingCurrentNS() {
394395
try {
395-
configuration.getEffectiveNamespaces();
396+
configuration.getEffectiveNamespaces(configurationService);
396397
} catch (OperatorException e) {
397398
throw new OperatorException(
398399
"Controller '"

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericKubernetesResourceMatcher.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
import io.fabric8.kubernetes.api.model.Secret;
88
import io.fabric8.zjsonpatch.JsonDiff;
99
import io.javaoperatorsdk.operator.ReconcilerUtils;
10-
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
1110
import io.javaoperatorsdk.operator.api.reconciler.Context;
1211
import io.javaoperatorsdk.operator.processing.dependent.Matcher;
1312

13+
import com.fasterxml.jackson.databind.ObjectMapper;
14+
1415
public class GenericKubernetesResourceMatcher<R extends HasMetadata, P extends HasMetadata>
1516
implements Matcher<R, P> {
1617

@@ -29,12 +30,13 @@ static <R extends HasMetadata, P extends HasMetadata> Matcher<R, P> matcherFor(
2930
@Override
3031
public Result<R> match(R actualResource, P primary, Context<P> context) {
3132
var desired = dependentResource.desired(primary, context);
32-
return match(desired, actualResource, false, false);
33+
return match(desired, actualResource, false, false, context.getControllerConfiguration()
34+
.getConfigurationService().getObjectMapper());
3335
}
3436

3537
public static <R extends HasMetadata> Result<R> match(R desired, R actualResource,
36-
boolean considerMetadata) {
37-
return match(desired, actualResource, considerMetadata, false);
38+
boolean considerMetadata, ObjectMapper objectMapper) {
39+
return match(desired, actualResource, considerMetadata, false, objectMapper);
3840
}
3941

4042
/**
@@ -62,7 +64,8 @@ public static <R extends HasMetadata> Result<R> match(R desired, R actualResourc
6264
* @param <R> resource
6365
*/
6466
public static <R extends HasMetadata> Result<R> match(R desired, R actualResource,
65-
boolean considerMetadata, boolean equality) {
67+
boolean considerMetadata, boolean equality,
68+
ObjectMapper objectMapper) {
6669
if (considerMetadata) {
6770
final var desiredMetadata = desired.getMetadata();
6871
final var actualMetadata = actualResource.getMetadata();
@@ -83,7 +86,6 @@ public static <R extends HasMetadata> Result<R> match(R desired, R actualResourc
8386
ResourceComparators.compareSecretData((Secret) desired, (Secret) actualResource),
8487
desired);
8588
} else {
86-
final var objectMapper = ConfigurationServiceProvider.instance().getObjectMapper();
8789

8890
// reflection will be replaced by this:
8991
// https://github.com/fabric8io/kubernetes-client/issues/3816
@@ -130,13 +132,15 @@ public static <R extends HasMetadata, P extends HasMetadata> Result<R> match(
130132
KubernetesDependentResource<R, P> dependentResource, R actualResource, P primary,
131133
Context<P> context, boolean considerMetadata, boolean strongEquality) {
132134
final var desired = dependentResource.desired(primary, context);
133-
return match(desired, actualResource, considerMetadata, strongEquality);
135+
return match(desired, actualResource, considerMetadata, strongEquality, dependentResource
136+
.getConfigurationService().getObjectMapper());
134137
}
135138

136139
public static <R extends HasMetadata, P extends HasMetadata> Result<R> match(
137140
KubernetesDependentResource<R, P> dependentResource, R actualResource, P primary,
138141
Context<P> context, boolean considerMetadata) {
139142
final var desired = dependentResource.desired(primary, context);
140-
return match(desired, actualResource, considerMetadata, false);
143+
return match(desired, actualResource, considerMetadata, false, dependentResource
144+
.getConfigurationService().getObjectMapper());
141145
}
142146
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/GenericResourceUpdatePreProcessor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.fabric8.kubernetes.api.model.HasMetadata;
55
import io.fabric8.kubernetes.api.model.Secret;
66
import io.javaoperatorsdk.operator.ReconcilerUtils;
7-
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
87
import io.javaoperatorsdk.operator.api.reconciler.Context;
98

109
public abstract class GenericResourceUpdatePreProcessor<R extends HasMetadata> implements
@@ -44,7 +43,9 @@ protected void updateClonedActual(R actual, R desired) {
4443
}
4544

4645
public R replaceSpecOnActual(R actual, R desired, Context<?> context) {
47-
var clonedActual = ConfigurationServiceProvider.instance().getResourceCloner().clone(actual);
46+
var clonedActual = context.getControllerConfiguration().getConfigurationService()
47+
.getResourceCloner()
48+
.clone(actual);
4849
updateClonedActual(clonedActual, desired);
4950
return clonedActual;
5051
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/KubernetesDependentResource.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import io.fabric8.kubernetes.client.KubernetesClient;
1313
import io.fabric8.kubernetes.client.dsl.Resource;
1414
import io.javaoperatorsdk.operator.OperatorException;
15+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
16+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceAware;
1517
import io.javaoperatorsdk.operator.api.config.dependent.Configured;
1618
import io.javaoperatorsdk.operator.api.config.informer.InformerConfiguration;
1719
import io.javaoperatorsdk.operator.api.reconciler.Constants;
@@ -34,7 +36,7 @@
3436
converter = KubernetesDependentConverter.class)
3537
public abstract class KubernetesDependentResource<R extends HasMetadata, P extends HasMetadata>
3638
extends AbstractEventSourceHolderDependentResource<R, P, InformerEventSource<R, P>>
37-
implements KubernetesClientAware,
39+
implements KubernetesClientAware, ConfigurationServiceAware,
3840
DependentResourceConfigurator<KubernetesDependentResourceConfig<R>> {
3941

4042
private static final Logger log = LoggerFactory.getLogger(KubernetesDependentResource.class);
@@ -44,6 +46,7 @@ public abstract class KubernetesDependentResource<R extends HasMetadata, P exten
4446
private final ResourceUpdatePreProcessor<R> processor;
4547
private final boolean garbageCollected = this instanceof GarbageCollected;
4648
private KubernetesDependentResourceConfig<R> kubernetesDependentResourceConfig;
49+
private ConfigurationService configurationService;
4750

4851
@SuppressWarnings("unchecked")
4952
public KubernetesDependentResource(Class<R> resourceType) {
@@ -146,7 +149,8 @@ public Result<R> match(R actualResource, P primary, Context<P> context) {
146149

147150
@SuppressWarnings("unused")
148151
public Result<R> match(R actualResource, R desired, P primary, Context<P> context) {
149-
return GenericKubernetesResourceMatcher.match(desired, actualResource, false);
152+
return GenericKubernetesResourceMatcher.match(desired, actualResource, false,
153+
configurationService.getObjectMapper());
150154
}
151155

152156
protected void handleDelete(P primary, R secondary, Context<P> context) {
@@ -261,4 +265,13 @@ public Optional<KubernetesDependentResourceConfig<R>> configuration() {
261265
public boolean isDeletable() {
262266
return super.isDeletable() && !garbageCollected;
263267
}
268+
269+
@Override
270+
public void setConfigurationService(ConfigurationService configurationService) {
271+
this.configurationService = configurationService;
272+
}
273+
274+
public ConfigurationService getConfigurationService() {
275+
return configurationService;
276+
}
264277
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/DefaultManagedWorkflow.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import io.fabric8.kubernetes.api.model.HasMetadata;
1010
import io.fabric8.kubernetes.client.KubernetesClient;
11-
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
11+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1212
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1313
import io.javaoperatorsdk.operator.api.config.dependent.DependentResourceSpec;
1414
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
@@ -24,9 +24,11 @@ public class DefaultManagedWorkflow<P extends HasMetadata> implements ManagedWor
2424
private final Set<String> bottomLevelResources;
2525
private final List<DependentResourceSpec> orderedSpecs;
2626
private final boolean hasCleaner;
27+
private final ConfigurationService configurationService;
2728

2829
protected DefaultManagedWorkflow(List<DependentResourceSpec> orderedSpecs,
29-
boolean hasCleaner) {
30+
boolean hasCleaner, ConfigurationService configurationService) {
31+
this.configurationService = configurationService;
3032
this.hasCleaner = hasCleaner;
3133
topLevelResources = new HashSet<>(orderedSpecs.size());
3234
bottomLevelResources = orderedSpecs.stream()
@@ -102,7 +104,7 @@ private <R> DependentResource<R, P> resolve(DependentResourceSpec<R, P> spec,
102104
KubernetesClient client,
103105
ControllerConfiguration<P> configuration) {
104106
final DependentResource<R, P> dependentResource =
105-
ConfigurationServiceProvider.instance().dependentResourceFactory()
107+
configurationService.dependentResourceFactory()
106108
.createFrom(spec, configuration);
107109

108110
if (dependentResource instanceof KubernetesClientAware) {

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/ManagedWorkflowSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ <P extends HasMetadata> DefaultManagedWorkflow<P> createAsDefault(
5656
List<DependentResourceSpec> dependentResourceSpecs) {
5757
final boolean[] cleanerHolder = {false};
5858
var orderedResourceSpecs = orderAndDetectCycles(dependentResourceSpecs, cleanerHolder);
59-
return new DefaultManagedWorkflow<>(orderedResourceSpecs, cleanerHolder[0]);
59+
return new DefaultManagedWorkflow<>(orderedResourceSpecs, cleanerHolder[0],);
6060
}
6161

6262
/**

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/EventProcessor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
import java.util.Optional;
77
import java.util.concurrent.ExecutorService;
88

9-
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
109
import org.slf4j.Logger;
1110
import org.slf4j.LoggerFactory;
1211

1312
import io.fabric8.kubernetes.api.model.HasMetadata;
1413
import io.javaoperatorsdk.operator.OperatorException;
15-
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
14+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1615
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
1716
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
1817
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
@@ -49,7 +48,7 @@ public class EventProcessor<P extends HasMetadata> implements EventHandler, Life
4948
private ExecutorService executor;
5049

5150
public EventProcessor(EventSourceManager<P> eventSourceManager, ExecutorServiceManager executor,
52-
ConfigurationService configurationService) {
51+
ConfigurationService configurationService) {
5352
this(
5453
eventSourceManager.getController().getConfiguration(),
5554
eventSourceManager.getControllerResourceEventSource(),

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/ReconciliationDispatcher.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.function.Function;
44

5-
import io.javaoperatorsdk.operator.api.config.Cloner;
65
import org.slf4j.Logger;
76
import org.slf4j.LoggerFactory;
87

@@ -15,7 +14,7 @@
1514
import io.fabric8.kubernetes.client.dsl.Resource;
1615
import io.javaoperatorsdk.operator.OperatorException;
1716
import io.javaoperatorsdk.operator.api.ObservedGenerationAware;
18-
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
17+
import io.javaoperatorsdk.operator.api.config.Cloner;
1918
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
2019
import io.javaoperatorsdk.operator.api.reconciler.BaseControl;
2120
import io.javaoperatorsdk.operator.api.reconciler.Context;

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private void initSources() {
7373
throw new IllegalStateException("Some sources already initialized.");
7474
}
7575
cloner = configurationService.getResourceCloner();
76-
final var targetNamespaces = configuration.getEffectiveNamespaces();
76+
final var targetNamespaces = configuration.getEffectiveNamespaces(configurationService);
7777
if (ResourceConfiguration.allNamespacesWatched(targetNamespaces)) {
7878
var source = createEventSourceForNamespace(WATCH_ALL_NAMESPACES);
7979
log.debug("Registered {} -> {} for any namespace", this, source);
@@ -129,7 +129,7 @@ private InformerWrapper<T> createEventSource(
129129
var informer = filteredBySelectorClient.runnableInformer(0);
130130
configuration.getItemStore().ifPresent(informer::itemStore);
131131
var source =
132-
new InformerWrapper<>(informer,configurationService, namespaceIdentifier);
132+
new InformerWrapper<>(informer, configurationService, namespaceIdentifier);
133133
source.addEventHandler(eventHandler);
134134
sources.put(namespaceIdentifier, source);
135135
return source;
@@ -207,7 +207,7 @@ public String toString() {
207207
return "InformerManager ["
208208
+ ReconcilerUtils.getResourceTypeNameWithVersion(configuration.getResourceClass())
209209
+ "] watching: "
210-
+ configuration.getEffectiveNamespaces()
210+
+ configuration.getEffectiveNamespaces(configurationService)
211211
+ (selector != null ? " selector: " + selector : "");
212212
}
213213

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/event/source/informer/ManagedInformerEventSource.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.util.function.Predicate;
99
import java.util.stream.Stream;
1010

11-
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1211
import org.slf4j.Logger;
1312
import org.slf4j.LoggerFactory;
1413

@@ -17,6 +16,8 @@
1716
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1817
import io.fabric8.kubernetes.client.dsl.Resource;
1918
import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
19+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
20+
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceAware;
2021
import io.javaoperatorsdk.operator.api.config.NamespaceChangeable;
2122
import io.javaoperatorsdk.operator.api.config.ResourceConfiguration;
2223
import io.javaoperatorsdk.operator.api.reconciler.dependent.RecentOperationCacheFiller;
@@ -33,20 +34,22 @@ public abstract class ManagedInformerEventSource<R extends HasMetadata, P extend
3334
extends AbstractResourceEventSource<R, P>
3435
implements ResourceEventHandler<R>, Cache<R>, IndexerResourceCache<R>,
3536
RecentOperationCacheFiller<R>,
36-
NamespaceChangeable, InformerWrappingEventSourceHealthIndicator<R>, Configurable<C> {
37+
NamespaceChangeable, InformerWrappingEventSourceHealthIndicator<R>, Configurable<C>,
38+
ConfigurationServiceAware {
3739

3840
private static final Logger log = LoggerFactory.getLogger(ManagedInformerEventSource.class);
3941

4042
protected TemporaryResourceCache<R> temporaryResourceCache;
4143
protected InformerManager<R, C> cache;
4244
protected C configuration;
45+
protected MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client;
46+
protected ConfigurationService configurationService;
4347

4448
protected ManagedInformerEventSource(
45-
MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client, C configuration,
46-
ConfigurationService configurationService) {
49+
MixedOperation<R, KubernetesResourceList<R>, Resource<R>> client, C configuration) {
4750
super(configuration.getResourceClass());
51+
this.client = client;
4852
temporaryResourceCache = new TemporaryResourceCache<>(this);
49-
cache = new InformerManager<>(client, configuration, configurationService,this);
5053
this.configuration = configuration;
5154
}
5255

@@ -172,4 +175,10 @@ public String toString() {
172175
"resourceClass: " + configuration.getResourceClass().getSimpleName() +
173176
"}";
174177
}
178+
179+
@Override
180+
public void setConfigurationService(ConfigurationService configurationService) {
181+
cache = new InformerManager<>(client, configuration, configurationService, this);
182+
this.configurationService = configurationService;
183+
}
175184
}

0 commit comments

Comments
 (0)