Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
019c458
feat(databricks): add the unity catalog client, access-path routing, …
mateoHernandez123 Oct 8, 2026
026cd03
ci(databricks): serialize the sync test against the shared tenant
mateoHernandez123 Oct 9, 2026
ffd87c2
fix(databricks): read permissions past the cache when provisioning, s…
mateoHernandez123 Oct 9, 2026
73eaf14
fix(databricks): treat a metastore no in-scope workspace reaches as o…
mateoHernandez123 Oct 9, 2026
c165803
fix(databricks): never prune a metastore while an in-scope workspace …
mateoHernandez123 Oct 9, 2026
b1a0243
fix(databricks): do not read an empty catalog listing as proof a deni…
mateoHernandez123 Oct 9, 2026
23720aa
fix(databricks): keep vendor error_code on api errors
mateoHernandez123 Oct 12, 2026
c16d41e
perf(databricks): resolve owner-only grants without listing account scim
mateoHernandez123 Oct 12, 2026
ca2d9be
fix(databricks): document direct workspace admin and share group gran…
mateoHernandez123 Oct 13, 2026
01d9cac
fix(databricks): route unity catalog through metastore assignments, r…
mateoHernandez123 Oct 13, 2026
8b58741
fix(databricks): treat a metastore assignment 404 as unknown and refr…
mateoHernandez123 Oct 13, 2026
92af630
docs(databricks): list the metastore endpoints the connector reads
mateoHernandez123 Oct 14, 2026
0aab946
docs(databricks): note the host-scoped http cache key
mateoHernandez123 Oct 14, 2026
a81fdd7
fix(databricks): stop a non-absence metastore 404 from deleting grant…
mateoHernandez123 Oct 15, 2026
4aa99d9
fix(databricks): confirm metastore absence against the account and sk…
mateoHernandez123 Oct 20, 2026
df1bb1a
fix(databricks): keep a cancelling workspace from pruning its metastore
mateoHernandez123 Oct 20, 2026
0286ed6
fix(databricks): rebuild the metastore route only on the first page a…
mateoHernandez123 Oct 21, 2026
d92adca
refactor(databricks): fold the unity catalog layer into the metastore…
mateoHernandez123 Oct 22, 2026
1906849
fix(databricks): keep a metastore whose assignment list cannot be rea…
mateoHernandez123 Oct 22, 2026
08c294e
fix(databricks): refuse to report a metastore privilege list the conn…
mateoHernandez123 Oct 22, 2026
6b52954
refactor(databricks): drop the redundant clientID comment
mateoHernandez123 Oct 22, 2026
24b901e
docs(databricks): state the limits the sync actually enforces
mateoHernandez123 Oct 22, 2026
d525ad6
docs(databricks): say a missing standing fails the sync
mateoHernandez123 Oct 22, 2026
24e11c8
fix(databricks): stop a repeated privilege page token
mateoHernandez123 Oct 22, 2026
ff64c51
docs(databricks): restore the metastore warning and the download tip
mateoHernandez123 Oct 22, 2026
08ec189
refactor(databricks): shorten comments that restated the trust rules
mateoHernandez123 Oct 22, 2026
8ef1c14
fix(databricks): wrap the trust comment under the line limit
mateoHernandez123 Oct 22, 2026
0dae4fc
test(databricks): drop redundant metastore tests
mateoHernandez123 Oct 23, 2026
bfe443b
merge(databricks): merge main into the unity catalog foundation branch
mateoHernandez123 Oct 23, 2026
3030c3a
merge(databricks): record main as merged into the unity catalog found…
mateoHernandez123 Oct 23, 2026
1f4470a
merge(databricks): merge main into the unity catalog foundation branch
mateoHernandez123 Oct 26, 2026
bedb9d5
docs(databricks): say a pending workspace fails the sync
mateoHernandez123 Oct 26, 2026
4e9dc4f
fix(databricks): route a metastore through a workspace it can fully read
mateoHernandez123 Oct 27, 2026
69528c1
merge(databricks): merge main into the unity catalog foundation branch
mateoHernandez123 Oct 27, 2026
7d83a1e
merge(databricks): merge staging into the unity catalog foundation br…
mateoHernandez123 Oct 27, 2026
dd1a5ac
Merge remote-tracking branch 'origin/staging' into mateoHernandez123/…
mateoHernandez123 Oct 27, 2026
e76e8e3
fix(databricks): keep a not-found account read from emptying the sync
mateoHernandez123 Oct 28, 2026
24ba46c
docs(databricks): shorten the metastore readme and the missing-worksp…
mateoHernandez123 Oct 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ on:
jobs:
test:
runs-on: ubuntu-latest
# This job grants and revokes one hardcoded group membership on the shared
Comment thread
mateoHernandez123 marked this conversation as resolved.
Resolved
# Databricks tenant, so two PRs running it at once read each other's writes.
# The group is deliberately not per-ref: it serializes across every branch.
concurrency:
group: databricks-sync-test
cancel-in-progress: false
Comment thread
mateoHernandez123 marked this conversation as resolved.
Resolved
env:
BATON_LOG_LEVEL: debug
# Add any environment variables needed to run baton-bitbucket-datacenter
Expand Down
69 changes: 67 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
`baton-databricks` is a connector for Databricks built using the
[Baton SDK](https://github.com/conductorone/baton-sdk). It communicates with the
Databricks API, to sync data about Databricks identities (users, groups and
service principals), roles and workspaces.
service principals), roles, workspaces and Unity Catalog metastores.

