This is an automated email from the ASF dual-hosted git repository.

pingtimeout pushed a commit to branch benchmarks-ppc
in repository https://gitbox.apache.org/repos/asf/polaris-tools.git

commit b6cf1dcd94835af39a4041ada1e4aac8cf60afb5
Author: Pierre Laporte <pie...@pingtimeout.fr>
AuthorDate: Thu Apr 3 13:29:18 2025 +0200

    Update authentication to match that of Dremio+PPC
---
 benchmarks/README.md                               | 20 +++++++---------
 .../src/gatling/resources/benchmark-defaults.conf  | 16 ++++++-------
 .../benchmarks/actions/AuthenticationActions.scala | 26 ++++++++++----------
 .../benchmarks/parameters/BenchmarkConfig.scala    |  6 ++---
 .../parameters/ConnectionParameters.scala          | 28 +++++++++++++++-------
 .../benchmarks/simulations/CreateCommits.scala     | 16 ++++++++-----
 .../benchmarks/simulations/CreateTreeDataset.scala | 20 +++++++++-------
 .../benchmarks/simulations/ReadTreeDataset.scala   | 20 +++++++++-------
 .../simulations/ReadUpdateTreeDataset.scala        | 14 +++++++----
 9 files changed, 95 insertions(+), 71 deletions(-)

diff --git a/benchmarks/README.md b/benchmarks/README.md
index 4622bc1..fa6a27c 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -60,12 +60,12 @@ Connection settings are configured under `http` and `auth`:
 
 ```hocon
 http {
-  base-url = "http://localhost:8181";  # Service URL
+  polaris-base-url = "http://localhost:8181";  # URL to the Polaris server that 
powers PPC
+  dremio-base-url = "http://localhost:9047";   # URL to the Dremio server
 }
 
 auth {
-  client-id = null      # Required: OAuth2 client ID
-  client-secret = null  # Required: OAuth2 client secret
+  dremioPat = null                          # Required: Personal access token 
for Dremio authentication
 }
 ```
 
@@ -90,12 +90,12 @@ To customize the benchmark settings, create your own 
`application.conf` file and
 Example `application.conf`:
 ```hocon
 auth {
-  client-id = "your-client-id"
-  client-secret = "your-client-secret"
+  dremioPat = "your-personal-access-token"
 }
 
 http {
-  base-url = "http://your-polaris-instance:8181";
+  polaris-base-url = "http://your-polaris-instance:8181";
+  dremio-base-url = "http://your-dremio-instance:9047";
 }
 
 workload {
@@ -134,18 +134,16 @@ Reports generated in: 
./benchmarks/build/reports/gatling/<simulation-name>/index
 
 ### Example Polaris server startup
 
-For repeated testing and benchmarking purposes it's convenient to have fixed 
client-ID + client-secret combinations. **The following example is ONLY for 
testing and benchmarking against an airgapped Polaris instance**
+For repeated testing and benchmarking purposes it's convenient to have a 
personal access token ready.
 
 ```bash
-# Start Polaris with the fixed client-ID/secret admin/admin
-# DO NEVER EVER USE THE FOLLOWING FOR ANY NON-AIRGAPPED POLARIS INSTANCE !!
+# Start Polaris with the default configuration
 ./gradlew :polaris-quarkus-server:quarkusBuild &&  java \
