Skip to content

Commit e2df3c0

Browse files
committed
chore: restore fabric8 5.12 compatibility
1 parent edd12e5 commit e2df3c0

File tree

15 files changed

+68
-53
lines changed

15 files changed

+68
-53
lines changed

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

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

33
import java.util.UUID;
4-
import java.util.concurrent.CompletableFuture;
4+
import java.util.concurrent.Future;
55

66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
@@ -10,7 +10,6 @@
1010
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderCallbacks;
1111
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElectionConfig;
1212
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElector;
13-
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElectorBuilder;
1413
import io.fabric8.kubernetes.client.extended.leaderelection.resourcelock.LeaseLock;
1514
import io.fabric8.kubernetes.client.extended.leaderelection.resourcelock.Lock;
1615
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
@@ -23,7 +22,7 @@ public class LeaderElectionManager {
2322
private LeaderElector leaderElector = null;
2423
private final ControllerManager controllerManager;
2524
private String identity;
26-
private CompletableFuture<?> leaderElectionFuture;
25+
private Future<?> leaderElectionFuture;
2726

2827
public LeaderElectionManager(ControllerManager controllerManager) {
2928
this.controllerManager = controllerManager;
@@ -33,11 +32,9 @@ public void init(LeaderElectionConfiguration config, KubernetesClient client) {
3332
this.identity = identity(config);
3433
Lock lock = new LeaseLock(config.getLeaseNamespace(), config.getLeaseName(), identity);
3534
// releaseOnCancel is not used in the underlying implementation
36-
leaderElector = new LeaderElectorBuilder(client,
37-
ConfigurationServiceProvider.instance().getExecutorService())
38-
.withConfig(
39-
new LeaderElectionConfig(lock, config.getLeaseDuration(), config.getRenewDeadline(),
40-
config.getRetryPeriod(), leaderCallbacks(), true, config.getLeaseName()))
35+
leaderElector = client.leaderElector().withConfig(
36+
new LeaderElectionConfig(lock, config.getLeaseDuration(), config.getRenewDeadline(),
37+
config.getRetryPeriod(), leaderCallbacks(), true, config.getLeaseName()))
4138
.build();
4239
}
4340

@@ -73,7 +70,8 @@ private String identity(LeaderElectionConfiguration config) {
7370

7471
public void start() {
7572
if (isLeaderElectionEnabled()) {
76-
leaderElectionFuture = leaderElector.start();
73+
leaderElectionFuture =
74+
ConfigurationServiceProvider.instance().getExecutorService().submit(leaderElector::run);
7775
}
7876
}
7977

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import org.slf4j.LoggerFactory;
1010

1111
import io.fabric8.kubernetes.api.model.HasMetadata;
12+
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
1213
import io.fabric8.kubernetes.client.KubernetesClient;
13-
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
1414
import io.fabric8.kubernetes.client.Version;
1515
import io.javaoperatorsdk.operator.api.config.*;
1616
import io.javaoperatorsdk.operator.api.reconciler.Reconciler;
@@ -59,7 +59,7 @@ public Operator(KubernetesClient client, Consumer<ConfigurationServiceOverrider>
5959
*/
6060
public Operator(KubernetesClient kubernetesClient, ConfigurationService configurationService) {
6161
this.kubernetesClient =
62-
kubernetesClient != null ? kubernetesClient : new KubernetesClientBuilder().build();
62+
kubernetesClient != null ? kubernetesClient : new DefaultKubernetesClient();
6363
configurationService.getLeaderElectionConfiguration()
6464
.ifPresent(c -> leaderElectionManager.init(c, this.kubernetesClient));
6565
ConfigurationServiceProvider.set(configurationService);

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.javaoperatorsdk.operator.processing.event;
22

3+
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
5+
import java.nio.charset.StandardCharsets;
6+
37
import org.slf4j.Logger;
48
import org.slf4j.LoggerFactory;
59

@@ -10,6 +14,7 @@
1014
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1115
import io.fabric8.kubernetes.client.dsl.Resource;
1216
import io.fabric8.kubernetes.client.dsl.internal.HasMetadataOperationsImpl;
17+
import io.fabric8.kubernetes.client.utils.Serialization;
1318
import io.javaoperatorsdk.operator.OperatorException;
1419
import io.javaoperatorsdk.operator.api.ObservedGenerationAware;
1520
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceProvider;
@@ -367,9 +372,9 @@ public R updateResource(R resource) {
367372
resource.getMetadata().getResourceVersion());
368373
return resourceOperation
369374
.inNamespace(resource.getMetadata().getNamespace())
370-
.resource(resource)
375+
.withName(getName(resource))
371376
.lockResourceVersion(resource.getMetadata().getResourceVersion())
372-
.replace();
377+
.replace(resource);
373378
}
374379

375380
@SuppressWarnings({"rawtypes", "unchecked"})
@@ -388,11 +393,15 @@ public R patchStatus(R resource, R originalResource) {
388393
// don't do optimistic locking on patch
389394
originalResource.getMetadata().setResourceVersion(null);
390395
resource.getMetadata().setResourceVersion(null);
391-
try {
396+
try (var bis = new ByteArrayInputStream(
397+
Serialization.asJson(originalResource).getBytes(StandardCharsets.UTF_8))) {
392398
return resourceOperation
393399
.inNamespace(resource.getMetadata().getNamespace())
394-
.resource(originalResource)
400+
// will be simplified in fabric8 v6
401+
.load(bis)
395402
.editStatus(r -> resource);
403+
} catch (IOException e) {
404+
throw new IllegalStateException(e);
396405
} finally {
397406
// restore initial resource version
398407
originalResource.getMetadata().setResourceVersion(resourceVersion);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void changeNamespaces(Set<String> namespaces) {
9494

9595

9696
private InformerWrapper<T> createEventSource(
97-
FilterWatchListDeletable<T, KubernetesResourceList<T>, Resource<T>> filteredBySelectorClient,
97+
FilterWatchListDeletable<T, KubernetesResourceList<T>> filteredBySelectorClient,
9898
ResourceEventHandler<T> eventHandler, String key) {
9999
var source = new InformerWrapper<>(filteredBySelectorClient.runnableInformer(0));
100100
source.addEventHandler(eventHandler);

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import io.fabric8.kubernetes.api.model.HasMetadata;
44
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
5+
import io.fabric8.kubernetes.client.GenericKubernetesClient;
56
import io.fabric8.kubernetes.client.KubernetesClient;
67
import io.fabric8.kubernetes.client.V1ApiextensionAPIGroupDSL;
78
import io.fabric8.kubernetes.client.dsl.*;
9+
import io.fabric8.kubernetes.client.extended.leaderelection.LeaderElectorBuilder;
810
import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
911
import io.fabric8.kubernetes.client.informers.cache.Indexer;
1012

@@ -18,14 +20,14 @@
1820
public class MockKubernetesClient {
1921

2022
public static <T extends HasMetadata> KubernetesClient client(Class<T> clazz) {
21-
final var client = mock(KubernetesClient.class);
23+
final var client = mock(GenericKubernetesClient.class);
2224
MixedOperation<T, KubernetesResourceList<T>, Resource<T>> resources =
2325
mock(MixedOperation.class);
2426
NonNamespaceOperation<T, KubernetesResourceList<T>, Resource<T>> nonNamespaceOperation =
2527
mock(NonNamespaceOperation.class);
26-
AnyNamespaceOperation<T, KubernetesResourceList<T>, Resource<T>> inAnyNamespace = mock(
27-
AnyNamespaceOperation.class);
28-
FilterWatchListDeletable<T, KubernetesResourceList<T>, Resource<T>> filterable =
28+
FilterWatchListMultiDeletable<T, KubernetesResourceList<T>> inAnyNamespace = mock(
29+
FilterWatchListMultiDeletable.class);
30+
FilterWatchListDeletable<T, KubernetesResourceList<T>> filterable =
2931
mock(FilterWatchListDeletable.class);
3032
when(resources.inNamespace(anyString())).thenReturn(nonNamespaceOperation);
3133
when(nonNamespaceOperation.withLabelSelector(nullable(String.class))).thenReturn(filterable);
@@ -36,6 +38,7 @@ public static <T extends HasMetadata> KubernetesClient client(Class<T> clazz) {
3638
when(informer.getIndexer()).thenReturn(mockIndexer);
3739
when(filterable.runnableInformer(anyLong())).thenReturn(informer);
3840
when(client.resources(clazz)).thenReturn(resources);
41+
when(client.leaderElector()).thenReturn(new LeaderElectorBuilder(client));
3942

4043
final var apiGroupDSL = mock(ApiextensionsAPIGroupDSL.class);
4144
when(client.apiextensions()).thenReturn(apiGroupDSL);

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/processing/event/source/informer/InformerEventSourceTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import io.fabric8.kubernetes.api.model.ObjectMeta;
1010
import io.fabric8.kubernetes.api.model.apps.Deployment;
1111
import io.fabric8.kubernetes.client.KubernetesClient;
12-
import io.fabric8.kubernetes.client.dsl.AnyNamespaceOperation;
12+
import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable;
13+
import io.fabric8.kubernetes.client.dsl.FilterWatchListMultiDeletable;
1314
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1415
import io.fabric8.kubernetes.client.informers.SharedIndexInformer;
1516
import io.fabric8.kubernetes.client.informers.cache.Indexer;
@@ -21,7 +22,11 @@
2122

2223
import static io.javaoperatorsdk.operator.api.reconciler.Constants.DEFAULT_NAMESPACES_SET;
2324
import static org.mockito.ArgumentMatchers.any;
24-
import static org.mockito.Mockito.*;
25+
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.never;
27+
import static org.mockito.Mockito.times;
28+
import static org.mockito.Mockito.verify;
29+
import static org.mockito.Mockito.when;
2530

2631
@SuppressWarnings({"rawtypes", "unchecked"})
2732
class InformerEventSourceTest {
@@ -36,10 +41,10 @@ class InformerEventSourceTest {
3641
mock(TemporaryResourceCache.class);
3742
private final EventHandler eventHandlerMock = mock(EventHandler.class);
3843
private final MixedOperation crClientMock = mock(MixedOperation.class);
39-
private final AnyNamespaceOperation specificResourceClientMock =
40-
mock(AnyNamespaceOperation.class);
41-
private final AnyNamespaceOperation labeledResourceClientMock =
42-
mock(AnyNamespaceOperation.class);
44+
private final FilterWatchListMultiDeletable specificResourceClientMock =
45+
mock(FilterWatchListMultiDeletable.class);
46+
private final FilterWatchListDeletable labeledResourceClientMock =
47+
mock(FilterWatchListDeletable.class);
4348
private final SharedIndexInformer informer = mock(SharedIndexInformer.class);
4449
private final InformerConfiguration<Deployment> informerConfiguration =
4550
mock(InformerConfiguration.class);

operator-framework-core/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestCustomReconciler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ public TestCustomReconciler(KubernetesClient kubernetesClient, boolean updateSta
3838
@Override
3939
public DeleteControl cleanup(
4040
TestCustomResource resource, Context<TestCustomResource> context) {
41-
var statusDetails =
41+
var deleted =
4242
kubernetesClient
4343
.configMaps()
4444
.inNamespace(resource.getMetadata().getNamespace())
4545
.withName(resource.getSpec().getConfigMapName())
4646
.delete();
47-
if (statusDetails.size() == 1 && statusDetails.get(0).getCauses().isEmpty()) {
47+
if (deleted) {
4848
log.info(
4949
"Deleted ConfigMap {} for resource: {}",
5050
resource.getSpec().getConfigMapName(),

operator-framework-junit5/src/main/java/io/javaoperatorsdk/operator/junit/AbstractOperatorExtension.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
import io.fabric8.kubernetes.api.model.HasMetadata;
1717
import io.fabric8.kubernetes.api.model.KubernetesResourceList;
1818
import io.fabric8.kubernetes.api.model.NamespaceBuilder;
19+
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
1920
import io.fabric8.kubernetes.client.KubernetesClient;
20-
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
21+
import io.fabric8.kubernetes.client.dsl.MixedOperation;
2122
import io.fabric8.kubernetes.client.dsl.NonNamespaceOperation;
2223
import io.fabric8.kubernetes.client.dsl.Resource;
2324
import io.fabric8.kubernetes.client.utils.KubernetesResourceUtil;
@@ -52,7 +53,7 @@ protected AbstractOperatorExtension(
5253
boolean preserveNamespaceOnError,
5354
boolean waitForNamespaceDeletion) {
5455

55-
this.kubernetesClient = new KubernetesClientBuilder().build();
56+
this.kubernetesClient = new DefaultKubernetesClient();
5657
this.configurationService = configurationService;
5758
this.infrastructure = infrastructure;
5859
this.infrastructureTimeout = infrastructureTimeout;
@@ -101,7 +102,7 @@ public <T extends HasMetadata> T get(Class<T> type, String name) {
101102
}
102103

103104
public <T extends HasMetadata> T create(T resource) {
104-
return kubernetesClient.resource(resource).inNamespace(namespace).create();
105+
return (T) kubernetesClient.resources(resource.getClass()).inNamespace(namespace).create();
105106
}
106107

107108
@Deprecated(forRemoval = true)
@@ -110,7 +111,9 @@ public <T extends HasMetadata> T create(Class<T> type, T resource) {
110111
}
111112

112113
public <T extends HasMetadata> T replace(T resource) {
113-
return kubernetesClient.resource(resource).inNamespace(namespace).replace();
114+
final MixedOperation<T, KubernetesResourceList<T>, Resource<T>> resources =
115+
kubernetesClient.resources((Class<T>) resource.getClass());
116+
return resources.inNamespace(namespace).replace(resource);
114117
}
115118

116119
@Deprecated(forRemoval = true)
@@ -119,8 +122,7 @@ public <T extends HasMetadata> T replace(Class<T> type, T resource) {
119122
}
120123

121124
public <T extends HasMetadata> boolean delete(T resource) {
122-
var res = kubernetesClient.resource(resource).inNamespace(namespace).delete();
123-
return res.size() == 1 && res.get(0).getCauses().isEmpty();
125+
return kubernetesClient.resource(resource).inNamespace(namespace).delete();
124126
}
125127

126128
@Deprecated(forRemoval = true)
@@ -160,9 +162,7 @@ protected void before(ExtensionContext context) {
160162

161163
kubernetesClient
162164
.namespaces()
163-
.resource(
164-
new NamespaceBuilder().withNewMetadata().withName(namespace).endMetadata().build())
165-
.create();
165+
.create(new NamespaceBuilder().withNewMetadata().withName(namespace).endMetadata().build());
166166

167167
kubernetesClient
168168
.resourceList(infrastructure)

operator-framework/src/test/java/io/javaoperatorsdk/operator/sample/simple/TestReconciler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ public DeleteControl cleanup(
6767
TestCustomResource resource, Context<TestCustomResource> context) {
6868
numberOfCleanupExecutions.incrementAndGet();
6969

70-
var statusDetail = kubernetesClient
70+
var deleted = kubernetesClient
7171
.configMaps()
7272
.inNamespace(resource.getMetadata().getNamespace())
7373
.withName(resource.getSpec().getConfigMapName())
7474
.delete();
7575

76-
if (statusDetail.size() == 1 && statusDetail.get(0).getCauses().isEmpty()) {
76+
if (deleted) {
7777
log.info(
7878
"Deleted ConfigMap {} for resource: {}",
7979
resource.getSpec().getConfigMapName(),

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
4444

4545
<junit.version>5.9.0</junit.version>
46-
<fabric8-client.version>6.1.1</fabric8-client.version>
46+
<fabric8-client.version>5.12.3</fabric8-client.version>
4747
<slf4j.version>1.7.36</slf4j.version>
4848
<log4j.version>2.18.0</log4j.version>
4949
<mokito.version>4.7.0</mokito.version>

sample-operators/leader-election/src/main/java/io/javaoperatorsdk/operator/sample/LeaderElectionTestOperator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import org.slf4j.Logger;
44
import org.slf4j.LoggerFactory;
55

6-
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
6+
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
77
import io.javaoperatorsdk.operator.Operator;
88
import io.javaoperatorsdk.operator.api.config.LeaderElectionConfiguration;
99

@@ -17,7 +17,7 @@ public static void main(String[] args) {
1717

1818
log.info("Starting operator with identity: {}", identity);
1919

20-
var client = new KubernetesClientBuilder().build();
20+
var client = new DefaultKubernetesClient();
2121
Operator operator = new Operator(client,
2222
c -> c.withLeaderElectionConfiguration(
2323
new LeaderElectionConfiguration("leader-election-test", namespace, identity)));

sample-operators/leader-election/src/test/java/io/javaoperatorsdk/operator/sample/LeaderElectionE2E.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
2424
import io.fabric8.kubernetes.api.model.rbac.ClusterRoleBinding;
2525
import io.fabric8.kubernetes.client.ConfigBuilder;
26+
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
2627
import io.fabric8.kubernetes.client.KubernetesClient;
27-
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
2828

2929
import static io.javaoperatorsdk.operator.junit.AbstractOperatorExtension.CRD_READY_WAIT;
3030
import static org.assertj.core.api.Assertions.assertThat;
@@ -107,24 +107,24 @@ private void applyCustomResource() {
107107
.withName(TEST_RESOURCE_NAME)
108108
.withNamespace(namespace)
109109
.build());
110-
client.resource(res).create();
110+
client.resources(res.getClass()).create();
111111
}
112112

113113
@BeforeEach
114114
void setup() {
115115
namespace = "leader-election-it-" + UUID.randomUUID();
116-
client = new KubernetesClientBuilder().withConfig(new ConfigBuilder()
116+
client = new DefaultKubernetesClient(new ConfigBuilder()
117117
.withNamespace(namespace)
118-
.build()).build();
118+
.build());
119119
applyCRD();
120-
client.namespaces().resource(new NamespaceBuilder().withNewMetadata().withName(namespace)
121-
.endMetadata().build()).create();
120+
client.namespaces().create(new NamespaceBuilder().withNewMetadata().withName(namespace)
121+
.endMetadata().build());
122122
}
123123

124124
@AfterEach
125125
void tearDown() {
126-
client.namespaces().resource(new NamespaceBuilder().withNewMetadata().withName(namespace)
127-
.endMetadata().build()).delete();
126+
client.namespaces().delete(new NamespaceBuilder().withNewMetadata().withName(namespace)
127+
.endMetadata().build());
128128
await()
129129
.atMost(Duration.ofSeconds(60))
130130
.untilAsserted(() -> assertThat(client.namespaces().withName(namespace).get()).isNull());

sample-operators/mysql-schema/src/main/java/io/javaoperatorsdk/operator/sample/MySQLSchemaOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class MySQLSchemaOperator {
2323
public static void main(String[] args) throws IOException {
2424
log.info("MySQL Schema Operator starting");
2525

26-
KubernetesClient client = new KubernetesClientBuilder().build();
26+
KubernetesClient client = new DefaultKubernetesClient();
2727
Operator operator = new Operator(client,
2828
overrider -> overrider.withMetrics(new MicrometerMetrics(new LoggingMeterRegistry())));
2929

sample-operators/tomcat-operator/src/main/java/io/javaoperatorsdk/operator/sample/TomcatOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class TomcatOperator {
1818

1919
public static void main(String[] args) throws IOException {
2020

21-
KubernetesClient client = new KubernetesClientBuilder().build();
21+
KubernetesClient client = new DefaultKubernetesClient();
2222
Operator operator = new Operator(client);
2323
operator.register(new TomcatReconciler());
2424
operator.register(new WebappReconciler(client));

sample-operators/webpage/src/main/java/io/javaoperatorsdk/operator/sample/WebPageOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class WebPageOperator {
2222
public static void main(String[] args) throws IOException {
2323
log.info("WebServer Operator starting!");
2424

25-
KubernetesClient client = new KubernetesClientBuilder().build();
25+
KubernetesClient client = new DefaultKubernetesClient();
2626
Operator operator = new Operator(client);
2727
String reconcilerEnvVar = System.getenv(WEBPAGE_RECONCILER_ENV);
2828
if (WEBPAGE_CLASSIC_RECONCILER_ENV_VALUE.equals(reconcilerEnvVar)) {

0 commit comments

Comments
 (0)