Skip to content

ci: use UC REST API for schema create/drop in Reyden nightly#505

Open
eric-wang-1990 wants to merge 19 commits into
mainfrom
ci/reyden-rest-nightly
Open

ci: use UC REST API for schema create/drop in Reyden nightly#505
eric-wang-1990 wants to merge 19 commits into
mainfrom
ci/reyden-rest-nightly

Conversation

@eric-wang-1990

Copy link
Copy Markdown
Collaborator

Summary

  • Fixes the Reyden REST nightly run (introduced in ci: add Reyden REST nightly E2E workflow #504) which failed immediately on Provision per-run schema with [USER_ERROR] Unsupported CREATE type: SCHEMA
  • Reyden warehouse rejects DDL via the SQL statement API; switch to the Unity Catalog REST API (/api/2.1/unity-catalog/schemas) for both schema creation and deletion
  • Seed step is unchanged — it only runs CREATE TABLE / INSERT DML which Reyden does support

Test plan

  • Trigger reyden-rest-nightly via workflow_dispatch after merge to verify schema is created and tests run

Fixes first-run failure from #504.


This PR was created with GitHub MCP.

Reyden warehouse rejects CREATE/DROP SCHEMA via the SQL statement API
("Unsupported CREATE type: SCHEMA"). Switch to the Unity Catalog REST
API (/api/2.1/unity-catalog/schemas) for both provision and cleanup.
@eric-wang-1990 eric-wang-1990 force-pushed the ci/reyden-rest-nightly branch from cbac8d3 to e3903a3 Compare June 2, 2026 01:20
eric-wang-1990 and others added 18 commits June 2, 2026 01:29
Reyden does not support DDL. Remove the per-run schema create/seed/drop
steps and point the nightly at the pre-existing main.adbc_testing schema
instead.
Reyden does not support any DDL (CREATE/DROP schema/table). Split the
two concerns: SETUP_HTTP_PATH (TEST_PECO_WAREHOUSE_HTTP_PATH) handles
schema provision, seeding, and cleanup; DATABRICKS_HTTP_PATH
(TEST_PECO_REYDEN_HTTP_PATH) is used only in the test connection config.
Add workflow_call to e2e-tests.yml with an optional execution_http_path
secret. Setup/teardown always use TEST_PECO_WAREHOUSE_HTTP_PATH (supports
DDL); test execution uses execution_http_path when provided, falling back
to the same regular warehouse.

reyden-rest-nightly.yml is now a 10-line wrapper that calls e2e-tests.yml
with protocol=rest and TEST_PECO_REYDEN_HTTP_PATH as the execution path.
Replace explicit secret passing (which dropped DATABRICKS_HOST and
credentials) with secrets: inherit. Control Reyden routing via a
boolean input use_reyden_for_execution instead of a passed secret.
Add e2e_only boolean input to e2e-tests.yml workflow_call. When true,
passes --filter FullyQualifiedName!~Tests.Unit to dotnet test, skipping
the bulk of unit tests. The test script now forwards extra args to
dotnet test via ${@:2}.

Set e2e_only: true in reyden-rest-nightly.yml.
Reyden supports SELECT and INSERT but not CREATE TABLE, DROP TABLE,
UPDATE, DELETE, SHOW COLUMNS, KEY type (SHOW PRIMARY KEYS/CROSS
REFERENCES), or bare SET statements. Add isReadOnly and mutableTable
config flags to gate tests appropriately:

- Seed step provisions adbc_testing_mutable via the regular warehouse
  so INSERT tests have a pre-existing table to write into on Reyden
- isReadOnly=true skips DDL-based and unsupported-metadata tests
- INSERT tests route to the pre-provisioned table when isReadOnly;
  unique IDs + WHERE clause isolate rows across parallel runs
- UPDATE and DELETE tests skip entirely under isReadOnly
- TestServerSidePropertyOnSeaPath skips (bare SET not supported)

Closes #505
xUnit1024 errors on CanInteractUsingSetOptions and CanGetColumns because
xUnit does not allow same-named methods in an inheritance chain. The new
keyword is intentional here — we need to intercept the inherited tests
to add Skip.If guards for Reyden. Suppress the analyzer error with
pragma around both methods.
Adds an append-only history dashboard for the Reyden REST nightly E2E run,
served from the existing gh-pages branch at
https://adbc-drivers.github.io/databricks/e2e-nightly/.

- parse-trx-to-json.py: TRX -> per-run JSON with totals, pass rate, and a
  coarse failure "signature" per failure (404 warehouse, read-only write
  rejected, assertion mismatch, ...) so 100+ failures group into a few causes.
- update-e2e-dashboard.py: merges each run into e2e-nightly/data/runs.json
  (keyed by run+protocol, capped history) and writes full per-run detail.
- e2e-dashboard/index.html: static page with summary cards, a Chart.js
  pass/fail/skip trend + pass-rate line, latest-run failure analysis, and a
  clickable run-history table that lazy-loads each run's failures.
- e2e-tests.yml: emit + upload a TRX; new opt-in publish_dashboard input and
  a publish-dashboard job that runs always() so failed runs are still recorded.
- reyden-rest-nightly.yml: opt in (publish_dashboard) and grant contents:write.

Co-authored-by: Isaac
## What

The raw pass-rate on the SEA/Reyden nightly (~61% on the latest run) is
dominated by **expected** failures — unsupported DDL/types, no Thrift
endpoint on a SEA-only warehouse, no CloudFetch — which buries the
genuine driver bugs. This adds a coarse **root-cause category** on top
of the existing per-failure signature so the dashboard separates
expected noise from the real backlog.

On the latest run (127 failures) the split is **51 expected Reyden gaps
/ 76 real issues**.

## How it classifies

Classification follows the failing step, which the message already
encodes:
- A test with a `CREATE TABLE/SCHEMA` step Reyden can't run fails **at
that step** with an `Unsupported …` message → **Reyden capability gap
(expected)**.
- A value/cast mismatch means setup succeeded and the
`INSERT→SELECT→DELETE` round-trip returned wrong data → **Real issue**
(e.g. a SEA-path serialization difference).
- Missing warehouse / read-only / auth / timeout / transport →
**Environment / infra**.

## Changes

- **`parse-trx-to-json.py`**: refined `signature_for()` (Thrift-on-SEA,
CloudFetch, unsupported-feature buckets; `PARSE_SYNTAX_ERROR` ordered
before the broad assertion bucket), added `category_for()` + per-failure
`category` + a `by_category` rollup.
- **`update-e2e-dashboard.py`**: propagate `by_category` into the
`runs.json` summary row.
- **`index.html`**: "By root-cause category" rollup with a color-coded
legend, and failure detail grouped by category → signature. Degrades
gracefully for older runs without `by_category`.

Validated against the latest run's data and syntax-checked (`py_compile`
+ `node --check`).

