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

mthomsen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new ee91341  NIFI-7497 Adding support for AWS Credentials Assume Role to 
be able to set the STS Endpoint NIFI-7497 Updating property description per 
comment
ee91341 is described below

commit ee91341ec3ce6009b6632d624defe00bd9b082ea
Author: neptunesalt <[email protected]>
AuthorDate: Sat May 30 17:12:23 2020 -0400

    NIFI-7497 Adding support for AWS Credentials Assume Role to be able to set 
the STS Endpoint
    NIFI-7497 Updating property description per comment
    
    This closes #4309
    
    Signed-off-by: Mike Thomsen <[email protected]>
---
 .../provider/factory/CredentialPropertyDescriptors.java  | 12 +++++++++++-
 .../strategies/AssumeRoleCredentialsStrategy.java        | 16 +++++++++++++++-
 .../service/AWSCredentialsProviderControllerService.java |  2 ++
 .../credentials/provider/factory/MockAWSProcessor.java   |  4 +++-
 .../provider/factory/TestCredentialsProviderFactory.java |  8 ++++++++
 5 files changed, 39 insertions(+), 3 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-abstract-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/CredentialPropertyDescriptors.java
 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-abstract-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/CredentialPropertyDescriptors.java
index 00f4e62..fa4c1df 100644
--- 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-abstract-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/CredentialPropertyDescriptors.java
+++ 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-abstract-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/CredentialPropertyDescriptors.java
@@ -177,6 +177,16 @@ public class CredentialPropertyDescriptors {
             .required(false)
             .addValidator(StandardValidators.POSITIVE_INTEGER_VALIDATOR)
             .sensitive(false)
-            .description("Proxy pot for cross-account access, if needed within 
your environment. This will configure a proxy to request for temporary access 
keys into another AWS account")
+            .description("Proxy port for cross-account access, if needed 
within your environment. This will configure a proxy to request for temporary 
access keys into another AWS account")
+            .build();
+    
+    public static final PropertyDescriptor ASSUME_ROLE_STS_ENDPOINT = new 
PropertyDescriptor.Builder()
+            .name("assume-role-sts-endpoint")
+            .displayName("Assume Role STS Endpoint")
+            .expressionLanguageSupported(ExpressionLanguageScope.NONE)
+            .required(false)
+            .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+            .sensitive(false)
+            .description("The default AWS Security Token Service (STS) 
endpoint (\"sts.amazonaws.com\") works for all accounts that are not for China 
(Beijing) region or GovCloud. You only need to set this property to 
\"sts.cn-north-1.amazonaws.com.cn\" when you are requesting session credentials 
for services in China(Beijing) region or to \"sts.us-gov-west-1.amazonaws.com\" 
for GovCloud.")
             .build();
 }
diff --git 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/strategies/AssumeRoleCredentialsStrategy.java
 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/strategies/AssumeRoleCredentialsStrategy.java
index 2a52dc9..adbfda9 100644
--- 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/strategies/AssumeRoleCredentialsStrategy.java
+++ 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/factory/strategies/AssumeRoleCredentialsStrategy.java
@@ -29,6 +29,7 @@ import static 
org.apache.nifi.processors.aws.credentials.provider.factory.Creden
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_NAME;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_PROXY_PORT;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_PROXY_HOST;
+import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_STS_ENDPOINT;
 import 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialsStrategy;
 
 import com.amazonaws.ClientConfiguration;
@@ -51,7 +52,7 @@ public class AssumeRoleCredentialsStrategy extends 
AbstractCredentialsStrategy {
         super("Assume Role", new PropertyDescriptor[] {
                 ASSUME_ROLE_ARN,
                 ASSUME_ROLE_NAME,
-                MAX_SESSION_TIME,
+                MAX_SESSION_TIME
         });
     }
 
@@ -90,6 +91,7 @@ public class AssumeRoleCredentialsStrategy extends 
AbstractCredentialsStrategy {
         final boolean assumeRoleExternalIdIsSet = 
validationContext.getProperty(ASSUME_ROLE_EXTERNAL_ID).isSet();
         final boolean assumeRoleProxyHostIsSet = 
validationContext.getProperty(ASSUME_ROLE_PROXY_HOST).isSet();
         final boolean assumeRoleProxyPortIsSet = 
validationContext.getProperty(ASSUME_ROLE_PROXY_PORT).isSet();
+        final boolean assumeRoleSTSEndpointIsSet = 
validationContext.getProperty(ASSUME_ROLE_STS_ENDPOINT).isSet();
 
         final Collection<ValidationResult> validationFailureResults  = new 
ArrayList<ValidationResult>();
 
@@ -112,6 +114,14 @@ public class AssumeRoleCredentialsStrategy extends 
AbstractCredentialsStrategy {
                     .explanation("Assume role requires both arn and name to be 
set with External ID")
                     .build());
         }
+        
+        // STS Endpoint should only be provided with viable Assume Role ARN 
and Name
+        if (assumeRoleSTSEndpointIsSet && (!assumeRoleArnIsSet || 
!assumeRoleNameIsSet)) {
+            validationFailureResults.add(new 
ValidationResult.Builder().input("Assume Role STS Endpoint")
+                    .valid(false)
+                    .explanation("Assume role requires both arn and name to be 
set with STS Endpoint")
+                    .build());
+        }
 
         // Both proxy host and proxy port are required if present
         if (assumeRoleProxyHostIsSet ^ assumeRoleProxyPortIsSet){
@@ -138,6 +148,7 @@ public class AssumeRoleCredentialsStrategy extends 
AbstractCredentialsStrategy {
         rawMaxSessionTime = (rawMaxSessionTime != null) ? rawMaxSessionTime : 
MAX_SESSION_TIME.getDefaultValue();
         final Integer maxSessionTime = 
Integer.parseInt(rawMaxSessionTime.trim());
         final String assumeRoleExternalId = 
properties.get(ASSUME_ROLE_EXTERNAL_ID);
+        final String assumeRoleSTSEndpoint = 
properties.get(ASSUME_ROLE_STS_ENDPOINT);
         STSAssumeRoleSessionCredentialsProvider.Builder builder;
         ClientConfiguration config = new ClientConfiguration();
 
@@ -150,6 +161,9 @@ public class AssumeRoleCredentialsStrategy extends 
AbstractCredentialsStrategy {
         }
 
         AWSSecurityTokenService securityTokenService = new 
AWSSecurityTokenServiceClient(primaryCredentialsProvider, config);
+        if (assumeRoleSTSEndpoint != null && !assumeRoleSTSEndpoint.isEmpty()) 
{
+               securityTokenService.setEndpoint(assumeRoleSTSEndpoint);
+        }
         builder = new STSAssumeRoleSessionCredentialsProvider
                 .Builder(assumeRoleArn, assumeRoleName)
                 .withStsClient(securityTokenService)
diff --git 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/service/AWSCredentialsProviderControllerService.java
 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/service/AWSCredentialsProviderControllerService.java
index a5f4e04..fcb9dc7 100644
--- 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/service/AWSCredentialsProviderControllerService.java
+++ 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/credentials/provider/service/AWSCredentialsProviderControllerService.java
@@ -41,6 +41,7 @@ import static 
org.apache.nifi.processors.aws.credentials.provider.factory.Creden
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_EXTERNAL_ID;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_PROXY_PORT;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_PROXY_HOST;
+import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_STS_ENDPOINT;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.CREDENTIALS_FILE;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.PROFILE_NAME;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.SECRET_KEY;
@@ -79,6 +80,7 @@ public class AWSCredentialsProviderControllerService extends 
AbstractControllerS
         props.add(ASSUME_ROLE_EXTERNAL_ID);
         props.add(ASSUME_ROLE_PROXY_HOST);
         props.add(ASSUME_ROLE_PROXY_PORT);
+        props.add(ASSUME_ROLE_STS_ENDPOINT);
         properties = Collections.unmodifiableList(props);
     }
 
diff --git 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/MockAWSProcessor.java
 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/MockAWSProcessor.java
index 5c7d57b..81ccb92 100644
--- 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/MockAWSProcessor.java
+++ 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/MockAWSProcessor.java
@@ -39,6 +39,7 @@ import static 
org.apache.nifi.processors.aws.credentials.provider.factory.Creden
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_NAME;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.MAX_SESSION_TIME;
 import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_EXTERNAL_ID;
+import static 
org.apache.nifi.processors.aws.credentials.provider.factory.CredentialPropertyDescriptors.ASSUME_ROLE_STS_ENDPOINT;
 
 import com.amazonaws.auth.AWSCredentialsProvider;
 import org.apache.nifi.processors.aws.AbstractAWSCredentialsProviderProcessor;
@@ -61,7 +62,8 @@ public class MockAWSProcessor extends 
AbstractAWSCredentialsProviderProcessor<Am
             MAX_SESSION_TIME,
             ASSUME_ROLE_EXTERNAL_ID,
             ASSUME_ROLE_PROXY_HOST,
-            ASSUME_ROLE_PROXY_PORT
+            ASSUME_ROLE_PROXY_PORT,
+            ASSUME_ROLE_STS_ENDPOINT
     );
 
     @Override
diff --git 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/TestCredentialsProviderFactory.java
 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/TestCredentialsProviderFactory.java
index f26ce81..3e48e6b 100644
--- 
a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/TestCredentialsProviderFactory.java
+++ 
b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/credentials/provider/factory/TestCredentialsProviderFactory.java
@@ -161,6 +161,14 @@ public class TestCredentialsProviderFactory {
         
runner.setProperty(CredentialPropertyDescriptors.ASSUME_ROLE_EXTERNAL_ID, 
"BogusExternalId");
         runner.assertNotValid();
     }
+    
+    @Test
+    public void testAssumeRoleSTSEndpointMissingArnAndName() throws Throwable {
+        final TestRunner runner = 
TestRunners.newTestRunner(MockAWSProcessor.class);
+        runner.setProperty(CredentialPropertyDescriptors.CREDENTIALS_FILE, 
"src/test/resources/mock-aws-credentials.properties");
+        
runner.setProperty(CredentialPropertyDescriptors.ASSUME_ROLE_STS_ENDPOINT, 
"BogusSTSEndpoint");
+        runner.assertNotValid();
+    }
 
     @Test
     public void testAnonymousCredentials() throws Throwable {

Reply via email to