You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2025/03/31 13:09:06 UTC
(camel) branch main updated: CAMEL-21905 - Camel-IBM-Secrets-Manager: Implement secret refresh by using IBM Event Streams as destination of notifications (#17626)
This is an automated email from the ASF dual-hosted git repository.
acosentino 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 7d487548dc4 CAMEL-21905 - Camel-IBM-Secrets-Manager: Implement secret refresh by using IBM Event Streams as destination of notifications (#17626)
7d487548dc4 is described below
commit 7d487548dc4a1341a6e8080df3767860bbd12b01
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 31 15:09:00 2025 +0200
CAMEL-21905 - Camel-IBM-Secrets-Manager: Implement secret refresh by using IBM Event Streams as destination of notifications (#17626)
Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
.../main/camel-main-configuration-metadata.json | 8 +
components/camel-ibm-secrets-manager/pom.xml | 12 +
.../apache/camel/periodic-task/ibm-secret-refresh | 2 +
.../vault/IBMEventStreamReloadTriggerTask.java | 268 +++++++++++++++++++++
.../vault/IBMSecretsManagerVaultConfiguration.java | 105 ++++++++
...SecretsManagerVaultConfigurationConfigurer.java | 45 ++++
...agerVaultConfigurationPropertiesConfigurer.java | 53 ++++
.../camel-main-configuration-metadata.json | 8 +
core/camel-main/src/main/docs/main.adoc | 10 +-
.../camel/main/DefaultConfigurationConfigurer.java | 18 ++
10 files changed, 528 insertions(+), 1 deletion(-)
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index b2d72d5918c..215b956e8ae 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -392,6 +392,14 @@
{ "name": "camel.vault.hashicorp.port", "description": "Port to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.hashicorp.scheme", "description": "Scheme to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.hashicorp.token", "description": "Token to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamBootstrapServers", "description": "Specify the Bootstrap servers for consuming notification on IBM Event Stream. Multiple servers can be separated by comma.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamGroupId", "description": "Specify the Consumer Group ID to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamPassword", "description": "Specify the password to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamTopic", "description": "Specify the topic name for consuming notification on IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamUsername", "description": "Specify the username to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in IBM.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
+ { "name": "camel.vault.ibm.refreshPeriod", "description": "The period (millis) between checking AWS for updated secrets.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "integer", "javaType": "long", "defaultValue": 30000 },
+ { "name": "camel.vault.ibm.secrets", "description": "Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.ibm.serviceUrl", "description": "Service URL to access IBM Secrets Manager vault", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.ibm.token", "description": "Token to access IBM Secrets Manager vault", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.kubernetes.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in Kubernetes Cluster.", "sourceType": "org.apache.camel.vault.KubernetesVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
diff --git a/components/camel-ibm-secrets-manager/pom.xml b/components/camel-ibm-secrets-manager/pom.xml
index d4d31bbb0c3..bf48c8c7262 100644
--- a/components/camel-ibm-secrets-manager/pom.xml
+++ b/components/camel-ibm-secrets-manager/pom.xml
@@ -48,6 +48,18 @@
<artifactId>secrets-manager</artifactId>
<version>${ibm-secrets-manager-version}</version>
</dependency>
+
+ <!-- kafka java client -->
+ <dependency>
+ <groupId>org.apache.kafka</groupId>
+ <artifactId>kafka-clients</artifactId>
+ <version>${kafka-version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
<!-- for testing -->
<dependency>
diff --git a/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/services/org/apache/camel/periodic-task/ibm-secret-refresh b/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/services/org/apache/camel/periodic-task/ibm-secret-refresh
new file mode 100644
index 00000000000..3633c451afc
--- /dev/null
+++ b/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/services/org/apache/camel/periodic-task/ibm-secret-refresh
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.ibm.secrets.manager.vault.IBMEventStreamReloadTriggerTask
diff --git a/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/vault/IBMEventStreamReloadTriggerTask.java b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/vault/IBMEventStreamReloadTriggerTask.java
new file mode 100644
index 00000000000..21b010c2626
--- /dev/null
+++ b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/vault/IBMEventStreamReloadTriggerTask.java
@@ -0,0 +1,268 @@
+/*
+ * 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.ibm.secrets.manager.vault;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.ibm.cloud.secrets_manager_sdk.secrets_manager.v2.SecretsManager;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerPropertiesFunction;
+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;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.vault.IBMSecretsManagerVaultConfiguration;
+import org.apache.kafka.clients.CommonClientConfigs;
+import org.apache.kafka.clients.consumer.ConsumerConfig;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.clients.consumer.ConsumerRecords;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.common.config.SaslConfigs;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Period task which checks if IBM secrets has been updated and can trigger Camel to be reloaded.
+ */
+@PeriodicTask("ibm-secret-refresh")
+public class IBMEventStreamReloadTriggerTask extends ServiceSupport implements CamelContextAware, Runnable {
+
+ private static final String CAMEL_VAULT_IBM_EVENTSTREAM_BOOTSTRAP_SERVERS_ENV
+ = "CAMEL_VAULT_IBM_EVENTSTREAM_BOOTSTRAP_SERVERS";
+ private static final String CAMEL_VAULT_IBM_EVENTSTREAM_TOPIC_ENV = "CAMEL_VAULT_IBM_EVENTSTREAM_TOPIC";
+ private static final String CAMEL_VAULT_IBM_EVENTSTREAM_USERNAME_ENV = "CAMEL_VAULT_IBM_EVENTSTREAM_USERNAME";
+ private static final String CAMEL_VAULT_IBM_EVENTSTREAM_PASSWORD_ENV = "CAMEL_VAULT_IBM_EVENTSTREAM_PASSWORD";
+ private static final String CAMEL_VAULT_IBM_EVENTSTREAM_CONSUMER_GROUPID_ENV
+ = "CAMEL_VAULT_IBM_EVENTSTREAM_CONSUMER_GROUP_ID";
+
+ private CamelContext camelContext;
+
+ private SecretsManager client;
+ private String secretGroup;
+ private boolean reloadEnabled = true;
+ private String secrets;
+ private IBMSecretsManagerPropertiesFunction propertiesFunction;
+ private volatile Instant lastTime;
+ private volatile Instant lastCheckTime;
+ private volatile Instant lastReloadTime;
+ private final Map<String, Instant> updates = new HashMap<>();
+ KafkaConsumer<String, String> kafkaConsumer;
+ private static final String IBM_SECRETS_MANAGER_SECRET_ROTATED_EVENT = "secret_rotated";
+
+ private static final Logger LOG = LoggerFactory.getLogger(IBMEventStreamReloadTriggerTask.class);
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ // auto-detect secrets in-use
+ PropertiesComponent pc = camelContext.getPropertiesComponent();
+ PropertiesFunction pf = pc.getPropertiesFunction("ibm");
+ if (pf instanceof IBMSecretsManagerPropertiesFunction) {
+ propertiesFunction = (IBMSecretsManagerPropertiesFunction) pf;
+ LOG.debug("Auto-detecting secrets from properties-function: {}", pf.getName());
+ }
+ // specific secrets
+ secrets = camelContext.getVaultConfiguration().ibmSecretsManager().getSecrets();
+ if (ObjectHelper.isEmpty(secrets) && propertiesFunction == null) {
+ throw new IllegalArgumentException("Secrets must be configured on IBM vault configuration");
+ }
+
+ String bootstrapServers = System.getenv(CAMEL_VAULT_IBM_EVENTSTREAM_BOOTSTRAP_SERVERS_ENV);
+ String groupId = System.getenv(CAMEL_VAULT_IBM_EVENTSTREAM_CONSUMER_GROUPID_ENV);
+ String topic = System.getenv(CAMEL_VAULT_IBM_EVENTSTREAM_TOPIC_ENV);
+ String username = System.getenv(CAMEL_VAULT_IBM_EVENTSTREAM_USERNAME_ENV);
+ String password = System.getenv(CAMEL_VAULT_IBM_EVENTSTREAM_PASSWORD_ENV);
+
+ if (ObjectHelper.isEmpty(bootstrapServers) && ObjectHelper.isEmpty(groupId) && ObjectHelper.isEmpty(topic)
+ && ObjectHelper.isEmpty(password)) {
+ IBMSecretsManagerVaultConfiguration ibmVaultConfiguration
+ = getCamelContext().getVaultConfiguration().ibmSecretsManager();
+ if (ObjectHelper.isNotEmpty(ibmVaultConfiguration)) {
+ bootstrapServers = ibmVaultConfiguration.getEventStreamBootstrapServers();
+ groupId = ibmVaultConfiguration.getEventStreamGroupId();
+ topic = ibmVaultConfiguration.getEventStreamTopic();
+ if (ObjectHelper.isEmpty(username)) {
+ if (ObjectHelper.isNotEmpty(ibmVaultConfiguration.getEventStreamUsername())) {
+ username = ibmVaultConfiguration.getEventStreamUsername();
+ } else {
+ username = "token";
+ }
+ }
+ password = ibmVaultConfiguration.getEventStreamPassword();
+ }
+ } else {
+ throw new RuntimeCamelException(
+ "Using the IBM Secrets Refresh Task requires setting IBM Event Stream bootstrap servers, topic, groupId, username and password as application properties or environment variables");
+ }
+
+ // create consumer configs
+ Map<String, Object> configs = new HashMap<>();
+ configs.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+ configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
+ configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
+ configs.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
+ configs.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
+ configs.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
+ configs.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
+ configs.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
+ configs.put(SaslConfigs.SASL_JAAS_CONFIG,
+ "org.apache.kafka.common.security.plain.PlainLoginModule required username=" + username + " password="
+ + password + ";");
+
+ // create consumer
+ Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+ kafkaConsumer = new KafkaConsumer<String, String>(configs);
+
+ kafkaConsumer.subscribe(Arrays.asList(topic));
+ }
+
+ @Override
+ public void run() {
+
+ lastCheckTime = Instant.now();
+ boolean triggerReloading = false;
+ ObjectMapper mapper = new ObjectMapper();
+
+ while (true) {
+ ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(100));
+
+ for (ConsumerRecord<String, String> record : records) {
+ JsonNode recordJson;
+ String secretType;
+ try {
+ recordJson = mapper.readTree(record.value());
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ JsonNode payload = recordJson.get("data");
+ if (payload != null) {
+ secretType = payload.get("event_type").asText();
+ if (secretType != null) {
+ if (secretType.equalsIgnoreCase(IBM_SECRETS_MANAGER_SECRET_ROTATED_EVENT)) {
+ ArrayNode secretsRotated = (ArrayNode) payload.get("secrets");
+ for (JsonNode secret : secretsRotated) {
+ if (secret != null) {
+ String name = secret.get("secret_name").asText();
+ if (matchSecret(name)) {
+ updates.put(name, Instant.parse(secret.get("event_time").asText()));
+ if (isReloadEnabled()) {
+ LOG.info("Update for IBM secret: {} detected, triggering CamelContext reload",
+ name);
+ triggerReloading = true;
+ }
+ if (triggerReloading) {
+ ContextReloadStrategy reload = camelContext.hasService(ContextReloadStrategy.class);
+ if (reload != null) {
+ // trigger reload
+ lastReloadTime = Instant.now();
+ reload.onReload(this);
+ }
+ triggerReloading = false;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ }
+
+ @Override
+ public CamelContext getCamelContext() {
+ return camelContext;
+ }
+
+ @Override
+ public void setCamelContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+
+ /**
+ * Whether Camel should be reloaded on IBM secret updated
+ */
+ public void setReloadEnabled(boolean reloadEnabled) {
+ this.reloadEnabled = reloadEnabled;
+ }
+
+ /**
+ * A map of the updated secrets with the latest updated time.
+ */
+ public Map<String, Instant> getUpdates() {
+ return Collections.unmodifiableMap(updates);
+ }
+
+ /**
+ * Last time this task checked IBM for updated secrets.
+ */
+ public Instant getLastCheckTime() {
+ return lastCheckTime;
+ }
+
+ /**
+ * Last time IBM secrets update triggered reload.
+ */
+ public Instant getLastReloadTime() {
+ return lastReloadTime;
+ }
+
+ public boolean isReloadEnabled() {
+ return reloadEnabled;
+ }
+
+ 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/vault/IBMSecretsManagerVaultConfiguration.java b/core/camel-api/src/main/java/org/apache/camel/vault/IBMSecretsManagerVaultConfiguration.java
index d6272066732..3a8c326f5a3 100644
--- a/core/camel-api/src/main/java/org/apache/camel/vault/IBMSecretsManagerVaultConfiguration.java
+++ b/core/camel-api/src/main/java/org/apache/camel/vault/IBMSecretsManagerVaultConfiguration.java
@@ -27,6 +27,22 @@ public class IBMSecretsManagerVaultConfiguration extends VaultConfiguration {
private String token;
@Metadata
private String serviceUrl;
+ @Metadata
+ private boolean refreshEnabled;
+ @Metadata(defaultValue = "30000")
+ private long refreshPeriod = 30000;
+ @Metadata
+ private String secrets;
+ @Metadata
+ private String eventStreamTopic;
+ @Metadata
+ private String eventStreamBootstrapServers;
+ @Metadata
+ private String eventStreamUsername;
+ @Metadata
+ private String eventStreamPassword;
+ @Metadata
+ private String eventStreamGroupId;
public String getToken() {
return token;
@@ -49,4 +65,93 @@ public class IBMSecretsManagerVaultConfiguration extends VaultConfiguration {
public void setServiceUrl(String serviceUrl) {
this.serviceUrl = serviceUrl;
}
+
+ public boolean isRefreshEnabled() {
+ return refreshEnabled;
+ }
+
+ /**
+ * Whether to automatically reload Camel upon secrets being updated in IBM.
+ */
+ public void setRefreshEnabled(boolean refreshEnabled) {
+ this.refreshEnabled = refreshEnabled;
+ }
+
+ public long getRefreshPeriod() {
+ return refreshPeriod;
+ }
+
+ /**
+ * The period (millis) between checking AWS for updated secrets.
+ */
+ public void setRefreshPeriod(long refreshPeriod) {
+ this.refreshPeriod = refreshPeriod;
+ }
+
+ public String getSecrets() {
+ return secrets;
+ }
+
+ /**
+ * Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma.
+ */
+ public void setSecrets(String secrets) {
+ this.secrets = secrets;
+ }
+
+ public String getEventStreamTopic() {
+ return eventStreamTopic;
+ }
+
+ /**
+ * Specify the topic name for consuming notification on IBM Event Stream
+ */
+ public void setEventStreamTopic(String eventStreamTopic) {
+ this.eventStreamTopic = eventStreamTopic;
+ }
+
+ public String getEventStreamBootstrapServers() {
+ return eventStreamBootstrapServers;
+ }
+
+ /**
+ * Specify the Bootstrap servers for consuming notification on IBM Event Stream. Multiple servers can be separated
+ * by comma.
+ */
+ public void setEventStreamBootstrapServers(String eventStreamBootstrapServers) {
+ this.eventStreamBootstrapServers = eventStreamBootstrapServers;
+ }
+
+ public String getEventStreamUsername() {
+ return eventStreamUsername;
+ }
+
+ /**
+ * Specify the username to access IBM Event Stream
+ */
+ public void setEventStreamUsername(String eventStreamUsername) {
+ this.eventStreamUsername = eventStreamUsername;
+ }
+
+ public String getEventStreamPassword() {
+ return eventStreamPassword;
+ }
+
+ /**
+ * Specify the password to access IBM Event Stream
+ */
+ public void setEventStreamPassword(String eventStreamPassword) {
+ this.eventStreamPassword = eventStreamPassword;
+ }
+
+ public String getEventStreamGroupId() {
+ return eventStreamGroupId;
+ }
+
+ /**
+ * Specify the Consumer Group ID to access IBM Event Stream
+ */
+ public void setEventStreamGroupId(String eventStreamGroupId) {
+ this.eventStreamGroupId = eventStreamGroupId;
+ }
}
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationConfigurer.java
index 823622dd7fe..7512a316ab2 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationConfigurer.java
@@ -27,6 +27,16 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "awsVaultConfiguration": target.setAwsVaultConfiguration(property(camelContext, org.apache.camel.vault.AwsVaultConfiguration.class, value)); return true;
case "azurevaultconfiguration":
case "azureVaultConfiguration": target.setAzureVaultConfiguration(property(camelContext, org.apache.camel.vault.AzureVaultConfiguration.class, value)); return true;
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": target.setEventStreamBootstrapServers(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": target.setEventStreamGroupId(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreampassword":
+ case "eventStreamPassword": target.setEventStreamPassword(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamtopic":
+ case "eventStreamTopic": target.setEventStreamTopic(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamusername":
+ case "eventStreamUsername": target.setEventStreamUsername(property(camelContext, java.lang.String.class, value)); return true;
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": target.setGcpVaultConfiguration(property(camelContext, org.apache.camel.vault.GcpVaultConfiguration.class, value)); return true;
case "hashicorpvaultconfiguration":
@@ -37,6 +47,11 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "kubernetesConfigMapVaultConfiguration": target.setKubernetesConfigMapVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesConfigMapVaultConfiguration.class, value)); return true;
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": target.setKubernetesVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesVaultConfiguration.class, value)); return true;
+ case "refreshenabled":
+ case "refreshEnabled": target.setRefreshEnabled(property(camelContext, boolean.class, value)); return true;
+ case "refreshperiod":
+ case "refreshPeriod": target.setRefreshPeriod(property(camelContext, long.class, value)); return true;
+ case "secrets": target.setSecrets(property(camelContext, java.lang.String.class, value)); return true;
case "serviceurl":
case "serviceUrl": target.setServiceUrl(property(camelContext, java.lang.String.class, value)); return true;
case "token": target.setToken(property(camelContext, java.lang.String.class, value)); return true;
@@ -51,6 +66,16 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "awsVaultConfiguration": return org.apache.camel.vault.AwsVaultConfiguration.class;
case "azurevaultconfiguration":
case "azureVaultConfiguration": return org.apache.camel.vault.AzureVaultConfiguration.class;
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": return java.lang.String.class;
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": return java.lang.String.class;
+ case "eventstreampassword":
+ case "eventStreamPassword": return java.lang.String.class;
+ case "eventstreamtopic":
+ case "eventStreamTopic": return java.lang.String.class;
+ case "eventstreamusername":
+ case "eventStreamUsername": return java.lang.String.class;
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": return org.apache.camel.vault.GcpVaultConfiguration.class;
case "hashicorpvaultconfiguration":
@@ -61,6 +86,11 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "kubernetesConfigMapVaultConfiguration": return org.apache.camel.vault.KubernetesConfigMapVaultConfiguration.class;
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": return org.apache.camel.vault.KubernetesVaultConfiguration.class;
+ case "refreshenabled":
+ case "refreshEnabled": return boolean.class;
+ case "refreshperiod":
+ case "refreshPeriod": return long.class;
+ case "secrets": return java.lang.String.class;
case "serviceurl":
case "serviceUrl": return java.lang.String.class;
case "token": return java.lang.String.class;
@@ -76,6 +106,16 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "awsVaultConfiguration": return target.getAwsVaultConfiguration();
case "azurevaultconfiguration":
case "azureVaultConfiguration": return target.getAzureVaultConfiguration();
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": return target.getEventStreamBootstrapServers();
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": return target.getEventStreamGroupId();
+ case "eventstreampassword":
+ case "eventStreamPassword": return target.getEventStreamPassword();
+ case "eventstreamtopic":
+ case "eventStreamTopic": return target.getEventStreamTopic();
+ case "eventstreamusername":
+ case "eventStreamUsername": return target.getEventStreamUsername();
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": return target.getGcpVaultConfiguration();
case "hashicorpvaultconfiguration":
@@ -86,6 +126,11 @@ public class IBMSecretsManagerVaultConfigurationConfigurer extends org.apache.ca
case "kubernetesConfigMapVaultConfiguration": return target.getKubernetesConfigMapVaultConfiguration();
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": return target.getKubernetesVaultConfiguration();
+ case "refreshenabled":
+ case "refreshEnabled": return target.isRefreshEnabled();
+ case "refreshperiod":
+ case "refreshPeriod": return target.getRefreshPeriod();
+ case "secrets": return target.getSecrets();
case "serviceurl":
case "serviceUrl": return target.getServiceUrl();
case "token": return target.getToken();
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationPropertiesConfigurer.java
index 9a4c1ea3d2d..0ed7ff077cc 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/IBMSecretsManagerVaultConfigurationPropertiesConfigurer.java
@@ -24,11 +24,19 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
Map<String, Object> map = new CaseInsensitiveMap();
map.put("AwsVaultConfiguration", org.apache.camel.vault.AwsVaultConfiguration.class);
map.put("AzureVaultConfiguration", org.apache.camel.vault.AzureVaultConfiguration.class);
+ map.put("EventStreamBootstrapServers", java.lang.String.class);
+ map.put("EventStreamGroupId", java.lang.String.class);
+ map.put("EventStreamPassword", java.lang.String.class);
+ map.put("EventStreamTopic", java.lang.String.class);
+ map.put("EventStreamUsername", java.lang.String.class);
map.put("GcpVaultConfiguration", org.apache.camel.vault.GcpVaultConfiguration.class);
map.put("HashicorpVaultConfiguration", org.apache.camel.vault.HashicorpVaultConfiguration.class);
map.put("IBMSecretsManagerVaultConfiguration", org.apache.camel.vault.IBMSecretsManagerVaultConfiguration.class);
map.put("KubernetesConfigMapVaultConfiguration", org.apache.camel.vault.KubernetesConfigMapVaultConfiguration.class);
map.put("KubernetesVaultConfiguration", org.apache.camel.vault.KubernetesVaultConfiguration.class);
+ map.put("RefreshEnabled", boolean.class);
+ map.put("RefreshPeriod", long.class);
+ map.put("Secrets", java.lang.String.class);
map.put("ServiceUrl", java.lang.String.class);
map.put("Token", java.lang.String.class);
ALL_OPTIONS = map;
@@ -42,6 +50,16 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "awsVaultConfiguration": target.setAwsVaultConfiguration(property(camelContext, org.apache.camel.vault.AwsVaultConfiguration.class, value)); return true;
case "azurevaultconfiguration":
case "azureVaultConfiguration": target.setAzureVaultConfiguration(property(camelContext, org.apache.camel.vault.AzureVaultConfiguration.class, value)); return true;
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": target.setEventStreamBootstrapServers(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": target.setEventStreamGroupId(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreampassword":
+ case "eventStreamPassword": target.setEventStreamPassword(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamtopic":
+ case "eventStreamTopic": target.setEventStreamTopic(property(camelContext, java.lang.String.class, value)); return true;
+ case "eventstreamusername":
+ case "eventStreamUsername": target.setEventStreamUsername(property(camelContext, java.lang.String.class, value)); return true;
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": target.setGcpVaultConfiguration(property(camelContext, org.apache.camel.vault.GcpVaultConfiguration.class, value)); return true;
case "hashicorpvaultconfiguration":
@@ -52,6 +70,11 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "kubernetesConfigMapVaultConfiguration": target.setKubernetesConfigMapVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesConfigMapVaultConfiguration.class, value)); return true;
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": target.setKubernetesVaultConfiguration(property(camelContext, org.apache.camel.vault.KubernetesVaultConfiguration.class, value)); return true;
+ case "refreshenabled":
+ case "refreshEnabled": target.setRefreshEnabled(property(camelContext, boolean.class, value)); return true;
+ case "refreshperiod":
+ case "refreshPeriod": target.setRefreshPeriod(property(camelContext, long.class, value)); return true;
+ case "secrets": target.setSecrets(property(camelContext, java.lang.String.class, value)); return true;
case "serviceurl":
case "serviceUrl": target.setServiceUrl(property(camelContext, java.lang.String.class, value)); return true;
case "token": target.setToken(property(camelContext, java.lang.String.class, value)); return true;
@@ -71,6 +94,16 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "awsVaultConfiguration": return org.apache.camel.vault.AwsVaultConfiguration.class;
case "azurevaultconfiguration":
case "azureVaultConfiguration": return org.apache.camel.vault.AzureVaultConfiguration.class;
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": return java.lang.String.class;
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": return java.lang.String.class;
+ case "eventstreampassword":
+ case "eventStreamPassword": return java.lang.String.class;
+ case "eventstreamtopic":
+ case "eventStreamTopic": return java.lang.String.class;
+ case "eventstreamusername":
+ case "eventStreamUsername": return java.lang.String.class;
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": return org.apache.camel.vault.GcpVaultConfiguration.class;
case "hashicorpvaultconfiguration":
@@ -81,6 +114,11 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "kubernetesConfigMapVaultConfiguration": return org.apache.camel.vault.KubernetesConfigMapVaultConfiguration.class;
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": return org.apache.camel.vault.KubernetesVaultConfiguration.class;
+ case "refreshenabled":
+ case "refreshEnabled": return boolean.class;
+ case "refreshperiod":
+ case "refreshPeriod": return long.class;
+ case "secrets": return java.lang.String.class;
case "serviceurl":
case "serviceUrl": return java.lang.String.class;
case "token": return java.lang.String.class;
@@ -96,6 +134,16 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "awsVaultConfiguration": return target.getAwsVaultConfiguration();
case "azurevaultconfiguration":
case "azureVaultConfiguration": return target.getAzureVaultConfiguration();
+ case "eventstreambootstrapservers":
+ case "eventStreamBootstrapServers": return target.getEventStreamBootstrapServers();
+ case "eventstreamgroupid":
+ case "eventStreamGroupId": return target.getEventStreamGroupId();
+ case "eventstreampassword":
+ case "eventStreamPassword": return target.getEventStreamPassword();
+ case "eventstreamtopic":
+ case "eventStreamTopic": return target.getEventStreamTopic();
+ case "eventstreamusername":
+ case "eventStreamUsername": return target.getEventStreamUsername();
case "gcpvaultconfiguration":
case "gcpVaultConfiguration": return target.getGcpVaultConfiguration();
case "hashicorpvaultconfiguration":
@@ -106,6 +154,11 @@ public class IBMSecretsManagerVaultConfigurationPropertiesConfigurer extends org
case "kubernetesConfigMapVaultConfiguration": return target.getKubernetesConfigMapVaultConfiguration();
case "kubernetesvaultconfiguration":
case "kubernetesVaultConfiguration": return target.getKubernetesVaultConfiguration();
+ case "refreshenabled":
+ case "refreshEnabled": return target.isRefreshEnabled();
+ case "refreshperiod":
+ case "refreshPeriod": return target.getRefreshPeriod();
+ case "secrets": return target.getSecrets();
case "serviceurl":
case "serviceUrl": return target.getServiceUrl();
case "token": return target.getToken();
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index b2d72d5918c..215b956e8ae 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -392,6 +392,14 @@
{ "name": "camel.vault.hashicorp.port", "description": "Port to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.hashicorp.scheme", "description": "Scheme to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.hashicorp.token", "description": "Token to access hashicorp vault", "sourceType": "org.apache.camel.vault.HashicorpVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamBootstrapServers", "description": "Specify the Bootstrap servers for consuming notification on IBM Event Stream. Multiple servers can be separated by comma.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamGroupId", "description": "Specify the Consumer Group ID to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamPassword", "description": "Specify the password to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamTopic", "description": "Specify the topic name for consuming notification on IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.eventStreamUsername", "description": "Specify the username to access IBM Event Stream", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
+ { "name": "camel.vault.ibm.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in IBM.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
+ { "name": "camel.vault.ibm.refreshPeriod", "description": "The period (millis) between checking AWS for updated secrets.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "integer", "javaType": "long", "defaultValue": 30000 },
+ { "name": "camel.vault.ibm.secrets", "description": "Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma.", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.ibm.serviceUrl", "description": "Service URL to access IBM Secrets Manager vault", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.ibm.token", "description": "Token to access IBM Secrets Manager vault", "sourceType": "org.apache.camel.vault.IBMSecretsManagerVaultConfiguration", "type": "string", "javaType": "java.lang.String" },
{ "name": "camel.vault.kubernetes.refreshEnabled", "description": "Whether to automatically reload Camel upon secrets being updated in Kubernetes Cluster.", "sourceType": "org.apache.camel.vault.KubernetesVaultConfiguration", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 1c12659004f..5a058fd5029 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -469,11 +469,19 @@ The camel.vault.hashicorp supports 6 options, which are listed below.
=== Camel IBM Secrets Manager Vault configurations
-The camel.vault.ibm supports 2 options, which are listed below.
+The camel.vault.ibm supports 10 options, which are listed below.
[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
+| *camel.vault.ibm.eventStream{zwsp}BootstrapServers* | Specify the Bootstrap servers for consuming notification on IBM Event Stream. Multiple servers can be separated by comma. | | String
+| *camel.vault.ibm.eventStream{zwsp}GroupId* | Specify the Consumer Group ID to access IBM Event Stream | | String
+| *camel.vault.ibm.eventStream{zwsp}Password* | Specify the password to access IBM Event Stream | | String
+| *camel.vault.ibm.eventStream{zwsp}Topic* | Specify the topic name for consuming notification on IBM Event Stream | | String
+| *camel.vault.ibm.eventStream{zwsp}Username* | Specify the username to access IBM Event Stream | | String
+| *camel.vault.ibm.refreshEnabled* | Whether to automatically reload Camel upon secrets being updated in IBM. | false | boolean
+| *camel.vault.ibm.refreshPeriod* | The period (millis) between checking AWS for updated secrets. | 30000 | long
+| *camel.vault.ibm.secrets* | Specify the secret names (or pattern) to check for updates. Multiple secrets can be separated by comma. | | String
| *camel.vault.ibm.serviceUrl* | Service URL to access IBM Secrets Manager vault | | String
| *camel.vault.ibm.token* | Token to access IBM Secrets Manager vault | | String
|===
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index dc737733b20..001ad910e5b 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -749,6 +749,24 @@ public final class DefaultConfigurationConfigurer {
scheduler.scheduledTask(r);
}
}
+
+ if (vc.ibmSecretsManager().isRefreshEnabled()) {
+ Optional<Runnable> task = PluginHelper.getPeriodTaskResolver(camelContext)
+ .newInstance("ibm-secret-refresh", Runnable.class);
+ if (task.isPresent()) {
+ Runnable r = task.get();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Scheduling: {} ", r);
+ }
+ if (camelContext.hasService(ContextReloadStrategy.class) == null) {
+ // refresh is enabled then we need to automatically enable context-reload as well
+ ContextReloadStrategy reloader = new DefaultContextReloadStrategy();
+ camelContext.addService(reloader);
+ }
+ PeriodTaskScheduler scheduler = PluginHelper.getPeriodTaskScheduler(camelContext);
+ scheduler.scheduledTask(r);
+ }
+ }
}
public static void afterPropertiesSet(final CamelContext camelContext) throws Exception {