Skip to content

Commit eb3e360

Browse files
committed
add refresh credentials property to loadTableResult
1 parent 6647374 commit eb3e360

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ public String genericTables(Namespace ns) {
5757
"polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ns), "generic-tables");
5858
}
5959

60+
public String credentialsPath(TableIdentifier ident) {
61+
return SLASH.join(
62+
"v1",
63+
prefix,
64+
"namespaces",
65+
RESTUtil.encodeNamespace(ident.namespace()),
66+
"tables",
67+
RESTUtil.encodeString(ident.name()),
68+
"credentials");
69+
}
70+
6071
public String genericTable(TableIdentifier ident) {
6172
return SLASH.join(
6273
"polaris",

runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.Set;
3939
import java.util.function.Function;
4040
import org.apache.iceberg.MetadataUpdate;
41+
import org.apache.iceberg.aws.AwsClientProperties;
4142
import org.apache.iceberg.catalog.Namespace;
4243
import org.apache.iceberg.catalog.TableIdentifier;
4344
import org.apache.iceberg.exceptions.BadRequestException;
@@ -71,7 +72,9 @@
7172
import org.apache.polaris.core.persistence.resolver.ResolverFactory;
7273
import org.apache.polaris.core.persistence.resolver.ResolverStatus;
7374
import org.apache.polaris.core.rest.PolarisEndpoints;
75+
import org.apache.polaris.core.rest.PolarisResourcePaths;
7476
import org.apache.polaris.core.secrets.UserSecretsManager;
77+
import org.apache.polaris.core.storage.StorageAccessProperty;
7578
import org.apache.polaris.service.catalog.AccessDelegationMode;
7679
import org.apache.polaris.service.catalog.CatalogPrefixParser;
7780
import org.apache.polaris.service.catalog.api.IcebergRestCatalogApiService;
@@ -420,16 +423,45 @@ public Response loadTable(
420423
.loadTableIfStale(tableIdentifier, ifNoneMatch, snapshots)
421424
.orElseThrow(() -> new WebApplicationException(Response.Status.NOT_MODIFIED));
422425
} else {
423-
response =
426+
LoadTableResponse originalResponse =
424427
catalog
425428
.loadTableWithAccessDelegationIfStale(tableIdentifier, ifNoneMatch, snapshots)
426429
.orElseThrow(() -> new WebApplicationException(Response.Status.NOT_MODIFIED));
430+
431+
if (delegationModes.contains(VENDED_CREDENTIALS)) {
432+
response =
433+
injectRefreshVendedCredentialProperties(
434+
originalResponse,
435+
new PolarisResourcePaths(prefix).credentialsPath(tableIdentifier));
436+
} else {
437+
response = originalResponse;
438+
}
427439
}
428440

429441
return tryInsertETagHeader(Response.ok(response), response, namespace, table).build();
430442
});
431443
}
432444

445+
private LoadTableResponse injectRefreshVendedCredentialProperties(
446+
LoadTableResponse originalResponse, String credentialsEndpoint) {
447+
LoadTableResponse.Builder loadResponseBuilder =
448+
LoadTableResponse.builder().withTableMetadata(originalResponse.tableMetadata());
449+
loadResponseBuilder.addAllConfig(originalResponse.config());
450+
loadResponseBuilder.addAllCredentials(originalResponse.credentials());
451+
loadResponseBuilder.addConfig(
452+
AwsClientProperties.REFRESH_CREDENTIALS_ENDPOINT, credentialsEndpoint);
453+
// Only enable credential refresh for currently supported credential types
454+
if (originalResponse.credentials().stream()
455+
.anyMatch(
456+
credential ->
457+
credential
458+
.config()
459+
.containsKey(StorageAccessProperty.AWS_SECRET_KEY.getPropertyName()))) {
460+
loadResponseBuilder.addConfig(AwsClientProperties.REFRESH_CREDENTIALS_ENABLED, "true");
461+
}
462+
return loadResponseBuilder.build();
463+
}
464+
433465
@Override
434466
public Response tableExists(
435467
String prefix,

0 commit comments

Comments
 (0)