This pull request and its description were written by Isaac.
)

## What

Adds the per-error granularity requested for the E2E nightly dashboard.

- **Splits** the single `Reyden unsupported feature` signature into the
specific errors so each gap shows its own count: `Unsupported statement:
SHOW COLUMNS` (13), `Unsupported CREATE type: SCHEMA` (4), `Unsupported
feature: CREATE OR REPLACE TABLE` (2), `Unsupported type: INTERVAL` (2),
plus a generic fallback. All map to the **Reyden capability gap**
category.
- **Dashboard**: replaces the flat signature/class tables with a **"By
error (root cause)"** table — `Category | Error | Count | What it is |
Tests` — where "What it is" is a plain-language description
(`SIGNATURE_DESCRIPTIONS`) and "Tests" lists the affected
`Class.Method`s (from the run detail file).

## Changes
- `.github/scripts/parse-trx-to-json.py` — `signature_for` splits the
unsupported bucket; `_SIGNATURE_CATEGORY` maps the new signatures to the
gap category (old combined signature kept for back-compat).
- `.github/e2e-dashboard/index.html` — `SIGNATURE_DESCRIPTIONS` +
`sigDetailTable()`; `renderAnalysis` now fetches the run detail and
renders the per-error table.

## Verification
Generated the dashboard locally from the latest run's data
(re-classified) and rendered it in a browser — the split, descriptions,
and test lists display correctly. Scripts `py_compile` clean and the
dashboard JS passes `node --check`.

This pull request and its description were written by Isaac.
Drops the csharp/test/E2E/* edits introduced by the Reyden read-only
adaptation (commit 167e356) and restores them to origin/main. Per PR #505
review the E2E test edits should not ship as part of the Reyden nightly
infrastructure PR — they belong in a separate change that proposes a
read-only-warehouse-aware test model independently.

Files restored from origin/main:
  csharp/test/E2E/DatabricksTestConfiguration.cs
  csharp/test/E2E/ServerSidePropertyE2ETest.cs
  csharp/test/E2E/StatementExecution/StatementExecutionDriverE2ETests.cs
  csharp/test/E2E/StatementTests.cs

Non-E2E commits (workflow plumbing, classifier, dashboard, etc.) are
unaffected.

Co-authored-by: Isaac
The "make e2e-tests callable + Reyden nightly as thin wrapper" refactor
(ce48179) leaked Reyden-specific routing (use_reyden_for_execution,
EXECUTION_HTTP_PATH, CREATE TABLE adbc_testing_mutable, isReadOnly /
mutableTable connection.json fields, the publish-dashboard job, …) into
the generic e2e-tests workflow. With the C# read-only test adaptation
reverted in 37243c5 those knobs no longer have a consumer, leaving
e2e-tests.yml carrying dead Reyden code on every PR run.

This commit moves all Reyden-specific scaffolding out of e2e-tests.yml
and back into reyden-rest-nightly.yml as a self-contained workflow:

- e2e-tests.yml restored byte-for-byte to origin/main (no workflow_call,
  no Reyden routing, no dashboard, no TRX upload, no e2e_only filter).
- reyden-rest-nightly.yml rebuilt from the pre-refactor 6a9501f version
  with the additions that lived briefly in e2e-tests.yml:
  - CREATE TABLE adbc_testing_mutable in the seed step (Reyden supports
    INSERT but not CREATE TABLE).
  - isReadOnly / mutableTable fields in the generated connection.json.
  - --filter FullyQualifiedName!~Tests.Unit on the test invocation
    (nightly only runs E2E).
  - TRX logger + upload-artifact step.
  - publish-dashboard job that parses TRX and pushes to gh-pages
    (RUN_READ_ONLY is hard-coded 'true' since this workflow always
    exercises the read-only Reyden warehouse).
  - permissions: contents: write at workflow scope for the gh-pages push.

Helper scripts (.github/scripts/parse-trx-to-json.py,
.github/scripts/update-e2e-dashboard.py) and .github/e2e-dashboard/
index.html are unchanged; the consolidated publish-dashboard job calls
them in place.

Trade-off accepted: ~180 lines of duplication between the two workflow
files. Justified because Reyden's needs (split setup/execution
warehouses, pre-created mutable table, read-only-tagged dashboard) don't
fit a generic e2e-tests parameterization cleanly, and the called-workflow
extensibility model GitHub Actions provides is too limited for the kind
of hooks Reyden would need.

Co-authored-by: Isaac
The "By error (root cause)" table capped the Tests column at 8 names and
showed a static "+N more". Turn that into a clickable toggle that expands
the full deduped test list and collapses back to "show fewer".

Co-authored-by: Isaac
Three failure modes are confirmed Reyden backend limitations, not driver
bugs, but the categorizer was filing two of them under "Real issue / to
investigate" via the generic value-mismatch bucket:

- rows_affected = -1 on INSERT/UPDATE (known Reyden bug) — surfaced as
  "Expected: 1 / Actual: -1"
- no hive_metastore catalog — surfaced as Expected "hive_metastore" /
  Actual "main"

Add two specific signatures ahead of the generic assertion bucket and map
them to CAT_REYDEN_GAP. (SHOW COLUMNS and PK/FK metadata were already
classified as gaps.) On the latest run this moves 71 failures out of
"Real issue" (80 -> 9), leaving only genuine driver-side items
(syntax error, col_0 alias, AfterInsert 2/0, cast mismatch).

Co-authored-by: Isaac
The "Real issue / to investigate" bucket now contains only the confirmed
Reyden SEA backend bugs filed under Epic SC-222102, each given its own
signature:
- SHOW SCHEMAS/TABLES IN ALL CATALOGS rejected (SC-233357)
- bare SET rejected (SC-233354)
- result schema omits column aliases / col_0 (SC-233356)
- ANSI strict-cast on heterogeneous ARRAY/MAP (SC-233355)

Generic value-mismatch and DML/DDL-rejected are remapped to the expected
Reyden capability-gap bucket (e.g. the non-reproducible write-not-persisted
case), since on this Reyden-only nightly everything outside the four tracked
bugs is a known limitation. Latest run: Real 9 -> 8 (4 tracked defects),
gaps 107 -> 108.

Co-authored-by: Isaac
The known Reyden rows_affected=-1 backend bug now has a tracking ticket;
surface it in the signature description. Stays in the expected-gap bucket.

Co-authored-by: Isaac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant