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

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

commit 3d4d33b33bc35243372f9b01c5005702de3754cd
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed Sep 11 10:08:16 2024 +0200

    CAMEL-21186 - AWS Secrets Manager: Support Batch Retrieval for Secrets
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../aws/secretsmanager/aws-secrets-manager.json    | 12 +--
 .../secretsmanager/SecretsManagerConstants.java    |  4 +
 .../secretsmanager/SecretsManagerOperations.java   |  1 +
 .../aws/secretsmanager/SecretsManagerProducer.java | 79 +++++++++++++-----
 ...sManagerBatchGetSecretProducerLocalstackIT.java | 93 ++++++++++++++++++++++
 5 files changed, 165 insertions(+), 24 deletions(-)

diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/aws/secretsmanager/aws-secrets-manager.json
 
b/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/aws/secretsmanager/aws-secrets-manager.json
index f48b89e7b99..9c7d8c9103c 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/aws/secretsmanager/aws-secrets-manager.json
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/generated/resources/META-INF/org/apache/camel/component/aws/secretsmanager/aws-secrets-manager.json
@@ -28,7 +28,7 @@
     "binaryPayload": { "index": 0, "kind": "property", "displayName": "Binary 
Payload", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "Set if the secret is 
binary or not" },
     "configuration": { "index": 1, "kind": "property", "displayName": 
"Configuration", "group": "producer", "label": "", "required": false, "type": 
"object", "javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Component configuration" },
     "lazyStartProducer": { "index": 2, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fail [...]
-    "operation": { "index": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": true, "type": "object", 
"javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerOperations", 
"enum": [ "listSecrets", "createSecret", "getSecret", "describeSecret", 
"deleteSecret", "rotateSecret", "updateSecret", "restoreSecret", 
"replicateSecretToRegions" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configur [...]
+    "operation": { "index": 3, "kind": "property", "displayName": "Operation", 
"group": "producer", "label": "", "required": true, "type": "object", 
"javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerOperations", 
"enum": [ "listSecrets", "createSecret", "getSecret", "batchGetSecret", 
"describeSecret", "deleteSecret", "rotateSecret", "updateSecret", 
"restoreSecret", "replicateSecretToRegions" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret" [...]
     "overrideEndpoint": { "index": 4, "kind": "property", "displayName": 
"Override Endpoint", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "Set the need for 
overriding the endpoint. This option needs to be us [...]
     "pojoRequest": { "index": 5, "kind": "property", "displayName": "Pojo 
Request", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "If we want to use a POJO 
request as body or not" },
     "profileCredentialsName": { "index": 6, "kind": "property", "displayName": 
"Profile Credentials Name", "group": "producer", "label": "", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "If using a profile 
credentials provider, this parameter will set the p [...]
@@ -55,14 +55,16 @@
     "CamelAwsSecretsManagerSecretName": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The name of the secret.", 
"constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_NAME"
 },
     "CamelAwsSecretsManagerSecretDescription": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The description of the secret.", 
"constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_DESCRIPTION"
 },
     "CamelAwsSecretsManagerSecretId": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The ARN or name of the secret.", 
"constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_ID"
 },
-    "CamelAwsSecretsManagerLambdaRotationFunctionArn": { "index": 5, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The ARN of the Lambda 
rotation function that can rotate the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#LAMBDA_ROTATION_FUNCTION_ARN"
 },
-    "CamelAwsSecretsManagerSecretVersionId": { "index": 6, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The unique identifier of the version of 
the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_VERSION_ID"
 },
-    "CamelAwsSecretsManagerSecretReplicationRegions": { "index": 7, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "A comma separated list of 
Regions in which to replicate the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_REPLICATION_REGIONS"
 }
+    "CamelAwsSecretsManagerSecretIds": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "A comma separated list of the ARN or 
name of the secrets.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_IDS"
 },
+    "CamelAwsSecretsManagerLambdaRotationFunctionArn": { "index": 6, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The ARN of the Lambda 
rotation function that can rotate the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#LAMBDA_ROTATION_FUNCTION_ARN"
 },
+    "CamelAwsSecretsManagerSecretVersionId": { "index": 7, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The unique identifier of the version of 
the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_VERSION_ID"
 },
+    "CamelAwsSecretsManagerSecretVersionIds": { "index": 8, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The unique identifier of the version of 
the secrets in batch operation.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_VERSION_IDS"
 },
+    "CamelAwsSecretsManagerSecretReplicationRegions": { "index": 9, "kind": 
"header", "displayName": "", "group": "producer", "label": "", "required": 
false, "javaType": "String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "A comma separated list of 
Regions in which to replicate the secret.", "constantName": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConstants#SECRET_REPLICATION_REGIONS"
 }
   },
   "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.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "Logical name" },
     "binaryPayload": { "index": 1, "kind": "parameter", "displayName": "Binary 
Payload", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "Set if the secret is 
binary or not" },
-    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"object", "javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerOperations", 
"enum": [ "listSecrets", "createSecret", "getSecret", "describeSecret", 
"deleteSecret", "rotateSecret", "updateSecret", "restoreSecret", 
"replicateSecretToRegions" ], "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "configu [...]
+    "operation": { "index": 2, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "", "required": true, "type": 
"object", "javaType": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerOperations", 
"enum": [ "listSecrets", "createSecret", "getSecret", "batchGetSecret", 
"describeSecret", "deleteSecret", "rotateSecret", "updateSecret", 
"restoreSecret", "replicateSecretToRegions" ], "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret [...]
     "overrideEndpoint": { "index": 3, "kind": "parameter", "displayName": 
"Override Endpoint", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "Set the need for 
overriding the endpoint. This option needs to be u [...]
     "pojoRequest": { "index": 4, "kind": "parameter", "displayName": "Pojo 
Request", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "If we want to use a POJO 
request as body or not" },
     "profileCredentialsName": { "index": 5, "kind": "parameter", 
"displayName": "Profile Credentials Name", "group": "producer", "label": "", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws.secretsmanager.SecretsManagerConfiguration", 
"configurationField": "configuration", "description": "If using a profile 
credentials provider, this parameter will set the  [...]
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerConstants.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerConstants.java
index ad3d0e5da8c..7862cc90c97 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerConstants.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerConstants.java
@@ -32,10 +32,14 @@ public interface SecretsManagerConstants {
     String SECRET_DESCRIPTION = "CamelAwsSecretsManagerSecretDescription";
     @Metadata(description = "The ARN or name of the secret.", javaType = 
"String")
     String SECRET_ID = "CamelAwsSecretsManagerSecretId";
+    @Metadata(description = "A comma separated list of the ARN or name of the 
secrets.", javaType = "String")
+    String SECRET_IDS = "CamelAwsSecretsManagerSecretIds";
     @Metadata(description = "The ARN of the Lambda rotation function that can 
rotate the secret.", javaType = "String")
     String LAMBDA_ROTATION_FUNCTION_ARN = 
"CamelAwsSecretsManagerLambdaRotationFunctionArn";
     @Metadata(description = "The unique identifier of the version of the 
secret.", javaType = "String")
     String SECRET_VERSION_ID = "CamelAwsSecretsManagerSecretVersionId";
+    @Metadata(description = "The unique identifier of the version of the 
secrets in batch operation.", javaType = "String")
+    String SECRET_VERSION_IDS = "CamelAwsSecretsManagerSecretVersionIds";
     @Metadata(description = "A comma separated list of Regions in which to 
replicate the secret.", javaType = "String")
     String SECRET_REPLICATION_REGIONS = 
"CamelAwsSecretsManagerSecretReplicationRegions";
 }
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerOperations.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerOperations.java
index c8bc0284aae..a4c6e51b627 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerOperations.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerOperations.java
@@ -21,6 +21,7 @@ public enum SecretsManagerOperations {
     listSecrets,
     createSecret,
     getSecret,
+    batchGetSecret,
     describeSecret,
     deleteSecret,
     rotateSecret,
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducer.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducer.java
index 40e42a9d8fe..4e06c57263b 100644
--- 
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducer.java
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducer.java
@@ -16,7 +16,10 @@
  */
 package org.apache.camel.component.aws.secretsmanager;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Base64;
+import java.util.List;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
@@ -33,26 +36,8 @@ import org.slf4j.LoggerFactory;
 import software.amazon.awssdk.awscore.exception.AwsServiceException;
 import software.amazon.awssdk.core.SdkBytes;
 import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
-import 
software.amazon.awssdk.services.secretsmanager.model.CreateSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.CreateSecretResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.DeleteSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.DeleteSecretResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.DescribeSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.DescribeSecretResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
-import software.amazon.awssdk.services.secretsmanager.model.ListSecretsRequest;
+import software.amazon.awssdk.services.secretsmanager.model.*;
 import 
software.amazon.awssdk.services.secretsmanager.model.ListSecretsRequest.Builder;
-import 
software.amazon.awssdk.services.secretsmanager.model.ListSecretsResponse;
-import software.amazon.awssdk.services.secretsmanager.model.ReplicaRegionType;
-import 
software.amazon.awssdk.services.secretsmanager.model.ReplicateSecretToRegionsRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.ReplicateSecretToRegionsResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.RestoreSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.RestoreSecretResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.RotateSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.RotateSecretResponse;
-import 
software.amazon.awssdk.services.secretsmanager.model.UpdateSecretRequest;
-import 
software.amazon.awssdk.services.secretsmanager.model.UpdateSecretResponse;
 
 /**
  * A Producer which sends messages to the Amazon Secrets Manager Service SDK v2
@@ -82,6 +67,9 @@ public class SecretsManagerProducer extends DefaultProducer {
             case getSecret:
                 getSecret(getEndpoint().getSecretsManagerClient(), exchange);
                 break;
+            case batchGetSecret:
+                batchGetSecret(getEndpoint().getSecretsManagerClient(), 
exchange);
+                break;
             case describeSecret:
                 describeSecret(getEndpoint().getSecretsManagerClient(), 
exchange);
                 break;
@@ -407,6 +395,59 @@ public class SecretsManagerProducer extends 
DefaultProducer {
         message.setBody(result);
     }
 
+    private void batchGetSecret(SecretsManagerClient secretsManagerClient, 
Exchange exchange)
+            throws InvalidPayloadException {
+        BatchGetSecretValueRequest request = null;
+        BatchGetSecretValueResponse result;
+        if (getConfiguration().isPojoRequest()) {
+            request = 
exchange.getIn().getMandatoryBody(BatchGetSecretValueRequest.class);
+        } else {
+            BatchGetSecretValueRequest.Builder builder = 
BatchGetSecretValueRequest.builder();
+            if 
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(SecretsManagerConstants.SECRET_IDS)))
 {
+                List<String> secretIds
+                        = Arrays.asList(
+                                
exchange.getIn().getHeader(SecretsManagerConstants.SECRET_IDS, 
String.class).split(","));
+                builder.secretIdList(secretIds);
+            } else {
+                throw new IllegalArgumentException("Secret Ids must be 
specified");
+            }
+            request = builder.build();
+        }
+        try {
+            result = secretsManagerClient.batchGetSecretValue(request);
+        } catch (AwsServiceException ase) {
+            LOG.trace("Batch Get Secret value command returned the error code 
{}", ase.awsErrorDetails().errorCode());
+            throw ase;
+        }
+        Message message = getMessageForResponse(exchange);
+        if (getConfiguration().isBinaryPayload()) {
+            List<String> secretsReturned = new ArrayList<String>();
+            if (!result.secretValues().isEmpty()) {
+                for (SecretValueEntry entry : result.secretValues()) {
+                    secretsReturned.add(new 
String(Base64.getDecoder().decode(entry.secretBinary().asByteBuffer()).array()));
+                }
+            }
+            message.setBody(secretsReturned);
+        } else {
+            List<String> secretsReturned = new ArrayList<String>();
+            if (!result.secretValues().isEmpty()) {
+                for (SecretValueEntry entry : result.secretValues()) {
+                    secretsReturned.add(entry.secretString());
+                }
+            }
+            message.setBody(secretsReturned);
+        }
+        List<String> versionIds = new ArrayList<String>();
+        if (!result.secretValues().isEmpty()) {
+            for (SecretValueEntry entry : result.secretValues()) {
+                if (ObjectHelper.isNotEmpty(entry.versionId())) {
+                    versionIds.add(entry.versionId());
+                }
+            }
+        }
+        
exchange.getMessage().setHeader(SecretsManagerConstants.SECRET_VERSION_IDS, 
versionIds);
+    }
+
     public static Message getMessageForResponse(final Exchange exchange) {
         return exchange.getMessage();
     }
diff --git 
a/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerBatchGetSecretProducerLocalstackIT.java
 
b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerBatchGetSecretProducerLocalstackIT.java
new file mode 100644
index 00000000000..188b1d4ab23
--- /dev/null
+++ 
b/components/camel-aws/camel-aws-secrets-manager/src/test/java/org/apache/camel/component/aws/secretsmanager/integration/SecretsManagerBatchGetSecretProducerLocalstackIT.java
@@ -0,0 +1,93 @@
+/*
+ * 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.aws.secretsmanager.integration;
+
+import java.util.List;
+
+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.aws.secretsmanager.SecretsManagerConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import 
software.amazon.awssdk.services.secretsmanager.model.CreateSecretResponse;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class SecretsManagerBatchGetSecretProducerLocalstackIT extends 
AwsSecretsManagerBaseTest {
+
+    @EndpointInject("mock:result")
+    private MockEndpoint mock;
+
+    @Test
+    public void createSecretTest() {
+
+        mock.expectedMessageCount(1);
+        Exchange sec1 = template.request("direct:createSecret", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                
exchange.getIn().setHeader(SecretsManagerConstants.SECRET_NAME, "TestSecret2");
+                exchange.getIn().setBody("Secret 2");
+            }
+        });
+
+        Exchange sec2 = template.request("direct:createSecret", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                
exchange.getIn().setHeader(SecretsManagerConstants.SECRET_NAME, "TestSecret1");
+                exchange.getIn().setBody("Secret 1");
+            }
+        });
+
+        CreateSecretResponse resultGet1 = (CreateSecretResponse) 
sec1.getIn().getBody();
+        assertNotNull(resultGet1);
+
+        CreateSecretResponse resultGet2 = (CreateSecretResponse) 
sec2.getIn().getBody();
+        assertNotNull(resultGet2);
+
+        Exchange exchangeFinal = template.request("direct:batchGetSecret", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                String secretsIds = resultGet1.arn() + "," + resultGet2.arn();
+                exchange.getIn().setHeader(SecretsManagerConstants.SECRET_IDS, 
secretsIds);
+            }
+        });
+
+        List<String> secrets = exchangeFinal.getIn().getBody(List.class);
+        assertEquals(2, secrets.size());
+        assertEquals("Secret 2", secrets.get(0));
+        assertEquals("Secret 1", secrets.get(1));
+        assertEquals(2, 
exchangeFinal.getMessage().getHeader(SecretsManagerConstants.SECRET_VERSION_IDS,
 List.class).size());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:createSecret")
+                        
.to("aws-secrets-manager://test?operation=createSecret");
+
+                from("direct:batchGetSecret")
+                        
.to("aws-secrets-manager://test?operation=batchGetSecret")
+                        .to("mock:result");
+            }
+        };
+    }
+}

Reply via email to