Skip to content

Commit 97b26c3

Browse files
committed
fix: bump kubernetes-client to 7.0.0 (redhat-developer#921)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent 05fc702 commit 97b26c3

File tree

12 files changed

+167
-149
lines changed

12 files changed

+167
-149
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[versions]
22
# libraries
33
junit = "4.13.2"
4-
openshift-client = "6.12.0"
4+
openshift-client = "7.0.0"
55
devtools-common = "1.9.7-SNAPSHOT"
66
keycloak = "24.0.5"
77
jsonwebtoken = "0.12.6"

src/it/java/org/jboss/tools/intellij/openshift/utils/ToolFactoryTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,24 @@
1818
import org.jboss.tools.intellij.openshift.utils.odo.OdoDelegate;
1919

2020
import java.util.concurrent.ExecutionException;
21+
import org.mockito.Mockito;
2122

2223
public class ToolFactoryTest extends BasePlatformTestCase {
2324

2425
public void testGetOdo() throws ExecutionException, InterruptedException {
25-
Tool<OdoDelegate> tool = ToolFactory.getInstance().createOdo(getProject()).get();
26+
Tool<OdoDelegate> tool = ToolFactory.getInstance().createOdo(Mockito.mock(), getProject()).get();
2627
Odo odo = tool.get();
2728
assertNotNull(odo);
2829
}
2930

3031
public void testGetHelm() throws ExecutionException, InterruptedException {
31-
Tool<Helm> tool = ToolFactory.getInstance().createHelm(getProject()).get();
32+
Tool<Helm> tool = ToolFactory.getInstance().createHelm().get();
3233
Helm helm = tool.get();
3334
assertNotNull(helm);
3435
}
3536

3637
public void testGetOc() throws ExecutionException, InterruptedException {
37-
Tool<Oc> tool = ToolFactory.getInstance().createOc(getProject()).get();
38+
Tool<Oc> tool = ToolFactory.getInstance().createOc(Mockito.mock()).get();
3839
Oc oc = tool.get();
3940
assertNotNull(oc);
4041
}

src/it/java/org/jboss/tools/intellij/openshift/utils/odo/OdoCliTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.CompletableFuture;
2626
import java.util.concurrent.ExecutionException;
2727
import java.util.concurrent.TimeUnit;
28+
import org.mockito.Mockito;
2829

2930
import static org.awaitility.Awaitility.with;
3031
import static org.jboss.tools.intellij.openshift.Constants.PLUGIN_FOLDER;
@@ -64,7 +65,7 @@ public abstract class OdoCliTest extends BasePlatformTestCase {
6465
protected void setUp() throws Exception {
6566
super.setUp();
6667
previousTestDialog = MessagesHelper.setTestDialog(TestDialog.OK);
67-
ToolFactory.getInstance().createOc(getProject()).whenComplete((ocTool, throwable) -> {
68+
ToolFactory.getInstance().createOc(Mockito.mock()).whenComplete((ocTool, throwable) -> {
6869
try {
6970
OdoCluster.INSTANCE.login(ocTool.get());
7071
} catch (IOException e) {
@@ -82,7 +83,7 @@ protected void tearDown() throws Exception {
8283

8384
private CompletableFuture<OdoFacade> getOdo() {
8485
return ToolFactory.getInstance()
85-
.createOdo(getProject())
86+
.createOdo(Mockito.mock(), getProject())
8687
.thenApply(tool -> new ApplicationRootNodeOdo(tool.get(), false, rootNode, processHelper));
8788
}
8889

src/it/java/org/jboss/tools/intellij/openshift/utils/odo/OdoKubernetesClientTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@
2727
import io.fabric8.openshift.api.model.ProjectList;
2828
import io.fabric8.openshift.client.OpenShiftClient;
2929
import io.fabric8.openshift.client.dsl.ProjectOperation;
30-
import org.jboss.tools.intellij.openshift.utils.Cli;
31-
import org.junit.Before;
32-
import org.junit.Test;
33-
3430
import java.io.IOException;
3531
import java.net.HttpURLConnection;
3632
import java.net.MalformedURLException;
@@ -40,7 +36,9 @@
4036
import java.util.List;
4137
import java.util.Map;
4238
import java.util.function.Function;
43-
import java.util.function.Supplier;
39+
import org.jboss.tools.intellij.openshift.utils.Cli;
40+
import org.junit.Before;
41+
import org.junit.Test;
4442

4543
import static org.fest.assertions.Assertions.assertThat;
4644
import static org.mockito.ArgumentMatchers.anyString;
@@ -250,17 +248,17 @@ public void isAuthorized_should_throw_if_listing_secrets_throws_other_Kubernetes
250248
}
251249

252250
private OdoCli createOdo(KubernetesClient kubernetesClient, OpenShiftClient openShiftClient) {
251+
KubernetesClient client = mock(KubernetesClient.class);
253252
Project project = mock(Project.class);
254253
String command = "Star Wars";
255254
MessageBusConnection connection = mock(MessageBusConnection.class);
256255
MessageBus bus = mock(MessageBus.class);
257256
doReturn(connection)
258257
.when(bus).connect();
259-
Supplier<KubernetesClient> kubernetesClientFactory = () -> kubernetesClient;
260-
Function<KubernetesClient, OpenShiftClient> openShiftClientFactory = client -> openShiftClient;
258+
Function<KubernetesClient, OpenShiftClient> openShiftClientFactory = kubeClient -> openShiftClient;
261259
Function<String, Map<String, String>> envVarFactory = url -> new HashMap<>();
262260
Cli.TelemetryReport telemetryReport = mock(Cli.TelemetryReport.class);
263-
return new OdoCli(project, command, bus, kubernetesClientFactory, openShiftClientFactory, envVarFactory, telemetryReport);
261+
return new OdoCli(command, project, client, bus, openShiftClientFactory, envVarFactory, telemetryReport);
264262
}
265263

266264
private static <R extends HasMetadata> R mockResource(String name, Class<R> clazz) {

src/main/java/org/jboss/tools/intellij/openshift/tree/application/ApplicationsRootNode.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,19 @@
2222
import com.intellij.openapi.vfs.LocalFileSystem;
2323
import com.intellij.openapi.vfs.VirtualFile;
2424
import com.intellij.util.messages.MessageBusConnection;
25-
import com.redhat.devtools.intellij.common.utils.ConfigHelper;
2625
import com.redhat.devtools.intellij.common.utils.ConfigWatcher;
2726
import com.redhat.devtools.intellij.common.utils.ExecHelper;
28-
import io.fabric8.kubernetes.api.model.Config;
27+
import io.fabric8.kubernetes.client.Config;
28+
import io.fabric8.kubernetes.client.ConfigBuilder;
29+
import io.fabric8.kubernetes.client.KubernetesClient;
2930
import java.io.File;
3031
import java.io.IOException;
31-
import java.nio.file.Paths;
3232
import java.util.HashMap;
3333
import java.util.List;
3434
import java.util.Map;
3535
import java.util.concurrent.CompletableFuture;
3636
import org.jboss.tools.intellij.openshift.actions.NotificationUtils;
37+
import org.jboss.tools.intellij.openshift.utils.KubernetesClientFactory;
3738
import org.jboss.tools.intellij.openshift.utils.ProjectUtils;
3839
import org.jboss.tools.intellij.openshift.utils.ToolFactory;
3940
import org.jboss.tools.intellij.openshift.utils.ToolFactory.Tool;
@@ -59,14 +60,13 @@ public class ApplicationsRootNode
5960
private CompletableFuture<Tool<Helm>> helmFuture;
6061
private CompletableFuture<Tool<Oc>> ocFuture;
6162
private boolean logged;
62-
private Config config;
63+
private KubernetesClient client;
6364
private final OdoProcessHelper processHelper;
6465

6566
public ApplicationsRootNode(Project project, ApplicationsTreeStructure structure, Disposable parent) {
6667
this.project = project;
6768
this.structure = structure;
6869
initConfigWatcher();
69-
this.config = loadConfig();
7070
registerProjectListener(project);
7171
this.processHelper = new OdoProcessHelper();
7272
Disposer.register(parent, this);
@@ -91,7 +91,7 @@ private CompletableFuture<ApplicationRootNodeOdo> doGetOdo() {
9191
if (odoFuture == null) {
9292
this.odoFuture =
9393
ReadAction.compute(() -> ToolFactory.getInstance()
94-
.createOdo(project)
94+
.createOdo(getClient(), project)
9595
.thenApply(tool -> {
9696
ApplicationRootNodeOdo odo = new ApplicationRootNodeOdo(tool.get(), tool.isDownloaded(), this, processHelper);
9797
loadProjectModel(odo, project);
@@ -117,15 +117,16 @@ public void resetOdo() {
117117

118118
public CompletableFuture<ToolFactory.Tool<Oc>> getOcTool() {
119119
if (ocFuture == null) {
120-
this.ocFuture = ToolFactory.getInstance().createOc(project);
120+
KubernetesClient client = getClient();
121+
this.ocFuture = ToolFactory.getInstance().createOc(client);
121122
}
122123
return ocFuture;
123124
}
124125

125126
public CompletableFuture<ToolFactory.Tool<Helm>> getHelmTool(boolean notify) {
126127
if (helmFuture == null) {
127128
this.helmFuture = ToolFactory.getInstance()
128-
.createHelm(project)
129+
.createHelm()
129130
.whenComplete((tool, err) -> {
130131
if (notify && tool.isDownloaded()) {
131132
structure.fireModified(this);
@@ -148,11 +149,7 @@ public Project getProject() {
148149
}
149150

150151
protected void initConfigWatcher() {
151-
ExecHelper.submit(new ConfigWatcher(Paths.get(ConfigHelper.getKubeConfigPath()), this));
152-
}
153-
154-
protected Config loadConfig() {
155-
return ConfigHelper.safeLoadKubeConfig();
152+
ExecHelper.submit(new ConfigWatcher(this));
156153
}
157154

158155
public Map<String, ComponentDescriptor> getLocalComponents() {
@@ -247,9 +244,10 @@ protected void registerProjectListener(Project project) {
247244
}
248245

249246
@Override
250-
public void onUpdate(ConfigWatcher source, Config config) {
251-
if (!ConfigHelper.areEqual(config, this.config)) {
252-
this.config = config;
247+
public void onUpdate(Config updated) {
248+
Config current = getClient().getConfiguration();
249+
if (!current.equals(updated)) {
250+
this.client = new KubernetesClientFactory().apply(updated);
253251
refresh();
254252
}
255253
}
@@ -305,4 +303,12 @@ public ApplicationsRootNode getRoot() {
305303
public void dispose() {
306304
resetOdo();
307305
}
306+
307+
protected KubernetesClient getClient() {
308+
if (client == null) {
309+
client = new KubernetesClientFactory().apply(new ConfigBuilder().build());
310+
}
311+
return client;
312+
}
313+
308314
}

src/main/java/org/jboss/tools/intellij/openshift/utils/Cli.java

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,15 @@
1414
import com.intellij.util.messages.MessageBus;
1515
import com.redhat.devtools.intellij.common.kubernetes.ClusterHelper;
1616
import com.redhat.devtools.intellij.common.kubernetes.ClusterInfo;
17-
import com.redhat.devtools.intellij.common.ssl.IDEATrustManager;
18-
import com.redhat.devtools.intellij.common.utils.ConfigHelper;
1917
import com.redhat.devtools.intellij.common.utils.NetworkUtils;
2018
import com.redhat.devtools.intellij.telemetry.core.configuration.TelemetryConfiguration;
2119
import com.redhat.devtools.intellij.telemetry.core.service.TelemetryMessageBuilder;
22-
import io.fabric8.kubernetes.client.Config;
2320
import io.fabric8.kubernetes.client.KubernetesClient;
24-
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
25-
import io.fabric8.kubernetes.client.http.HttpClient;
26-
import io.fabric8.kubernetes.client.internal.SSLUtils;
27-
import java.io.IOException;
2821
import java.net.URISyntaxException;
29-
import java.security.KeyStoreException;
30-
import java.security.NoSuchAlgorithmException;
31-
import java.security.UnrecoverableKeyException;
32-
import java.security.cert.CertificateException;
33-
import java.security.spec.InvalidKeySpecException;
34-
import java.util.Arrays;
3522
import java.util.Collections;
36-
import java.util.List;
3723
import java.util.Map;
3824
import java.util.function.Function;
39-
import java.util.function.Supplier;
40-
import javax.net.ssl.TrustManager;
41-
import javax.net.ssl.X509ExtendedTrustManager;
42-
import javax.net.ssl.X509TrustManager;
4325
import org.jetbrains.annotations.NotNull;
44-
import org.slf4j.Logger;
45-
import org.slf4j.LoggerFactory;
4626

4727
import static org.jboss.tools.intellij.openshift.telemetry.TelemetryService.IS_OPENSHIFT;
4828
import static org.jboss.tools.intellij.openshift.telemetry.TelemetryService.KUBERNETES_VERSION;
@@ -52,34 +32,10 @@
5232

5333
public class Cli {
5434

55-
private static final Logger LOGGER = LoggerFactory.getLogger(Cli.class);
35+
protected final String command;
5636

57-
protected final KubernetesClient client;
58-
59-
protected Cli(Supplier<KubernetesClient> kubernetesClientFactory) {
60-
this.client = kubernetesClientFactory.get();
61-
}
62-
63-
public static final class KubernetesClientFactory implements Supplier<KubernetesClient> {
64-
65-
@Override
66-
public KubernetesClient get() {
67-
String current = ConfigHelper.getCurrentContextName();
68-
Config config = Config.autoConfigure(current);
69-
return new KubernetesClientBuilder().withConfig(config).withHttpClientBuilderConsumer(builder -> setSslContext(builder, config)).build();
70-
}
71-
72-
private void setSslContext(HttpClient.Builder builder, Config config) {
73-
try {
74-
X509TrustManager externalTrustManager = new IDEATrustManager().configure(List.of(Arrays.stream(SSLUtils.trustManagers(config))
75-
.filter(X509ExtendedTrustManager.class::isInstance)
76-
.map(X509ExtendedTrustManager.class::cast).toArray(X509ExtendedTrustManager[]::new)));
77-
builder.sslContext(SSLUtils.keyManagers(config), List.of(externalTrustManager).toArray(new TrustManager[0]));
78-
} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException |
79-
UnrecoverableKeyException | InvalidKeySpecException e) {
80-
LOGGER.error(e.getMessage(), e);
81-
}
82-
}
37+
protected Cli(String command) {
38+
this.command = command;
8339
}
8440

8541
public static final class EnvVarFactory implements Function<String, Map<String, String>> {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Red Hat, Inc.
3+
* Distributed under license by Red Hat, Inc. All rights reserved.
4+
* This program is made available under the terms of the
5+
* Eclipse Public License v2.0 which accompanies this distribution,
6+
* and is available at http://www.eclipse.org/legal/epl-v20.html
7+
*
8+
* Contributors:
9+
* Red Hat, Inc. - initial API and implementation
10+
******************************************************************************/
11+
package org.jboss.tools.intellij.openshift.utils;
12+
13+
import io.fabric8.kubernetes.client.KubernetesClient;
14+
15+
public class ClientAwareCli extends Cli{
16+
17+
protected final KubernetesClient client;
18+
19+
protected ClientAwareCli(String command, KubernetesClient client) {
20+
super(command);
21+
this.client = client;
22+
}
23+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.jboss.tools.intellij.openshift.utils;
2+
3+
import com.redhat.devtools.intellij.common.ssl.IDEATrustManager;
4+
import io.fabric8.kubernetes.client.Config;
5+
import io.fabric8.kubernetes.client.KubernetesClient;
6+
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
7+
import io.fabric8.kubernetes.client.http.HttpClient;
8+
import io.fabric8.kubernetes.client.internal.SSLUtils;
9+
import java.io.IOException;
10+
import java.security.KeyStoreException;
11+
import java.security.NoSuchAlgorithmException;
12+
import java.security.UnrecoverableKeyException;
13+
import java.security.cert.CertificateException;
14+
import java.security.spec.InvalidKeySpecException;
15+
import java.util.Arrays;
16+
import java.util.List;
17+
import java.util.function.Function;
18+
import javax.net.ssl.TrustManager;
19+
import javax.net.ssl.X509ExtendedTrustManager;
20+
import javax.net.ssl.X509TrustManager;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
24+
public class KubernetesClientFactory implements Function<Config, KubernetesClient> {
25+
26+
private static final Logger LOGGER = LoggerFactory.getLogger(KubernetesClientFactory.class);
27+
28+
@Override
29+
public KubernetesClient apply(Config config) {
30+
return new KubernetesClientBuilder()
31+
.withConfig(config)
32+
.withHttpClientBuilderConsumer(builder -> setSslContext(builder, config))
33+
.build();
34+
}
35+
36+
private void setSslContext(HttpClient.Builder builder, Config config) {
37+
try {
38+
X509TrustManager externalTrustManager = new IDEATrustManager().configure(List.of(Arrays.stream(SSLUtils.trustManagers(config))
39+
.filter(X509ExtendedTrustManager.class::isInstance)
40+
.map(X509ExtendedTrustManager.class::cast).toArray(X509ExtendedTrustManager[]::new)));
41+
builder.sslContext(SSLUtils.keyManagers(config), List.of(externalTrustManager).toArray(new TrustManager[0]));
42+
} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException |
43+
UnrecoverableKeyException | InvalidKeySpecException e) {
44+
LOGGER.error(e.getMessage(), e);
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)