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

kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new cb625c54f0 GH-48068: [C++][FlightRPC] Linux ODBC: Configure Dremio 
instance to allow remote testing (#49695)
cb625c54f0 is described below

commit cb625c54f0541d5929a9463694d8cd4addf4bd0b
Author: Alina (Xi) Li <[email protected]>
AuthorDate: Mon Jun 15 17:35:47 2026 -0700

    GH-48068: [C++][FlightRPC] Linux ODBC: Configure Dremio instance to allow 
remote testing (#49695)
    
    ### Rationale for this change
    
    The goal is to run remote tests against the Dremio instance on 
Ubuntu-latest runner, as Dremio docker instances are only available on Linux 
and they are not supported on macOS/Windows GitHub Actions.
    
    ### What changes are included in this PR?
    
    - Added `dremio` to `compose.yaml`.
    - Added logic for setting up dremio account and creating a table in 
`cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh`.
    - Add ODBC remote test connection variable `ARROW_FLIGHT_SQL_ODBC_CONN`.
    - set up Dremio remote instance in CI
    
    Note: This PR prepares the Dremio instance for remote testing, which is 
activated using `ARROW_FLIGHT_SQL_ODBC_CONN={..., HOST=dremio`.
    
    ### Are these changes tested?
    
    Tested in CI at local repository.
    
    ### Are there any user-facing changes?
    N/A
    
    * GitHub Issue: #48068
    
    Lead-authored-by: justing-bq <[email protected]>
    Co-authored-by: Alina (Xi) Li <[email protected]>
    Co-authored-by: justing-bq <[email protected]>
    Signed-off-by: Sutou Kouhei <[email protected]>
---
 .github/workflows/cpp_extra.yml                    |  14 ++-
 .pre-commit-config.yaml                            |   1 +
 compose.yaml                                       |  20 +++
 .../odbc/tests/dremio/set_up_dremio_instance.sh    | 134 +++++++++++++++++++++
 4 files changed, 164 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml
index e14d4c7660..622cf8d1a7 100644
--- a/.github/workflows/cpp_extra.yml
+++ b/.github/workflows/cpp_extra.yml
@@ -394,17 +394,21 @@ jobs:
           persist-credentials: false
           fetch-depth: 0
           submodules: recursive
-      - name: Restore Docker Volumes
-        uses: 
apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53
-        with:
-          path: .docker
-          key: ubuntu-cpp-odbc
       - name: Setup Python on hosted runner
         uses: actions/setup-python@v6
         with:
           python-version: 3
       - name: Setup Archery
         run: python3 -m pip install -e dev/archery[docker]
+      - name: Set Up Dremio Instance
+        run: |
+          docker compose up -d dremio
+          cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh
+      - name: Restore Docker Volumes
+        uses: 
apache/infrastructure-actions/stash/restore@0ba14156c9f4c3cfbe4b0c9f36339ab0f8d81e53
+        with:
+          path: .docker
+          key: ubuntu-cpp-odbc
       - name: Execute Docker Build
         env:
           ARCHERY_DOCKER_USER: ${{ secrets.DOCKERHUB_USER }}
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e7cf88b16c..a9513a9309 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -350,6 +350,7 @@ repos:
           ?^cpp/src/arrow/flight/sql/odbc/install/mac/postinstall$|
           ?^cpp/src/arrow/flight/sql/odbc/install/unix/install_odbc\.sh$|
           ?^cpp/src/arrow/flight/sql/odbc/install/unix/install_odbc_ini\.sh$|
+          
?^cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance\.sh$|
           ?^dev/release/05-binary-upload\.sh$|
           ?^dev/release/07-flightsqlodbc-upload\.sh$|
           ?^dev/release/09-binary-verify\.sh$|
diff --git a/compose.yaml b/compose.yaml
index c13bd831ec..119a8fc589 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -135,6 +135,7 @@ x-hierarchy:
       - debian-ruby
     - debian-python:
       - debian-docs
+  - dremio
   - fedora-cpp:
     - fedora-python
   - fedora-r-clang
@@ -372,6 +373,21 @@ services:
         /arrow/ci/scripts/cpp_build.sh /arrow /build &&
         /arrow/ci/scripts/cpp_test.sh /arrow /build"
 
+  dremio:
+    platform: linux/x86_64
+    image: dremio/dremio-oss:26.0.0
+    ports:
+      - 9047:9047  # REST API
+      - 31010:31010  # JDBC/ODBC
+      - 32010:32010
+    environment:
+      - "DREMIO_JAVA_SERVER_EXTRA_OPTS=-Dsaffron.default.charset=UTF-8 
-Dsaffron.default.nationalcharset=UTF-8 
-Dsaffron.default.collation.name=UTF-8$$en_US"
+    healthcheck:
+      test: curl --fail http://localhost:9047
+      interval: 10s
+      timeout: 5s
+      retries: 30
+
   ubuntu-cpp: &ubuntu-cpp-base
     # Usage:
     #   docker compose build ubuntu-cpp
@@ -510,6 +526,7 @@ services:
       ARROW_DEPENDENCY_SOURCE: BUNDLED
       ARROW_DEPENDENCY_USE_SHARED: "OFF"
       ARROW_FLIGHT_SQL_ODBC: "ON"
+      ARROW_FLIGHT_SQL_ODBC_CONN: "driver={Apache Arrow Flight SQL ODBC 
Driver};HOST=dremio;port=32010;pwd=admin2025;uid=admin;useEncryption=false;UseWideChar=true;"
       ARROW_GANDIVA: "OFF"
       ARROW_GCS: "OFF"
       ARROW_HDFS: "OFF"
@@ -518,6 +535,9 @@ services:
       ARROW_S3: "OFF"
       ARROW_SUBSTRAIT: "OFF"
     # Register ODBC before running tests
+    depends_on:
+      dremio:
+         condition: service_healthy
     command: >
       /bin/bash -c "
         /arrow/ci/scripts/cpp_build.sh /arrow /build &&
diff --git 
a/cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh 
b/cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh
new file mode 100755
index 0000000000..dd9868e05c
--- /dev/null
+++ b/cpp/src/arrow/flight/sql/odbc/tests/dremio/set_up_dremio_instance.sh
@@ -0,0 +1,134 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+set -euo pipefail
+
+HOST_URL="http://localhost:9047";
+NEW_USER_URL="$HOST_URL/apiv2/bootstrap/firstuser"
+LOGIN_URL="$HOST_URL/apiv2/login"
+SQL_URL="$HOST_URL/api/v3/sql"
+
+ADMIN_USER="admin"
+ADMIN_PASSWORD="admin2025"
+
+MAX_WAIT_ATTEMPTS=60
+WAIT_INTERVAL_SECONDS=5
+
+# Wait for Dremio to be available.
+attempt=1
+until status_code="$(
+    curl --silent \
+         --output /dev/null \
+         --write-out '%{http_code}' \
+         "$NEW_USER_URL"
+)"; [[ "$status_code" == "200" || "$status_code" == "404" || "$status_code" == 
"405" ]]; do
+
+    if [[ "$attempt" -ge "$MAX_WAIT_ATTEMPTS" ]]; then
+        echo "Timed out waiting for Dremio to start." >&2
+        exit 1
+    fi
+
+    echo "Waiting for Dremio to start... HTTP $status_code"
+    attempt=$((attempt + 1))
+    sleep "$WAIT_INTERVAL_SECONDS"
+done
+
+echo ""
+echo "Creating admin user..."
+
+# Create new admin account.
+curl --fail --silent --show-error \
+     -X PUT "$NEW_USER_URL" \
+     -H "Content-Type: application/json" \
+     -d "$(python3 - <<EOF
+import json
+print(json.dumps({
+    "userName": "$ADMIN_USER",
+    "password": "$ADMIN_PASSWORD"
+}))
+EOF
+)"
+
+echo ""
+echo "Created admin user."
+
+echo "Logging in as admin user..."
+
+# Login and capture response body.
+LOGIN_RESPONSE="$(curl --fail --silent --show-error \
+     -X POST "$LOGIN_URL" \
+     -H "Content-Type: application/json" \
+     -d "$(python3 - <<EOF
+import json
+print(json.dumps({
+    "userName": "$ADMIN_USER",
+    "password": "$ADMIN_PASSWORD"
+}))
+EOF
+)")"
+
+# Extract token safely using Python JSON parsing.
+TOKEN="$(python3 - <<EOF
+import json
+import sys
+
+try:
+    response = json.loads("""$LOGIN_RESPONSE""")
+except json.JSONDecodeError as exc:
+    print(f"Failed to parse login response JSON: {exc}", file=sys.stderr)
+    sys.exit(1)
+
+token = response.get("token")
+
+if not token:
+    print("Login response did not contain a token.", file=sys.stderr)
+    sys.exit(1)
+
+print(token)
+EOF
+)"
+
+SQL_QUERY="
+Create Table \$scratch.ODBCTest As
+  SELECT CAST(2147483647 AS INTEGER) AS sinteger_max,
+         CAST(9223372036854775807 AS BIGINT) AS sbigint_max,
+         CAST(999999999 AS DECIMAL(38,0)) AS decimal_positive,
+         CAST(3.40282347E38 AS FLOAT) AS float_max,
+         CAST(1.7976931348623157E308 AS DOUBLE) AS double_max,
+         CAST(true AS BOOLEAN) AS bit_true,
+         CAST(DATE '9999-12-31' AS DATE) AS date_max,
+         CAST(TIME '23:59:59' AS TIME) AS time_max,
+         CAST(TIMESTAMP '9999-12-31 23:59:59' AS TIMESTAMP) AS timestamp_max;
+"
+
+echo "Creating \$scratch.ODBCTest table."
+
+# Create a new table by sending a SQL query.
+curl --fail --silent --show-error \
+     -X POST "$SQL_URL" \
+     -H "Authorization: _dremio$TOKEN" \
+     -H "Content-Type: application/json" \
+     -d "$(python3 - <<EOF
+import json
+print(json.dumps({"sql": """$SQL_QUERY"""}))
+EOF
+)"
+
+echo ""
+echo "Finished setting up dremio docker instance."

Reply via email to