[ 
https://issues.apache.org/jira/browse/HADOOP-19384?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17926094#comment-17926094
 ] 

ASF GitHub Bot commented on HADOOP-19384:
-----------------------------------------

steveloughran commented on code in PR #7284:
URL: https://github.com/apache/hadoop/pull/7284#discussion_r1951317234


##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;

Review Comment:
   need the license...just copy from another class



##########
hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java:
##########
@@ -18,8 +18,7 @@
 
 package org.apache.hadoop.fs.s3a;
 
-import java.io.IOException;
-import java.io.InterruptedIOException;
+import java.io.*;

Review Comment:
   revert; .* is not allowed in the hadoop code as it is too brittle



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.profiles.ProfileFile;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
[email protected]
[email protected]
+public class ProfileAWSCredentialsProvider extends 
AbstractAWSCredentialProvider {
+    public static final String NAME
+            = "org.apache.hadoop.fs.s3a.auth.ProfileAWSCredentialsProvider";
+    public static final String PROFILE_FILE = "fs.s3a.auth.profile.file";

Review Comment:
   add javadocs for these and the field at L25



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.profiles.ProfileFile;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
[email protected]
[email protected]
+public class ProfileAWSCredentialsProvider extends 
AbstractAWSCredentialProvider {
+    public static final String NAME
+            = "org.apache.hadoop.fs.s3a.auth.ProfileAWSCredentialsProvider";
+    public static final String PROFILE_FILE = "fs.s3a.auth.profile.file";
+    public static final String PROFILE_NAME = "fs.s3a.auth.profile.name";
+
+    private final ProfileCredentialsProvider pcp;
+
+    private static Path getCredentialsPath(Configuration conf) {
+        String credentialsFile = conf.get(PROFILE_FILE, null);
+        if (credentialsFile == null) {
+            credentialsFile = 
SystemUtils.getEnvironmentVariable("AWS_SHARED_CREDENTIALS_FILE", null);
+        }
+        Path path = (credentialsFile == null) ?
+                
FileSystems.getDefault().getPath(SystemUtils.getUserHome().getPath(),".aws","credentials")

Review Comment:
   nit: can you add a space after the commas in the arguments



##########
hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java:
##########
@@ -139,6 +134,32 @@ public void testInstantiationChain() throws Throwable {
     assertCredentialProviders(expectedClasses, list);
   }
 
+  @Test
+  public void testProfileAWSCredentialsProvider() throws Throwable {
+    Configuration conf = new Configuration(false);
+    conf.set(AWS_CREDENTIALS_PROVIDER, ProfileAWSCredentialsProvider.NAME);
+    try (FileWriter fileWriter = new FileWriter("testcred"); BufferedWriter 
bufferedWriter = new BufferedWriter(fileWriter)) {

Review Comment:
   the test files have to go into target/, whether run on the command line or 
IDE.
   
   use `File.createTempFile()` to get one in the temp dir



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;

Review Comment:
   import ordering (should be)
   
   ```
   java.
   
   javax.
   
   non-apache-stuff.
   
   org.apache.
   
   static everything
   ---
   
   it's close but a bit mixed up...please fix



##########
hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java:
##########
@@ -35,6 +34,7 @@
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
+import org.apache.hadoop.fs.s3a.auth.*;

Review Comment:
   revert



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.profiles.ProfileFile;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
[email protected]
[email protected]
+public class ProfileAWSCredentialsProvider extends 
AbstractAWSCredentialProvider {

Review Comment:
   I wonder if we should be logging at debug when the env vars are being used? 
Nothing secret will be logged and it could be useful.



##########
hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AAWSCredentialsProvider.java:
##########
@@ -139,6 +134,32 @@ public void testInstantiationChain() throws Throwable {
     assertCredentialProviders(expectedClasses, list);
   }
 
+  @Test
+  public void testProfileAWSCredentialsProvider() throws Throwable {
+    Configuration conf = new Configuration(false);
+    conf.set(AWS_CREDENTIALS_PROVIDER, ProfileAWSCredentialsProvider.NAME);
+    try (FileWriter fileWriter = new FileWriter("testcred"); BufferedWriter 
bufferedWriter = new BufferedWriter(fileWriter)) {
+      bufferedWriter.write("[default]\n"
+      + "aws_access_key_id = defaultaccesskeyid\n"
+      + "aws_secret_access_key = defaultsecretkeyid\n");
+      bufferedWriter.write("[nondefault]\n"
+              + "aws_access_key_id = nondefaultaccesskeyid\n"
+              + "aws_secret_access_key = nondefaultsecretkeyid\n");
+    }
+    conf.set(ProfileAWSCredentialsProvider.PROFILE_FILE, "testcred");
+    URI testUri = new URI("s3a://bucket1");
+    AWSCredentialProviderList list = createAWSCredentialProviderList(testUri, 
conf);
+    
assertCredentialProviders(Collections.singletonList(ProfileAWSCredentialsProvider.class),
 list);
+    AwsCredentials credentials = list.resolveCredentials();
+    assertEquals("defaultaccesskeyid", credentials.accessKeyId());

Review Comment:
   Use AssertJ assertions. We need this to ease our migration to junit5



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.profiles.ProfileFile;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
[email protected]
[email protected]
+public class ProfileAWSCredentialsProvider extends 
AbstractAWSCredentialProvider {
+    public static final String NAME
+            = "org.apache.hadoop.fs.s3a.auth.ProfileAWSCredentialsProvider";
+    public static final String PROFILE_FILE = "fs.s3a.auth.profile.file";
+    public static final String PROFILE_NAME = "fs.s3a.auth.profile.name";
+
+    private final ProfileCredentialsProvider pcp;
+
+    private static Path getCredentialsPath(Configuration conf) {
+        String credentialsFile = conf.get(PROFILE_FILE, null);
+        if (credentialsFile == null) {
+            credentialsFile = 
SystemUtils.getEnvironmentVariable("AWS_SHARED_CREDENTIALS_FILE", null);

Review Comment:
   move all env vars to string constants; add javadocs for each of these



##########
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/ProfileAWSCredentialsProvider.java:
##########
@@ -0,0 +1,56 @@
+package org.apache.hadoop.fs.s3a.auth;
+
+import software.amazon.awssdk.auth.credentials.AwsCredentials;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.profiles.ProfileFile;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.hadoop.conf.Configuration;
+
+import java.net.URI;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+
[email protected]
[email protected]
+public class ProfileAWSCredentialsProvider extends 
AbstractAWSCredentialProvider {
+    public static final String NAME
+            = "org.apache.hadoop.fs.s3a.auth.ProfileAWSCredentialsProvider";
+    public static final String PROFILE_FILE = "fs.s3a.auth.profile.file";
+    public static final String PROFILE_NAME = "fs.s3a.auth.profile.name";
+
+    private final ProfileCredentialsProvider pcp;
+
+    private static Path getCredentialsPath(Configuration conf) {
+        String credentialsFile = conf.get(PROFILE_FILE, null);
+        if (credentialsFile == null) {
+            credentialsFile = 
SystemUtils.getEnvironmentVariable("AWS_SHARED_CREDENTIALS_FILE", null);
+        }
+        Path path = (credentialsFile == null) ?
+                
FileSystems.getDefault().getPath(SystemUtils.getUserHome().getPath(),".aws","credentials")
+                : FileSystems.getDefault().getPath(credentialsFile);
+        return path;
+    }
+
+    private static String getCredentialsName(Configuration conf) {
+        String profileName = conf.get(PROFILE_NAME, null);
+        if (profileName == null) {
+            profileName = SystemUtils.getEnvironmentVariable("AWS_PROFILE", 
"default");
+        }
+        return profileName;
+    }
+
+    public ProfileAWSCredentialsProvider(URI uri, Configuration conf) {
+        super(uri, conf);
+        ProfileCredentialsProvider.Builder builder = 
ProfileCredentialsProvider.builder();
+        
builder.profileName(getCredentialsName(conf)).profileFile(ProfileFile.builder().content(getCredentialsPath(conf)).type(ProfileFile.Type.CREDENTIALS).build());

Review Comment:
   should be split across lines, one per build attribute





> Add support for ProfileCredentialsProvider
> ------------------------------------------
>
>                 Key: HADOOP-19384
>                 URL: https://issues.apache.org/jira/browse/HADOOP-19384
>             Project: Hadoop Common
>          Issue Type: Improvement
>          Components: fs/s3
>    Affects Versions: 3.4.1
>            Reporter: Venkatasubrahmanian Narayanan
>            Assignee: Venkatasubrahmanian Narayanan
>            Priority: Minor
>              Labels: pull-request-available
>
> Hadoop currently doesn't support AWS' ProfileCredentialsProvider. A thin 
> wrapper is sufficient to get it to work, since it just needs us to fetch the 
> credentials file.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to