Skip to content

Commit caf3995

Browse files
HADOOP-17076: ABFS: Delegation SAS Generator Updates
Contributed by Thomas Marquardt. DETAILS: 1) The authentication version in the service has been updated from Dec19 to Feb20, so need to update the client. 2) Add support and test cases for getXattr and setXAttr. 3) Update DelegationSASGenerator and related to use Duration instead of int for time periods. 4) Cleanup DelegationSASGenerator switch/case statement that maps operations to permissions. 5) Cleanup SASGenerator classes to use String.equals instead of ==. TESTS: Added tests for getXAttr and setXAttr. All tests are passing against my account in eastus2euap: $mvn -T 1C -Dparallel-tests=abfs -Dscale -DtestsThreadCount=8 clean verify Tests run: 76, Failures: 0, Errors: 0, Skipped: 0 Tests run: 441, Failures: 0, Errors: 0, Skipped: 33 Tests run: 206, Failures: 0, Errors: 0, Skipped: 24
1 parent 89689c5 commit caf3995

File tree

6 files changed

+42
-26
lines changed

6 files changed

+42
-26
lines changed

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/extensions/SASTokenProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@
3333
public interface SASTokenProvider {
3434

3535
String CHECK_ACCESS_OPERATION = "check-access";
36+
String CREATE_DIRECTORY_OPERATION = "create-directory";
3637
String CREATE_FILE_OPERATION = "create-file";
3738
String DELETE_OPERATION = "delete";
3839
String DELETE_RECURSIVE_OPERATION = "delete-recursive";
3940
String GET_ACL_OPERATION = "get-acl";
4041
String GET_STATUS_OPERATION = "get-status";
4142
String GET_PROPERTIES_OPERATION = "get-properties";
4243
String LIST_OPERATION = "list";
43-
String CREATE_DIRECTORY_OPERATION = "create-directory";
4444
String READ_OPERATION = "read";
4545
String RENAME_SOURCE_OPERATION = "rename-source";
4646
String RENAME_DESTINATION_OPERATION = "rename-destination";

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemDelegationSAS.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.List;
2626
import java.util.UUID;
2727

28+
import org.junit.Assert;
2829
import org.junit.Assume;
2930
import org.junit.Test;
3031
import org.slf4j.Logger;
@@ -365,4 +366,19 @@ public void testRootPath() throws Exception {
365366
}
366367
assertEquals(0, count);
367368
}
369+
370+
@Test
371+
// Test filesystem operations getXAttr and setXAttr
372+
public void testProperties() throws Exception {
373+
final AzureBlobFileSystem fs = getFileSystem();
374+
Path reqPath = new Path(UUID.randomUUID().toString());
375+
376+
fs.create(reqPath).close();
377+
378+
final String propertyName = "user.mime_type";
379+
final byte[] propertyValue = "text/plain".getBytes("utf-8");
380+
fs.setXAttr(reqPath, propertyName, propertyValue);
381+
382+
assertArrayEquals(propertyValue, fs.getXAttr(reqPath, propertyName));
383+
}
368384
}

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/extensions/MockDelegationSASTokenProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ public void initialize(Configuration configuration, String accountName) throws I
5555
String appSecret = configuration.get(TestConfigurationKeys.FS_AZURE_TEST_APP_SECRET);
5656
String sktid = configuration.get(TestConfigurationKeys.FS_AZURE_TEST_APP_SERVICE_PRINCIPAL_TENANT_ID);
5757
String skoid = configuration.get(TestConfigurationKeys.FS_AZURE_TEST_APP_SERVICE_PRINCIPAL_OBJECT_ID);
58-
String skt = SASGenerator.ISO_8601_FORMATTER.format(Instant.now().minusSeconds(SASGenerator.FIVE_MINUTES));
59-
String ske = SASGenerator.ISO_8601_FORMATTER.format(Instant.now().plusSeconds(SASGenerator.ONE_DAY));
58+
String skt = SASGenerator.ISO_8601_FORMATTER.format(Instant.now().minus(SASGenerator.FIVE_MINUTES));
59+
String ske = SASGenerator.ISO_8601_FORMATTER.format(Instant.now().plus(SASGenerator.ONE_DAY));
6060
String skv = SASGenerator.AuthenticationVersion.Dec19.toString();
6161

