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 269518f76d0 CAMEL-18479: camel-aws - Capture aws secrets in use making 
refresh no need for declaring the secrets
269518f76d0 is described below

commit 269518f76d0802dbe82cc4b616d94e5c97387cd9
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Sep 7 17:39:54 2022 +0200

    CAMEL-18479: camel-aws - Capture aws secrets in use making refresh no need 
for declaring the secrets
---
 .../SecretsManagerPropertiesFunction.java          | 28 ++++++++++++++--
 .../vault/CloudTrailReloadTriggerTask.java         | 37 ++++++++++++++++++----
 .../org/apache/camel/spi/PropertiesComponent.java  |  8 +++++
 .../component/properties/PropertiesComponent.java  | 11 ++-----
 4 files changed, 66 insertions(+), 18 deletions(-)

diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java
index ccb7212668a..ae147d7f974 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerPropertiesFunction.java
@@ -17,6 +17,8 @@
 package org.apache.camel.component.aws.secretsmanager;
 
 import java.util.Base64;
+import java.util.HashSet;
+import java.util.Set;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -51,7 +53,7 @@ import 
software.amazon.awssdk.services.secretsmanager.model.SecretsManagerExcept
  * </ul>
  * <p/>
  *
- * Otherwise it is possible to specify the credentials as properties:
+ * Otherwise, it is possible to specify the credentials as properties:
  *
  * <ul>
  * <li><tt>camel.vault.aws.accessKey</tt></li>
@@ -72,7 +74,6 @@ import 
software.amazon.awssdk.services.secretsmanager.model.SecretsManagerExcept
  * <tt>aws:database/username:admin</tt>. The admin value will be returned as 
default value, if the conditions above were
  * all met.
  */
-
 @org.apache.camel.spi.annotations.PropertiesFunction("aws")
 public class SecretsManagerPropertiesFunction extends ServiceSupport 
