Added the ability to use AWSCredentialsProvider's that require non-empty contructor args e.g. ProfileCredentialsProvider where you provide the profile name to use from your ~/.aws/credentials file

This commit is contained in:
Joshua Morris 2016-08-22 20:28:16 +00:00
parent 06b0acd3dc
commit 807e7f822c
4 changed files with 140 additions and 11 deletions

View file

@ -52,6 +52,11 @@
<artifactId>aws-java-sdk-cloudwatch</artifactId> <artifactId>aws-java-sdk-cloudwatch</artifactId>
<version>${aws-java-sdk.version}</version> <version>${aws-java-sdk.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>${aws-java-sdk.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>

View file

@ -17,6 +17,7 @@ package com.amazonaws.services.kinesis.clientlibrary.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.lang.reflect.Constructor;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -30,6 +31,7 @@ class AWSCredentialsProviderPropertyValueDecoder implements IPropertyValueDecode
private static final Log LOG = LogFactory.getLog(AWSCredentialsProviderPropertyValueDecoder.class); private static final Log LOG = LogFactory.getLog(AWSCredentialsProviderPropertyValueDecoder.class);
private static final String AUTH_PREFIX = "com.amazonaws.auth."; private static final String AUTH_PREFIX = "com.amazonaws.auth.";
private static final String LIST_DELIMITER = ","; private static final String LIST_DELIMITER = ",";
private static final String ARG_DELIMITER = "|";
/** /**
* Constructor. * Constructor.
@ -70,6 +72,19 @@ class AWSCredentialsProviderPropertyValueDecoder implements IPropertyValueDecode
private static List<AWSCredentialsProvider> getValidCredentialsProviders(List<String> providerNames) { private static List<AWSCredentialsProvider> getValidCredentialsProviders(List<String> providerNames) {
List<AWSCredentialsProvider> credentialsProviders = new ArrayList<AWSCredentialsProvider>(); List<AWSCredentialsProvider> credentialsProviders = new ArrayList<AWSCredentialsProvider>();
for (String providerName : providerNames) { for (String providerName : providerNames) {
if (providerName.contains(ARG_DELIMITER)) {
String[] nameAndArgs = providerName.split("\\" + ARG_DELIMITER);
Class<?>[] argTypes = new Class<?>[nameAndArgs.length - 1];
Arrays.fill(argTypes, String.class);
try {
Class<?> className = Class.forName(nameAndArgs[0]);
Constructor<?> c = className.getConstructor(argTypes);
credentialsProviders.add((AWSCredentialsProvider) c.newInstance(
Arrays.copyOfRange(nameAndArgs, 1, nameAndArgs.length)));
} catch (Exception e) {
LOG.debug("Can't find any credentials provider matching " + providerName + ".");
}
} else {
try { try {
Class<?> className = Class.forName(providerName); Class<?> className = Class.forName(providerName);
credentialsProviders.add((AWSCredentialsProvider) className.newInstance()); credentialsProviders.add((AWSCredentialsProvider) className.newInstance());
@ -77,6 +92,7 @@ class AWSCredentialsProviderPropertyValueDecoder implements IPropertyValueDecode
LOG.debug("Can't find any credentials provider matching " + providerName + "."); LOG.debug("Can't find any credentials provider matching " + providerName + ".");
} }
} }
}
return credentialsProviders; return credentialsProviders;
} }

View file

@ -0,0 +1,104 @@
/*
* Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Amazon Software License (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/asl/
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.amazonaws.services.kinesis.clientlibrary.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Set;
import java.io.File;
import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSCredentialsProviderChain;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.kinesis.clientlibrary.config.AWSCredentialsProviderPropertyValueDecoder;
public class AWSCredentialsProviderPropertyValueDecoderTest {
private String credentialName1 =
"com.amazonaws.services.kinesis.clientlibrary.config.KinesisClientLibConfiguratorTest$AlwaysSucceedCredentialsProvider";
private String credentialName2 =
"com.amazonaws.services.kinesis.clientlibrary.config.KinesisClientLibConfiguratorTest$AlwaysFailCredentialsProvider";
private AWSCredentialsProviderPropertyValueDecoder decoder = new AWSCredentialsProviderPropertyValueDecoder();
@Test
public void testSingleProvider() {
AWSCredentialsProvider provider = decoder.decodeValue(credentialName1);
assertEquals(provider.getClass(), AWSCredentialsProviderChain.class);
}
@Test
public void testTwoProviders() {
AWSCredentialsProvider provider = decoder.decodeValue(credentialName1 + "," + credentialName2);
assertEquals(provider.getClass(), AWSCredentialsProviderChain.class);
}
@Test
public void testProfileProviderWithOneArg() {
AWSCredentialsProvider provider = decoder.decodeValue(ProfileCredentialsProvider.class.getName() + "|profileName");
assertEquals(provider.getClass(), AWSCredentialsProviderChain.class);
}
@Test
public void testProfileProviderWithTwoArgs() throws IOException {
File temp = File.createTempFile("test-profiles-file", ".tmp");
temp.deleteOnExit();
AWSCredentialsProvider provider = decoder.decodeValue(ProfileCredentialsProvider.class.getName() +
"|" + temp.getAbsolutePath() + "|profileName");
assertEquals(provider.getClass(), AWSCredentialsProviderChain.class);
}
/**
* This credentials provider will always succeed
*/
public static class AlwaysSucceedCredentialsProvider implements AWSCredentialsProvider {
@Override
public AWSCredentials getCredentials() {
return null;
}
@Override
public void refresh() {
}
}
/**
* This credentials provider will always fail
*/
public static class AlwaysFailCredentialsProvider implements AWSCredentialsProvider {
@Override
public AWSCredentials getCredentials() {
throw new IllegalArgumentException();
}
@Override
public void refresh() {
}
}
}

View file

@ -56,6 +56,7 @@ public class KinesisClientLibConfigurationTest {
// Test constructor with all valid arguments. // Test constructor with all valid arguments.
config = config =
new KinesisClientLibConfiguration(TEST_STRING, new KinesisClientLibConfiguration(TEST_STRING,
TEST_STRING,
TEST_STRING, TEST_STRING,
TEST_STRING, TEST_STRING,
null, null,
@ -93,6 +94,7 @@ public class KinesisClientLibConfigurationTest {
try { try {
config = config =
new KinesisClientLibConfiguration(TEST_STRING, new KinesisClientLibConfiguration(TEST_STRING,
TEST_STRING,
TEST_STRING, TEST_STRING,
TEST_STRING, TEST_STRING,
null, null,
@ -126,6 +128,7 @@ public class KinesisClientLibConfigurationTest {
try { try {
config = config =
new KinesisClientLibConfiguration(TEST_STRING, new KinesisClientLibConfiguration(TEST_STRING,
TEST_STRING,
TEST_STRING, TEST_STRING,
TEST_STRING, TEST_STRING,
null, null,
@ -288,6 +291,7 @@ public class KinesisClientLibConfigurationTest {
Mockito.mock(AWSCredentialsProvider.class); Mockito.mock(AWSCredentialsProvider.class);
try { try {
new KinesisClientLibConfiguration(TEST_STRING, new KinesisClientLibConfiguration(TEST_STRING,
TEST_STRING,
TEST_STRING, TEST_STRING,
TEST_STRING, TEST_STRING,
null, null,