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);
                                 }
                             }

Reply via email to