This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch iam-operation-prod in repository https://gitbox.apache.org/repos/asf/camel.git
commit c89f808f16a7ac9de2c2a0825054e63e58f4c472 Author: Andrea Cosentino <[email protected]> AuthorDate: Tue Jan 20 11:41:27 2026 +0100 CAMEL-22804 - Camel-AWS-IAM: Support more operations based on the API available Signed-off-by: Andrea Cosentino <[email protected]> --- .../apache/camel/catalog/components/aws2-iam.json | 22 +- .../apache/camel/component/aws2/iam/aws2-iam.json | 22 +- .../src/main/docs/aws2-iam-component.adoc | 215 +++++++++ .../camel/component/aws2/iam/IAM2Constants.java | 38 ++ .../camel/component/aws2/iam/IAM2Operations.java | 26 +- .../camel/component/aws2/iam/IAM2Producer.java | 516 +++++++++++++++++++++ .../component/aws2/iam/AmazonIAMClientMock.java | 222 +++++++++ .../camel/component/aws2/iam/IAMProducerTest.java | 394 ++++++++++++++++ .../endpoint/dsl/IAM2EndpointBuilderFactory.java | 193 ++++++++ 9 files changed, 1641 insertions(+), 7 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 c1d3d6027367..2f837b11dace 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 @@ -27,7 +27,7 @@ "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.iam.IAM2Configuration", "deprecated": false, "autowired": false, "secret": false, "description": "Component configuration" }, "iamClient": { "index": 1, "kind": "property", "displayName": "Iam Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "To use an existing configured AWS IAM client" }, "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": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], "deprecated": false, "autowired": false, "secret": fal [...] + "operation": { "index": 3, "kind": "property", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", "createRole", "deleteRole", "getRole", "listRoles", "cre [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "Set the need for overriding the endpoint. This option needs to be used in combination wi [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" }, "region": { "index": 6, "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", "eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", "ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", "us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", "ap-northeast-3", "ap-northeast-2", "ap-north [...] @@ -61,12 +61,28 @@ "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" } + "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" }, + "CamelAwsIAMRoleName": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_NAME" }, + "CamelAwsIAMRolePath": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_PATH" }, + "CamelAwsIAMAssumeRolePolicyDocument": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The assume role policy document for the role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ASSUME_ROLE_POLICY_DOCUMENT" }, + "CamelAwsIAMRoleArn": { "index": 17, "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 role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ARN" }, + "CamelAwsIAMRoleId": { "index": 18, "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 role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ID" }, + "CamelAwsIAMRoleDescription": { "index": 19, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The description of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_DESCRIPTION" }, + "CamelAwsIAMPolicyName": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_NAME" }, + "CamelAwsIAMPolicyPath": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_PATH" }, + "CamelAwsIAMPolicyDocument": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The policy document", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DOCUMENT" }, + "CamelAwsIAMPolicyArn": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ARN" }, + "CamelAwsIAMPolicyId": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ID" }, + "CamelAwsIAMPolicyDescription": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The description of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DESCRIPTION" }, + "CamelAwsIAMInstanceProfileName": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_NAME" }, + "CamelAwsIAMInstanceProfilePath": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_PATH" }, + "CamelAwsIAMInstanceProfileArn": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ARN" }, + "CamelAwsIAMInstanceProfileId": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_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" }, "iamClient": { "index": 1, "kind": "parameter", "displayName": "Iam Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "To use an existing configured AWS IAM client" }, - "operation": { "index": 2, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], "deprecated": false, "autowired": false, "secret": fa [...] + "operation": { "index": 2, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", "createRole", "deleteRole", "getRole", "listRoles", "cr [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "Set the need for overriding the endpoint. This option needs to be used in combination w [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" }, "region": { "index": 5, "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", "eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", "ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", "us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", "ap-northeast-3", "ap-northeast-2", "ap-nort [...] 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 c1d3d6027367..2f837b11dace 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 @@ -27,7 +27,7 @@ "configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.iam.IAM2Configuration", "deprecated": false, "autowired": false, "secret": false, "description": "Component configuration" }, "iamClient": { "index": 1, "kind": "property", "displayName": "Iam Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "To use an existing configured AWS IAM client" }, "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": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], "deprecated": false, "autowired": false, "secret": fal [...] + "operation": { "index": 3, "kind": "property", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", "createRole", "deleteRole", "getRole", "listRoles", "cre [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "Set the need for overriding the endpoint. This option needs to be used in combination wi [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" }, "region": { "index": 6, "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", "eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", "ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", "us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", "ap-northeast-3", "ap-northeast-2", "ap-north [...] @@ -61,12 +61,28 @@ "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" } + "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" }, + "CamelAwsIAMRoleName": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_NAME" }, + "CamelAwsIAMRolePath": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_PATH" }, + "CamelAwsIAMAssumeRolePolicyDocument": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The assume role policy document for the role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ASSUME_ROLE_POLICY_DOCUMENT" }, + "CamelAwsIAMRoleArn": { "index": 17, "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 role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ARN" }, + "CamelAwsIAMRoleId": { "index": 18, "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 role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_ID" }, + "CamelAwsIAMRoleDescription": { "index": 19, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The description of an AWS IAM Role", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#ROLE_DESCRIPTION" }, + "CamelAwsIAMPolicyName": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_NAME" }, + "CamelAwsIAMPolicyPath": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_PATH" }, + "CamelAwsIAMPolicyDocument": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The policy document", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DOCUMENT" }, + "CamelAwsIAMPolicyArn": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ARN" }, + "CamelAwsIAMPolicyId": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_ID" }, + "CamelAwsIAMPolicyDescription": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The description of an AWS IAM Policy", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#POLICY_DESCRIPTION" }, + "CamelAwsIAMInstanceProfileName": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_NAME" }, + "CamelAwsIAMInstanceProfilePath": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The path of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_PATH" }, + "CamelAwsIAMInstanceProfileArn": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ARN of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_ARN" }, + "CamelAwsIAMInstanceProfileId": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The ID of an AWS IAM Instance Profile", "constantName": "org.apache.camel.component.aws2.iam.IAM2Constants#INSTANCE_PROFILE_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" }, "iamClient": { "index": 1, "kind": "parameter", "displayName": "Iam Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.iam.IamClient", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "To use an existing configured AWS IAM client" }, - "operation": { "index": 2, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup" ], "deprecated": false, "autowired": false, "secret": fa [...] + "operation": { "index": 2, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "org.apache.camel.component.aws2.iam.IAM2Operations", "enum": [ "listAccessKeys", "createUser", "deleteUser", "getUser", "listUsers", "createAccessKey", "deleteAccessKey", "updateAccessKey", "createGroup", "deleteGroup", "listGroups", "addUserToGroup", "removeUserFromGroup", "createRole", "deleteRole", "getRole", "listRoles", "cr [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "Set the need for overriding the endpoint. This option needs to be used in combination w [...] "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.aws2.iam.IAM2Configuration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not" }, "region": { "index": 5, "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "ap-south-2", "ap-south-1", "eu-south-1", "eu-south-2", "us-gov-east-1", "me-central-1", "il-central-1", "ca-central-1", "eu-central-1", "us-iso-west-1", "eu-central-2", "us-west-1", "us-west-2", "af-south-1", "eu-north-1", "eu-west-3", "eu-west-2", "eu-west-1", "ap-northeast-3", "ap-northeast-2", "ap-nort [...] diff --git a/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc b/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc index 98023eefa54d..5c0e173f3f49 100644 --- a/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc +++ b/components/camel-aws/camel-aws2-iam/src/main/docs/aws2-iam-component.adoc @@ -92,6 +92,26 @@ Camel-AWS2 IAM component provides the following operation on the producer side: - listGroups - addUserToGroup - removeUserFromGroup +- createRole +- deleteRole +- getRole +- listRoles +- createPolicy +- deletePolicy +- getPolicy +- listPolicies +- attachUserPolicy +- detachUserPolicy +- attachGroupPolicy +- detachGroupPolicy +- attachRolePolicy +- detachRolePolicy +- createInstanceProfile +- deleteInstanceProfile +- getInstanceProfile +- listInstanceProfiles +- addRoleToInstanceProfile +- removeRoleFromInstanceProfile == Examples @@ -149,6 +169,201 @@ from("direct:listUsers") .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listGroups") -------------------------------------------------------------------------------- +==== Role Operations + +- createRole: this operation will create a role in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:createRole") + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .setHeader(IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT, constant("{...}")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createRole") +-------------------------------------------------------------------------------- + +- deleteRole: this operation will delete a role in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:deleteRole") + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteRole") +-------------------------------------------------------------------------------- + +- getRole: this operation will get a role in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:getRole") + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getRole") +-------------------------------------------------------------------------------- + +- listRoles: this operation will list the roles in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:listRoles") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listRoles") +-------------------------------------------------------------------------------- + +==== Policy Operations + +- createPolicy: this operation will create a policy in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:createPolicy") + .setHeader(IAM2Constants.POLICY_NAME, constant("myPolicy")) + .setHeader(IAM2Constants.POLICY_DOCUMENT, constant("{...}")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createPolicy") +-------------------------------------------------------------------------------- + +- deletePolicy: this operation will delete a policy in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:deletePolicy") + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deletePolicy") +-------------------------------------------------------------------------------- + +- getPolicy: this operation will get a policy in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:getPolicy") + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getPolicy") +-------------------------------------------------------------------------------- + +- listPolicies: this operation will list the policies in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:listPolicies") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listPolicies") +-------------------------------------------------------------------------------- + +==== Policy Attachment Operations + +- attachUserPolicy: this operation will attach a policy to a user + +[source,java] +-------------------------------------------------------------------------------- +from("direct:attachUserPolicy") + .setHeader(IAM2Constants.USERNAME, constant("camel")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachUserPolicy") +-------------------------------------------------------------------------------- + +- detachUserPolicy: this operation will detach a policy from a user + +[source,java] +-------------------------------------------------------------------------------- +from("direct:detachUserPolicy") + .setHeader(IAM2Constants.USERNAME, constant("camel")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachUserPolicy") +-------------------------------------------------------------------------------- + +- attachGroupPolicy: this operation will attach a policy to a group + +[source,java] +-------------------------------------------------------------------------------- +from("direct:attachGroupPolicy") + .setHeader(IAM2Constants.GROUP_NAME, constant("myGroup")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachGroupPolicy") +-------------------------------------------------------------------------------- + +- detachGroupPolicy: this operation will detach a policy from a group + +[source,java] +-------------------------------------------------------------------------------- +from("direct:detachGroupPolicy") + .setHeader(IAM2Constants.GROUP_NAME, constant("myGroup")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachGroupPolicy") +-------------------------------------------------------------------------------- + +- attachRolePolicy: this operation will attach a policy to a role + +[source,java] +-------------------------------------------------------------------------------- +from("direct:attachRolePolicy") + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachRolePolicy") +-------------------------------------------------------------------------------- + +- detachRolePolicy: this operation will detach a policy from a role + +[source,java] +-------------------------------------------------------------------------------- +from("direct:detachRolePolicy") + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .setHeader(IAM2Constants.POLICY_ARN, constant("arn:aws:iam::123456789012:policy/myPolicy")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachRolePolicy") +-------------------------------------------------------------------------------- + +==== Instance Profile Operations + +- createInstanceProfile: this operation will create an instance profile in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:createInstanceProfile") + .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, constant("myInstanceProfile")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createInstanceProfile") +-------------------------------------------------------------------------------- + +- deleteInstanceProfile: this operation will delete an instance profile in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:deleteInstanceProfile") + .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, constant("myInstanceProfile")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteInstanceProfile") +-------------------------------------------------------------------------------- + +- getInstanceProfile: this operation will get an instance profile in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:getInstanceProfile") + .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, constant("myInstanceProfile")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getInstanceProfile") +-------------------------------------------------------------------------------- + +- listInstanceProfiles: this operation will list the instance profiles in IAM + +[source,java] +-------------------------------------------------------------------------------- +from("direct:listInstanceProfiles") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listInstanceProfiles") +-------------------------------------------------------------------------------- + +- addRoleToInstanceProfile: this operation will add a role to an instance profile + +[source,java] +-------------------------------------------------------------------------------- +from("direct:addRoleToInstanceProfile") + .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, constant("myInstanceProfile")) + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=addRoleToInstanceProfile") +-------------------------------------------------------------------------------- + +- removeRoleFromInstanceProfile: this operation will remove a role from an instance profile + +[source,java] +-------------------------------------------------------------------------------- +from("direct:removeRoleFromInstanceProfile") + .setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, constant("myInstanceProfile")) + .setHeader(IAM2Constants.ROLE_NAME, constant("myRole")) + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeRoleFromInstanceProfile") +-------------------------------------------------------------------------------- + === Using a POJO as body Sometimes building an AWS Request can be complex because of multiple options. We introduce the possibility to use a POJO as a body. 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 6acc42d5ff41..298ca9026143 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 @@ -55,4 +55,42 @@ public interface IAM2Constants { String GROUP_ARN = "CamelAwsIAMGroupArn"; @Metadata(description = "The ID of the created or retrieved group", javaType = "String") String GROUP_ID = "CamelAwsIAMGroupId"; + + // Role constants + @Metadata(description = "The name of an AWS IAM Role", javaType = "String") + String ROLE_NAME = "CamelAwsIAMRoleName"; + @Metadata(description = "The path of an AWS IAM Role", javaType = "String") + String ROLE_PATH = "CamelAwsIAMRolePath"; + @Metadata(description = "The assume role policy document for the role", javaType = "String") + String ASSUME_ROLE_POLICY_DOCUMENT = "CamelAwsIAMAssumeRolePolicyDocument"; + @Metadata(description = "The ARN of the created or retrieved role", javaType = "String") + String ROLE_ARN = "CamelAwsIAMRoleArn"; + @Metadata(description = "The ID of the created or retrieved role", javaType = "String") + String ROLE_ID = "CamelAwsIAMRoleId"; + @Metadata(description = "The description of an AWS IAM Role", javaType = "String") + String ROLE_DESCRIPTION = "CamelAwsIAMRoleDescription"; + + // Policy constants + @Metadata(description = "The name of an AWS IAM Policy", javaType = "String") + String POLICY_NAME = "CamelAwsIAMPolicyName"; + @Metadata(description = "The path of an AWS IAM Policy", javaType = "String") + String POLICY_PATH = "CamelAwsIAMPolicyPath"; + @Metadata(description = "The policy document", javaType = "String") + String POLICY_DOCUMENT = "CamelAwsIAMPolicyDocument"; + @Metadata(description = "The ARN of an AWS IAM Policy", javaType = "String") + String POLICY_ARN = "CamelAwsIAMPolicyArn"; + @Metadata(description = "The ID of an AWS IAM Policy", javaType = "String") + String POLICY_ID = "CamelAwsIAMPolicyId"; + @Metadata(description = "The description of an AWS IAM Policy", javaType = "String") + String POLICY_DESCRIPTION = "CamelAwsIAMPolicyDescription"; + + // Instance profile constants + @Metadata(description = "The name of an AWS IAM Instance Profile", javaType = "String") + String INSTANCE_PROFILE_NAME = "CamelAwsIAMInstanceProfileName"; + @Metadata(description = "The path of an AWS IAM Instance Profile", javaType = "String") + String INSTANCE_PROFILE_PATH = "CamelAwsIAMInstanceProfilePath"; + @Metadata(description = "The ARN of an AWS IAM Instance Profile", javaType = "String") + String INSTANCE_PROFILE_ARN = "CamelAwsIAMInstanceProfileArn"; + @Metadata(description = "The ID of an AWS IAM Instance Profile", javaType = "String") + String INSTANCE_PROFILE_ID = "CamelAwsIAMInstanceProfileId"; } diff --git a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java index 048bb0d4ec6d..122dd60ef399 100644 --- a/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java +++ b/components/camel-aws/camel-aws2-iam/src/main/java/org/apache/camel/component/aws2/iam/IAM2Operations.java @@ -30,5 +30,29 @@ public enum IAM2Operations { deleteGroup, listGroups, addUserToGroup, - removeUserFromGroup + removeUserFromGroup, + // Role operations + createRole, + deleteRole, + getRole, + listRoles, + // Policy operations + createPolicy, + deletePolicy, + getPolicy, + listPolicies, + // Policy attachment operations + attachUserPolicy, + detachUserPolicy, + attachGroupPolicy, + detachGroupPolicy, + attachRolePolicy, + detachRolePolicy, + // Instance profile operations + createInstanceProfile, + deleteInstanceProfile, + getInstanceProfile, + listInstanceProfiles, + addRoleToInstanceProfile, + removeRoleFromInstanceProfile } 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 dcebdf013988..70c83b665750 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 @@ -34,23 +34,52 @@ import org.slf4j.Logger; 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.AddRoleToInstanceProfileRequest; import software.amazon.awssdk.services.iam.model.AddUserToGroupRequest; +import software.amazon.awssdk.services.iam.model.AttachGroupPolicyRequest; +import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest; +import software.amazon.awssdk.services.iam.model.AttachUserPolicyRequest; import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest; import software.amazon.awssdk.services.iam.model.CreateGroupRequest; import software.amazon.awssdk.services.iam.model.CreateGroupResponse; +import software.amazon.awssdk.services.iam.model.CreateInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.CreatePolicyRequest; +import software.amazon.awssdk.services.iam.model.CreatePolicyResponse; +import software.amazon.awssdk.services.iam.model.CreateRoleRequest; +import software.amazon.awssdk.services.iam.model.CreateRoleResponse; 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.DeleteGroupRequest; +import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.DeletePolicyRequest; +import software.amazon.awssdk.services.iam.model.DeleteRoleRequest; import software.amazon.awssdk.services.iam.model.DeleteUserRequest; +import software.amazon.awssdk.services.iam.model.DetachGroupPolicyRequest; +import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest; +import software.amazon.awssdk.services.iam.model.DetachUserPolicyRequest; +import software.amazon.awssdk.services.iam.model.GetInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.GetPolicyRequest; +import software.amazon.awssdk.services.iam.model.GetPolicyResponse; +import software.amazon.awssdk.services.iam.model.GetRoleRequest; +import software.amazon.awssdk.services.iam.model.GetRoleResponse; import software.amazon.awssdk.services.iam.model.GetUserRequest; import software.amazon.awssdk.services.iam.model.GetUserResponse; 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.ListInstanceProfilesRequest; +import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse; +import software.amazon.awssdk.services.iam.model.ListPoliciesRequest; +import software.amazon.awssdk.services.iam.model.ListPoliciesResponse; +import software.amazon.awssdk.services.iam.model.ListRolesRequest; +import software.amazon.awssdk.services.iam.model.ListRolesResponse; import software.amazon.awssdk.services.iam.model.ListUsersRequest; import software.amazon.awssdk.services.iam.model.ListUsersResponse; +import software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileRequest; import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest; import software.amazon.awssdk.services.iam.model.StatusType; import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest; @@ -63,6 +92,12 @@ public class IAM2Producer extends DefaultProducer { private static final Logger LOG = LoggerFactory.getLogger(IAM2Producer.class); public static final String MISSING_GROUP_NAME = "Group Name must be specified"; public static final String MISSING_USER_NAME = "User Name must be specified"; + public static final String MISSING_ROLE_NAME = "Role Name must be specified"; + public static final String MISSING_POLICY_ARN = "Policy ARN must be specified"; + public static final String MISSING_POLICY_NAME = "Policy Name must be specified"; + public static final String MISSING_POLICY_DOCUMENT = "Policy Document must be specified"; + public static final String MISSING_ASSUME_ROLE_POLICY_DOCUMENT = "Assume Role Policy Document must be specified"; + public static final String MISSING_INSTANCE_PROFILE_NAME = "Instance Profile Name must be specified"; private transient String iamProducerToString; private HealthCheck producerHealthCheck; private WritableHealthCheckRepository healthCheckRepository; @@ -118,6 +153,70 @@ public class IAM2Producer extends DefaultProducer { case removeUserFromGroup: removeUserFromGroup(getEndpoint().getIamClient(), exchange); break; + // Role operations + case createRole: + createRole(getEndpoint().getIamClient(), exchange); + break; + case deleteRole: + deleteRole(getEndpoint().getIamClient(), exchange); + break; + case getRole: + getRole(getEndpoint().getIamClient(), exchange); + break; + case listRoles: + listRoles(getEndpoint().getIamClient(), exchange); + break; + // Policy operations + case createPolicy: + createPolicy(getEndpoint().getIamClient(), exchange); + break; + case deletePolicy: + deletePolicy(getEndpoint().getIamClient(), exchange); + break; + case getPolicy: + getPolicy(getEndpoint().getIamClient(), exchange); + break; + case listPolicies: + listPolicies(getEndpoint().getIamClient(), exchange); + break; + // Policy attachment operations + case attachUserPolicy: + attachUserPolicy(getEndpoint().getIamClient(), exchange); + break; + case detachUserPolicy: + detachUserPolicy(getEndpoint().getIamClient(), exchange); + break; + case attachGroupPolicy: + attachGroupPolicy(getEndpoint().getIamClient(), exchange); + break; + case detachGroupPolicy: + detachGroupPolicy(getEndpoint().getIamClient(), exchange); + break; + case attachRolePolicy: + attachRolePolicy(getEndpoint().getIamClient(), exchange); + break; + case detachRolePolicy: + detachRolePolicy(getEndpoint().getIamClient(), exchange); + break; + // Instance profile operations + case createInstanceProfile: + createInstanceProfile(getEndpoint().getIamClient(), exchange); + break; + case deleteInstanceProfile: + deleteInstanceProfile(getEndpoint().getIamClient(), exchange); + break; + case getInstanceProfile: + getInstanceProfile(getEndpoint().getIamClient(), exchange); + break; + case listInstanceProfiles: + listInstanceProfiles(getEndpoint().getIamClient(), exchange); + break; + case addRoleToInstanceProfile: + addRoleToInstanceProfile(getEndpoint().getIamClient(), exchange); + break; + case removeRoleFromInstanceProfile: + removeRoleFromInstanceProfile(getEndpoint().getIamClient(), exchange); + break; default: throw new IllegalArgumentException("Unsupported operation: " + operation); } @@ -401,6 +500,423 @@ public class IAM2Producer extends DefaultProducer { "Remove User From Group"); } + // Role operations + + private void createRole(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + CreateRoleRequest.class, + iamClient::createRole, + () -> { + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + String assumeRolePolicyDocument = getRequiredHeader(exchange, + IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT, String.class, MISSING_ASSUME_ROLE_POLICY_DOCUMENT); + CreateRoleRequest.Builder builder = CreateRoleRequest.builder() + .roleName(roleName) + .assumeRolePolicyDocument(assumeRolePolicyDocument); + String rolePath = getOptionalHeader(exchange, IAM2Constants.ROLE_PATH, String.class); + if (rolePath != null) { + builder.path(rolePath); + } + String description = getOptionalHeader(exchange, IAM2Constants.ROLE_DESCRIPTION, String.class); + if (description != null) { + builder.description(description); + } + return iamClient.createRole(builder.build()); + }, + "Create Role", + (CreateRoleResponse response, Message message) -> { + if (response.role() != null) { + message.setHeader(IAM2Constants.ROLE_ARN, response.role().arn()); + message.setHeader(IAM2Constants.ROLE_ID, response.role().roleId()); + } + }); + } + + private void deleteRole(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DeleteRoleRequest.class, + iamClient::deleteRole, + () -> { + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + return iamClient.deleteRole(DeleteRoleRequest.builder().roleName(roleName).build()); + }, + "Delete Role"); + } + + private void getRole(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + GetRoleRequest.class, + iamClient::getRole, + () -> { + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + return iamClient.getRole(GetRoleRequest.builder().roleName(roleName).build()); + }, + "Get Role", + (GetRoleResponse response, Message message) -> { + if (response.role() != null) { + message.setHeader(IAM2Constants.ROLE_ARN, response.role().arn()); + message.setHeader(IAM2Constants.ROLE_ID, response.role().roleId()); + } + }); + } + + private void listRoles(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + ListRolesRequest.class, + iamClient::listRoles, + () -> { + ListRolesRequest.Builder builder = ListRolesRequest.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.listRoles(builder.build()); + }, + "List Roles", + (ListRolesResponse response, Message message) -> { + message.setHeader(IAM2Constants.IS_TRUNCATED, response.isTruncated()); + if (response.marker() != null) { + message.setHeader(IAM2Constants.NEXT_MARKER, response.marker()); + } + }); + } + + // Policy operations + + private void createPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + CreatePolicyRequest.class, + iamClient::createPolicy, + () -> { + String policyName + = getRequiredHeader(exchange, IAM2Constants.POLICY_NAME, String.class, MISSING_POLICY_NAME); + String policyDocument + = getRequiredHeader(exchange, IAM2Constants.POLICY_DOCUMENT, String.class, MISSING_POLICY_DOCUMENT); + CreatePolicyRequest.Builder builder = CreatePolicyRequest.builder() + .policyName(policyName) + .policyDocument(policyDocument); + String policyPath = getOptionalHeader(exchange, IAM2Constants.POLICY_PATH, String.class); + if (policyPath != null) { + builder.path(policyPath); + } + String description = getOptionalHeader(exchange, IAM2Constants.POLICY_DESCRIPTION, String.class); + if (description != null) { + builder.description(description); + } + return iamClient.createPolicy(builder.build()); + }, + "Create Policy", + (CreatePolicyResponse response, Message message) -> { + if (response.policy() != null) { + message.setHeader(IAM2Constants.POLICY_ARN, response.policy().arn()); + message.setHeader(IAM2Constants.POLICY_ID, response.policy().policyId()); + } + }); + } + + private void deletePolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DeletePolicyRequest.class, + iamClient::deletePolicy, + () -> { + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.deletePolicy(DeletePolicyRequest.builder().policyArn(policyArn).build()); + }, + "Delete Policy"); + } + + private void getPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + GetPolicyRequest.class, + iamClient::getPolicy, + () -> { + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.getPolicy(GetPolicyRequest.builder().policyArn(policyArn).build()); + }, + "Get Policy", + (GetPolicyResponse response, Message message) -> { + if (response.policy() != null) { + message.setHeader(IAM2Constants.POLICY_ARN, response.policy().arn()); + message.setHeader(IAM2Constants.POLICY_ID, response.policy().policyId()); + } + }); + } + + private void listPolicies(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + ListPoliciesRequest.class, + iamClient::listPolicies, + () -> { + ListPoliciesRequest.Builder builder = ListPoliciesRequest.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.listPolicies(builder.build()); + }, + "List Policies", + (ListPoliciesResponse response, Message message) -> { + message.setHeader(IAM2Constants.IS_TRUNCATED, response.isTruncated()); + if (response.marker() != null) { + message.setHeader(IAM2Constants.NEXT_MARKER, response.marker()); + } + }); + } + + // Policy attachment operations + + private void attachUserPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + AttachUserPolicyRequest.class, + iamClient::attachUserPolicy, + () -> { + String userName + = getRequiredHeader(exchange, IAM2Constants.USERNAME, String.class, MISSING_USER_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.attachUserPolicy(AttachUserPolicyRequest.builder() + .userName(userName) + .policyArn(policyArn) + .build()); + }, + "Attach User Policy"); + } + + private void detachUserPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DetachUserPolicyRequest.class, + iamClient::detachUserPolicy, + () -> { + String userName + = getRequiredHeader(exchange, IAM2Constants.USERNAME, String.class, MISSING_USER_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.detachUserPolicy(DetachUserPolicyRequest.builder() + .userName(userName) + .policyArn(policyArn) + .build()); + }, + "Detach User Policy"); + } + + private void attachGroupPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + AttachGroupPolicyRequest.class, + iamClient::attachGroupPolicy, + () -> { + String groupName + = getRequiredHeader(exchange, IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.attachGroupPolicy(AttachGroupPolicyRequest.builder() + .groupName(groupName) + .policyArn(policyArn) + .build()); + }, + "Attach Group Policy"); + } + + private void detachGroupPolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DetachGroupPolicyRequest.class, + iamClient::detachGroupPolicy, + () -> { + String groupName + = getRequiredHeader(exchange, IAM2Constants.GROUP_NAME, String.class, MISSING_GROUP_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.detachGroupPolicy(DetachGroupPolicyRequest.builder() + .groupName(groupName) + .policyArn(policyArn) + .build()); + }, + "Detach Group Policy"); + } + + private void attachRolePolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + AttachRolePolicyRequest.class, + iamClient::attachRolePolicy, + () -> { + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.attachRolePolicy(AttachRolePolicyRequest.builder() + .roleName(roleName) + .policyArn(policyArn) + .build()); + }, + "Attach Role Policy"); + } + + private void detachRolePolicy(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DetachRolePolicyRequest.class, + iamClient::detachRolePolicy, + () -> { + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + String policyArn + = getRequiredHeader(exchange, IAM2Constants.POLICY_ARN, String.class, MISSING_POLICY_ARN); + return iamClient.detachRolePolicy(DetachRolePolicyRequest.builder() + .roleName(roleName) + .policyArn(policyArn) + .build()); + }, + "Detach Role Policy"); + } + + // Instance profile operations + + private void createInstanceProfile(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + CreateInstanceProfileRequest.class, + iamClient::createInstanceProfile, + () -> { + String instanceProfileName = getRequiredHeader(exchange, + IAM2Constants.INSTANCE_PROFILE_NAME, String.class, MISSING_INSTANCE_PROFILE_NAME); + CreateInstanceProfileRequest.Builder builder + = CreateInstanceProfileRequest.builder().instanceProfileName(instanceProfileName); + String path = getOptionalHeader(exchange, IAM2Constants.INSTANCE_PROFILE_PATH, String.class); + if (path != null) { + builder.path(path); + } + return iamClient.createInstanceProfile(builder.build()); + }, + "Create Instance Profile", + (CreateInstanceProfileResponse response, Message message) -> { + if (response.instanceProfile() != null) { + message.setHeader(IAM2Constants.INSTANCE_PROFILE_ARN, response.instanceProfile().arn()); + message.setHeader(IAM2Constants.INSTANCE_PROFILE_ID, response.instanceProfile().instanceProfileId()); + } + }); + } + + private void deleteInstanceProfile(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + DeleteInstanceProfileRequest.class, + iamClient::deleteInstanceProfile, + () -> { + String instanceProfileName = getRequiredHeader(exchange, + IAM2Constants.INSTANCE_PROFILE_NAME, String.class, MISSING_INSTANCE_PROFILE_NAME); + return iamClient.deleteInstanceProfile( + DeleteInstanceProfileRequest.builder().instanceProfileName(instanceProfileName).build()); + }, + "Delete Instance Profile"); + } + + private void getInstanceProfile(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + GetInstanceProfileRequest.class, + iamClient::getInstanceProfile, + () -> { + String instanceProfileName = getRequiredHeader(exchange, + IAM2Constants.INSTANCE_PROFILE_NAME, String.class, MISSING_INSTANCE_PROFILE_NAME); + return iamClient.getInstanceProfile( + GetInstanceProfileRequest.builder().instanceProfileName(instanceProfileName).build()); + }, + "Get Instance Profile", + (GetInstanceProfileResponse response, Message message) -> { + if (response.instanceProfile() != null) { + message.setHeader(IAM2Constants.INSTANCE_PROFILE_ARN, response.instanceProfile().arn()); + message.setHeader(IAM2Constants.INSTANCE_PROFILE_ID, response.instanceProfile().instanceProfileId()); + } + }); + } + + private void listInstanceProfiles(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + ListInstanceProfilesRequest.class, + iamClient::listInstanceProfiles, + () -> { + ListInstanceProfilesRequest.Builder builder = ListInstanceProfilesRequest.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.listInstanceProfiles(builder.build()); + }, + "List Instance Profiles", + (ListInstanceProfilesResponse response, Message message) -> { + message.setHeader(IAM2Constants.IS_TRUNCATED, response.isTruncated()); + if (response.marker() != null) { + message.setHeader(IAM2Constants.NEXT_MARKER, response.marker()); + } + }); + } + + private void addRoleToInstanceProfile(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + AddRoleToInstanceProfileRequest.class, + iamClient::addRoleToInstanceProfile, + () -> { + String instanceProfileName = getRequiredHeader(exchange, + IAM2Constants.INSTANCE_PROFILE_NAME, String.class, MISSING_INSTANCE_PROFILE_NAME); + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + return iamClient.addRoleToInstanceProfile(AddRoleToInstanceProfileRequest.builder() + .instanceProfileName(instanceProfileName) + .roleName(roleName) + .build()); + }, + "Add Role To Instance Profile"); + } + + private void removeRoleFromInstanceProfile(IamClient iamClient, Exchange exchange) throws InvalidPayloadException { + executeOperation( + exchange, + RemoveRoleFromInstanceProfileRequest.class, + iamClient::removeRoleFromInstanceProfile, + () -> { + String instanceProfileName = getRequiredHeader(exchange, + IAM2Constants.INSTANCE_PROFILE_NAME, String.class, MISSING_INSTANCE_PROFILE_NAME); + String roleName + = getRequiredHeader(exchange, IAM2Constants.ROLE_NAME, String.class, MISSING_ROLE_NAME); + return iamClient.removeRoleFromInstanceProfile(RemoveRoleFromInstanceProfileRequest.builder() + .instanceProfileName(instanceProfileName) + .roleName(roleName) + .build()); + }, + "Remove Role From Instance Profile"); + } + public static Message getMessageForResponse(final Exchange exchange) { return exchange.getMessage(); } 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 9e08029537c2..94e735324829 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 @@ -26,29 +26,72 @@ import software.amazon.awssdk.services.iam.IamClient; import software.amazon.awssdk.services.iam.IamServiceClientConfiguration; import software.amazon.awssdk.services.iam.model.AccessKey; import software.amazon.awssdk.services.iam.model.AccessKeyMetadata; +import software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.AttachGroupPolicyRequest; +import software.amazon.awssdk.services.iam.model.AttachGroupPolicyResponse; +import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest; +import software.amazon.awssdk.services.iam.model.AttachRolePolicyResponse; +import software.amazon.awssdk.services.iam.model.AttachUserPolicyRequest; +import software.amazon.awssdk.services.iam.model.AttachUserPolicyResponse; 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.CreateInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.CreatePolicyRequest; +import software.amazon.awssdk.services.iam.model.CreatePolicyResponse; +import software.amazon.awssdk.services.iam.model.CreateRoleRequest; +import software.amazon.awssdk.services.iam.model.CreateRoleResponse; 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.DeleteInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.DeletePolicyRequest; +import software.amazon.awssdk.services.iam.model.DeletePolicyResponse; +import software.amazon.awssdk.services.iam.model.DeleteRoleRequest; +import software.amazon.awssdk.services.iam.model.DeleteRoleResponse; import software.amazon.awssdk.services.iam.model.DeleteUserRequest; import software.amazon.awssdk.services.iam.model.DeleteUserResponse; +import software.amazon.awssdk.services.iam.model.DetachGroupPolicyRequest; +import software.amazon.awssdk.services.iam.model.DetachGroupPolicyResponse; +import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest; +import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse; +import software.amazon.awssdk.services.iam.model.DetachUserPolicyRequest; +import software.amazon.awssdk.services.iam.model.DetachUserPolicyResponse; +import software.amazon.awssdk.services.iam.model.GetInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.GetPolicyRequest; +import software.amazon.awssdk.services.iam.model.GetPolicyResponse; +import software.amazon.awssdk.services.iam.model.GetRoleRequest; +import software.amazon.awssdk.services.iam.model.GetRoleResponse; 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.InstanceProfile; 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.ListInstanceProfilesRequest; +import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse; +import software.amazon.awssdk.services.iam.model.ListPoliciesRequest; +import software.amazon.awssdk.services.iam.model.ListPoliciesResponse; +import software.amazon.awssdk.services.iam.model.ListRolesRequest; +import software.amazon.awssdk.services.iam.model.ListRolesResponse; import software.amazon.awssdk.services.iam.model.ListUsersRequest; import software.amazon.awssdk.services.iam.model.ListUsersResponse; +import software.amazon.awssdk.services.iam.model.Policy; +import software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileRequest; +import software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileResponse; import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupRequest; import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse; +import software.amazon.awssdk.services.iam.model.Role; import software.amazon.awssdk.services.iam.model.StatusType; import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest; import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse; @@ -175,6 +218,185 @@ public class AmazonIAMClientMock implements IamClient { return result; } + // Role operations + + @Override + public CreateRoleResponse createRole(CreateRoleRequest createRoleRequest) { + CreateRoleResponse.Builder result = CreateRoleResponse.builder(); + Role.Builder role = Role.builder(); + role.roleName(createRoleRequest.roleName()); + role.roleId("TestRoleId"); + role.arn("arn:aws:iam::123456789012:role/" + createRoleRequest.roleName()); + if (createRoleRequest.path() != null) { + role.path(createRoleRequest.path()); + } + result.role(role.build()); + return result.build(); + } + + @Override + public DeleteRoleResponse deleteRole(DeleteRoleRequest deleteRoleRequest) { + return DeleteRoleResponse.builder().build(); + } + + @Override + public GetRoleResponse getRole(GetRoleRequest getRoleRequest) { + GetRoleResponse.Builder result = GetRoleResponse.builder(); + Role.Builder role = Role.builder(); + role.roleName(getRoleRequest.roleName()); + role.roleId("TestRoleId"); + role.arn("arn:aws:iam::123456789012:role/" + getRoleRequest.roleName()); + result.role(role.build()); + return result.build(); + } + + @Override + public ListRolesResponse listRoles(ListRolesRequest listRolesRequest) { + Role.Builder role = Role.builder(); + role.roleId("TestRoleId"); + role.roleName("TestRole"); + role.arn("arn:aws:iam::123456789012:role/TestRole"); + ListRolesResponse.Builder res = ListRolesResponse.builder(); + res.roles(Collections.singleton(role.build())); + res.isTruncated(false); + return res.build(); + } + + // Policy operations + + @Override + public CreatePolicyResponse createPolicy(CreatePolicyRequest createPolicyRequest) { + CreatePolicyResponse.Builder result = CreatePolicyResponse.builder(); + Policy.Builder policy = Policy.builder(); + policy.policyName(createPolicyRequest.policyName()); + policy.policyId("TestPolicyId"); + policy.arn("arn:aws:iam::123456789012:policy/" + createPolicyRequest.policyName()); + if (createPolicyRequest.path() != null) { + policy.path(createPolicyRequest.path()); + } + result.policy(policy.build()); + return result.build(); + } + + @Override + public DeletePolicyResponse deletePolicy(DeletePolicyRequest deletePolicyRequest) { + return DeletePolicyResponse.builder().build(); + } + + @Override + public GetPolicyResponse getPolicy(GetPolicyRequest getPolicyRequest) { + GetPolicyResponse.Builder result = GetPolicyResponse.builder(); + Policy.Builder policy = Policy.builder(); + policy.policyName("TestPolicy"); + policy.policyId("TestPolicyId"); + policy.arn(getPolicyRequest.policyArn()); + result.policy(policy.build()); + return result.build(); + } + + @Override + public ListPoliciesResponse listPolicies(ListPoliciesRequest listPoliciesRequest) { + Policy.Builder policy = Policy.builder(); + policy.policyId("TestPolicyId"); + policy.policyName("TestPolicy"); + policy.arn("arn:aws:iam::123456789012:policy/TestPolicy"); + ListPoliciesResponse.Builder res = ListPoliciesResponse.builder(); + res.policies(Collections.singleton(policy.build())); + res.isTruncated(false); + return res.build(); + } + + // Policy attachment operations + + @Override + public AttachUserPolicyResponse attachUserPolicy(AttachUserPolicyRequest attachUserPolicyRequest) { + return AttachUserPolicyResponse.builder().build(); + } + + @Override + public DetachUserPolicyResponse detachUserPolicy(DetachUserPolicyRequest detachUserPolicyRequest) { + return DetachUserPolicyResponse.builder().build(); + } + + @Override + public AttachGroupPolicyResponse attachGroupPolicy(AttachGroupPolicyRequest attachGroupPolicyRequest) { + return AttachGroupPolicyResponse.builder().build(); + } + + @Override + public DetachGroupPolicyResponse detachGroupPolicy(DetachGroupPolicyRequest detachGroupPolicyRequest) { + return DetachGroupPolicyResponse.builder().build(); + } + + @Override + public AttachRolePolicyResponse attachRolePolicy(AttachRolePolicyRequest attachRolePolicyRequest) { + return AttachRolePolicyResponse.builder().build(); + } + + @Override + public DetachRolePolicyResponse detachRolePolicy(DetachRolePolicyRequest detachRolePolicyRequest) { + return DetachRolePolicyResponse.builder().build(); + } + + // Instance profile operations + + @Override + public CreateInstanceProfileResponse createInstanceProfile(CreateInstanceProfileRequest createInstanceProfileRequest) { + CreateInstanceProfileResponse.Builder result = CreateInstanceProfileResponse.builder(); + InstanceProfile.Builder instanceProfile = InstanceProfile.builder(); + instanceProfile.instanceProfileName(createInstanceProfileRequest.instanceProfileName()); + instanceProfile.instanceProfileId("TestInstanceProfileId"); + instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/" + createInstanceProfileRequest.instanceProfileName()); + if (createInstanceProfileRequest.path() != null) { + instanceProfile.path(createInstanceProfileRequest.path()); + } + instanceProfile.createDate(Instant.now()); + result.instanceProfile(instanceProfile.build()); + return result.build(); + } + + @Override + public DeleteInstanceProfileResponse deleteInstanceProfile(DeleteInstanceProfileRequest deleteInstanceProfileRequest) { + return DeleteInstanceProfileResponse.builder().build(); + } + + @Override + public GetInstanceProfileResponse getInstanceProfile(GetInstanceProfileRequest getInstanceProfileRequest) { + GetInstanceProfileResponse.Builder result = GetInstanceProfileResponse.builder(); + InstanceProfile.Builder instanceProfile = InstanceProfile.builder(); + instanceProfile.instanceProfileName(getInstanceProfileRequest.instanceProfileName()); + instanceProfile.instanceProfileId("TestInstanceProfileId"); + instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/" + getInstanceProfileRequest.instanceProfileName()); + instanceProfile.createDate(Instant.now()); + result.instanceProfile(instanceProfile.build()); + return result.build(); + } + + @Override + public ListInstanceProfilesResponse listInstanceProfiles(ListInstanceProfilesRequest listInstanceProfilesRequest) { + InstanceProfile.Builder instanceProfile = InstanceProfile.builder(); + instanceProfile.instanceProfileId("TestInstanceProfileId"); + instanceProfile.instanceProfileName("TestInstanceProfile"); + instanceProfile.arn("arn:aws:iam::123456789012:instance-profile/TestInstanceProfile"); + instanceProfile.createDate(Instant.now()); + ListInstanceProfilesResponse.Builder res = ListInstanceProfilesResponse.builder(); + res.instanceProfiles(Collections.singleton(instanceProfile.build())); + res.isTruncated(false); + return res.build(); + } + + @Override + public AddRoleToInstanceProfileResponse addRoleToInstanceProfile( + AddRoleToInstanceProfileRequest addRoleToInstanceProfileRequest) { + return AddRoleToInstanceProfileResponse.builder().build(); + } + + @Override + public RemoveRoleFromInstanceProfileResponse removeRoleFromInstanceProfile( + RemoveRoleFromInstanceProfileRequest removeRoleFromInstanceProfileRequest) { + return RemoveRoleFromInstanceProfileResponse.builder().build(); + } + @Override public IamServiceClientConfiguration serviceClientConfiguration() { return null; diff --git a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java index 9cb0c6028003..8d059d0b981f 100644 --- a/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java +++ b/components/camel-aws/camel-aws2-iam/src/test/java/org/apache/camel/component/aws2/iam/IAMProducerTest.java @@ -24,18 +24,38 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; +import software.amazon.awssdk.services.iam.model.AddRoleToInstanceProfileResponse; import software.amazon.awssdk.services.iam.model.AddUserToGroupResponse; +import software.amazon.awssdk.services.iam.model.AttachGroupPolicyResponse; +import software.amazon.awssdk.services.iam.model.AttachRolePolicyResponse; +import software.amazon.awssdk.services.iam.model.AttachUserPolicyResponse; import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse; import software.amazon.awssdk.services.iam.model.CreateGroupResponse; +import software.amazon.awssdk.services.iam.model.CreateInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.CreatePolicyResponse; +import software.amazon.awssdk.services.iam.model.CreateRoleResponse; import software.amazon.awssdk.services.iam.model.CreateUserRequest; import software.amazon.awssdk.services.iam.model.CreateUserResponse; import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse; import software.amazon.awssdk.services.iam.model.DeleteGroupResponse; +import software.amazon.awssdk.services.iam.model.DeleteInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.DeletePolicyResponse; +import software.amazon.awssdk.services.iam.model.DeleteRoleResponse; import software.amazon.awssdk.services.iam.model.DeleteUserResponse; +import software.amazon.awssdk.services.iam.model.DetachGroupPolicyResponse; +import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse; +import software.amazon.awssdk.services.iam.model.DetachUserPolicyResponse; +import software.amazon.awssdk.services.iam.model.GetInstanceProfileResponse; +import software.amazon.awssdk.services.iam.model.GetPolicyResponse; +import software.amazon.awssdk.services.iam.model.GetRoleResponse; import software.amazon.awssdk.services.iam.model.GetUserResponse; import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse; import software.amazon.awssdk.services.iam.model.ListGroupsResponse; +import software.amazon.awssdk.services.iam.model.ListInstanceProfilesResponse; +import software.amazon.awssdk.services.iam.model.ListPoliciesResponse; +import software.amazon.awssdk.services.iam.model.ListRolesResponse; import software.amazon.awssdk.services.iam.model.ListUsersResponse; +import software.amazon.awssdk.services.iam.model.RemoveRoleFromInstanceProfileResponse; import software.amazon.awssdk.services.iam.model.RemoveUserFromGroupResponse; import software.amazon.awssdk.services.iam.model.StatusType; import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse; @@ -308,6 +328,335 @@ public class IAMProducerTest extends CamelTestSupport { assertNotNull(resultGet); } + // Role operations tests + + @Test + public void iamCreateRoleTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:createRole", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.createRole); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + exchange.getIn().setHeader(IAM2Constants.ASSUME_ROLE_POLICY_DOCUMENT, + "{\"Version\":\"2012-10-17\",\"Statement\":[]}"); + } + }); + MockEndpoint.assertIsSatisfied(context); + CreateRoleResponse resultGet = (CreateRoleResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestRole", resultGet.role().roleName()); + } + + @Test + public void iamDeleteRoleTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:deleteRole", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.deleteRole); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DeleteRoleResponse resultGet = (DeleteRoleResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamGetRoleTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:getRole", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.getRole); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + } + }); + MockEndpoint.assertIsSatisfied(context); + GetRoleResponse resultGet = (GetRoleResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestRole", resultGet.role().roleName()); + } + + @Test + public void iamListRolesTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:listRoles", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.listRoles); + } + }); + MockEndpoint.assertIsSatisfied(context); + ListRolesResponse resultGet = (ListRolesResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals(1, resultGet.roles().size()); + assertEquals("TestRole", resultGet.roles().get(0).roleName()); + } + + // Policy operations tests + + @Test + public void iamCreatePolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:createPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.createPolicy); + exchange.getIn().setHeader(IAM2Constants.POLICY_NAME, "TestPolicy"); + exchange.getIn().setHeader(IAM2Constants.POLICY_DOCUMENT, + "{\"Version\":\"2012-10-17\",\"Statement\":[]}"); + } + }); + MockEndpoint.assertIsSatisfied(context); + CreatePolicyResponse resultGet = (CreatePolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestPolicy", resultGet.policy().policyName()); + } + + @Test + public void iamDeletePolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:deletePolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.deletePolicy); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DeletePolicyResponse resultGet = (DeletePolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamGetPolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:getPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.getPolicy); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + GetPolicyResponse resultGet = (GetPolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestPolicy", resultGet.policy().policyName()); + } + + @Test + public void iamListPoliciesTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:listPolicies", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.listPolicies); + } + }); + MockEndpoint.assertIsSatisfied(context); + ListPoliciesResponse resultGet = (ListPoliciesResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals(1, resultGet.policies().size()); + assertEquals("TestPolicy", resultGet.policies().get(0).policyName()); + } + + // Policy attachment operations tests + + @Test + public void iamAttachUserPolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:attachUserPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.attachUserPolicy); + exchange.getIn().setHeader(IAM2Constants.USERNAME, "test"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + AttachUserPolicyResponse resultGet = (AttachUserPolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamDetachUserPolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:detachUserPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.detachUserPolicy); + exchange.getIn().setHeader(IAM2Constants.USERNAME, "test"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DetachUserPolicyResponse resultGet = (DetachUserPolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamAttachGroupPolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:attachGroupPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.attachGroupPolicy); + exchange.getIn().setHeader(IAM2Constants.GROUP_NAME, "Test"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + AttachGroupPolicyResponse resultGet = (AttachGroupPolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamDetachGroupPolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:detachGroupPolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.detachGroupPolicy); + exchange.getIn().setHeader(IAM2Constants.GROUP_NAME, "Test"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DetachGroupPolicyResponse resultGet = (DetachGroupPolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamAttachRolePolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:attachRolePolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.attachRolePolicy); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + AttachRolePolicyResponse resultGet = (AttachRolePolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamDetachRolePolicyTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:detachRolePolicy", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.detachRolePolicy); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + exchange.getIn().setHeader(IAM2Constants.POLICY_ARN, "arn:aws:iam::123456789012:policy/TestPolicy"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DetachRolePolicyResponse resultGet = (DetachRolePolicyResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + // Instance profile operations tests + + @Test + public void iamCreateInstanceProfileTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:createInstanceProfile", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.createInstanceProfile); + exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, "TestInstanceProfile"); + } + }); + MockEndpoint.assertIsSatisfied(context); + CreateInstanceProfileResponse resultGet = (CreateInstanceProfileResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestInstanceProfile", resultGet.instanceProfile().instanceProfileName()); + } + + @Test + public void iamDeleteInstanceProfileTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:deleteInstanceProfile", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.deleteInstanceProfile); + exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, "TestInstanceProfile"); + } + }); + MockEndpoint.assertIsSatisfied(context); + DeleteInstanceProfileResponse resultGet = (DeleteInstanceProfileResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamGetInstanceProfileTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:getInstanceProfile", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.getInstanceProfile); + exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, "TestInstanceProfile"); + } + }); + MockEndpoint.assertIsSatisfied(context); + GetInstanceProfileResponse resultGet = (GetInstanceProfileResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals("TestInstanceProfile", resultGet.instanceProfile().instanceProfileName()); + } + + @Test + public void iamListInstanceProfilesTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:listInstanceProfiles", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.listInstanceProfiles); + } + }); + MockEndpoint.assertIsSatisfied(context); + ListInstanceProfilesResponse resultGet = (ListInstanceProfilesResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + assertEquals(1, resultGet.instanceProfiles().size()); + assertEquals("TestInstanceProfile", resultGet.instanceProfiles().get(0).instanceProfileName()); + } + + @Test + public void iamAddRoleToInstanceProfileTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:addRoleToInstanceProfile", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.addRoleToInstanceProfile); + exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, "TestInstanceProfile"); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + } + }); + MockEndpoint.assertIsSatisfied(context); + AddRoleToInstanceProfileResponse resultGet = (AddRoleToInstanceProfileResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + + @Test + public void iamRemoveRoleFromInstanceProfileTest() throws Exception { + mock.expectedMessageCount(1); + Exchange exchange = template.request("direct:removeRoleFromInstanceProfile", new Processor() { + @Override + public void process(Exchange exchange) { + exchange.getIn().setHeader(IAM2Constants.OPERATION, IAM2Operations.removeRoleFromInstanceProfile); + exchange.getIn().setHeader(IAM2Constants.INSTANCE_PROFILE_NAME, "TestInstanceProfile"); + exchange.getIn().setHeader(IAM2Constants.ROLE_NAME, "TestRole"); + } + }); + MockEndpoint.assertIsSatisfied(context); + RemoveRoleFromInstanceProfileResponse resultGet = (RemoveRoleFromInstanceProfileResponse) exchange.getIn().getBody(); + assertNotNull(resultGet); + } + @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @@ -340,6 +689,51 @@ public class IAMProducerTest extends CamelTestSupport { .to("mock:result"); from("direct:removeUserFromGroup") .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeUserFromGroup").to("mock:result"); + // Role operations + from("direct:createRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createRole") + .to("mock:result"); + from("direct:deleteRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteRole") + .to("mock:result"); + from("direct:getRole").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getRole") + .to("mock:result"); + from("direct:listRoles").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listRoles") + .to("mock:result"); + // Policy operations + from("direct:createPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createPolicy") + .to("mock:result"); + from("direct:deletePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deletePolicy") + .to("mock:result"); + from("direct:getPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getPolicy") + .to("mock:result"); + from("direct:listPolicies").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listPolicies") + .to("mock:result"); + // Policy attachment operations + from("direct:attachUserPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachUserPolicy") + .to("mock:result"); + from("direct:detachUserPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachUserPolicy") + .to("mock:result"); + from("direct:attachGroupPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachGroupPolicy") + .to("mock:result"); + from("direct:detachGroupPolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachGroupPolicy") + .to("mock:result"); + from("direct:attachRolePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=attachRolePolicy") + .to("mock:result"); + from("direct:detachRolePolicy").to("aws2-iam://test?iamClient=#amazonIAMClient&operation=detachRolePolicy") + .to("mock:result"); + // Instance profile operations + from("direct:createInstanceProfile") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=createInstanceProfile").to("mock:result"); + from("direct:deleteInstanceProfile") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=deleteInstanceProfile").to("mock:result"); + from("direct:getInstanceProfile") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=getInstanceProfile").to("mock:result"); + from("direct:listInstanceProfiles") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=listInstanceProfiles").to("mock:result"); + from("direct:addRoleToInstanceProfile") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=addRoleToInstanceProfile").to("mock:result"); + from("direct:removeRoleFromInstanceProfile") + .to("aws2-iam://test?iamClient=#amazonIAMClient&operation=removeRoleFromInstanceProfile") + .to("mock:result"); } }; } 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 6880ada43b72..6b7f0c66554b 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 @@ -763,6 +763,199 @@ public interface IAM2EndpointBuilderFactory { public String awsIAMGroupId() { return "CamelAwsIAMGroupId"; } + /** + * The name of an AWS IAM Role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMRoleName}. + */ + public String awsIAMRoleName() { + return "CamelAwsIAMRoleName"; + } + /** + * The path of an AWS IAM Role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMRolePath}. + */ + public String awsIAMRolePath() { + return "CamelAwsIAMRolePath"; + } + /** + * The assume role policy document for the role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code + * AwsIAMAssumeRolePolicyDocument}. + */ + public String awsIAMAssumeRolePolicyDocument() { + return "CamelAwsIAMAssumeRolePolicyDocument"; + } + /** + * The ARN of the created or retrieved role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMRoleArn}. + */ + public String awsIAMRoleArn() { + return "CamelAwsIAMRoleArn"; + } + /** + * The ID of the created or retrieved role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMRoleId}. + */ + public String awsIAMRoleId() { + return "CamelAwsIAMRoleId"; + } + /** + * The description of an AWS IAM Role. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMRoleDescription}. + */ + public String awsIAMRoleDescription() { + return "CamelAwsIAMRoleDescription"; + } + /** + * The name of an AWS IAM Policy. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyName}. + */ + public String awsIAMPolicyName() { + return "CamelAwsIAMPolicyName"; + } + /** + * The path of an AWS IAM Policy. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyPath}. + */ + public String awsIAMPolicyPath() { + return "CamelAwsIAMPolicyPath"; + } + /** + * The policy document. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyDocument}. + */ + public String awsIAMPolicyDocument() { + return "CamelAwsIAMPolicyDocument"; + } + /** + * The ARN of an AWS IAM Policy. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyArn}. + */ + public String awsIAMPolicyArn() { + return "CamelAwsIAMPolicyArn"; + } + /** + * The ID of an AWS IAM Policy. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyId}. + */ + public String awsIAMPolicyId() { + return "CamelAwsIAMPolicyId"; + } + /** + * The description of an AWS IAM Policy. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMPolicyDescription}. + */ + public String awsIAMPolicyDescription() { + return "CamelAwsIAMPolicyDescription"; + } + /** + * The name of an AWS IAM Instance Profile. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMInstanceProfileName}. + */ + public String awsIAMInstanceProfileName() { + return "CamelAwsIAMInstanceProfileName"; + } + /** + * The path of an AWS IAM Instance Profile. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMInstanceProfilePath}. + */ + public String awsIAMInstanceProfilePath() { + return "CamelAwsIAMInstanceProfilePath"; + } + /** + * The ARN of an AWS IAM Instance Profile. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMInstanceProfileArn}. + */ + public String awsIAMInstanceProfileArn() { + return "CamelAwsIAMInstanceProfileArn"; + } + /** + * The ID of an AWS IAM Instance Profile. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsIAMInstanceProfileId}. + */ + public String awsIAMInstanceProfileId() { + return "CamelAwsIAMInstanceProfileId"; + } } static IAM2EndpointBuilder endpointBuilder(String componentName, String path) { class IAM2EndpointBuilderImpl extends AbstractEndpointBuilder implements IAM2EndpointBuilder, AdvancedIAM2EndpointBuilder {