-  -Dpolaris.bootstrap.credentials=POLARIS,admin,admin \
   -Djava.security.manager=allow \
   -jar quarkus/server/build/quarkus-app/quarkus-run.jar
 ```
 
-With the above you can run the benchmarks using a configuration file with 
`client-id = "admin"` and `client-secret = "admin"` - meant only for 
convenience in a fully airgapped system.
+After starting the server, generate a personal access token through the Dremio 
UI or API and use it in your `application.conf` file with the `dremioPat` 
property.
 
 # Test Dataset
 
diff --git a/benchmarks/src/gatling/resources/benchmark-defaults.conf 
b/benchmarks/src/gatling/resources/benchmark-defaults.conf
index dced98c..584a4e0 100644
--- a/benchmarks/src/gatling/resources/benchmark-defaults.conf
+++ b/benchmarks/src/gatling/resources/benchmark-defaults.conf
@@ -19,20 +19,20 @@
 
 # HTTP connection settings
 http {
-  # Base URL of the Polaris service
+  # URL to the Polaris server that powers PPC
   # Default: "http://localhost:8181";
-  base-url = "http://localhost:8181";
+  polaris-base-url = "http://localhost:8181";
+
+  # URL to the Dremio server
+  # Default: "http://localhost:9047";
+  dremio-base-url = "http://localhost:9047";
 }
 
 # Authentication settings
 auth {
-  # OAuth2 client ID for authentication
-  # Required: Must be provided in configuration
-  client-id = null
-
-  # OAuth2 client secret for authentication
+  # Personal access token for authentication against the Dremio server
   # Required: Must be provided in configuration
-  client-secret = null
+  dremioPat = null
 }
 
 # Dataset tree structure configuration
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala
index a65d2b8..ecbdfce 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/actions/AuthenticationActions.scala
@@ -51,35 +51,35 @@ case class AuthenticationActions(
 
   /**
    * Creates a Gatling Feeder that provides authentication credentials. The 
feeder continuously
-   * supplies client ID and client secret from the connection parameters for 
use in authentication
+   * supplies the personal access token from the connection parameters for use 
in authentication
    * requests.
    *
-   * @return An iterator providing client credentials
+   * @return An iterator providing authentication credentials
    */
   def feeder(): Feeder[String] = Iterator.continually(
     Map(
-      "clientId" -> cp.clientId,
-      "clientSecret" -> cp.clientSecret
+      "dremioPat" -> cp.dremioPat
     )
   )
 
   /**
-   * Authenticates using client credentials and saves the access token as a 
session attribute. The
-   * credentials are defined in the [[AuthenticationActions.feeder]]. This 
operation performs an
-   * OAuth2 client credentials flow, requesting full principal roles, and 
stores the received access
-   * token in both the Gatling session and the shared AtomicReference.
+   * Authenticates using a personal access token and saves the OAuth token as 
a session attribute.
+   * The Dremio PAT is defined in the [[AuthenticationActions.feeder]].
    *
    * There is no limit to the maximum number of users that can authenticate 
concurrently.
    */
   val authenticateAndSaveAccessToken: ChainBuilder =
     retryOnHttpStatus(maxRetries, retryableHttpCodes, "Authenticate")(
       http("Authenticate")
-        .post("/api/catalog/v1/oauth/tokens")
+        .post("/oauth/token")
         .header("Content-Type", "application/x-www-form-urlencoded")
-        .formParam("grant_type", "client_credentials")
-        .formParam("client_id", "#{clientId}")
-        .formParam("client_secret", "#{clientSecret}")
-        .formParam("scope", "PRINCIPAL_ROLE:ALL")
+        .formParam("grant_type", 
"urn:ietf:params:oauth:grant-type:token-exchange")
+        .formParam(
+          "subject_token_type",
+          "urn:ietf:params:oauth:token-type:dremio:personal-access-token"
+        )
+        .formParam("subject_token", "#{dremioPat}")
+        .formParam("scope", "dremio.all")
         .saveHttpStatusCode()
         .check(status.is(200))
         .check(jsonPath("$.access_token").saveAs("accessToken"))
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/BenchmarkConfig.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/BenchmarkConfig.scala
index 40d841b..fc820ce 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/BenchmarkConfig.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/BenchmarkConfig.scala
@@ -33,9 +33,9 @@ object BenchmarkConfig {
     val workload: Config = config.getConfig("workload")
 
     val connectionParams = ConnectionParameters(
-      auth.getString("client-id"),
-      auth.getString("client-secret"),
-      http.getString("base-url")
+      auth.getString("dremioPat"),
+      http.getString("polaris-base-url"),
+      http.getString("dremio-base-url")
     )
 
     val workloadParams = {
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala
index 67c8cc1..bc61a9e 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/parameters/ConnectionParameters.scala
@@ -22,16 +22,26 @@ package org.apache.polaris.benchmarks.parameters
 /**
  * Case class to hold the connection parameters for the benchmark.
  *
- * @param clientId The client ID for authentication.
- * @param clientSecret The client secret for authentication.
- * @param baseUrl The base URL of the Polaris service.
+ * @param dremioPat The personal access token for authentication against the 
Dremio server.
+ * @param polarisBaseUrl The URL to the Polaris server that powers PPC.
+ * @param dremioBaseUrl The URL to the Dremio server.
  */
-case class ConnectionParameters(clientId: String, clientSecret: String, 
baseUrl: String) {
-  require(clientId != null && clientId.nonEmpty, "Client ID cannot be null or 
empty")
-  require(clientSecret != null && clientSecret.nonEmpty, "Client secret cannot 
be null or empty")
-  require(baseUrl != null && baseUrl.nonEmpty, "Base URL cannot be null or 
empty")
+case class ConnectionParameters(dremioPat: String, polarisBaseUrl: String, 
dremioBaseUrl: String) {
+  require(dremioPat != null && dremioPat.nonEmpty, "Personal access token 
cannot be null or empty")
   require(
-    baseUrl.startsWith("http://";) || baseUrl.startsWith("https://";),
-    "Base URL must start with http:// or https://";
+    polarisBaseUrl != null && polarisBaseUrl.nonEmpty,
+    "Polaris base URL cannot be null or empty"
+  )
+  require(
+    polarisBaseUrl.startsWith("http://";) || 
polarisBaseUrl.startsWith("https://";),
+    "Polaris base URL must start with http:// or https://";
+  )
+  require(
+    dremioBaseUrl != null && dremioBaseUrl.nonEmpty,
+    "Dremio base URL cannot be null or empty"
+  )
+  require(
+    dremioBaseUrl.startsWith("http://";) || 
dremioBaseUrl.startsWith("https://";),
+    "Dremio base URL must start with http:// or https://";
   )
 }
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateCommits.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateCommits.scala
index cd8e7c9..2811cba 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateCommits.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateCommits.scala
@@ -109,8 +109,12 @@ class CreateCommits extends Simulation {
       .feed(viewActions.propertyUpdateFeeder())
       .exec(viewActions.updateView)
 
-  private val httpProtocol = http
-    .baseUrl(cp.baseUrl)
+  private val dremioHttpProtocol = http
+    .baseUrl(cp.dremioBaseUrl)
+    .acceptHeader("application/json")
+    .contentTypeHeader("application/json")
+  private val polarisHttpProtocol = http
+    .baseUrl(cp.polarisBaseUrl)
     .acceptHeader("application/json")
     .contentTypeHeader("application/json")
 
@@ -118,7 +122,7 @@ class CreateCommits extends Simulation {
   private val viewCommitsThroughput = wp.createCommits.viewCommitsThroughput
   private val durationInMinutes = wp.createCommits.durationInMinutes
   setUp(
-    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(httpProtocol),
+    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol),
     waitForAuthentication
       .inject(atOnceUsers(1))
       .andThen(
@@ -126,13 +130,13 @@ class CreateCommits extends Simulation {
           .inject(
             
constantUsersPerSec(tableCommitsThroughput).during(durationInMinutes.minutes)
           )
-          .protocols(httpProtocol),
+          .protocols(polarisHttpProtocol),
         viewUpdateScenario
           .inject(
             
constantUsersPerSec(viewCommitsThroughput).during(durationInMinutes.minutes)
           )
-          .protocols(httpProtocol)
+          .protocols(polarisHttpProtocol)
       )
-      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(httpProtocol))
+      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol))
   )
 }
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala
index 6f39a09..0b41e9e 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/CreateTreeDataset.scala
@@ -145,8 +145,12 @@ class CreateTreeDataset extends Simulation {
   // 
--------------------------------------------------------------------------------
   // Build up the HTTP protocol configuration and set up the simulation
   // 
--------------------------------------------------------------------------------
-  private val httpProtocol = http
-    .baseUrl(cp.baseUrl)
+  private val dremioHttpProtocol = http
+    .baseUrl(cp.dremioBaseUrl)
+    .acceptHeader("application/json")
+    .contentTypeHeader("application/json")
+  private val polarisHttpProtocol = http
+    .baseUrl(cp.polarisBaseUrl)
     .acceptHeader("application/json")
     .contentTypeHeader("application/json")
     .disableCaching
@@ -156,20 +160,20 @@ class CreateTreeDataset extends Simulation {
   private val viewThroughput = wp.createTreeDataset.viewThroughput
 
   setUp(
-    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(httpProtocol),
+    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol),
     waitForAuthentication
       .inject(atOnceUsers(1))
-      .andThen(createCatalogs.inject(atOnceUsers(1)).protocols(httpProtocol))
+      
.andThen(createCatalogs.inject(atOnceUsers(1)).protocols(polarisHttpProtocol))
       .andThen(
         createNamespaces
           .inject(
             constantUsersPerSec(1).during(1.seconds),
             constantUsersPerSec(dp.nsWidth - 1).during(dp.nsDepth.seconds)
           )
-          .protocols(httpProtocol)
+          .protocols(polarisHttpProtocol)
       )
-      
.andThen(createTables.inject(atOnceUsers(tableThroughput)).protocols(httpProtocol))
-      
.andThen(createViews.inject(atOnceUsers(viewThroughput)).protocols(httpProtocol))
-      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(httpProtocol))
+      
.andThen(createTables.inject(atOnceUsers(tableThroughput)).protocols(polarisHttpProtocol))
+      
.andThen(createViews.inject(atOnceUsers(viewThroughput)).protocols(polarisHttpProtocol))
+      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol))
   )
 }
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala
index 379f6e3..0f78e7e 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadTreeDataset.scala
@@ -148,8 +148,12 @@ class ReadTreeDataset extends Simulation {
   // 
--------------------------------------------------------------------------------
   // Build up the HTTP protocol configuration and set up the simulation
   // 
--------------------------------------------------------------------------------
-  private val httpProtocol = http
-    .baseUrl(cp.baseUrl)
+  private val dremioHttpProtocol = http
+    .baseUrl(cp.dremioBaseUrl)
+    .acceptHeader("application/json")
+    .contentTypeHeader("application/json")
+  private val polarisHttpProtocol = http
+    .baseUrl(cp.polarisBaseUrl)
     .acceptHeader("application/json")
     .contentTypeHeader("application/json")
     .disableCaching
@@ -160,13 +164,13 @@ class ReadTreeDataset extends Simulation {
   private val viewThroughput = wp.readTreeDataset.viewThroughput
 
   setUp(
-    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(httpProtocol),
+    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol),
     waitForAuthentication
       .inject(atOnceUsers(1))
-      .andThen(verifyCatalogs.inject(atOnceUsers(1)).protocols(httpProtocol))
-      
.andThen(verifyNamespaces.inject(atOnceUsers(namespaceThroughput)).protocols(httpProtocol))
-      
.andThen(verifyTables.inject(atOnceUsers(tableThroughput)).protocols(httpProtocol))
-      
.andThen(verifyViews.inject(atOnceUsers(viewThroughput)).protocols(httpProtocol))
-      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(httpProtocol))
+      
.andThen(verifyCatalogs.inject(atOnceUsers(1)).protocols(polarisHttpProtocol))
+      
.andThen(verifyNamespaces.inject(atOnceUsers(namespaceThroughput)).protocols(polarisHttpProtocol))
+      
.andThen(verifyTables.inject(atOnceUsers(tableThroughput)).protocols(polarisHttpProtocol))
+      
.andThen(verifyViews.inject(atOnceUsers(viewThroughput)).protocols(polarisHttpProtocol))
+      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol))
   )
 }
diff --git 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala
 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala
index 2304920..c205b0d 100644
--- 
a/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala
+++ 
b/benchmarks/src/gatling/scala/org/apache/polaris/benchmarks/simulations/ReadUpdateTreeDataset.scala
@@ -137,8 +137,12 @@ class ReadUpdateTreeDataset extends Simulation {
   // 
--------------------------------------------------------------------------------
   // Build up the HTTP protocol configuration and set up the simulation
   // 
--------------------------------------------------------------------------------
-  private val httpProtocol = http
-    .baseUrl(cp.baseUrl)
+  private val dremioHttpProtocol = http
+    .baseUrl(cp.dremioBaseUrl)
+    .acceptHeader("application/json")
+    .contentTypeHeader("application/json")
+  private val polarisHttpProtocol = http
+    .baseUrl(cp.polarisBaseUrl)
     .acceptHeader("application/json")
     .contentTypeHeader("application/json")
     .disableCaching
@@ -148,7 +152,7 @@ class ReadUpdateTreeDataset extends Simulation {
   private val durationInMinutes = wp.readUpdateTreeDataset.durationInMinutes
 
   setUp(
-    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(httpProtocol),
+    
continuouslyRefreshOauthToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol),
     waitForAuthentication
       .inject(atOnceUsers(1))
       .andThen(
@@ -156,8 +160,8 @@ class ReadUpdateTreeDataset extends Simulation {
           .inject(
             
constantUsersPerSec(throughput).during(durationInMinutes.minutes).randomized
           )
-          .protocols(httpProtocol)
+          .protocols(polarisHttpProtocol)
       )
-      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(httpProtocol))
+      
.andThen(stopRefreshingToken.inject(atOnceUsers(1)).protocols(dremioHttpProtocol))
   )
 }

Reply via email to