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()) {

Reply via email to