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 8e7112aeca27 CAMEL-22806 - Camel-AWS components: Avoid duplicated code
and add pagination to producer operation where it makes sense - AWS IAM (#20648)
8e7112aeca27 is described below
commit 8e7112aeca27a8179e514bec2939225d11b8e4df
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed Dec 31 18:38:52 2025 +0100
CAMEL-22806 - Camel-AWS components: Avoid duplicated code and add
pagination to producer operation where it makes sense - AWS IAM (#20648)
Signed-off-by: Andrea Cosentino <[email protected]>
---
.../apache/camel/catalog/components/aws2-iam.json | 10 +-
.../apache/camel/component/aws2/iam/aws2-iam.json | 10 +-
.../camel/component/aws2/iam/IAM2Constants.java | 20 +
.../camel/component/aws2/iam/IAM2Producer.java | 717 +++++++++------------
.../component/aws2/iam/AmazonIAMClientMock.java | 15 +
.../endpoint/dsl/IAM2EndpointBuilderFactory.java | 96 +++
6 files changed, 460 insertions(+), 408 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
index 00cee1030a02..c3214a03072b 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-iam.json
@@ -53,7 +53,15 @@
"CamelAwsIAMAccessKeyID": { "index": 2, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The accessKey you want to manage", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#ACCESS_KEY_ID" },
"CamelAwsIAMAccessKeyStatus": { "index": 3, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The Status of the AccessKey you want to
set, possible value are active and inactive", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#ACCESS_KEY_STATUS" },
"CamelAwsIAMGroupName": { "index": 4, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The name of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_NAME" },
- "CamelAwsIAMGroupPath": { "index": 5, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The path of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_PATH" }
+ "CamelAwsIAMGroupPath": { "index": 5, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The path of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_PATH" },
+ "CamelAwsIAMMarker": { "index": 6, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The marker to use for pagination in list operations",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#MARKER" },
+ "CamelAwsIAMMaxItems": { "index": 7, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "Integer",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The maximum number of items to return in list
operations", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#MAX_ITEMS" },
+ "CamelAwsIAMIsTruncated": { "index": 8, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "Boolean",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "Whether the list response is truncated (has more
results)", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#IS_TRUNCATED" },
+ "CamelAwsIAMNextMarker": { "index": 9, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The marker to use for the next page of results",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#NEXT_MARKER"
},
+ "CamelAwsIAMUserArn": { "index": 10, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ARN of the created or retrieved user",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ARN" },
+ "CamelAwsIAMUserId": { "index": 11, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ID of the created or retrieved user",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ID" },
+ "CamelAwsIAMGroupArn": { "index": 12, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ARN of the created or retrieved group",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ARN" },
+ "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ID of the created or retrieved group",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" }
},
"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.aws2.iam.IAM2Configuration", "configurationField":
"configuration", "description": "Logical name" },
diff --git
a/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
b/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
index 00cee1030a02..c3214a03072b 100644
---
a/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
+++
b/components/camel-aws/camel-aws2-iam/src/generated/resources/META-INF/org/apache/camel/component/aws2/iam/aws2-iam.json
@@ -53,7 +53,15 @@
"CamelAwsIAMAccessKeyID": { "index": 2, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The accessKey you want to manage", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#ACCESS_KEY_ID" },
"CamelAwsIAMAccessKeyStatus": { "index": 3, "kind": "header",
"displayName": "", "group": "producer", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The Status of the AccessKey you want to
set, possible value are active and inactive", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#ACCESS_KEY_STATUS" },
"CamelAwsIAMGroupName": { "index": 4, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The name of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_NAME" },
- "CamelAwsIAMGroupPath": { "index": 5, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The path of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_PATH" }
+ "CamelAwsIAMGroupPath": { "index": 5, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The path of an AWS IAM Group", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_PATH" },
+ "CamelAwsIAMMarker": { "index": 6, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The marker to use for pagination in list operations",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#MARKER" },
+ "CamelAwsIAMMaxItems": { "index": 7, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "Integer",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The maximum number of items to return in list
operations", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#MAX_ITEMS" },
+ "CamelAwsIAMIsTruncated": { "index": 8, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "Boolean",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "Whether the list response is truncated (has more
results)", "constantName":
"org.apache.camel.component.aws2.iam.IAM2Constants#IS_TRUNCATED" },
+ "CamelAwsIAMNextMarker": { "index": 9, "kind": "header", "displayName":
"", "group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The marker to use for the next page of results",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#NEXT_MARKER"
},
+ "CamelAwsIAMUserArn": { "index": 10, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ARN of the created or retrieved user",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ARN" },
+ "CamelAwsIAMUserId": { "index": 11, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ID of the created or retrieved user",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#USER_ID" },
+ "CamelAwsIAMGroupArn": { "index": 12, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ARN of the created or retrieved group",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ARN" },
+ "CamelAwsIAMGroupId": { "index": 13, "kind": "header", "displayName": "",
"group": "producer", "label": "", "required": false, "javaType": "String",
"deprecated": false, "deprecationNote": "", "autowired": false, "secret":
false, "description": "The ID of the created or retrieved group",
"constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#GROUP_ID" }
},
"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.aws2.iam.IAM2Configuration", "configurationField":
"configuration", "description": "Logical name" },
diff --git
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
index acf66c56f373..6acc42d5ff41 100644
---
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
+++
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Constants.java
@@ -35,4 +35,24 @@ public interface IAM2Constants {
String GROUP_NAME = "CamelAwsIAMGroupName";
@Metadata(description = "The path of an AWS IAM Group", javaType =
"String")
String GROUP_PATH = "CamelAwsIAMGroupPath";
+
+ // Pagination support
+ @Metadata(description = "The marker to use for pagination in list
operations", javaType = "String")
+ String MARKER = "CamelAwsIAMMarker";
+ @Metadata(description = "The maximum number of items to return in list
operations", javaType = "Integer")
+ String MAX_ITEMS = "CamelAwsIAMMaxItems";
+
+ // Response metadata
+ @Metadata(description = "Whether the list response is truncated (has more
results)", javaType = "Boolean")
+ String IS_TRUNCATED = "CamelAwsIAMIsTruncated";
+ @Metadata(description = "The marker to use for the next page of results",
javaType = "String")
+ String NEXT_MARKER = "CamelAwsIAMNextMarker";
+ @Metadata(description = "The ARN of the created or retrieved user",
javaType = "String")
+ String USER_ARN = "CamelAwsIAMUserArn";
+ @Metadata(description = "The ID of the created or retrieved user",
javaType = "String")
+ String USER_ID = "CamelAwsIAMUserId";
+ @Metadata(description = "The ARN of the created or retrieved group",
javaType = "String")
+ String GROUP_ARN = "CamelAwsIAMGroupArn";
+ @Metadata(description = "The ID of the created or retrieved group",
javaType = "String")
+ String GROUP_ID = "CamelAwsIAMGroupId";
}
diff --git
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
index 51919305aab6..dcebdf013988 100644
---
a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
+++
b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Producer.java
@@ -16,6 +16,10 @@
*/
package org.apache.camel.component.aws2.iam;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.InvalidPayloadException;
@@ -31,19 +35,14 @@ import org.slf4j.LoggerFactory;
import software.amazon.awssdk.awscore.exception.AwsServiceException;
import software.amazon.awssdk.services.iam.IamClient;
import software.amazon.awssdk.services.iam.model.AddUserToGroupRequest;
-import software.amazon.awssdk.services.iam.model.AddUserToGroupResponse;
import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest;
-import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse;
import software.amazon.awssdk.services.iam.model.CreateGroupRequest;
import software.amazon.awssdk.services.iam.model.CreateGroupResponse;
import software.amazon.awssdk.services.iam.model.CreateUserRequest;
import software.amazon.awssdk.services.iam.model.CreateUserResponse;
import software.amazon.awssdk.services.iam.model.DeleteAccessKeyRequest;
-import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse;
import software.amazon.awssdk.services.iam.model.DeleteGroupRequest;
-import software.amazon.awssdk.services.iam.model.DeleteGroupResponse;
import software.amazon.awssdk.services.iam.model.DeleteUserRequest;
-import software.amazon.awssdk.services.iam.model.DeleteUserResponse;
import software.amazon.awssdk.services.iam.model.GetUserRequest;
import software.amazon.awssdk.services.iam.model.GetUserResponse;
import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;
@@ -53,10 +52,8 @@ import
software.amazon.awssdk.services.iam.model.ListGroupsResponse;
import software.amazon.awssdk.services.iam.model.ListUsersRequest;
import software.amazon.awssdk.services.iam.model.ListUsersResponse;
import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest;
-import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse;
import software.amazon.awssdk.services.iam.model.StatusType;
import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest;
-import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse;
/**
* A Producer which sends messages to the Amazon IAM Service <a
href="http://aws.amazon.com/iam/">AWS IAM</a>
@@ -152,456 +149,364 @@ public class IAM2Producer extends DefaultProducer {
}
private void listAccessKeys(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof ListAccessKeysRequest) {
- ListAccessKeysResponse response;
- try {
- response =
iamClient.listAccessKeys((ListAccessKeysRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("List Access Keys command returned the error
code {}", ase.getMessage());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(response);
- }
- } else {
- ListAccessKeysResponse response;
- try {
- response = iamClient.listAccessKeys();
- } catch (AwsServiceException ase) {
- LOG.trace("List Access Keys command returned the error code
{}", ase.getMessage());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(response);
- }
+ executeOperation(
+ exchange,
+ ListAccessKeysRequest.class,
+ iamClient::listAccessKeys,
+ () -> {
+ ListAccessKeysRequest.Builder builder =
ListAccessKeysRequest.builder();
+ String marker = getOptionalHeader(exchange,
IAM2Constants.MARKER, String.class);
+ if (marker != null) {
+ builder.marker(marker);
+ }
+ Integer maxItems = getOptionalHeader(exchange,
IAM2Constants.MAX_ITEMS, Integer.class);
+ if (maxItems != null) {
+ builder.maxItems(maxItems);
+ }
+ String userName = getOptionalHeader(exchange,
IAM2Constants.USERNAME, String.class);
+ if (userName != null) {
+ builder.userName(userName);
+ }
+ return iamClient.listAccessKeys(builder.build());
+ },
+ "List Access Keys",
+ (ListAccessKeysResponse response, Message message) -> {
+ message.setHeader(IAM2Constants.IS_TRUNCATED,
response.isTruncated());
+ if (response.marker() != null) {
+ message.setHeader(IAM2Constants.NEXT_MARKER,
response.marker());
+ }
+ });
}
private void createUser(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof CreateUserRequest) {
- CreateUserResponse result;
- try {
- result = iamClient.createUser((CreateUserRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Create user command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- CreateUserRequest.Builder builder = CreateUserRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- } else {
- throw new IllegalArgumentException(MISSING_USER_NAME);
- }
- CreateUserResponse result;
- try {
- result = iamClient.createUser(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Create user command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ CreateUserRequest.class,
+ iamClient::createUser,
+ () -> {
+ String userName = getRequiredHeader(exchange,
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+ return
iamClient.createUser(CreateUserRequest.builder().userName(userName).build());
+ },
+ "Create user",
+ (CreateUserResponse response, Message message) -> {
+ if (response.user() != null) {
+ message.setHeader(IAM2Constants.USER_ARN,
response.user().arn());
+ message.setHeader(IAM2Constants.USER_ID,
response.user().userId());
+ }
+ });
}
private void deleteUser(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof DeleteUserRequest) {
- DeleteUserResponse result;
- try {
- result = iamClient.deleteUser((DeleteUserRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Delete user command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- DeleteUserRequest.Builder builder = DeleteUserRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- } else {
- throw new IllegalArgumentException(MISSING_USER_NAME);
- }
- DeleteUserResponse result;
- try {
- result = iamClient.deleteUser(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Delete user command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ DeleteUserRequest.class,
+ iamClient::deleteUser,
+ () -> {
+ String userName = getRequiredHeader(exchange,
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+ return
iamClient.deleteUser(DeleteUserRequest.builder().userName(userName).build());
+ },
+ "Delete user");
}
private void getUser(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof GetUserRequest) {
- GetUserResponse result;
- try {
- result = iamClient.getUser((GetUserRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("get user command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- GetUserRequest.Builder builder = GetUserRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- } else {
- throw new IllegalArgumentException(MISSING_USER_NAME);
- }
- GetUserResponse result;
- try {
- result = iamClient.getUser(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("get user command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ GetUserRequest.class,
+ iamClient::getUser,
+ () -> {
+ String userName = getRequiredHeader(exchange,
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+ return
iamClient.getUser(GetUserRequest.builder().userName(userName).build());
+ },
+ "Get user",
+ (GetUserResponse response, Message message) -> {
+ if (response.user() != null) {
+ message.setHeader(IAM2Constants.USER_ARN,
response.user().arn());
+ message.setHeader(IAM2Constants.USER_ID,
response.user().userId());
+ }
+ });
}
private void listUsers(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof ListUsersRequest) {
- ListUsersResponse result;
- try {
- result = iamClient.listUsers((ListUsersRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("List users command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- ListUsersResponse result;
- try {
- result = iamClient.listUsers();
- } catch (AwsServiceException ase) {
- LOG.trace("List users command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ ListUsersRequest.class,
+ iamClient::listUsers,
+ () -> {
+ ListUsersRequest.Builder builder =
ListUsersRequest.builder();
+ String marker = getOptionalHeader(exchange,
IAM2Constants.MARKER, String.class);
+ if (marker != null) {
+ builder.marker(marker);
+ }
+ Integer maxItems = getOptionalHeader(exchange,
IAM2Constants.MAX_ITEMS, Integer.class);
+ if (maxItems != null) {
+ builder.maxItems(maxItems);
+ }
+ return iamClient.listUsers(builder.build());
+ },
+ "List users",
+ (ListUsersResponse response, Message message) -> {
+ message.setHeader(IAM2Constants.IS_TRUNCATED,
response.isTruncated());
+ if (response.marker() != null) {
+ message.setHeader(IAM2Constants.NEXT_MARKER,
response.marker());
+ }
+ });
}
private void createAccessKey(IamClient iamClient, Exchange exchange)
throws InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof CreateAccessKeyRequest) {
- CreateAccessKeyResponse result;
- try {
- result =
iamClient.createAccessKey((CreateAccessKeyRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Create Access Key command returned the error
code {}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- CreateAccessKeyRequest.Builder builder =
CreateAccessKeyRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- }
- CreateAccessKeyResponse result;
- try {
- result = iamClient.createAccessKey(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Create Access Key command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ CreateAccessKeyRequest.class,
+ iamClient::createAccessKey,
+ () -> {
+ CreateAccessKeyRequest.Builder builder =
CreateAccessKeyRequest.builder();
+ String userName = getOptionalHeader(exchange,
IAM2Constants.USERNAME, String.class);
+ if (userName != null) {
+ builder.userName(userName);
+ }
+ return iamClient.createAccessKey(builder.build());
+ },
+ "Create Access Key");
}
private void deleteAccessKey(IamClient iamClient, Exchange exchange)
throws InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof DeleteAccessKeyRequest) {
- DeleteAccessKeyResponse result;
- try {
- result =
iamClient.deleteAccessKey((DeleteAccessKeyRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Delete Access Key command returned the error
code {}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- DeleteAccessKeyRequest.Builder builder =
DeleteAccessKeyRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_ID)))
{
- String accessKeyId =
exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_ID, String.class);
- builder.accessKeyId(accessKeyId);
- } else {
- throw new IllegalArgumentException("Key Id must be specified");
- }
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- }
- DeleteAccessKeyResponse result;
- try {
- result = iamClient.deleteAccessKey(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Delete Access Key command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ DeleteAccessKeyRequest.class,
+ iamClient::deleteAccessKey,
+ () -> {
+ String accessKeyId = getRequiredHeader(exchange,
IAM2Constants.ACCESS_KEY_ID, String.class,
+ "Key Id must be specified");
+ DeleteAccessKeyRequest.Builder builder =
DeleteAccessKeyRequest.builder().accessKeyId(accessKeyId);
+ String userName = getOptionalHeader(exchange,
IAM2Constants.USERNAME, String.class);
+ if (userName != null) {
+ builder.userName(userName);
+ }
+ return iamClient.deleteAccessKey(builder.build());
+ },
+ "Delete Access Key");
}
private void updateAccessKey(IamClient iamClient, Exchange exchange)
throws InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof UpdateAccessKeyRequest) {
- UpdateAccessKeyResponse result;
- try {
- result =
iamClient.updateAccessKey((UpdateAccessKeyRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Update Access Key command returned the error
code {}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- UpdateAccessKeyRequest.Builder builder =
UpdateAccessKeyRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_ID)))
{
- String accessKeyId =
exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_ID, String.class);
- builder.accessKeyId(accessKeyId);
- } else {
- throw new IllegalArgumentException("Key Id must be specified");
- }
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_STATUS)))
{
- String status =
exchange.getIn().getHeader(IAM2Constants.ACCESS_KEY_STATUS, String.class);
- builder.status(StatusType.fromValue(status));
- } else {
- throw new IllegalArgumentException("Access Key status must be
specified");
- }
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- }
- UpdateAccessKeyResponse result;
- try {
- result = iamClient.updateAccessKey(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Update Access Key command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ UpdateAccessKeyRequest.class,
+ iamClient::updateAccessKey,
+ () -> {
+ String accessKeyId = getRequiredHeader(exchange,
IAM2Constants.ACCESS_KEY_ID, String.class,
+ "Key Id must be specified");
+ String status = getRequiredHeader(exchange,
IAM2Constants.ACCESS_KEY_STATUS, String.class,
+ "Access Key status must be specified");
+ UpdateAccessKeyRequest.Builder builder =
UpdateAccessKeyRequest.builder()
+ .accessKeyId(accessKeyId)
+ .status(StatusType.fromValue(status));
+ String userName = getOptionalHeader(exchange,
IAM2Constants.USERNAME, String.class);
+ if (userName != null) {
+ builder.userName(userName);
+ }
+ return iamClient.updateAccessKey(builder.build());
+ },
+ "Update Access Key");
}
private void createGroup(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof CreateGroupRequest) {
- CreateGroupResponse result;
- try {
- result = iamClient.createGroup((CreateGroupRequest)
payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Create Group command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- CreateGroupRequest.Builder builder = CreateGroupRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.GROUP_NAME)))
{
- String groupName =
exchange.getIn().getHeader(IAM2Constants.GROUP_NAME, String.class);
- builder.groupName(groupName);
- } else {
- throw new IllegalArgumentException(MISSING_GROUP_NAME);
- }
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.GROUP_PATH)))
{
- String groupPath =
exchange.getIn().getHeader(IAM2Constants.GROUP_PATH, String.class);
- builder.path(groupPath);
- }
- CreateGroupResponse result;
- try {
- result = iamClient.createGroup(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Create Group command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ CreateGroupRequest.class,
+ iamClient::createGroup,
+ () -> {
+ String groupName = getRequiredHeader(exchange,
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+ CreateGroupRequest.Builder builder =
CreateGroupRequest.builder().groupName(groupName);
+ String groupPath = getOptionalHeader(exchange,
IAM2Constants.GROUP_PATH, String.class);
+ if (groupPath != null) {
+ builder.path(groupPath);
+ }
+ return iamClient.createGroup(builder.build());
+ },
+ "Create Group",
+ (CreateGroupResponse response, Message message) -> {
+ if (response.group() != null) {
+ message.setHeader(IAM2Constants.GROUP_ARN,
response.group().arn());
+ message.setHeader(IAM2Constants.GROUP_ID,
response.group().groupId());
+ }
+ });
}
private void deleteGroup(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof DeleteGroupResponse) {
- DeleteGroupResponse result;
- try {
- result = iamClient.deleteGroup((DeleteGroupRequest)
payload); // TODO this cast is impossible and will produce ClassCastException
for non-null value
- } catch (AwsServiceException ase) {
- LOG.trace("Delete Group command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- DeleteGroupRequest.Builder builder = DeleteGroupRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.GROUP_NAME)))
{
- String groupName =
exchange.getIn().getHeader(IAM2Constants.GROUP_NAME, String.class);
- builder.groupName(groupName);
- } else {
- throw new IllegalArgumentException(MISSING_GROUP_NAME);
- }
- DeleteGroupResponse result;
- try {
- result = iamClient.deleteGroup(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Delete Group command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ DeleteGroupRequest.class,
+ iamClient::deleteGroup,
+ () -> {
+ String groupName = getRequiredHeader(exchange,
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+ return
iamClient.deleteGroup(DeleteGroupRequest.builder().groupName(groupName).build());
+ },
+ "Delete Group");
}
private void listGroups(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof ListGroupsRequest) {
- ListGroupsResponse result;
- try {
- result = iamClient.listGroups((ListGroupsRequest) payload);
- } catch (AwsServiceException ase) {
- LOG.trace("List Groups command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- ListGroupsResponse result;
- try {
- result = iamClient.listGroups();
- } catch (AwsServiceException ase) {
- LOG.trace("List Groups command returned the error code {}",
ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ ListGroupsRequest.class,
+ iamClient::listGroups,
+ () -> {
+ ListGroupsRequest.Builder builder =
ListGroupsRequest.builder();
+ String marker = getOptionalHeader(exchange,
IAM2Constants.MARKER, String.class);
+ if (marker != null) {
+ builder.marker(marker);
+ }
+ Integer maxItems = getOptionalHeader(exchange,
IAM2Constants.MAX_ITEMS, Integer.class);
+ if (maxItems != null) {
+ builder.maxItems(maxItems);
+ }
+ return iamClient.listGroups(builder.build());
+ },
+ "List Groups",
+ (ListGroupsResponse response, Message message) -> {
+ message.setHeader(IAM2Constants.IS_TRUNCATED,
response.isTruncated());
+ if (response.marker() != null) {
+ message.setHeader(IAM2Constants.NEXT_MARKER,
response.marker());
+ }
+ });
}
private void addUserToGroup(IamClient iamClient, Exchange exchange) throws
InvalidPayloadException {
- if (getConfiguration().isPojoRequest()) {
- Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof AddUserToGroupRequest) {
- AddUserToGroupResponse result;
- try {
- result = iamClient.addUserToGroup((AddUserToGroupRequest)
payload);
- } catch (AwsServiceException ase) {
- LOG.trace("Add User To Group command returned the error
code {}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- AddUserToGroupRequest.Builder builder =
AddUserToGroupRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.GROUP_NAME)))
{
- String groupName =
exchange.getIn().getHeader(IAM2Constants.GROUP_NAME, String.class);
- builder.groupName(groupName);
- } else {
- throw new IllegalArgumentException(MISSING_GROUP_NAME);
- }
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- } else {
- throw new IllegalArgumentException(MISSING_USER_NAME);
- }
- AddUserToGroupResponse result;
- try {
- result = iamClient.addUserToGroup(builder.build());
- } catch (AwsServiceException ase) {
- LOG.trace("Add User To Group command returned the error code
{}", ase.awsErrorDetails().errorCode());
- throw ase;
- }
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
+ executeOperation(
+ exchange,
+ AddUserToGroupRequest.class,
+ iamClient::addUserToGroup,
+ () -> {
+ String groupName = getRequiredHeader(exchange,
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+ String userName = getRequiredHeader(exchange,
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+ return
iamClient.addUserToGroup(AddUserToGroupRequest.builder()
+ .groupName(groupName)
+ .userName(userName)
+ .build());
+ },
+ "Add User To Group");
}
private void removeUserFromGroup(IamClient iamClient, Exchange exchange)
throws InvalidPayloadException {
+ executeOperation(
+ exchange,
+ RemoveUserFromGroupRequest.class,
+ iamClient::removeUserFromGroup,
+ () -> {
+ String groupName = getRequiredHeader(exchange,
IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME);
+ String userName = getRequiredHeader(exchange,
IAM2Constants.USERNAME, String.class, MISSING_USER_NAME);
+ return
iamClient.removeUserFromGroup(RemoveUserFromGroupRequest.builder()
+ .groupName(groupName)
+ .userName(userName)
+ .build());
+ },
+ "Remove User From Group");
+ }
+
+ public static Message getMessageForResponse(final Exchange exchange) {
+ return exchange.getMessage();
+ }
+
+ /**
+ * Executes an IAM operation with POJO request support.
+ *
+ * @param exchange the Camel exchange
+ * @param requestClass the expected request class type
+ * @param pojoExecutor function to execute when using POJO request
+ * @param headerExecutor supplier to execute when using header-based
request
+ * @param operationName name of the operation for logging
+ * @param <REQ> the request type
+ * @param <RES> the response type
+ */
+ private <REQ, RES> void executeOperation(
+ Exchange exchange,
+ Class<REQ> requestClass,
+ Function<REQ, RES> pojoExecutor,
+ Supplier<RES> headerExecutor,
+ String operationName)
+ throws InvalidPayloadException {
+ executeOperation(exchange, requestClass, pojoExecutor, headerExecutor,
operationName, null);
+ }
+
+ /**
+ * Executes an IAM operation with POJO request support and optional
response post-processing.
+ *
+ * @param exchange the Camel exchange
+ * @param requestClass the expected request class type
+ * @param pojoExecutor function to execute when using POJO request
+ * @param headerExecutor supplier to execute when using header-based
request
+ * @param operationName name of the operation for logging
+ * @param responseProcessor optional consumer to process the response and
set headers
+ * @param <REQ> the request type
+ * @param <RES> the response type
+ */
+ private <REQ, RES> void executeOperation(
+ Exchange exchange,
+ Class<REQ> requestClass,
+ Function<REQ, RES> pojoExecutor,
+ Supplier<RES> headerExecutor,
+ String operationName,
+ BiConsumer<RES, Message> responseProcessor)
+ throws InvalidPayloadException {
+
+ RES result;
if (getConfiguration().isPojoRequest()) {
Object payload = exchange.getIn().getMandatoryBody();
- if (payload instanceof RemoveUserFromGroupRequest) {
- RemoveUserFromGroupResponse result;
+ if (requestClass.isInstance(payload)) {
try {
- result =
iamClient.removeUserFromGroup((RemoveUserFromGroupRequest) payload);
+ result = pojoExecutor.apply(requestClass.cast(payload));
} catch (AwsServiceException ase) {
- LOG.trace("Remove User From Group command returned the
error code {}", ase.awsErrorDetails().errorCode());
+ LOG.trace("{} command returned the error code {}",
operationName, ase.awsErrorDetails().errorCode());
throw ase;
}
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
- }
- } else {
- RemoveUserFromGroupRequest.Builder builder =
RemoveUserFromGroupRequest.builder();
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.GROUP_NAME)))
{
- String groupName =
exchange.getIn().getHeader(IAM2Constants.GROUP_NAME, String.class);
- builder.groupName(groupName);
} else {
- throw new IllegalArgumentException(MISSING_GROUP_NAME);
+ throw new IllegalArgumentException(
+ String.format("Expected body of type %s but was %s",
+ requestClass.getName(),
+ payload != null ? payload.getClass().getName()
: "null"));
}
- if
(ObjectHelper.isNotEmpty(exchange.getIn().getHeader(IAM2Constants.USERNAME))) {
- String userName =
exchange.getIn().getHeader(IAM2Constants.USERNAME, String.class);
- builder.userName(userName);
- } else {
- throw new IllegalArgumentException(MISSING_USER_NAME);
- }
- RemoveUserFromGroupResponse result;
+ } else {
try {
- result = iamClient.removeUserFromGroup(builder.build());
+ result = headerExecutor.get();
} catch (AwsServiceException ase) {
- LOG.trace("Remove User From Group command returned the error
code {}", ase.awsErrorDetails().errorCode());
+ LOG.trace("{} command returned the error code {}",
operationName, ase.awsErrorDetails().errorCode());
throw ase;
}
- Message message = getMessageForResponse(exchange);
- message.setBody(result);
+ }
+ Message message = getMessageForResponse(exchange);
+ message.setBody(result);
+ if (responseProcessor != null) {
+ responseProcessor.accept(result, message);
}
}
- public static Message getMessageForResponse(final Exchange exchange) {
- return exchange.getMessage();
+ /**
+ * Retrieves a required header value or throws an IllegalArgumentException.
+ *
+ * @param exchange the Camel exchange
+ * @param headerName the header name constant
+ * @param headerType the expected type
+ * @param errorMessage the error message if header is missing
+ * @param <T> the header value type
+ * @return the header value
+ */
+ private <T> T getRequiredHeader(Exchange exchange, String headerName,
Class<T> headerType, String errorMessage) {
+ T value = exchange.getIn().getHeader(headerName, headerType);
+ if (ObjectHelper.isEmpty(value)) {
+ throw new IllegalArgumentException(errorMessage);
+ }
+ return value;
+ }
+
+ /**
+ * Retrieves an optional header value.
+ *
+ * @param exchange the Camel exchange
+ * @param headerName the header name constant
+ * @param headerType the expected type
+ * @param <T> the header value type
+ * @return the header value or null if not present
+ */
+ private <T> T getOptionalHeader(Exchange exchange, String headerName,
Class<T> headerType) {
+ return exchange.getIn().getHeader(headerName, headerType);
}
@Override
diff --git
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
index 2c602049576a..9e08029537c2 100644
---
a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
+++
b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/AmazonIAMClientMock.java
@@ -41,9 +41,11 @@ import
software.amazon.awssdk.services.iam.model.DeleteUserResponse;
import software.amazon.awssdk.services.iam.model.GetUserRequest;
import software.amazon.awssdk.services.iam.model.GetUserResponse;
import software.amazon.awssdk.services.iam.model.Group;
+import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;
import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;
import software.amazon.awssdk.services.iam.model.ListGroupsRequest;
import software.amazon.awssdk.services.iam.model.ListGroupsResponse;
+import software.amazon.awssdk.services.iam.model.ListUsersRequest;
import software.amazon.awssdk.services.iam.model.ListUsersResponse;
import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest;
import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse;
@@ -115,6 +117,11 @@ public class AmazonIAMClientMock implements IamClient {
@Override
public ListAccessKeysResponse listAccessKeys() {
+ return listAccessKeys(ListAccessKeysRequest.builder().build());
+ }
+
+ @Override
+ public ListAccessKeysResponse listAccessKeys(ListAccessKeysRequest
listAccessKeysRequest) {
ListAccessKeysResponse.Builder result =
ListAccessKeysResponse.builder();
Collection<AccessKeyMetadata> accessKeyMetadata = new ArrayList<>();
AccessKeyMetadata.Builder meta = AccessKeyMetadata.builder();
@@ -124,6 +131,7 @@ public class AmazonIAMClientMock implements IamClient {
meta.userName("test");
accessKeyMetadata.add(meta.build());
result.accessKeyMetadata(accessKeyMetadata);
+ result.isTruncated(false);
return result.build();
}
@@ -134,17 +142,24 @@ public class AmazonIAMClientMock implements IamClient {
group.groupName("Test");
ListGroupsResponse.Builder res = ListGroupsResponse.builder();
res.groups(Collections.singleton(group.build()));
+ res.isTruncated(false);
return res.build();
}
@Override
public ListUsersResponse listUsers() {
+ return listUsers(ListUsersRequest.builder().build());
+ }
+
+ @Override
+ public ListUsersResponse listUsers(ListUsersRequest listUsersRequest) {
ListUsersResponse.Builder res = ListUsersResponse.builder();
List<User> list = new ArrayList<>();
User.Builder user = User.builder();
user.userName("test");
list.add(user.build());
res.users(list);
+ res.isTruncated(false);
return res.build();
}
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
index 5ab24987a04c..6880ada43b72 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/IAM2EndpointBuilderFactory.java
@@ -667,6 +667,102 @@ public interface IAM2EndpointBuilderFactory {
public String awsIAMGroupPath() {
return "CamelAwsIAMGroupPath";
}
+ /**
+ * The marker to use for pagination in list operations.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMMarker}.
+ */
+ public String awsIAMMarker() {
+ return "CamelAwsIAMMarker";
+ }
+ /**
+ * The maximum number of items to return in list operations.
+ *
+ * The option is a: {@code Integer} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMMaxItems}.
+ */
+ public String awsIAMMaxItems() {
+ return "CamelAwsIAMMaxItems";
+ }
+ /**
+ * Whether the list response is truncated (has more results).
+ *
+ * The option is a: {@code Boolean} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMIsTruncated}.
+ */
+ public String awsIAMIsTruncated() {
+ return "CamelAwsIAMIsTruncated";
+ }
+ /**
+ * The marker to use for the next page of results.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMNextMarker}.
+ */
+ public String awsIAMNextMarker() {
+ return "CamelAwsIAMNextMarker";
+ }
+ /**
+ * The ARN of the created or retrieved user.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMUserArn}.
+ */
+ public String awsIAMUserArn() {
+ return "CamelAwsIAMUserArn";
+ }
+ /**
+ * The ID of the created or retrieved user.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMUserId}.
+ */
+ public String awsIAMUserId() {
+ return "CamelAwsIAMUserId";
+ }
+ /**
+ * The ARN of the created or retrieved group.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMGroupArn}.
+ */
+ public String awsIAMGroupArn() {
+ return "CamelAwsIAMGroupArn";
+ }
+ /**
+ * The ID of the created or retrieved group.
+ *
+ * The option is a: {@code String} type.
+ *
+ * Group: producer
+ *
+ * @return the name of the header {@code AwsIAMGroupId}.
+ */
+ public String awsIAMGroupId() {
+ return "CamelAwsIAMGroupId";
+ }
}
static IAM2EndpointBuilder endpointBuilder(String componentName, String
path) {
class IAM2EndpointBuilderImpl extends AbstractEndpointBuilder
implements IAM2EndpointBuilder, AdvancedIAM2EndpointBuilder {