Check out [Baton](https://github.com/conductorone/baton) to learn more about the project in general.

Expand All @@ -30,6 +30,11 @@ the Generate secret button. You can use this secret to authenticate across all
workspaces that service principal has access to. This requires admin access to
the Databricks account and each workspace you want to sync.

Syncing Unity Catalog needs more than account admin on its own: the service
principal also has to be able to read the privileges recorded on each metastore.
See [Unity Catalog permissions](#unity-catalog-permissions) for the exact
requirement.

# Using Azure Databricks

To work with Azure Databricks, you need to provide the hostname flag.
Expand Down Expand Up @@ -76,12 +81,21 @@ baton resources
- Service Principals
- Users
- Roles
- Metastores

The connector fetches all resources from the account and every workspace the
service principal can access. To limit the scope, pass a comma-separated list of
workspaces to the `--workspaces` flag. Each entry can be a workspace name,
deployment name, or numeric workspace ID, matched case-insensitively.

`--workspaces` also scopes which metastores sync: only a metastore attached to a
listed workspace is synced, so narrowing the list removes the other metastores
and their grants from ConductorOne. A list that names no workspace on the
account is rejected during credential validation, before any sync runs.

Metastores are Unity Catalog securables and are opt-in: the type stays off until
it is enabled for the connector in ConductorOne.

## Authentication

OAuth is the only authentication method: an account-level service principal's
Expand All @@ -97,7 +111,9 @@ To instead exclude specific workspaces from the sync, pass them to the
`--databricks-exclude-workspaces` flag (or the
`BATON_DATABRICKS_EXCLUDE_WORKSPACES` environment variable) as a comma-separated
list. Each entry can be a workspace name, deployment name, or numeric workspace
ID. Excluded workspaces and their roles are skipped entirely.
ID. Excluded workspaces and their roles are skipped entirely. A metastore
attached only to excluded workspaces is not synced, and its grants are removed
from ConductorOne.

## Incremental sync

Expand Down Expand Up @@ -188,6 +204,55 @@ membership from a group removes the group's entire workspace assignment,
including admin access if the group is a workspace admin, so its members lose
it.

## Unity Catalog

A metastore is the top of the Databricks Unity Catalog hierarchy. The resource
tree the connector syncs is:

```
account
├── workspace
│ └── role
├── user
├── group
├── service principal
└── metastore
```

A metastore exposes its privileges as entitlements (`CREATE_CATALOG`,
`READ_METADATA`, `USE_SHARE` and so on) plus a non-grantable `owner`. A
privilege held by a group is expandable, so ConductorOne resolves the group's
members as holders.

`MANAGE` and `ALL_PRIVILEGES` are not offered: Databricks rejects both at the
metastore level.

A metastore lives on the account plane, but its privileges are read through a
workspace attached to it. The connector picks that workspace itself: the first
running one in scope where it can read every privilege, which it proves by
owning the metastore or by holding Admin directly on that workspace. Grant and
Revoke resolve the same route from the metastore id.

A metastore syncs through a running workspace in scope. The sync fails, naming
the metastore, while an attached workspace in scope is still provisioning, or
while the metastore's workspace list cannot be read.

## Unity Catalog provisioning

A metastore privilege can be granted to and revoked from a user, group or
service principal. The `owner` entitlement is read-only: granting or revoking it
fails with an `InvalidArgument` error.

## Unity Catalog permissions
Comment thread
mateoHernandez123 marked this conversation as resolved.
Resolved

The service principal must own the metastore, or be assigned **Admin** directly
on at least one running workspace attached to it. Admin inherited only through a
group is not enough. Otherwise the sync fails naming the metastore.

The connector requests the `all-apis` OAuth scope. Each resource type declares
the scopes, roles and privileges it needs, so `./baton-databricks capabilities`
reports them per type.

# Contributing, Support and Issues

We started Baton because we were tired of taking screenshots and manually
Expand Down
Loading
Loading