This is an automated email from the ASF dual-hosted git repository.
dimas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new ee7f37017 Allow `PolarisServerManager` implementations to define
custom client headers (#2510)
ee7f37017 is described below
commit ee7f3701750dfed888d5dfe917d8686f9ba140ce
Author: Dmitri Bourlatchkov <[email protected]>
AuthorDate: Mon Sep 8 10:08:41 2025 -0400
Allow `PolarisServerManager` implementations to define custom client
headers (#2510)
`PolarisServerManager` is a plugin point for downstream builds
to define runtime env. for tests under `integration-tests`.
This change allows more flexibility for test runtime environments
by allowing injecting extra headers into test clients.
---
.../polaris/service/it/env/IcebergHelper.java | 2 +-
.../service/it/env/PolarisApiEndpoints.java | 20 ++++++++++++---
.../polaris/service/it/env/PolarisRestApi.java | 3 +--
.../org/apache/polaris/service/it/env/Server.java | 5 ++++
.../it/ext/PolarisIntegrationTestExtension.java | 2 +-
.../it/test/PolarisApplicationIntegrationTest.java | 30 +++++++++-------------
.../service/it/RestCatalogMinIOSpecialIT.java | 2 +-
.../service/it/ApplicationIntegrationTest.java | 6 ++---
8 files changed, 40 insertions(+), 30 deletions(-)
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/IcebergHelper.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/IcebergHelper.java
index 027c68905..480995727 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/IcebergHelper.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/IcebergHelper.java
@@ -39,7 +39,7 @@ public final class IcebergHelper {
.put(CatalogProperties.URI,
endpoints.catalogApiEndpoint().toString())
.put(OAuth2Properties.TOKEN, authToken)
.put("warehouse", catalog)
- .put("header." + endpoints.realmHeaderName(), endpoints.realmId())
+ .putAll(endpoints.extraHeaders("header."))
.putAll(extraProperties);
restCatalog.initialize("polaris", propertiesBuilder.buildKeepingLast());
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisApiEndpoints.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisApiEndpoints.java
index 45fe7809b..78e62bcd2 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisApiEndpoints.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisApiEndpoints.java
@@ -20,6 +20,8 @@ package org.apache.polaris.service.it.env;
import java.io.Serializable;
import java.net.URI;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* This class contains the most fundamental information for accessing Polaris
APIs, such as the base
@@ -30,12 +32,16 @@ public final class PolarisApiEndpoints implements
Serializable {
private final URI baseUri;
private final String realmId;
- private final String realmHeaderName;
+ private final Map<String, String> headers;
public PolarisApiEndpoints(URI baseUri, String realmId, String
realmHeaderName) {
+ this(baseUri, realmId, Map.of(realmHeaderName, realmId));
+ }
+
+ public PolarisApiEndpoints(URI baseUri, String realmId, Map<String, String>
headers) {
this.baseUri = baseUri;
this.realmId = realmId;
- this.realmHeaderName = realmHeaderName;
+ this.headers = headers;
}
public URI catalogApiEndpoint() {
@@ -50,7 +56,13 @@ public final class PolarisApiEndpoints implements
Serializable {
return realmId;
}
- public String realmHeaderName() {
- return realmHeaderName;
+ public Map<String, String> extraHeaders() {
+ return headers;
+ }
+
+ public Map<String, String> extraHeaders(String keyPrefix) {
+ return headers.entrySet().stream()
+ .map(e -> Map.entry(keyPrefix + e.getKey(), e.getValue()))
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
}
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisRestApi.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisRestApi.java
index ddf9e0c50..40222c2b3 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisRestApi.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/PolarisRestApi.java
@@ -39,8 +39,7 @@ public class PolarisRestApi extends RestApi {
}
protected Map<String, String> defaultHeaders() {
- Map<String, String> headers = new HashMap<>();
- headers.put(endpoints.realmHeaderName(), endpoints.realmId());
+ Map<String, String> headers = new HashMap<>(endpoints.extraHeaders());
if (authToken != null) {
headers.put("Authorization", "Bearer " + authToken);
}
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/Server.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/Server.java
index 4fea80070..fea53d891 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/Server.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/Server.java
@@ -19,6 +19,7 @@
package org.apache.polaris.service.it.env;
import java.net.URI;
+import java.util.Map;
/**
* This is a holder for access information to a particular Polaris Server.
Test cases may use only
@@ -37,6 +38,10 @@ public interface Server extends AutoCloseable {
return DEFAULT_REALM_HEADER;
}
+ default Map<String, String> headers() {
+ return Map.of(realmHeaderName(), realmId());
+ }
+
/**
* The base URI to all Polaris APIs (e.g. the common base of the Iceberg
REST API endpoints and
* Polaris Management API endpoints).
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/ext/PolarisIntegrationTestExtension.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/ext/PolarisIntegrationTestExtension.java
index 9031247fc..fd64273e1 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/ext/PolarisIntegrationTestExtension.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/ext/PolarisIntegrationTestExtension.java
@@ -92,7 +92,7 @@ public class PolarisIntegrationTestExtension implements
ParameterResolver {
private Env(Server server) {
this.server = server;
this.endpoints =
- new PolarisApiEndpoints(server.baseUri(), server.realmId(),
server.realmHeaderName());
+ new PolarisApiEndpoints(server.baseUri(), server.realmId(),
server.headers());
}
PolarisApiEndpoints endpoints() {
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
index a7e21427e..87f2c66e5 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
@@ -259,15 +259,12 @@ public class PolarisApplicationIntegrationTest {
RESTSessionCatalog sessionCatalog = new RESTSessionCatalog();
sessionCatalog.initialize(
"polaris_catalog_test",
- Map.of(
- "uri",
- endpoints.catalogApiEndpoint().toString(),
- OAuth2Properties.TOKEN,
- authToken,
- "warehouse",
- catalog,
- "header." + endpoints.realmHeaderName(),
- realm));
+ ImmutableMap.<String, String>builder()
+ .put("uri", endpoints.catalogApiEndpoint().toString())
+ .put(OAuth2Properties.TOKEN, authToken)
+ .put("warehouse", catalog)
+ .putAll(endpoints.extraHeaders("header."))
+ .build());
return sessionCatalog;
}
@@ -590,15 +587,12 @@ public class PolarisApplicationIntegrationTest {
() ->
sessionCatalog.initialize(
"polaris_catalog_test",
- Map.of(
- "uri",
- endpoints.catalogApiEndpoint().toString(),
- OAuth2Properties.TOKEN,
- authToken,
- "warehouse",
- emptyEnvironmentVariable,
- "header." + endpoints.realmHeaderName(),
- realm)))
+ ImmutableMap.<String, String>builder()
+ .put("uri",
endpoints.catalogApiEndpoint().toString())
+ .put(OAuth2Properties.TOKEN, authToken)
+ .put("warehouse", emptyEnvironmentVariable)
+ .putAll(endpoints.extraHeaders("header."))
+ .build()))
.isInstanceOf(BadRequestException.class)
.hasMessage("Malformed request: Please specify a warehouse");
}
diff --git
a/runtime/service/src/intTest/java/org/apache/polaris/service/it/RestCatalogMinIOSpecialIT.java
b/runtime/service/src/intTest/java/org/apache/polaris/service/it/RestCatalogMinIOSpecialIT.java
index 83ddd0c57..80845608d 100644
---
a/runtime/service/src/intTest/java/org/apache/polaris/service/it/RestCatalogMinIOSpecialIT.java
+++
b/runtime/service/src/intTest/java/org/apache/polaris/service/it/RestCatalogMinIOSpecialIT.java
@@ -198,7 +198,7 @@ public class RestCatalogMinIOSpecialIT {
org.apache.iceberg.CatalogProperties.URI,
endpoints.catalogApiEndpoint().toString())
.put(OAuth2Properties.TOKEN, authToken)
.put("warehouse", catalogName)
- .put("header." + endpoints.realmHeaderName(), endpoints.realmId())
+ .putAll(endpoints.extraHeaders("header."))
.put("header.X-Iceberg-Access-Delegation", "vended-credentials");
restCatalog.initialize("polaris", propertiesBuilder.buildKeepingLast());
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/it/ApplicationIntegrationTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/it/ApplicationIntegrationTest.java
index ef3b808d4..b0f27fba5 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/it/ApplicationIntegrationTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/it/ApplicationIntegrationTest.java
@@ -75,7 +75,7 @@ public class ApplicationIntegrationTest extends
PolarisApplicationIntegrationTes
String path = endpoints.catalogApiEndpoint() + "/v1/oauth/tokens";
try (RESTClient client =
HTTPClient.builder(Map.of())
- .withHeader(endpoints.realmHeaderName(), endpoints.realmId())
+ .withHeaders(endpoints.extraHeaders())
.uri(path)
.withAuthSession(AuthSession.EMPTY)
.build()) {
@@ -106,7 +106,7 @@ public class ApplicationIntegrationTest extends
PolarisApplicationIntegrationTes
String path = endpoints.catalogApiEndpoint() + "/v1/oauth/tokens";
try (RESTClient client =
HTTPClient.builder(Map.of())
- .withHeader(endpoints.realmHeaderName(), endpoints.realmId())
+ .withHeaders(endpoints.extraHeaders())
.uri(path)
.withAuthSession(AuthSession.EMPTY)
.build()) {
@@ -147,7 +147,7 @@ public class ApplicationIntegrationTest extends
PolarisApplicationIntegrationTes
String path = endpoints.catalogApiEndpoint() + "/v1/oauth/tokens";
try (RESTClient client =
HTTPClient.builder(Map.of())
- .withHeader(endpoints.realmHeaderName(), endpoints.realmId())
+ .withHeaders(endpoints.extraHeaders())
.uri(path)
.withAuthSession(AuthSession.EMPTY)
.build()) {