This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-21497 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 3a8674e0a275a5ce6dd37f184dc50c27d69bce70 Author: Andrea Cosentino <anco...@gmail.com> AuthorDate: Mon Dec 2 12:34:45 2024 +0100 CAMEL-21497 - Camel-Kubernetes: Add Configmap Dev Console Signed-off-by: Andrea Cosentino <anco...@gmail.com> --- .../apache/camel/catalog/dev-consoles.properties | 1 + .../dev-consoles/kubernetes-configmaps.json | 15 +++ .../camel/dev-console/kubernetes-configmaps.json | 15 +++ .../apache/camel/dev-console/kubernetes-configmaps | 2 + .../org/apache/camel/dev-consoles.properties | 2 +- .../config_maps/vault/ConfigmapsDevConsole.java | 131 +++++++++++++++++++++ .../camel/cli/connector/LocalCliConnector.java | 10 ++ .../dsl/jbang/core/commands/process/ListVault.java | 18 +++ 8 files changed, 193 insertions(+), 1 deletion(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties index 280b182c430..a586f018ed8 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles.properties @@ -20,6 +20,7 @@ inflight java-security jvm kafka +kubernetes-configmaps kubernetes-secrets log main-configuration diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-configmaps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-configmaps.json new file mode 100644 index 00000000000..d2055d7d2ff --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-configmaps.json @@ -0,0 +1,15 @@ +{ + "console": { + "kind": "console", + "group": "camel", + "name": "kubernetes-configmaps", + "title": "Kubernetes Config Maps", + "description": "Kubernetes Cluster Config Maps", + "deprecated": false, + "javaType": "org.apache.camel.component.kubernetes.config_maps.vault.ConfigmapsDevConsole", + "groupId": "org.apache.camel", + "artifactId": "camel-kubernetes", + "version": "4.9.0-SNAPSHOT" + } +} + diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json new file mode 100644 index 00000000000..d2055d7d2ff --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-configmaps.json @@ -0,0 +1,15 @@ +{ + "console": { + "kind": "console", + "group": "camel", + "name": "kubernetes-configmaps", + "title": "Kubernetes Config Maps", + "description": "Kubernetes Cluster Config Maps", + "deprecated": false, + "javaType": "org.apache.camel.component.kubernetes.config_maps.vault.ConfigmapsDevConsole", + "groupId": "org.apache.camel", + "artifactId": "camel-kubernetes", + "version": "4.9.0-SNAPSHOT" + } +} + diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-configmaps b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-configmaps new file mode 100644 index 00000000000..db765140ed3 --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-configmaps @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.kubernetes.config_maps.vault.ConfigmapsDevConsole diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties index 781f4c1bca8..18e9d1637f8 100644 --- a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties +++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties @@ -1,5 +1,5 @@ # Generated by camel build tools - do NOT edit this file! -dev-consoles=kubernetes-secrets +dev-consoles=kubernetes-configmaps kubernetes-secrets groupId=org.apache.camel artifactId=camel-kubernetes version=4.9.0-SNAPSHOT diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/vault/ConfigmapsDevConsole.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/vault/ConfigmapsDevConsole.java new file mode 100644 index 00000000000..c4a573660d5 --- /dev/null +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/config_maps/vault/ConfigmapsDevConsole.java @@ -0,0 +1,131 @@ +/* + * 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.component.kubernetes.config_maps.vault; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.camel.component.kubernetes.properties.ConfigMapPropertiesFunction; +import org.apache.camel.spi.PeriodTaskScheduler; +import org.apache.camel.spi.PropertiesFunction; +import org.apache.camel.spi.annotations.DevConsole; +import org.apache.camel.support.PluginHelper; +import org.apache.camel.support.console.AbstractDevConsole; +import org.apache.camel.util.TimeUtils; +import org.apache.camel.util.json.JsonArray; +import org.apache.camel.util.json.JsonObject; +import org.apache.camel.vault.KubernetesConfigMapVaultConfiguration; +import org.apache.camel.vault.KubernetesVaultConfiguration; + +@DevConsole(name = "kubernetes-configmaps", displayName = "Kubernetes Config Maps", + description = "Kubernetes Cluster Config Maps") +public class ConfigmapsDevConsole extends AbstractDevConsole { + + private ConfigMapPropertiesFunction propertiesFunction; + private ConfigmapsReloadTriggerTask cmRefreshTask; + + public ConfigmapsDevConsole() { + super("camel", "kubernetes-configmaps", "Kubernetes Config Maps", "Kubernetes Cluster Config Maps"); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + if (getCamelContext().getPropertiesComponent().hasPropertiesFunction("configmap")) { + PropertiesFunction pf = getCamelContext().getPropertiesComponent().getPropertiesFunction("configmap"); + if (pf instanceof ConfigMapPropertiesFunction) { + propertiesFunction = (ConfigMapPropertiesFunction) pf; + } + } + KubernetesConfigMapVaultConfiguration kubernetes + = getCamelContext().getVaultConfiguration().getKubernetesConfigMapVaultConfiguration(); + if (kubernetes != null && kubernetes.isRefreshEnabled()) { + PeriodTaskScheduler scheduler = PluginHelper.getPeriodTaskScheduler(getCamelContext()); + cmRefreshTask = scheduler.getTaskByType(ConfigmapsReloadTriggerTask.class); + } + } + + @Override + protected String doCallText(Map<String, Object> options) { + StringBuilder sb = new StringBuilder(); + + if (propertiesFunction != null) { + sb.append("Kubernetes Config maps Cluster:"); + sb.append(String.format("\n Master Url: %s", propertiesFunction.getClient().getMasterUrl())); + sb.append("\n Login: OAuth Token"); + KubernetesVaultConfiguration kubernetes + = getCamelContext().getVaultConfiguration().getKubernetesVaultConfiguration(); + if (kubernetes != null) { + sb.append(String.format("\n Refresh Enabled: %s", kubernetes.isRefreshEnabled())); + } + if (cmRefreshTask != null) { + Instant start = cmRefreshTask.getStartingTime(); + String s = start != null ? TimeUtils.printSince(start.toEpochMilli()) : "none"; + sb.append(String.format("\n Running Since: %s", s)); + } + List<String> sorted = new ArrayList<>(); + if (kubernetes != null) { + sb.append("\n\nSecrets in use:"); + + sorted = new ArrayList<>(List.of(kubernetes.getSecrets().split(","))); + Collections.sort(sorted); + } + + for (String sec : sorted) { + sb.append(String.format("\n %s", sec)); + } + } + + return sb.toString(); + } + + @Override + protected JsonObject doCallJson(Map<String, Object> options) { + JsonObject root = new JsonObject(); + if (propertiesFunction != null) { + root.put("masterUrl", propertiesFunction.getClient().getMasterUrl().toString()); + root.put("login", "OAuth Token"); + } + KubernetesVaultConfiguration kubernetes = getCamelContext().getVaultConfiguration().getKubernetesVaultConfiguration(); + if (kubernetes != null) { + root.put("refreshEnabled", kubernetes.isRefreshEnabled()); + } + if (cmRefreshTask != null) { + Instant start = cmRefreshTask.getStartingTime(); + if (start != null) { + long timestamp = start.toEpochMilli(); + root.put("startCheckTimestamp", timestamp); + } + } + JsonArray arr = new JsonArray(); + root.put("configmaps", arr); + + List<String> sorted = new ArrayList<>(List.of(kubernetes.getSecrets().split(","))); + Collections.sort(sorted); + + for (String sec : sorted) { + JsonObject jo = new JsonObject(); + jo.put("name", sec); + arr.add(jo); + } + return root; + } +} diff --git a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java index 365996552e9..33271493389 100644 --- a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java +++ b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java @@ -1370,6 +1370,16 @@ public class LocalCliConnector extends ServiceSupport implements CliConnector, C root.put("hashicorp-secrets", json); } } + + // kubernetes-configmaps is optional + Optional<DevConsole> cmcKubernetes + = PluginHelper.getDevConsoleResolver(camelContext).lookupDevConsole("kubernetes-configmaps"); + if (cmcKubernetes.isPresent()) { + JsonObject json = (JsonObject) cmcKubernetes.get().call(DevConsole.MediaType.JSON); + if (json != null) { + root.put("kubernetes-configmaps", json); + } + } return root; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java index 0b7bcceb3f6..9ebb40d83dc 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java @@ -161,6 +161,24 @@ public class ListVault extends ProcessWatchCommand { row.lastReload = hashicorp.getLongOrDefault("lastReloadTimestamp", 0); rows.add(row); } + + JsonObject cmKubernetes = (JsonObject) vaults.get("kubernetes-configmaps"); + if (cmKubernetes != null) { + row.vault = "Kubernetes-cm"; + row.lastCheck = cmKubernetes.getLongOrDefault("startCheckTimestamp", 0); + row.lastReload = cmKubernetes.getLongOrDefault("lastReloadTimestamp", 0); + JsonArray arr = (JsonArray) cmKubernetes.get("configmap"); + for (int i = 0; i < arr.size(); i++) { + if (i > 0) { + // create a copy for 2+ configmap + row = row.copy(); + } + JsonObject jo = (JsonObject) arr.get(i); + row.secret = jo.getString("name"); + row.timestamp = jo.getLongOrDefault("timestamp", 0); + rows.add(row); + } + } } } });