6262
byte[] key = getUserDelegationKey(accountName, appID, appSecret, sktid, skt, ske, skv);

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/DelegationSASGenerator.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@
2929
* Test Delegation SAS generator.
3030
*/
3131
public class DelegationSASGenerator extends SASGenerator {
32-
private String skoid;
33-
private String sktid;
34-
private String skt;
35-
private String ske;
32+
private final String skoid;
33+
private final String sktid;
34+
private final String skt;
35+
private final String ske;
3636
private final String sks = "b";
37-
private String skv;
37+
private final String skv;
3838

3939
public DelegationSASGenerator(byte[] userDelegationKey, String skoid, String sktid, String skt, String ske, String skv) {
4040
super(userDelegationKey);
@@ -48,20 +48,18 @@ public DelegationSASGenerator(byte[] userDelegationKey, String skoid, String skt
4848
public String getDelegationSAS(String accountName, String containerName, String path, String operation,
4949
String saoid, String suoid, String scid) {
5050

51-
final String sv = AuthenticationVersion.Dec19.toString();
52-
final String st = ISO_8601_FORMATTER.format(Instant.now().minusSeconds(FIVE_MINUTES));
53-
final String se = ISO_8601_FORMATTER.format(Instant.now().plusSeconds(ONE_DAY));
51+
final String sv = AuthenticationVersion.Feb20.toString();
52+
final String st = ISO_8601_FORMATTER.format(Instant.now().minus(FIVE_MINUTES));
53+
final String se = ISO_8601_FORMATTER.format(Instant.now().plus(ONE_DAY));
5454
String sr = "b";
5555
String sdd = null;
56-
String sp = null;
56+
String sp;
5757

5858
switch (operation) {
59-
case SASTokenProvider.CHECK_ACCESS_OPERATION:
60-
sp = "e";
61-
break;
62-
case SASTokenProvider.WRITE_OPERATION:
6359
case SASTokenProvider.CREATE_FILE_OPERATION:
6460
case SASTokenProvider.CREATE_DIRECTORY_OPERATION:
61+
case SASTokenProvider.WRITE_OPERATION:
62+
case SASTokenProvider.SET_PROPERTIES_OPERATION:
6563
sp = "w";
6664
break;
6765
case SASTokenProvider.DELETE_OPERATION:
@@ -72,13 +70,15 @@ public String getDelegationSAS(String accountName, String containerName, String
7270
sr = "d";
7371
sdd = Integer.toString(StringUtils.countMatches(path, "/"));
7472
break;
73+
case SASTokenProvider.CHECK_ACCESS_OPERATION:
7574
case SASTokenProvider.GET_ACL_OPERATION:
7675
case SASTokenProvider.GET_STATUS_OPERATION:
7776
sp = "e";
7877
break;
7978
case SASTokenProvider.LIST_OPERATION:
8079
sp = "l";
8180
break;
81+
case SASTokenProvider.GET_PROPERTIES_OPERATION:
8282
case SASTokenProvider.READ_OPERATION:
8383
sp = "r";
8484
break;
@@ -87,14 +87,12 @@ public String getDelegationSAS(String accountName, String containerName, String
8787
sp = "m";
8888
break;
8989
case SASTokenProvider.SET_ACL_OPERATION:
90+
case SASTokenProvider.SET_PERMISSION_OPERATION:
9091
sp = "p";
9192
break;
9293
case SASTokenProvider.SET_OWNER_OPERATION:
9394
sp = "o";
9495
break;
95-
case SASTokenProvider.SET_PERMISSION_OPERATION:
96-
sp = "p";
97-
break;
9896
default:
9997
throw new IllegalArgumentException(operation);
10098
}
@@ -146,7 +144,7 @@ private String computeSignatureForSAS(String sp, String st, String se, String sv
146144
sb.append(accountName);
147145
sb.append("/");
148146
sb.append(containerName);
149-
if (path != null && sr != "c") {
147+
if (path != null && !sr.equals("c")) {
150148
sb.append(path);
151149
}
152150
sb.append("\n");

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/SASGenerator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.io.UnsupportedEncodingException;
2222
import java.nio.charset.StandardCharsets;
23+
import java.time.Duration;
2324
import java.time.format.DateTimeFormatter;
2425
import java.time.ZoneId;
2526
import java.util.Locale;
@@ -35,7 +36,8 @@ public abstract class SASGenerator {
3536

3637
public enum AuthenticationVersion {
3738
Nov18("2018-11-09"),
38-
Dec19("2019-12-12");
39+
Dec19("2019-12-12"),
40+
Feb20("2020-02-10");
3941

4042
private final String ver;
4143

@@ -50,8 +52,8 @@ public String toString() {
5052
}
5153

5254
protected static final Logger LOG = LoggerFactory.getLogger(SASGenerator.class);
53-
public static final int FIVE_MINUTES = 5 * 60;
54-
public static final int ONE_DAY = 24 * 60 * 60;
55+
public static final Duration FIVE_MINUTES = Duration.ofMinutes(5);
56+
public static final Duration ONE_DAY = Duration.ofDays(1);
5557
public static final DateTimeFormatter ISO_8601_FORMATTER =
5658
DateTimeFormatter
5759
.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT)

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/ServiceSASGenerator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public String getContainerSASWithFullControl(String accountName, String containe
4040
String sp = "rcwdl";
4141
String sv = AuthenticationVersion.Nov18.toString();
4242
String sr = "c";
43-
String st = ISO_8601_FORMATTER.format(Instant.now().minusSeconds(FIVE_MINUTES));
44-
String se = ISO_8601_FORMATTER.format(Instant.now().plusSeconds(ONE_DAY));
43+
String st = ISO_8601_FORMATTER.format(Instant.now().minus(FIVE_MINUTES));
44+
String se = ISO_8601_FORMATTER.format(Instant.now().plus(ONE_DAY));
4545

4646
String signature = computeSignatureForSAS(sp, st, se, sv, "c",
4747
accountName, containerName, null);
@@ -71,7 +71,7 @@ private String computeSignatureForSAS(String sp, String st, String se, String sv
7171
sb.append(accountName);
7272
sb.append("/");
7373
sb.append(containerName);
74-
if (path != null && sr != "c") {
74+
if (path != null && !sr.equals("c")) {
7575
//sb.append("/");
7676
sb.append(path);
7777
}

0 commit comments

Comments
 (0)