Skip to content

Commit 9e95b07

Browse files
authored
Merge pull request apache#19 from ahmarsuhail/HADOOP-18073-cred-provider-fix-test
fixes failing test
2 parents 3b03e86 + bf577c7 commit 9e95b07

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.amazonaws.ClientConfiguration;
2222
import com.amazonaws.Protocol;
2323
import com.amazonaws.auth.AWSCredentialsProvider;
24-
import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
2524

2625
import org.apache.commons.lang3.StringUtils;
2726
import org.apache.commons.lang3.tuple.Pair;
@@ -50,6 +49,7 @@
5049
import org.slf4j.LoggerFactory;
5150

5251
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
52+
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
5353
import software.amazon.awssdk.awscore.exception.AwsServiceException;
5454
import software.amazon.awssdk.core.exception.AbortedException;
5555
import software.amazon.awssdk.core.exception.SdkException;
@@ -76,6 +76,7 @@
7676
import java.util.Collection;
7777
import java.util.Collections;
7878
import java.util.Date;
79+
import java.util.HashMap;
7980
import java.util.HashSet;
8081
import java.util.List;
8182
import java.util.Map;
@@ -621,6 +622,22 @@ public static List<Class<?>> loadAWSProviderClasses(Configuration conf,
621622
}
622623
}
623624

625+
/**
626+
* Maps V1 credential providers to either their equivalent SDK V2 class or hadoop provider.
627+
*/
628+
private static Map<String, Class> initCredentialProvidersMap() {
629+
Map<String, Class> v1v2CredentialProviderMap = new HashMap<>();
630+
631+
v1v2CredentialProviderMap.put("EnvironmentVariableCredentialsProvider",
632+
EnvironmentVariableCredentialsProvider.class);
633+
v1v2CredentialProviderMap.put("EC2ContainerCredentialsProviderWrapper",
634+
IAMInstanceCredentialsProvider.class);
635+
v1v2CredentialProviderMap.put("InstanceProfileCredentialsProvider",
636+
IAMInstanceCredentialsProvider.class);
637+
638+
return v1v2CredentialProviderMap;
639+
}
640+
624641
/**
625642
* Load list of AWS credential provider/credential provider factory classes;
626643
* support a forbidden list to prevent loops, mandate full secrets, etc.
@@ -643,6 +660,8 @@ public static AWSCredentialProviderList buildAWSProviderList(
643660
List<Class<?>> awsClasses = loadAWSProviderClasses(conf,
644661
key,
645662
defaultValues.toArray(new Class[defaultValues.size()]));
663+
664+
Map<String, Class> v1v2CredentialProviderMap = initCredentialProvidersMap();
646665
// and if the list is empty, switch back to the defaults.
647666
// this is to address the issue that configuration.getClasses()
648667
// doesn't return the default if the config value is just whitespace.
@@ -659,11 +678,11 @@ public static AWSCredentialProviderList buildAWSProviderList(
659678
+ " in option " + key + ": " + aClass);
660679
}
661680

662-
// TODO: Not sure what to do here yet.
663-
// There were some V1 providers for which we suppressed warnings, how do we map those?
664-
if (aClass.getName().contains(AWS_AUTH_CLASS_PREFIX)) {
665-
// V2Migration.v1ProviderReferenced(aClass.getName());
666-
681+
if (v1v2CredentialProviderMap.containsKey(aClass.getSimpleName()) &&
682+
aClass.getName().contains(AWS_AUTH_CLASS_PREFIX)){
683+
providers.add(createAWSV2CredentialProvider(conf,
684+
v1v2CredentialProviderMap.get(aClass.getSimpleName()), binding));
685+
} else if (AWSCredentialsProvider.class.isAssignableFrom(aClass)) {
667686
providers.add(createAWSV1CredentialProvider(conf,
668687
aClass, binding));
669688
} else {
@@ -823,7 +842,7 @@ private static AwsCredentialsProvider createAWSV2CredentialProvider(
823842

824843
// X.getInstance()
825844
Method factory = getFactoryMethod(credClass, AwsCredentialsProvider.class,
826-
"getInstance");
845+
"create");
827846
if (factory != null) {
828847
credentials = (AwsCredentialsProvider)factory.invoke(null);
829848
return credentials;
@@ -840,7 +859,7 @@ private static AwsCredentialsProvider createAWSV2CredentialProvider(
840859
throw new IOException(String.format("%s " + CONSTRUCTOR_EXCEPTION
841860
+ ". A class specified in %s must provide a public constructor "
842861
+ "of a supported signature, or a public factory method named "
843-
+ "getInstance that accepts no arguments.",
862+
+ "create that accepts no arguments.",
844863
className, AWS_CREDENTIALS_PROVIDER));
845864
} catch (InvocationTargetException e) {
846865
// TODO: Can probably be moved to a common method, but before doing this, check if we still

hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828

2929
import com.amazonaws.auth.AWSCredentials;
3030
import com.amazonaws.auth.AWSCredentialsProvider;
31-
import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
32-
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
3331
import org.apache.hadoop.util.Sets;
3432
import org.junit.Rule;
3533
import org.junit.Test;
3634
import org.junit.rules.ExpectedException;
35+
import software.amazon.awssdk.auth.credentials.AwsCredentials;
3736
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
37+
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
38+
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
3839

3940
import org.apache.hadoop.conf.Configuration;
4041
import org.apache.hadoop.fs.Path;
@@ -52,6 +53,7 @@
5253
/**
5354
* Unit tests for {@link Constants#AWS_CREDENTIALS_PROVIDER} logic.
5455
*/
56+
// TODO: Add new tests that use a mix of V1 and V2 providers and assert that everything works ok.
5557
public class TestS3AAWSCredentialsProvider {
5658

5759
/**
@@ -66,7 +68,7 @@ public class TestS3AAWSCredentialsProvider {
6668
@Test
6769
public void testProviderWrongClass() throws Exception {
6870
expectProviderInstantiationFailure(this.getClass(),
69-
NOT_AWS_PROVIDER);
71+
NOT_AWS_V2_PROVIDER);
7072
}
7173

7274
@Test
@@ -220,21 +222,18 @@ public void refresh() {
220222
* A credential provider whose constructor raises an NPE.
221223
*/
222224
static class ConstructorFailureProvider
223-
implements AWSCredentialsProvider {
225+
implements AwsCredentialsProvider {
224226

225227
@SuppressWarnings("unused")
226228
public ConstructorFailureProvider() {
227229
throw new NullPointerException("oops");
228230
}
229231

230232
@Override
231-
public AWSCredentials getCredentials() {
233+
public AwsCredentials resolveCredentials() {
232234
return null;
233235
}
234236

235-
@Override
236-
public void refresh() {
237-
}
238237
}
239238

240239
@Test

0 commit comments

Comments
 (0)