This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch CAMEL-21173 in repository https://gitbox.apache.org/repos/asf/camel.git
commit c63f55e44f286bd1b3094a81ef02436821a54262 Author: Andrea Cosentino <[email protected]> AuthorDate: Thu Sep 5 08:59:13 2024 +0200 CAMEL-21173 - Camel-Jbang Dev Console: Add Kubernetes Vault support Signed-off-by: Andrea Cosentino <[email protected]> --- .../apache/camel/catalog/dev-consoles.properties | 1 + .../catalog/dev-consoles/kubernetes-secrets.json | 15 +++ .../camel/dev-console/kubernetes-secrets.json | 15 +++ .../apache/camel/dev-console/kubernetes-secrets | 2 + .../org/apache/camel/dev-consoles.properties | 7 ++ .../secrets/vault/SecretsDevConsole.java | 128 +++++++++++++++++++++ .../secrets/vault/SecretsReloadTriggerTask.java | 13 +-- 7 files changed, 169 insertions(+), 12 deletions(-) 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 d634e0271ec..0d11272191f 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 @@ -18,6 +18,7 @@ inflight java-security jvm kafka +kubernetes-secrets log main-configuration memory diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-secrets.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-secrets.json new file mode 100644 index 00000000000..81da7a37aeb --- /dev/null +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dev-consoles/kubernetes-secrets.json @@ -0,0 +1,15 @@ +{ + "console": { + "kind": "console", + "group": "camel", + "name": "kubernetes-secrets", + "title": "Kubernetes Secrets", + "description": "Kubernetes Cluster Secrets", + "deprecated": false, + "javaType": "org.apache.camel.component.kubernetes.secrets.vault.SecretsDevConsole", + "groupId": "org.apache.camel", + "artifactId": "camel-kubernetes", + "version": "4.8.0-SNAPSHOT" + } +} + diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json new file mode 100644 index 00000000000..81da7a37aeb --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/org/apache/camel/dev-console/kubernetes-secrets.json @@ -0,0 +1,15 @@ +{ + "console": { + "kind": "console", + "group": "camel", + "name": "kubernetes-secrets", + "title": "Kubernetes Secrets", + "description": "Kubernetes Cluster Secrets", + "deprecated": false, + "javaType": "org.apache.camel.component.kubernetes.secrets.vault.SecretsDevConsole", + "groupId": "org.apache.camel", + "artifactId": "camel-kubernetes", + "version": "4.8.0-SNAPSHOT" + } +} + diff --git a/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-secrets b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-secrets new file mode 100644 index 00000000000..5f0cfca21dc --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-console/kubernetes-secrets @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.component.kubernetes.secrets.vault.SecretsDevConsole 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 new file mode 100644 index 00000000000..f64eca9145b --- /dev/null +++ b/components/camel-kubernetes/src/generated/resources/META-INF/services/org/apache/camel/dev-consoles.properties @@ -0,0 +1,7 @@ +# Generated by camel build tools - do NOT edit this file! +dev-consoles=kubernetes-secrets +groupId=org.apache.camel +artifactId=camel-kubernetes +version=4.8.0-SNAPSHOT +projectName=Camel :: Kubernetes +projectDescription=Camel Components diff --git a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsDevConsole.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsDevConsole.java new file mode 100644 index 00000000000..2528a6f167b --- /dev/null +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsDevConsole.java @@ -0,0 +1,128 @@ +/* + * 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.secrets.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.SecretPropertiesFunction; +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.KubernetesVaultConfiguration; + +@DevConsole(name = "kubernetes-secrets", displayName = "Kubernetes Secrets", description = "Kubernetes Cluster Secrets") +public class SecretsDevConsole extends AbstractDevConsole { + + private SecretPropertiesFunction propertiesFunction; + private SecretsReloadTriggerTask secretsRefreshTask; + + public SecretsDevConsole() { + super("camel", "kubernetes-secrets", "Kubernetes Secrets", "Kubernetes Cluster Secrets"); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + if (getCamelContext().getPropertiesComponent().hasPropertiesFunction("secret")) { + PropertiesFunction pf = getCamelContext().getPropertiesComponent().getPropertiesFunction("secret"); + if (pf instanceof SecretPropertiesFunction) { + propertiesFunction = (SecretPropertiesFunction) pf; + } + } + KubernetesVaultConfiguration kubernetes = getCamelContext().getVaultConfiguration().getKubernetesVaultConfiguration(); + if (kubernetes != null && kubernetes.isRefreshEnabled()) { + PeriodTaskScheduler scheduler = PluginHelper.getPeriodTaskScheduler(getCamelContext()); + secretsRefreshTask = scheduler.getTaskByType(SecretsReloadTriggerTask.class); + } + } + + @Override + protected String doCallText(Map<String, Object> options) { + StringBuilder sb = new StringBuilder(); + + if (propertiesFunction != null) { + sb.append("Kubernetes Secrets 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 (secretsRefreshTask != null) { + Instant start = secretsRefreshTask.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 (secretsRefreshTask != null) { + Instant start = secretsRefreshTask.getStartingTime(); + if (start != null) { + long timestamp = start.toEpochMilli(); + root.put("startCheckTimestamp", timestamp); + } + } + JsonArray arr = new JsonArray(); + root.put("secrets", 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/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsReloadTriggerTask.java b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsReloadTriggerTask.java index 1535a376e95..1a21385bf7a 100644 --- a/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsReloadTriggerTask.java +++ b/components/camel-kubernetes/src/main/java/org/apache/camel/component/kubernetes/secrets/vault/SecretsReloadTriggerTask.java @@ -17,9 +17,7 @@ package org.apache.camel.component.kubernetes.secrets.vault; import java.time.Instant; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import java.util.concurrent.CountDownLatch; import io.fabric8.kubernetes.api.model.Secret; @@ -47,7 +45,6 @@ public class SecretsReloadTriggerTask extends ServiceSupport implements CamelCon private String secrets; private KubernetesClient kubernetesClient; private SecretPropertiesFunction propertiesFunction; - private volatile Instant lastReloadTime; private volatile Instant startingTime; private static final Logger LOG = LoggerFactory.getLogger(SecretsReloadTriggerTask.class); @@ -73,13 +70,6 @@ public class SecretsReloadTriggerTask extends ServiceSupport implements CamelCon this.reloadEnabled = reloadEnabled; } - /** - * Last time Kubernetes secrets update triggered reload. - */ - public Instant getLastReloadTime() { - return lastReloadTime; - } - /** * Starting Time Kubernetes secrets watcher */ @@ -137,7 +127,6 @@ public class SecretsReloadTriggerTask extends ServiceSupport implements CamelCon ContextReloadStrategy reload = camelContext.hasService(ContextReloadStrategy.class); if (reload != null) { // trigger reload - lastReloadTime = Instant.now(); reload.onReload(this); } }
