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/02/20 11:35:37 UTC

(camel) branch CAMEL-21767 created (now f9e37abefd9)

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a change to branch CAMEL-21767
in repository https://gitbox.apache.org/repos/asf/camel.git


      at f9e37abefd9 CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation

This branch includes the following new commits:

     new ae0c8898ab1 CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation
     new f9e37abefd9 CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 02/02: CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch CAMEL-21767
in repository https://gitbox.apache.org/repos/asf/camel.git

commit f9e37abefd9f3affc43b9c22466fd697c184ac7f
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 20 12:34:55 2025 +0100

    CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../catalog/components/ibm-secrets-manager.json    |  2 +-
 .../ibm/secrets/manager/ibm-secrets-manager.json   |  2 +-
 .../main/docs/ibm-secrets-manager-component.adoc   |  3 +-
 .../manager/IBMSecretsManagerOperation.java        |  1 +
 .../secrets/manager/IBMSecretsManagerProducer.java | 37 +++++++++++++++++++++-
 5 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-secrets-manager.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-secrets-manager.json
index c5f1b490144..22d88cdb6d6 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-secrets-manager.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ibm-secrets-manager.json
@@ -35,7 +35,7 @@
   },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "Logical name" },
-    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerOperation", "enum": [ "createArbitrarySecret", "getSecret", "deleteSecret" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationFie [...]
+    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerOperation", "enum": [ "createArbitrarySecret", "createKVSecret", "getSecret", "deleteSecret" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", [...]
     "serviceUrl": { "index": 2, "kind": "parameter", "displayName": "Service Url", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "Service URL for IBM Secrets Manager" },
     "lazyStartProducer": { "index": 3, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...]
     "token": { "index": 4, "kind": "parameter", "displayName": "Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "IBM Cloud API Token for IBM Secrets Manager" }
diff --git a/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/ibm/secrets/manager/ibm-secrets-manager.json b/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/ibm/secrets/manager/ibm-secrets-manager.json
index c5f1b490144..22d88cdb6d6 100644
--- a/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/ibm/secrets/manager/ibm-secrets-manager.json
+++ b/components/camel-ibm-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/ibm/secrets/manager/ibm-secrets-manager.json
@@ -35,7 +35,7 @@
   },
   "properties": {
     "label": { "index": 0, "kind": "path", "displayName": "Label", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "Logical name" },
-    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerOperation", "enum": [ "createArbitrarySecret", "getSecret", "deleteSecret" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationFie [...]
+    "operation": { "index": 1, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerOperation", "enum": [ "createArbitrarySecret", "createKVSecret", "getSecret", "deleteSecret" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", [...]
     "serviceUrl": { "index": 2, "kind": "parameter", "displayName": "Service Url", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "Service URL for IBM Secrets Manager" },
     "lazyStartProducer": { "index": 3, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...]
     "token": { "index": 4, "kind": "parameter", "displayName": "Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConfiguration", "configurationField": "configuration", "description": "IBM Cloud API Token for IBM Secrets Manager" }
diff --git a/components/camel-ibm-secrets-manager/src/main/docs/ibm-secrets-manager-component.adoc b/components/camel-ibm-secrets-manager/src/main/docs/ibm-secrets-manager-component.adoc
index bc40de95abf..5921c3991dc 100644
--- a/components/camel-ibm-secrets-manager/src/main/docs/ibm-secrets-manager-component.adoc
+++ b/components/camel-ibm-secrets-manager/src/main/docs/ibm-secrets-manager-component.adoc
@@ -51,7 +51,8 @@ include::partial$component-endpoint-headers.adoc[]
 
 The component supports operations at the producer level. Specifically, it provides the following functionalities:
 
-* `createSecret`
+* `createArbitrarySecret`
+* `createKVSecret`
 * `getSecret`
 * `deleteSecret`
 
diff --git a/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerOperation.java b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerOperation.java
index 51f0e7dfd76..546daaee3f3 100644
--- a/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerOperation.java
+++ b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerOperation.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.ibm.secrets.manager;
 
 public enum IBMSecretsManagerOperation {
     createArbitrarySecret,
+    createKVSecret,
     getSecret,
     deleteSecret
 }
diff --git a/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerProducer.java b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerProducer.java
index 652e4760f84..526e0430ab8 100644
--- a/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerProducer.java
+++ b/components/camel-ibm-secrets-manager/src/main/java/org/apache/camel/component/ibm/secrets/manager/IBMSecretsManagerProducer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.ibm.secrets.manager;
 
+import java.util.Map;
+
 import com.ibm.cloud.sdk.core.http.Response;
 import com.ibm.cloud.secrets_manager_sdk.secrets_manager.v2.model.*;
 import org.apache.camel.Endpoint;
@@ -35,6 +37,9 @@ public class IBMSecretsManagerProducer extends DefaultProducer {
             case createArbitrarySecret:
                 createArbitratySecret(exchange);
                 break;
+            case createKVSecret:
+                createKVSecret(exchange);
+                break;
             case getSecret:
                 getSecret(exchange);
                 break;
@@ -66,6 +71,26 @@ public class IBMSecretsManagerProducer extends DefaultProducer {
         exchange.getMessage().setBody(createResp.getResult().getId());
     }
 
+    private void createKVSecret(Exchange exchange) {
+        KVSecretPrototype.Builder kvSecretResourceBuilder = new KVSecretPrototype.Builder();
+        if (ObjectHelper.isNotEmpty(exchange.getMessage().getHeader(IBMSecretsManagerConstants.SECRET_NAME, String.class))) {
+            kvSecretResourceBuilder
+                    .name(exchange.getMessage().getHeader(IBMSecretsManagerConstants.SECRET_NAME, String.class));
+        } else {
+            throw new IllegalArgumentException("Secret Name must be specified");
+        }
+        kvSecretResourceBuilder.data(exchange.getMessage().getBody(Map.class));
+        kvSecretResourceBuilder.secretType(KVSecretPrototype.SecretType.KV);
+        KVSecretPrototype kvSecretResource = kvSecretResourceBuilder.build();
+
+        CreateSecretOptions createSecretOptions = new CreateSecretOptions.Builder()
+                .secretPrototype(kvSecretResource)
+                .build();
+        Response<Secret> createResp = getEndpoint().getSecretManager().createSecret(createSecretOptions).execute();
+
+        exchange.getMessage().setBody(createResp.getResult().getId());
+    }
+
     private void getSecret(Exchange exchange) {
         GetSecretOptions.Builder getSecretOptionsBuilder = new GetSecretOptions.Builder();
         if (ObjectHelper.isNotEmpty(exchange.getMessage().getHeader(IBMSecretsManagerConstants.SECRET_ID, String.class))) {
@@ -75,7 +100,17 @@ public class IBMSecretsManagerProducer extends DefaultProducer {
         }
         Response<Secret> getResp = getEndpoint().getSecretManager().getSecret(getSecretOptionsBuilder.build()).execute();
 
-        exchange.getMessage().setBody(getResp.getResult().getPayload());
+        String secretType = getResp.getResult().getSecretType();
+        switch (secretType) {
+            case "arbitrary":
+                exchange.getMessage().setBody(getResp.getResult().getPayload());
+                break;
+            case "kv":
+                exchange.getMessage().setBody(getResp.getResult().getData());
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported Secret Type");
+        }
     }
 
     private void deleteSecret(Exchange exchange) {


(camel) 01/02: CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch CAMEL-21767
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ae0c8898ab1162c9d7e20833ad2f964778788d28
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 20 12:11:20 2025 +0100

    CAMEL-21767 - Camel-IBM-Secrets-manager: Add more type of secrets for create secret operation
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../IBMSecretsManagerCreateKVSecretIT.java         | 114 +++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/components/camel-ibm-secrets-manager/src/test/java/org/apache/camel/component/ibm/secrets/manager/integration/operations/IBMSecretsManagerCreateKVSecretIT.java b/components/camel-ibm-secrets-manager/src/test/java/org/apache/camel/component/ibm/secrets/manager/integration/operations/IBMSecretsManagerCreateKVSecretIT.java
new file mode 100644
index 00000000000..a8851c32908
--- /dev/null
+++ b/components/camel-ibm-secrets-manager/src/test/java/org/apache/camel/component/ibm/secrets/manager/integration/operations/IBMSecretsManagerCreateKVSecretIT.java
@@ -0,0 +1,114 @@
+/*
+ * 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.integration.operations;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.ibm.secrets.manager.IBMSecretsManagerConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIfSystemProperties;
+import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+// Must be manually tested. Provide your own accessKey and secretKey using -Dsecrets-manager and -Dcamel.ibm.sm.serviceurl
+@EnabledIfSystemProperties({
+        @EnabledIfSystemProperty(named = "camel.ibm.sm.token", matches = ".*",
+                                 disabledReason = "Secrets Manager Token not provided"),
+        @EnabledIfSystemProperty(named = "camel.ibm.sm.serviceurl", matches = ".*",
+                                 disabledReason = "Secrets Manager Service URL not provided")
+})
+public class IBMSecretsManagerCreateKVSecretIT extends CamelTestSupport {
+
+    @EndpointInject("mock:result-write")
+    private MockEndpoint mockWrite;
+
+    @EndpointInject("mock:result-read")
+    private MockEndpoint mockRead;
+
+    @EndpointInject("mock:result-delete")
+    private MockEndpoint mockDelete;
+
+    @Test
+    public void createSecretTest() throws InterruptedException {
+        HashMap<String, String> secretPayload = new HashMap<String, String>();
+        secretPayload.put("username", "admin");
+        secretPayload.put("password", "pwd123");
+
+        mockWrite.expectedMessageCount(1);
+        mockRead.expectedMessageCount(1);
+        mockDelete.expectedMessageCount(1);
+        Exchange createdSec = template.request("direct:createSecret", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setBody(secretPayload);
+
+                exchange.getMessage().setHeader(IBMSecretsManagerConstants.SECRET_NAME, "secret-kv");
+            }
+        });
+        Exchange readSec = template.request("direct:readSecret", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getMessage().setHeader(IBMSecretsManagerConstants.SECRET_ID, createdSec.getMessage().getBody());
+            }
+        });
+
+        template.request("direct:deleteSecret", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getMessage().setHeader(IBMSecretsManagerConstants.SECRET_ID, createdSec.getMessage().getBody());
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+        Exchange ret = mockRead.getExchanges().get(0);
+        assertNotNull(ret);
+        assertEquals(secretPayload, ret.getMessage().getBody(Map.class));
+        Exchange retDelete = mockDelete.getExchanges().get(0);
+        assertNotNull(retDelete);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:createSecret")
+                        .toF("ibm-secrets-manager://secret?operation=createKVSecret&token=RAW(%s)&serviceUrl=%s",
+                                System.getProperty("camel.ibm.sm.token"), System.getProperty("camel.ibm.sm.serviceurl"))
+                        .to("mock:result-write");
+                from("direct:readSecret")
+                        .toF("ibm-secrets-manager://secret?operation=getSecret&token=RAW(%s)&serviceUrl=%s",
+                                System.getProperty("camel.ibm.sm.token"), System.getProperty("camel.ibm.sm.serviceurl"))
+                        .to("mock:result-read");
+                from("direct:deleteSecret")
+                        .toF("ibm-secrets-manager://secret?operation=deleteSecret&token=RAW(%s)&serviceUrl=%s",
+                                System.getProperty("camel.ibm.sm.token"), System.getProperty("camel.ibm.sm.serviceurl"))
+                        .to("mock:result-delete");
+            }
+        };
+    }
+}