You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/08/27 06:57:14 UTC

[camel] 01/06: CAMEL-15374 - Camel-AWS2-STS: Add more operation to the producer, getFederationToken

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

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

commit 53f11ffd97bb605b6f8bf3be9734f39420e6762f
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Aug 27 08:39:52 2020 +0200

    CAMEL-15374 - Camel-AWS2-STS: Add more operation to the producer, getFederationToken
---
 .../camel/component/aws2/sts/STS2Constants.java    |  1 +
 .../camel/component/aws2/sts/STS2Operations.java   |  3 +-
 .../camel/component/aws2/sts/STS2Producer.java     | 40 ++++++++++++++++++++++
 .../component/aws2/sts/AmazonSTSClientMock.java    |  9 +++++
 .../camel/component/aws2/sts/STS2ProducerTest.java | 20 +++++++++++
 5 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Constants.java b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Constants.java
index fb2868f..79a2cb5 100644
--- a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Constants.java
+++ b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Constants.java
@@ -23,4 +23,5 @@ public interface STS2Constants {
     String OPERATION = "CamelAwsStsOperation";
     String ROLE_ARN = "CamelAwsStsRoleArn";
     String ROLE_SESSION_NAME = "CamelAwsStsRoleSessionName";
+    String FEDERATED_NAME = "CamelAwsStsFederatedName";
 }
diff --git a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Operations.java b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Operations.java
index 9d7c4b6..dda62e8 100644
--- a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Operations.java
+++ b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Operations.java
@@ -19,5 +19,6 @@ package org.apache.camel.component.aws2.sts;
 public enum STS2Operations {
 
     assumeRole,
-    getSessionToken
+    getSessionToken,
+    getFederationToken
 }
diff --git a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Producer.java b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Producer.java
index 816d83c..1d888c5 100644
--- a/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Producer.java
+++ b/components/camel-aws2-sts/src/main/java/org/apache/camel/component/aws2/sts/STS2Producer.java
@@ -30,6 +30,8 @@ import software.amazon.awssdk.services.sts.StsClient;
 import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
 import software.amazon.awssdk.services.sts.model.AssumeRoleRequest.Builder;
 import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
+import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest;
+import software.amazon.awssdk.services.sts.model.GetFederationTokenResponse;
 import software.amazon.awssdk.services.sts.model.GetSessionTokenRequest;
 import software.amazon.awssdk.services.sts.model.GetSessionTokenResponse;
 
@@ -55,6 +57,9 @@ public class STS2Producer extends DefaultProducer {
             case getSessionToken:
                 getSessionToken(getEndpoint().getStsClient(), exchange);
                 break;
+            case getFederationToken:
+                getFederationToken(getEndpoint().getStsClient(), exchange);
+                break;
             default:
                 throw new IllegalArgumentException("Unsupported operation");
         }
@@ -154,6 +159,41 @@ public class STS2Producer extends DefaultProducer {
             message.setBody(result);
         }
     }
+    
+    private void getFederationToken(StsClient stsClient, Exchange exchange) throws InvalidPayloadException {
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetFederationTokenRequest) {
+                GetFederationTokenResponse result;
+                try {
+                    GetFederationTokenRequest request = (GetFederationTokenRequest) payload;
+                    result = stsClient.getFederationToken(request);
+                } catch (AwsServiceException ase) {
+                    LOG.trace("Get Federation Token command returned the error code {}", ase.awsErrorDetails().errorCode());
+                    throw ase;
+                }
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            GetFederationTokenRequest.Builder builder = GetFederationTokenRequest.builder();
+            GetFederationTokenResponse result;
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(STS2Constants.FEDERATED_NAME))) {
+                String federatedName = exchange.getIn().getHeader(STS2Constants.FEDERATED_NAME, String.class);
+                builder.name(federatedName);
+            } else {
+                throw new IllegalArgumentException("Role ARN needs to be specified for assumeRole operation");
+            }
+            try {
+                result = stsClient.getFederationToken(builder.build());
+            } catch (AwsServiceException ase) {
+                LOG.trace("Get Federation Token command returned the error code {}", ase.awsErrorDetails().errorCode());
+                throw ase;
+            }
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
 
     public static Message getMessageForResponse(final Exchange exchange) {
         return exchange.getMessage();
diff --git a/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/AmazonSTSClientMock.java b/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/AmazonSTSClientMock.java
index ba8facb..1f4eab4 100644
--- a/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/AmazonSTSClientMock.java
+++ b/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/AmazonSTSClientMock.java
@@ -21,6 +21,8 @@ import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
 import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
 import software.amazon.awssdk.services.sts.model.AssumedRoleUser;
 import software.amazon.awssdk.services.sts.model.Credentials;
+import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest;
+import software.amazon.awssdk.services.sts.model.GetFederationTokenResponse;
 import software.amazon.awssdk.services.sts.model.GetSessionTokenRequest;
 import software.amazon.awssdk.services.sts.model.GetSessionTokenResponse;
 
@@ -40,6 +42,13 @@ public class AmazonSTSClientMock implements StsClient {
                 .credentials(Credentials.builder().accessKeyId("xxx").secretAccessKey("yyy").sessionToken("test").build())
                 .build();
     }
+    
+    @Override
+    public GetFederationTokenResponse getFederationToken(GetFederationTokenRequest getFederationTokenRequest) {
+        return GetFederationTokenResponse.builder()
+                .credentials(Credentials.builder().accessKeyId("xxx").secretAccessKey("yyy").sessionToken("test").build())
+                .build();
+    }
 
     @Override
     public String serviceName() {
diff --git a/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/STS2ProducerTest.java b/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/STS2ProducerTest.java
index 683065a..dd42751 100644
--- a/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/STS2ProducerTest.java
+++ b/components/camel-aws2-sts/src/test/java/org/apache/camel/component/aws2/sts/STS2ProducerTest.java
@@ -25,6 +25,7 @@ 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.sts.model.AssumeRoleResponse;
+import software.amazon.awssdk.services.sts.model.GetFederationTokenResponse;
 import software.amazon.awssdk.services.sts.model.GetSessionTokenResponse;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -72,6 +73,23 @@ public class STS2ProducerTest extends CamelTestSupport {
         GetSessionTokenResponse resultGet = (GetSessionTokenResponse) exchange.getIn().getBody();
         assertEquals("xxx", resultGet.credentials().accessKeyId());
     }
+    
+    @Test
+    public void stsGetFederationTokenTest() throws Exception {
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = template.request("direct:getFederationToken", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(STS2Constants.OPERATION, STS2Operations.getFederationToken);
+            }
+        });
+
+        assertMockEndpointsSatisfied();
+
+        GetFederationTokenResponse resultGet = (GetFederationTokenResponse) exchange.getIn().getBody();
+        assertEquals("xxx", resultGet.credentials().accessKeyId());
+    }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
@@ -82,6 +100,8 @@ public class STS2ProducerTest extends CamelTestSupport {
                         .to("mock:result");
                 from("direct:getSessionToken").to("aws2-sts://test?stsClient=#amazonStsClient&operation=getSessionToken")
                         .to("mock:result");
+                from("direct:getFederationToken").to("aws2-sts://test?stsClient=#amazonStsClient&operation=getFederationToken")
+                        .to("mock:result");
             }
         };
     }