This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.8.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.8.x by this push: new f05afca10f0 [CAMEL-21361] fabric8 kubernetes-client fails to connect to openshift (#16053) f05afca10f0 is described below commit f05afca10f0ff21d890adaca89cf9cc312b23c2f 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 83aedbf6eee..c9ec183745f 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/pom.xml @@ -88,6 +88,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 a09f8ac61ca..6fa5cb92c4c 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 @@ -362,10 +362,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()); + } + } +}