implements PropertiesFunction, CamelContextAware {
 
@@ -84,9 +85,12 @@ public class SecretsManagerPropertiesFunction extends 
ServiceSupport implements
     private CamelContext camelContext;
     private SecretsManagerClient client;
 
+    private final Set<String> secrets = new HashSet<>();
+
     @Override
     protected void doStart() throws Exception {
         super.doStart();
+
         String accessKey = System.getenv(CAMEL_AWS_VAULT_ACCESS_KEY_ENV);
         String secretKey = System.getenv(CAMEL_AWS_VAULT_SECRET_KEY_ENV);
         String region = System.getenv(CAMEL_AWS_VAULT_REGION_ENV);
@@ -120,8 +124,14 @@ public class SecretsManagerPropertiesFunction extends 
ServiceSupport implements
     @Override
     protected void doStop() throws Exception {
         if (client != null) {
-            client.close();
+            try {
+                client.close();
+            } catch (Exception e) {
+                // ignore
+            }
+            client = null;
         }
+        secrets.clear();
         super.doStop();
     }
 
@@ -182,6 +192,10 @@ public class SecretsManagerPropertiesFunction extends 
ServiceSupport implements
     private String getSecretFromSource(
             String key, String subkey, String defaultValue, String version)
             throws JsonProcessingException {
+
+        // capture name of secret
+        secrets.add(key);
+
         String returnValue;
         GetSecretValueRequest request;
         GetSecretValueRequest.Builder builder = 
GetSecretValueRequest.builder();
@@ -229,4 +243,12 @@ public class SecretsManagerPropertiesFunction extends 
ServiceSupport implements
     public CamelContext getCamelContext() {
         return camelContext;
     }
+
+    /**
+     * Ids of the secrets in use
+     */
+    public Set<String> getSecrets() {
+        return secrets;
+    }
+
 }
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/vault/CloudTrailReloadTriggerTask.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/vault/CloudTrailReloadTriggerTask.java
index 9c093f7f2cd..31cd63f0a10 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/vault/CloudTrailReloadTriggerTask.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/vault/CloudTrailReloadTriggerTask.java
@@ -17,11 +17,17 @@
 package org.apache.camel.component.aws.secretsmanager.vault;
 
 import java.time.Instant;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
+import 
org.apache.camel.component.aws.secretsmanager.SecretsManagerPropertiesFunction;
 import org.apache.camel.spi.ContextReloadStrategy;
+import org.apache.camel.spi.PropertiesComponent;
+import org.apache.camel.spi.PropertiesFunction;
 import org.apache.camel.spi.annotations.PeriodicTask;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.support.service.ServiceSupport;
@@ -56,6 +62,7 @@ public class CloudTrailReloadTriggerTask extends 
ServiceSupport implements Camel
     private CamelContext camelContext;
     private CloudTrailClient cloudTrailClient;
     private String secrets;
+    private SecretsManagerPropertiesFunction propertiesFunction;
     private volatile Instant lastTime;
 
     public CloudTrailReloadTriggerTask() {
@@ -75,8 +82,16 @@ public class CloudTrailReloadTriggerTask extends 
ServiceSupport implements Camel
     protected void doStart() throws Exception {
         super.doStart();
 
+        // auto-detect secrets in-use
+        PropertiesComponent pc = camelContext.getPropertiesComponent();
+        PropertiesFunction pf = pc.getPropertiesFunction("aws");
+        if (pf instanceof SecretsManagerPropertiesFunction) {
+            propertiesFunction = (SecretsManagerPropertiesFunction) pf;
+            LOG.debug("Auto-detecting secrets from properties-function: {}", 
pf.getName());
+        }
+        // specific secrets
         secrets = camelContext.getVaultConfiguration().aws().getSecrets();
-        if (ObjectHelper.isEmpty(secrets)) {
+        if (ObjectHelper.isEmpty(secrets) && propertiesFunction == null) {
             throw new IllegalArgumentException("Secrets must be configured on 
AWS vault configuration");
         }
 
@@ -137,7 +152,7 @@ public class CloudTrailReloadTriggerTask extends 
ServiceSupport implements Camel
                         List<Resource> a = event.resources();
                         for (Resource res : a) {
                             String name = res.resourceName();
-                            if (matchSecret(name, secrets)) {
+                            if (matchSecret(name)) {
                                 LOG.info("Update for secret: {} detected, 
triggering a CamelContext reload", name);
                                 triggerReloading = true;
                                 break;
@@ -159,13 +174,23 @@ public class CloudTrailReloadTriggerTask extends 
ServiceSupport implements Camel
         }
     }
 
-    protected boolean matchSecret(String name, String patterns) {
-        String[] parts = patterns.split(",");
-        for (String part : parts) {
-            if (name.contains(part) || PatternHelper.matchPattern(name, part)) 
{
+    protected boolean matchSecret(String name) {
+        Set<String> set = new HashSet<>();
+        if (secrets != null) {
+            Collections.addAll(set, secrets.split(","));
+        }
+        if (propertiesFunction != null) {
+            set.addAll(propertiesFunction.getSecrets());
+        }
+
+        for (String part : set) {
+            boolean result = name.contains(part) || 
PatternHelper.matchPattern(name, part);
+            LOG.trace("Matching secret id: {}={} -> {}", name, part, result);
+            if (result) {
                 return true;
             }
         }
+
         return false;
     }
 
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
index f225f255977..093e2f856de 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
@@ -186,6 +186,14 @@ public interface PropertiesComponent extends StaticService 
{
      */
     void addPropertiesFunction(PropertiesFunction function);
 
+    /**
+     * Gets the {@link PropertiesFunction} by the given name
+     *
+     * @param  name the function name
+     * @return      the function or null if no function exists
+     */
+    PropertiesFunction getPropertiesFunction(String name);
+
     /**
      * Whether to silently ignore if a location cannot be located, such as a 
properties file not found.
      */
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 852fc155be8..93b51b39089 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -561,12 +561,7 @@ public class PropertiesComponent extends ServiceSupport
         return propertiesFunctionResolver.getFunctions();
     }
 
-    /**
-     * Gets the function by the given name
-     *
-     * @param  name the function name
-     * @return      the function or null if no function exists
-     */
+    @Override
     public PropertiesFunction getPropertiesFunction(String name) {
         if (name == null) {
             return null;
@@ -574,9 +569,7 @@ public class PropertiesComponent extends ServiceSupport
         return propertiesFunctionResolver.resolvePropertiesFunction(name);
     }
 
-    /**
-     * Registers the {@link PropertiesFunction} as a function to this 
component.
-     */
+    @Override
     public void addPropertiesFunction(PropertiesFunction function) {
         propertiesFunctionResolver.addPropertiesFunction(function);
     }

Reply via email to