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 <tdies...@redhat.com>
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());
+        }
+    }
+}

Reply via email to