This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new c50910434d1 [CAMEL-21361] fabric8 kubernetes-client fails to connect
to openshift (#16053)
c50910434d1 is described below
commit c50910434d1eb016e59a7102911c711d3c57876e
Author: Thomas Diesler <[email protected]>
AuthorDate: Wed Oct 23 10:44:09 2024 +0200
[CAMEL-21361] fabric8 kubernetes-client fails to connect to openshift
(#16053)
---
.../core/commands/catalog/CatalogKamelet.java | 3 ++
.../commands/catalog/KameletCatalogHelper.java | 46 ++++++++++++---------
.../camel-jbang-plugin-kubernetes/pom.xml | 6 +++
.../commands/kubernetes/KubernetesBaseCommand.java | 4 +-
.../core/commands/kubernetes/KubernetesExport.java | 11 +++--
.../core/commands/kubernetes/KubernetesHelper.java | 9 -----
.../commands/kubernetes/KubernetesClientTest.java | 47 ++++++++++++++++++++++
7 files changed, 94 insertions(+), 32 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index dd8582cdf7e..e929b414ad8 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -69,6 +69,7 @@ public class CatalogKamelet extends CamelCommand {
}
Map<String, Object> kamelets;
+ var tccLoader = Thread.currentThread().getContextClassLoader();
try {
ClassLoader cl = createClassLoader();
MavenDependencyDownloader downloader = new
MavenDependencyDownloader();
@@ -84,6 +85,8 @@ public class CatalogKamelet extends CamelCommand {
} catch (Exception e) {
System.err.println("Cannot download camel-kamelets-catalog due to
" + e.getMessage());
return 1;
+ } finally {
+ Thread.currentThread().setContextClassLoader(tccLoader);
}
for (Object o : kamelets.values()) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
index 280186ca174..3e6aa4763f7 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/KameletCatalogHelper.java
@@ -141,27 +141,37 @@ public final class KameletCatalogHelper {
}
public static Map<String, Object> loadKamelets(String version) throws
Exception {
- ClassLoader cl = createClassLoader();
- MavenDependencyDownloader downloader = new MavenDependencyDownloader();
- downloader.setClassLoader(cl);
- downloader.start();
- downloader.downloadDependency("org.apache.camel.kamelets",
"camel-kamelets-catalog", version);
-
- Thread.currentThread().setContextClassLoader(cl);
- Class<?> clazz =
cl.loadClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
- Object catalog = clazz.getDeclaredConstructor().newInstance();
- Method m = clazz.getMethod("getKamelets");
- return (Map<String, Object>) ObjectHelper.invokeMethod(m, catalog);
+ var tccLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ ClassLoader cl = createClassLoader();
+ MavenDependencyDownloader downloader = new
MavenDependencyDownloader();
+ downloader.setClassLoader(cl);
+ downloader.start();
+ downloader.downloadDependency("org.apache.camel.kamelets",
"camel-kamelets-catalog", version);
+
+ Thread.currentThread().setContextClassLoader(cl);
+ Class<?> clazz =
cl.loadClass("org.apache.camel.kamelets.catalog.KameletsCatalog");
+ Object catalog = clazz.getDeclaredConstructor().newInstance();
+ Method m = clazz.getMethod("getKamelets");
+ return (Map<String, Object>) ObjectHelper.invokeMethod(m, catalog);
+ } finally {
+ Thread.currentThread().setContextClassLoader(tccLoader);
+ }
}
public static InputStream loadKameletYamlSchema(String name, String
version) throws Exception {
- ClassLoader cl = createClassLoader();
- MavenDependencyDownloader downloader = new MavenDependencyDownloader();
- downloader.setClassLoader(cl);
- downloader.start();
- downloader.downloadDependency("org.apache.camel.kamelets",
"camel-kamelets-catalog", version);
- Thread.currentThread().setContextClassLoader(cl);
- return cl.getResourceAsStream("kamelets/" + name + ".kamelet.yaml");
+ var tccLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ ClassLoader cl = createClassLoader();
+ MavenDependencyDownloader downloader = new
MavenDependencyDownloader();
+ downloader.setClassLoader(cl);
+ downloader.start();
+ downloader.downloadDependency("org.apache.camel.kamelets",
"camel-kamelets-catalog", version);
+ Thread.currentThread().setContextClassLoader(cl);
+ return cl.getResourceAsStream("kamelets/" + name +
".kamelet.yaml");
+ } finally {
+ Thread.currentThread().setContextClassLoader(tccLoader);
+ }
}
public static KameletModel loadKameletModel(String name, String version)
throws Exception {
diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
index 04c55cbd314..c65471c737b 100644
--- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml
@@ -80,6 +80,12 @@
<version>${kubernetes-client-version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>io.fabric8</groupId>
+ <artifactId>openshift-client</artifactId>
+ <version>${kubernetes-client-version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
index 2b853c25328..fdb0aec1a7a 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesBaseCommand.java
@@ -89,9 +89,9 @@ public abstract class KubernetesBaseCommand extends
CamelCommand {
if (kubernetesClient == null) {
if (kubeConfig != null) {
kubernetesClient =
KubernetesHelper.getKubernetesClient(kubeConfig);
+ } else {
+ kubernetesClient = KubernetesHelper.getKubernetesClient();
}
-
- kubernetesClient = KubernetesHelper.getKubernetesClient();
}
return kubernetesClient;
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
index 50f5e1cf3f5..2592180d42d 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java
@@ -358,10 +358,15 @@ public class KubernetesExport extends Export {
var kubeFragments =
context.buildItems().stream().map(KubernetesHelper::toJsonMap).toList();
// Quarkus: dump joined fragments to kubernetes.yml
- if (runtime == RuntimeType.quarkus &&
!ClusterType.OPENSHIFT.isEqualTo(clusterType)) {
+ if (runtime == RuntimeType.quarkus) {
var kubeManifest =
kubeFragments.stream().map(KubernetesHelper::dumpYaml).collect(Collectors.joining("---\n"));
- safeCopy(new
ByteArrayInputStream(kubeManifest.getBytes(StandardCharsets.UTF_8)),
- KubernetesHelper.getKubernetesManifest(clusterType,
exportDir + "/src/main/kubernetes"));
+ File manifestFile =
KubernetesHelper.getKubernetesManifest(clusterType, exportDir +
"/src/main/kubernetes");
+ if (ClusterType.OPENSHIFT.isEqualTo(clusterType)) {
+ // Quarkus maven plugin does not support manifest merging
(correctly)
+ // We still export the wanted configuration for comparison
with the quarkus generated manifest
+ manifestFile = new File(exportDir +
"/src/main/kubernetes/_openshift.yml");
+ }
+ safeCopy(new
ByteArrayInputStream(kubeManifest.getBytes(StandardCharsets.UTF_8)),
manifestFile);
}
// SpringBoot: dump each fragment to its respective kind
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
index 5512848f133..6f5d6724ab2 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesHelper.java
@@ -70,8 +70,6 @@ public final class KubernetesHelper {
/**
* Gets the default Kubernetes client.
- *
- * @return
*/
public static KubernetesClient getKubernetesClient() {
if (kubernetesClient == null) {
@@ -83,9 +81,6 @@ public final class KubernetesHelper {
/**
* Create or get Kubernetes client with given config.
- *
- * @param config
- * @return
*/
public static KubernetesClient getKubernetesClient(String config) {
if (clients.containsKey(config)) {
@@ -98,8 +93,6 @@ public final class KubernetesHelper {
/**
* Creates new Yaml instance. The implementation provided by Snakeyaml is
not thread-safe. It is better to create a
* fresh instance for every YAML stream.
- *
- * @return
*/
public static Yaml yaml() {
return YamlHelper.yaml();
@@ -109,8 +102,6 @@ public final class KubernetesHelper {
* Creates new Yaml instance. The implementation provided by Snakeyaml is
not thread-safe. It is better to create a
* fresh instance for every YAML stream. Uses the given class loader as
base constructor. This is mandatory when
* additional classes have been downloaded via Maven for instance when
loading a Camel JBang plugin.
- *
- * @return
*/
public static Yaml yaml(ClassLoader classLoader) {
return YamlHelper.yaml(classLoader);
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesClientTest.java
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesClientTest.java
new file mode 100644
index 00000000000..d532b3bb99a
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesClientTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.dsl.jbang.core.commands.kubernetes;
+
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClientException;
+import io.fabric8.openshift.client.OpenShiftClient;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class KubernetesClientTest {
+
+ private static final Logger log =
LoggerFactory.getLogger(KubernetesClientTest.class);
+
+ @Test
+ public void shouldHaveOpenshiftClient() {
+ try (KubernetesClient client = KubernetesHelper.getKubernetesClient())
{
+ OpenShiftClient openShiftClient =
client.adapt(OpenShiftClient.class);
+ try {
+ openShiftClient.projects().list().getItems().forEach(project
-> {
+ log.debug("Project: {}", project.getMetadata().getName());
+ });
+ log.info("OpenShiftClient is authenticated and working
properly.");
+ } catch (KubernetesClientException e) {
+ log.debug("OpenShiftClient is not authenticated: {}",
e.getMessage());
+ }
+ } catch (Exception e) {
+ log.debug("Cannot construct OpenShiftClient: {}", e.getMessage());
+ }
+ }
+}