Skip to content

Commit 10ee64d

Browse files
wolflex888David Lu
and
David Lu
authored
add AWS_SESSION_TOKEN_EXPIRES_AT_MS (#1160)
* add AWS_SESSION_TOKEN_EXPIRES_AT_MS * spotless * add expiration time to aws integration tests --------- Co-authored-by: David Lu <dalu@hubspot.com>
1 parent 241149c commit 10ee64d

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisCredentialProperty.java

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public enum PolarisCredentialProperty {
2323
AWS_KEY_ID(String.class, "s3.access-key-id", "the aws access key id"),
2424
AWS_SECRET_KEY(String.class, "s3.secret-access-key", "the aws access key secret"),
2525
AWS_TOKEN(String.class, "s3.session-token", "the aws scoped access token"),
26+
AWS_SESSION_TOKEN_EXPIRES_AT_MS(
27+
String.class,
28+
"s3.session-token-expires-at-ms",
29+
"the time the aws session token expires, in milliseconds"),
2630
CLIENT_REGION(
2731
String.class, "client.region", "region to configure client for making requests to AWS"),
2832

polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,13 @@ public EnumMap<PolarisCredentialProperty, String> getSubscopedCreds(
8383
credentialMap.put(PolarisCredentialProperty.AWS_TOKEN, response.credentials().sessionToken());
8484
Optional.ofNullable(response.credentials().expiration())
8585
.ifPresent(
86-
i ->
87-
credentialMap.put(
88-
PolarisCredentialProperty.EXPIRATION_TIME, String.valueOf(i.toEpochMilli())));
86+
i -> {
87+
credentialMap.put(
88+
PolarisCredentialProperty.EXPIRATION_TIME, String.valueOf(i.toEpochMilli()));
89+
credentialMap.put(
90+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
91+
String.valueOf(i.toEpochMilli()));
92+
});
8993

9094
if (storageConfig.getRegion() != null) {
9195
credentialMap.put(PolarisCredentialProperty.CLIENT_REGION, storageConfig.getRegion());

polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheEntry.java

+4
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public long getExpirationTime() {
4242
if (credsMap.containsKey(PolarisCredentialProperty.GCS_ACCESS_TOKEN_EXPIRES_AT)) {
4343
return Long.parseLong(credsMap.get(PolarisCredentialProperty.GCS_ACCESS_TOKEN_EXPIRES_AT));
4444
}
45+
if (credsMap.containsKey(PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS)) {
46+
return Long.parseLong(
47+
credsMap.get(PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS));
48+
}
4549
if (credsMap.containsKey(PolarisCredentialProperty.EXPIRATION_TIME)) {
4650
return Long.parseLong(credsMap.get(PolarisCredentialProperty.EXPIRATION_TIME));
4751
}

polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java

+1
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ private static List<ScopedCredentialsResult> getFakeScopedCreds(int number, bool
397397
ImmutableMap.<PolarisCredentialProperty, String>builder()
398398
.put(PolarisCredentialProperty.AWS_KEY_ID, "key_id_" + finalI)
399399
.put(PolarisCredentialProperty.AWS_SECRET_KEY, "key_secret_" + finalI)
400+
.put(PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS, expireTime)
400401
.put(PolarisCredentialProperty.EXPIRATION_TIME, expireTime)
401402
.buildOrThrow())));
402403
if (res.size() == number) return res;

polaris-core/src/test/java/org/apache/polaris/service/storage/aws/AwsCredentialsStorageIntegrationTest.java

+24-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.assertj.core.api.Assertions.assertThat;
2222

2323
import jakarta.annotation.Nonnull;
24+
import java.time.Instant;
2425
import java.util.EnumMap;
2526
import java.util.List;
2627
import java.util.Set;
@@ -49,13 +50,16 @@
4950

5051
class AwsCredentialsStorageIntegrationTest {
5152

53+
public static final Instant EXPIRE_TIME = Instant.now().plusMillis(3600_000);
54+
5255
public static final AssumeRoleResponse ASSUME_ROLE_RESPONSE =
5356
AssumeRoleResponse.builder()
5457
.credentials(
5558
Credentials.builder()
5659
.accessKeyId("accessKey")
5760
.secretAccessKey("secretKey")
5861
.sessionToken("sess")
62+
.expiration(EXPIRE_TIME)
5963
.build())
6064
.build();
6165
public static final String AWS_PARTITION = "aws";
@@ -93,7 +97,10 @@ public void testGetSubscopedCreds() {
9397
.isNotEmpty()
9498
.containsEntry(PolarisCredentialProperty.AWS_TOKEN, "sess")
9599
.containsEntry(PolarisCredentialProperty.AWS_KEY_ID, "accessKey")
96-
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey");
100+
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey")
101+
.containsEntry(
102+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
103+
String.valueOf(EXPIRE_TIME.toEpochMilli()));
97104
}
98105

99106
@ParameterizedTest
@@ -255,7 +262,10 @@ public void testGetSubscopedCredsInlinePolicy(String awsPartition) {
255262
.isNotEmpty()
256263
.containsEntry(PolarisCredentialProperty.AWS_TOKEN, "sess")
257264
.containsEntry(PolarisCredentialProperty.AWS_KEY_ID, "accessKey")
258-
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey");
265+
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey")
266+
.containsEntry(
267+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
268+
String.valueOf(EXPIRE_TIME.toEpochMilli()));
259269
break;
260270
default:
261271
throw new IllegalArgumentException("Unknown aws partition: " + awsPartition);
@@ -353,7 +363,10 @@ public void testGetSubscopedCredsInlinePolicyWithoutList() {
353363
.isNotEmpty()
354364
.containsEntry(PolarisCredentialProperty.AWS_TOKEN, "sess")
355365
.containsEntry(PolarisCredentialProperty.AWS_KEY_ID, "accessKey")
356-
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey");
366+
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey")
367+
.containsEntry(
368+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
369+
String.valueOf(EXPIRE_TIME.toEpochMilli()));
357370
}
358371

359372
@Test
@@ -445,7 +458,10 @@ public void testGetSubscopedCredsInlinePolicyWithoutWrites() {
445458
.isNotEmpty()
446459
.containsEntry(PolarisCredentialProperty.AWS_TOKEN, "sess")
447460
.containsEntry(PolarisCredentialProperty.AWS_KEY_ID, "accessKey")
448-
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey");
461+
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey")
462+
.containsEntry(
463+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
464+
String.valueOf(EXPIRE_TIME.toEpochMilli()));
449465
}
450466

451467
@Test
@@ -507,7 +523,10 @@ public void testGetSubscopedCredsInlinePolicyWithEmptyReadAndWrite() {
507523
.isNotEmpty()
508524
.containsEntry(PolarisCredentialProperty.AWS_TOKEN, "sess")
509525
.containsEntry(PolarisCredentialProperty.AWS_KEY_ID, "accessKey")
510-
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey");
526+
.containsEntry(PolarisCredentialProperty.AWS_SECRET_KEY, "secretKey")
527+
.containsEntry(
528+
PolarisCredentialProperty.AWS_SESSION_TOKEN_EXPIRES_AT_MS,
529+
String.valueOf(EXPIRE_TIME.toEpochMilli()));
511530
}
512531

513532
@ParameterizedTest

0 commit comments

Comments
 (0)