Use X-Databricks-Workspace-Id for workspace routing#1688
Merged
Divyansh-db merged 6 commits intoMay 28, 2026
Conversation
Regenerated from the gosdkv0 template change in databricks-eng/universe#1955306, which renames the workspace routing header emitted on SPOG/unified-host requests from `X-Databricks-Org-Id` to `X-Databricks-Workspace-Id`. This is the M1 piece of the "DECO + Unified Workspace Addressing" initiative. The diff is mechanical: 944 swaps across 34 generated files, no behavioral change. The value still comes from `Config.WorkspaceID` and emission is still gated on the operation being workspace-scoped (`!Service.IsAccounts`). Co-authored-by: Isaac Signed-off-by: Divyansh Vijayvergia <divyansh.vijayvergia@databricks.com>
Companion to the regenerated code: the generator only touched the OpenAPI-spec backed `service/*/impl.go` files. This change updates the hand-written sites that emit or parse the same SPOG routing header on workspace-scoped API calls: - `service/iam/ext_impl.go`, `service/sharing/ext_api.go`, `service/workspace/ext_utilities.go`: swap `X-Databricks-Org-Id` → `X-Databricks-Workspace-Id` in the manually-written header injection (these files extend generated services with hand-written endpoints/wrappers and weren't covered by the codegen pass). - `workspace_functions.go`: `CurrentWorkspaceID` now sends and reads the new header on `/api/2.0/preview/scim/v2/Me`; doc comments updated. - `workspace_functions_test.go`: tests assert the new header name; function names renamed (`OrgIdHeader` → `WorkspaceIdHeader`) so the test names reflect what they cover. - `config/config.go`: widen the `WorkspaceID` doc comment to note the value can now be a classic numeric workspace ID *or* a CPDR connection ID (the server disambiguates). Field name, type, and env var (`DATABRICKS_WORKSPACE_ID`) unchanged. - `NEXT_CHANGELOG.md`: entry under Internal Changes. POPP keeps accepting the legacy `X-Databricks-Org-Id` for rollback safety, so this is safe to land any time after M0 platform support is fully rolled out. Co-authored-by: Isaac Signed-off-by: Divyansh Vijayvergia <divyansh.vijayvergia@databricks.com>
End-to-end testing against the staging shard confirmed that the server still echoes the legacy `X-Databricks-Org-Id` response header on /api/2.0/preview/scim/v2/Me even when the request is made with the new `X-Databricks-Workspace-Id` header. The response side of the migration is on a separate, later schedule. This is request-side asymmetric now: send `X-Databricks-Workspace-Id`, read back from `X-Databricks-Org-Id`. Updated the comments and test fakes to reflect that. If we kept reading the new response header, `CurrentWorkspaceID` would return (0, ParseIntError) for every caller hitting a server that hasn't renamed its echo yet. Co-authored-by: Isaac Signed-off-by: Divyansh Vijayvergia <divyansh.vijayvergia@databricks.com>
After merging latest main, six auto-codegen PRs (#1689, #1691, #1692, #1694, #1695, #1696) re-introduced the legacy `X-Databricks-Org-Id` request header in code generated against the still-unflipped gosdkv0 template. Affected: - service/bundle/ (brand-new service, 14 occurrences) - service/dashboards/impl.go:733 (new method) - service/postgres/impl.go:625 (new method) Mechanically swap these 16 lines so the branch's request-side migration is internally consistent. Once the upstream generator template change lands and the next auto-codegen PR runs, this manual patch will be a no-op against the freshly-regenerated output. Co-authored-by: Isaac Signed-off-by: Divyansh Vijayvergia <divyansh.vijayvergia@databricks.com>
67b5775 to
abede5d
Compare
hectorcast-db
approved these changes
May 26, 2026
abede5d to
7248519
Compare
Hooks a capturing http.RoundTripper into a workspace client built against a
unified (SPOG) host and verifies what crosses the wire:
1. SDK sends X-Databricks-Workspace-Id with Config.WorkspaceID on the
request and no longer sends the legacy X-Databricks-Org-Id.
2. Server still echoes the workspace ID on the legacy X-Databricks-Org-Id
response header — which is why workspace_functions.go reads that name.
3. The workspace-scoped /api/2.0/preview/scim/v2/Me call succeeds against
the unified host gateway.
Targets the workspace test environment. Requires UNIFIED_HOST,
THIS_WORKSPACE_ID, TEST_ACCOUNT_ID, DATABRICKS_CLIENT_ID, and
DATABRICKS_CLIENT_SECRET, and skips if TEST_ENVIRONMENT_TYPE is set to
anything other than WORKSPACE / UC_WORKSPACE.
Co-authored-by: Isaac
Signed-off-by: Divyansh Vijayvergia <divyansh.vijayvergia@databricks.com>
7248519 to
60e716c
Compare
7eb0c2c to
60e716c
Compare
|
If integration tests don't run automatically, an authorized user can run them manually by following the instructions below: Trigger: Inputs:
Checks will be approved automatically on success. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Workspace-scoped API calls now identify the target workspace via the
X-Databricks-Workspace-Idrequest header instead ofX-Databricks-Org-Id. The value source is unchanged: it still comes fromConfig.WorkspaceID(or theDATABRICKS_WORKSPACE_IDenvironment variable). The response-side header read inCurrentWorkspaceIDis left on the legacy name for now. A newCurrentWorkspaceIdentifierhelper is added to support workspace identifier formats other than classic numeric IDs.Why
On unified Databricks hosts that serve multiple workspaces, the SDK sends a routing header on every workspace-scoped HTTP request so the gateway can dispatch it to the correct workspace. Until now that header was
X-Databricks-Org-Id.The Databricks platform is consolidating workspace addressing onto a single header,
X-Databricks-Workspace-Id, which accepts a broader range of workspace identifier formats and replaces the older single-purpose channels going forward. The previous header continues to be accepted by the platform, so older SDK versions keep working, but new SDK versions should use the new name.This PR is the Go SDK's part of that migration on the request side. The platform's response-side echo header has not yet been renamed, so the SDK continues to read the workspace ID back from the legacy
X-Databricks-Org-Idresponse header.What changed
Interface changes
WorkspaceClient.CurrentWorkspaceIdentifier(ctx context.Context) (string, error)— returns the workspace identifier exactly as the server echoes it back, without attempting to parse it as a number. Use this in preference toCurrentWorkspaceIDif your code may run against workspaces whose identifier is not a classic numeric ID.Config.WorkspaceIDkeeps the same field name, type (string), and environment variable (DATABRICKS_WORKSPACE_ID). The doc comment is widened to note that the value may now be either a classic numeric workspace ID or another workspace identifier format that the server understands.CurrentWorkspaceID(ctx) (int64, error)is unchanged signature-wise but is now a thinParseIntadapter overCurrentWorkspaceIdentifier. Existing callers keep working byte-for-byte against classic numeric workspaces; for non-numeric identifiers it returns the parse error fromstrconv.ParseInt.Behavioral changes
X-Databricks-Org-Id. They now sendX-Databricks-Workspace-Id(with the same value, gated onConfig.WorkspaceIDbeing non-empty). Account-scoped requests are unaffected.WorkspaceClient.CurrentWorkspaceIDand the newCurrentWorkspaceIdentifiersendX-Databricks-Workspace-Idas the routing header and read the workspace ID back from the legacyX-Databricks-Org-Idresponse header on/api/2.0/preview/scim/v2/Me— the server still emits the legacy name on responses, and the response-side migration is on a separate, later schedule.Internal changes
service/*/impl.goandinternal/testspecs/service/*/impl.gofrom the corresponding generator template change: 34 files, 944 line swaps, no logic change.service/iam/ext_impl.go,service/sharing/ext_api.go,service/workspace/ext_utilities.go, andworkspace_functions.go.service/bundle/impl.go,service/dashboards/impl.go:733,service/postgres/impl.go:625) that came in via an auto-codegen update made before the generator template change was available. This will be a no-op against the next regen after the generator change lands upstream.TestCurrentWorkspaceID*test functions so the names match the new header on the request side.How is this tested?
make fmt,make lint, andmake testall pass locally. Full unit suite is green.workspace_functions_test.gotests cover both helpers: they assert the newX-Databricks-Workspace-Idrequest header is sent, that the SDK reads the workspace ID back from the legacyX-Databricks-Org-Idresponse header, and thatCurrentWorkspaceIdentifierreturns non-numeric identifiers verbatim whileCurrentWorkspaceIDreturns a parse error for those.service/*/impl.gois exclusively the request-header literal swap; no collateral changes.X-Databricks-Workspace-Idcorrectly and the gateway routes the request to the expected workspace. The response on/api/2.0/preview/scim/v2/Meechoes the workspace ID onx-databricks-org-id, which is why the response read site stays on the legacy name.TestAccUnifiedHostSendsWorkspaceIdHeaderininternal/unified_host_test.go. It hooks a capturinghttp.RoundTripperinto a workspace client built against a unified host and verifies on the wire that (1) the SDK sendsX-Databricks-Workspace-Idand notX-Databricks-Org-Idon the request, (2) the server still echoesX-Databricks-Org-Idon the response, and (3) the SCIM Me call succeeds end-to-end. Skips when the workspace-test environment variables (UNIFIED_HOST,THIS_WORKSPACE_ID,TEST_ACCOUNT_ID,DATABRICKS_CLIENT_ID,DATABRICKS_CLIENT_SECRET) are missing.