Skip to content

Commit 2a28cc2

Browse files
committed
feat: provide and use Kubernetes client directly
1 parent 0c6fe4f commit 2a28cc2

File tree

11 files changed

+38
-132
lines changed

11 files changed

+38
-132
lines changed

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/LeaderElectionManager.java

+5-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectRulesReview;
1111
import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectRulesReviewSpecBuilder;
12-
import io.fabric8.kubernetes.client.KubernetesClient;
1312
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderCallbacks;
1413
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElectionConfig;
1514
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElector;
@@ -32,14 +31,11 @@ public class LeaderElectionManager {
3231
private final ControllerManager controllerManager;
3332
private String identity;
3433
private CompletableFuture<?> leaderElectionFuture;
35-
private KubernetesClient kubernetesClient;
3634
private final ConfigurationService configurationService;
3735
private String leaseNamespace;
3836

39-
public LeaderElectionManager(KubernetesClient kubernetesClient,
40-
ControllerManager controllerManager,
37+
LeaderElectionManager(ControllerManager controllerManager,
4138
ConfigurationService configurationService) {
42-
this.kubernetesClient = kubernetesClient;
4339
this.controllerManager = controllerManager;
4440
this.configurationService = configurationService;
4541
}
@@ -52,7 +48,7 @@ private void init(LeaderElectionConfiguration config) {
5248
this.identity = identity(config);
5349
leaseNamespace =
5450
config.getLeaseNamespace().orElseGet(
55-
() -> configurationService.getClientConfiguration().getNamespace());
51+
() -> configurationService.getKubernetesClient().getConfiguration().getNamespace());
5652
if (leaseNamespace == null) {
5753
final var message =
5854
"Lease namespace is not set and cannot be inferred. Leader election cannot continue.";
@@ -62,7 +58,8 @@ private void init(LeaderElectionConfiguration config) {
6258
final var lock = new LeaseLock(leaseNamespace, config.getLeaseName(), identity);
6359
// releaseOnCancel is not used in the underlying implementation
6460
leaderElector = new LeaderElectorBuilder(
65-
kubernetesClient, configurationService.getExecutorServiceManager().cachingExecutorService())
61+
configurationService.getKubernetesClient(),
62+
configurationService.getExecutorServiceManager().cachingExecutorService())
6663
.withConfig(
6764
new LeaderElectionConfig(
6865
lock,
@@ -122,7 +119,7 @@ private void checkLeaseAccess() {
122119
var verbs = Arrays.asList("create", "update", "get");
123120
SelfSubjectRulesReview review = new SelfSubjectRulesReview();
124121
review.setSpec(new SelfSubjectRulesReviewSpecBuilder().withNamespace(leaseNamespace).build());
125-
var reviewResult = kubernetesClient.resource(review).create();
122+
var reviewResult = configurationService.getKubernetesClient().resource(review).create();
126123
log.debug("SelfSubjectRulesReview result: {}", reviewResult);
127124
var foundRule = reviewResult.getStatus().getResourceRules().stream()
128125
.filter(rule -> rule.getApiGroups().contains(COORDINATION_GROUP)

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import io.fabric8.kubernetes.api.model.HasMetadata;
1313
import io.fabric8.kubernetes.client.KubernetesClient;
1414
import io.fabric8.kubernetes.client.Version;
15-
import io.javaoperatorsdk.operator.api.config.BaseConfigurationService;
1615
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1716
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
1817
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
@@ -45,6 +44,7 @@ public Operator() {
4544
* @deprecated Use {@link #Operator(Consumer)} instead
4645
*/
4746
@Deprecated(forRemoval = true)
47+
@SuppressWarnings("unused")
4848
public Operator(ConfigurationService configurationService) {
4949
this(null, null);
5050
}
@@ -60,12 +60,14 @@ public Operator(Consumer<ConfigurationServiceOverrider> overrider) {
6060
* @param client client to use to all Kubernetes related operations
6161
* @param overrider a {@link ConfigurationServiceOverrider} consumer used to override the default
6262
* {@link ConfigurationService} values
63+
* @deprecated Use {@link Operator#Operator(Consumer)} instead, passing your custom client with
64+
* {@link ConfigurationServiceOverrider#withKubernetesClient(KubernetesClient)}
6365
*/
66+
@Deprecated
6467
public Operator(KubernetesClient client, Consumer<ConfigurationServiceOverrider> overrider) {
6568
// initialize the client if the user didn't provide one
6669
if (client == null) {
67-
var configurationService = ConfigurationService
68-
.newOverriddenConfigurationService(new BaseConfigurationService(), overrider);
70+
var configurationService = ConfigurationService.newOverriddenConfigurationService(overrider);
6971
client = configurationService.getKubernetesClient();
7072
}
7173

@@ -77,14 +79,12 @@ public Operator(KubernetesClient client, Consumer<ConfigurationServiceOverrider>
7779
} else {
7880
overrider = o -> o.withKubernetesClient(this.kubernetesClient);
7981
}
80-
this.configurationService = ConfigurationService
81-
.newOverriddenConfigurationService(new BaseConfigurationService(), overrider);
82+
this.configurationService = ConfigurationService.newOverriddenConfigurationService(overrider);
8283

8384
final var executorServiceManager = configurationService.getExecutorServiceManager();
8485
controllerManager = new ControllerManager(executorServiceManager);
8586

86-
leaderElectionManager =
87-
new LeaderElectionManager(this.kubernetesClient, controllerManager, configurationService);
87+
leaderElectionManager = new LeaderElectionManager(controllerManager, configurationService);
8888
}
8989

9090
/**

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

+9-20
Original file line numberDiff line numberDiff line change
@@ -9,44 +9,38 @@
99
import io.javaoperatorsdk.operator.ReconcilerUtils;
1010
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
1111

12-
import com.fasterxml.jackson.databind.ObjectMapper;
13-
1412
@SuppressWarnings("rawtypes")
1513
public class AbstractConfigurationService implements ConfigurationService {
1614
private final Map<String, ControllerConfiguration> configurations = new ConcurrentHashMap<>();
1715
private final Version version;
1816
private Cloner cloner;
19-
private ObjectMapper mapper;
2017
private ExecutorServiceManager executorServiceManager;
2118

2219
public AbstractConfigurationService(Version version) {
23-
this(version, null, null, null);
20+
this(version, null, null);
2421
}
2522

2623
public AbstractConfigurationService(Version version, Cloner cloner) {
27-
this(version, cloner, null, null);
24+
this(version, cloner, null);
2825
}
2926

30-
public AbstractConfigurationService(Version version, Cloner cloner, ObjectMapper mapper,
27+
public AbstractConfigurationService(Version version, Cloner cloner,
3128
ExecutorServiceManager executorServiceManager) {
3229
this.version = version;
33-
init(cloner, mapper, executorServiceManager);
30+
init(cloner, executorServiceManager);
3431
}
3532

3633
/**
37-
* Subclasses can call this method to more easily initialize the {@link Cloner}
38-
* {@link ObjectMapper} and {@link ExecutorServiceManager} associated with this
39-
* ConfigurationService implementation. This is useful in situations where the cloner depends on a
40-
* mapper that might require additional configuration steps before it's ready to be used.
34+
* Subclasses can call this method to more easily initialize the {@link Cloner} and
35+
* {@link ExecutorServiceManager} associated with this ConfigurationService implementation. This
36+
* is useful in situations where the cloner depends on a mapper that might require additional
37+
* configuration steps before it's ready to be used.
4138
*
4239
* @param cloner the {@link Cloner} instance to be used
43-
* @param mapper the {@link ObjectMapper} instance to be used
4440
* @param executorServiceManager the {@link ExecutorServiceManager} instance to be used
4541
*/
46-
protected void init(Cloner cloner, ObjectMapper mapper,
47-
ExecutorServiceManager executorServiceManager) {
42+
protected void init(Cloner cloner, ExecutorServiceManager executorServiceManager) {
4843
this.cloner = cloner != null ? cloner : ConfigurationService.super.getResourceCloner();
49-
this.mapper = mapper != null ? mapper : ConfigurationService.super.getObjectMapper();
5044
this.executorServiceManager = executorServiceManager;
5145
}
5246

@@ -133,11 +127,6 @@ public Cloner getResourceCloner() {
133127
return cloner;
134128
}
135129

136-
@Override
137-
public ObjectMapper getObjectMapper() {
138-
return mapper;
139-
}
140-
141130
@Override
142131
public ExecutorServiceManager getExecutorServiceManager() {
143132
// lazy init to avoid initializing thread pools for nothing in an overriding scenario

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/BaseConfigurationService.java

-6
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
import io.javaoperatorsdk.operator.processing.event.source.filter.OnUpdateFilter;
3232
import io.javaoperatorsdk.operator.processing.retry.Retry;
3333

34-
import com.fasterxml.jackson.databind.ObjectMapper;
35-
3634
import static io.javaoperatorsdk.operator.api.config.ControllerConfiguration.CONTROLLER_NAME_AS_FIELD_MANAGER;
3735
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
3836

@@ -45,10 +43,6 @@ public BaseConfigurationService(Version version) {
4543
super(version);
4644
}
4745

48-
public BaseConfigurationService(Version version, Cloner cloner, ObjectMapper mapper) {
49-
super(version, cloner, mapper, null);
50-
}
51-
5246
public BaseConfigurationService(Version version, Cloner cloner) {
5347
super(version, cloner);
5448
}

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/config/ConfigurationService.java

+6-23
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResourceFactory;
2222
import io.javaoperatorsdk.operator.processing.dependent.workflow.ManagedWorkflowFactory;
2323

24-
import com.fasterxml.jackson.databind.ObjectMapper;
25-
2624
import static io.javaoperatorsdk.operator.api.config.ExecutorServiceManager.newThreadPoolExecutor;
2725

2826
/** An interface from which to retrieve configuration information. */
@@ -42,26 +40,6 @@ public interface ConfigurationService {
4240
*/
4341
<R extends HasMetadata> ControllerConfiguration<R> getConfigurationFor(Reconciler<R> reconciler);
4442

45-
/**
46-
* Retrieves the Kubernetes client configuration
47-
*
48-
* @return the configuration of the Kubernetes client, defaulting to the provided
49-
* auto-configuration
50-
* @deprecated Configure your client as needed using {@link #getKubernetesClient()} or a
51-
* {@link ConfigurationServiceOverrider} to pass your own client instance, configured
52-
* as needed, instead
53-
*/
54-
@Deprecated(since = "4.4.0", forRemoval = true)
55-
default Config getClientConfiguration() {
56-
return getKubernetesClient().getConfiguration();
57-
}
58-
59-
60-
ObjectMapper mapper = new ObjectMapper();
61-
62-
default ObjectMapper getObjectMapper() {
63-
return mapper;
64-
}
6543

6644
/**
6745
* Used to clone custom resources. It is strongly suggested that implementors override this method
@@ -84,7 +62,7 @@ default KubernetesClient getKubernetesClient() {
8462
.withConfig(new ConfigBuilder(Config.autoConfigure(null))
8563
.withMaxConcurrentRequests(DEFAULT_MAX_CONCURRENT_REQUEST)
8664
.build())
87-
.withKubernetesSerialization(new KubernetesSerialization(getObjectMapper(), true))
65+
.withKubernetesSerialization(new KubernetesSerialization())
8866
.build();
8967
}
9068

@@ -275,6 +253,11 @@ static ConfigurationService newOverriddenConfigurationService(
275253
return baseConfiguration;
276254
}
277255

256+
static ConfigurationService newOverriddenConfigurationService(
257+
Consumer<ConfigurationServiceOverrider> overrider) {
258+
return newOverriddenConfigurationService(new BaseConfigurationService(), overrider);
259+
}
260+
278261
default ExecutorServiceManager getExecutorServiceManager() {
279262
return new ExecutorServiceManager(this);
280263
}

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

+1-29
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,15 @@
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
1111

12-
import io.fabric8.kubernetes.client.Config;
1312
import io.fabric8.kubernetes.client.KubernetesClient;
1413
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
1514

16-
import com.fasterxml.jackson.databind.ObjectMapper;
17-
1815
@SuppressWarnings("unused")
1916
public class ConfigurationServiceOverrider {
2017

2118
private static final Logger log = LoggerFactory.getLogger(ConfigurationServiceOverrider.class);
2219
private final ConfigurationService original;
2320
private Metrics metrics;
24-
private Config clientConfig;
2521
private Boolean checkCR;
2622
private Integer concurrentReconciliationThreads;
2723
private Integer minConcurrentReconciliationThreads;
@@ -30,7 +26,6 @@ public class ConfigurationServiceOverrider {
3026
private Cloner cloner;
3127
private Integer timeoutSeconds;
3228
private Boolean closeClientOnStop;
33-
private ObjectMapper objectMapper;
3429
private KubernetesClient client;
3530
private ExecutorService executorService;
3631
private ExecutorService workflowExecutorService;
@@ -46,11 +41,6 @@ public class ConfigurationServiceOverrider {
4641
this.original = original;
4742
}
4843

49-
public ConfigurationServiceOverrider withClientConfiguration(Config configuration) {
50-
this.clientConfig = configuration;
51-
return this;
52-
}
53-
5444
public ConfigurationServiceOverrider checkingCRDAndValidateLocalModel(boolean check) {
5545
this.checkCR = check;
5646
return this;
@@ -115,11 +105,6 @@ public ConfigurationServiceOverrider withWorkflowExecutorService(
115105
return this;
116106
}
117107

118-
public ConfigurationServiceOverrider withObjectMapper(ObjectMapper objectMapper) {
119-
this.objectMapper = objectMapper;
120-
return this;
121-
}
122-
123108
public ConfigurationServiceOverrider withKubernetesClient(KubernetesClient client) {
124109
this.client = client;
125110
return this;
@@ -166,18 +151,12 @@ public ConfigurationServiceOverrider withSSABasedDefaultMatchingForDependentReso
166151
}
167152

168153
public ConfigurationService build() {
169-
return new BaseConfigurationService(original.getVersion(), cloner, objectMapper) {
154+
return new BaseConfigurationService(original.getVersion(), cloner) {
170155
@Override
171156
public Set<String> getKnownReconcilerNames() {
172157
return original.getKnownReconcilerNames();
173158
}
174159

175-
@Override
176-
public Config getClientConfiguration() {
177-
//todo: check if client exists
178-
return clientConfig != null ? clientConfig : (client != null ? client.getConfiguration() : original.getClientConfiguration());
179-
}
180-
181160
@Override
182161
public boolean checkCRDAndValidateLocalModel() {
183162
return checkCR != null ? checkCR : original.checkCRDAndValidateLocalModel();
@@ -242,15 +221,8 @@ public ExecutorService getWorkflowExecutorService() {
242221
: super.getWorkflowExecutorService();
243222
}
244223

245-
@Override
246-
public ObjectMapper getObjectMapper() {
247-
// todo: check if client exits
248-
return objectMapper != null ? objectMapper : original.getObjectMapper();
249-
}
250-
251224
@Override
252225
public KubernetesClient getKubernetesClient() {
253-
// TODO: we need to use the client's mapper if we provided a client
254226
return client != null ? client : original.getKubernetesClient();
255227
}
256228

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ static Set<String> ensureValidNamespaces(Collection<String> namespaces) {
114114
default Set<String> getEffectiveNamespaces(ConfigurationService configurationService) {
115115
var targetNamespaces = getNamespaces();
116116
if (watchCurrentNamespace()) {
117-
final String namespace = configurationService.getClientConfiguration().getNamespace();
117+
final String namespace =
118+
configurationService.getKubernetesClient().getConfiguration().getNamespace();
118119
if (namespace == null) {
119120
throw new OperatorException(
120121
"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>'");

Diff for: operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/kubernetes/SSABasedGenericKubernetesResourceMatcher.java

-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import io.javaoperatorsdk.operator.api.reconciler.Context;
2222

2323
import com.fasterxml.jackson.core.JsonProcessingException;
24-
import com.fasterxml.jackson.core.type.TypeReference;
2524

2625
/**
2726
* Matches the actual state on the server vs the desired state. Based on the managedFields of SSA.
@@ -53,8 +52,6 @@ public static <L extends HasMetadata> SSABasedGenericKubernetesResourceMatcher<L
5352
return INSTANCE;
5453
}
5554

56-
private static final TypeReference<HashMap<String, Object>> typeRef = new TypeReference<>() {};
57-
5855
private static final String F_PREFIX = "f:";
5956
private static final String K_PREFIX = "k:";
6057
private static final String V_PREFIX = "v:";

0 commit comments

Comments
 (0)