Skip to content

Added support for UC external locations (direct mode only) - #4484

Merged
andrewnester merged 11 commits into
mainfrom
feat/external-locations
Feb 18, 2026
Merged

Added support for UC external locations (direct mode only)#4484
andrewnester merged 11 commits into
mainfrom
feat/external-locations

Conversation

@andrewnester

Copy link
Copy Markdown
Contributor

Changes

Added support for UC external locations (direct mode only)

Why

This is a natural extension of support for UC catalogs where UC catalogs can have references to UC external locations.

Tests

Added an acceptance test

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Feb 10, 2026

Copy link
Copy Markdown
Collaborator

Commit: 758c064

Run: 22137063903

Env❌​FAIL🟨​KNOWN💚​RECOVERED🙈​SKIP✅​pass🙈​skipTime
❌​aws linux61162687646:05
❌​aws windows61162707626:09
💚​aws-ucws linux263706806:50
💚​aws-ucws windows263726786:27
💚​azure linux262717645:44
💚​azure windows262737624:58
💚​azure-ucws linux263696786:08
💚​azure-ucws windows263716764:41
💚​gcp linux262677676:13
💚​gcp windows262697655:36
14 interesting tests: 6 FAIL, 6 SKIP, 1 KNOWN, 1 RECOVERED
Test Nameaws linuxaws windowsaws-ucws linuxaws-ucws windowsazure linuxazure windowsazure-ucws linuxazure-ucws windowsgcp linuxgcp windows
🟨​TestAccept🟨​K🟨​K💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions❌​F❌​F✅​p✅​p🙈​s🙈​s🙈​s🙈​s🙈​s🙈​s
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct❌​F❌​F✅​p✅​p
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform❌​F❌​F✅​p✅​p
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions❌​F❌​F✅​p✅​p🙈​s🙈​s🙈​s🙈​s🙈​s🙈​s
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct❌​F❌​F✅​p✅​p
❌​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform❌​F❌​F✅​p✅​p
🙈​TestAccept/bundle/resources/postgres_branches/basic🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🙈​TestAccept/bundle/resources/postgres_branches/recreate🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🙈​TestAccept/bundle/resources/postgres_branches/update_protected🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🙈​TestAccept/bundle/resources/postgres_branches/without_branch_id🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🙈​TestAccept/bundle/resources/postgres_endpoints/recreate🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🙈​TestAccept/bundle/resources/synced_database_tables/basic🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
💚​TestAccept/ssh/connection💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R
Top 20 slowest tests (at least 2 minutes):
durationenvtestname
3:56aws-ucws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:43aws-ucws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:41gcp windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:40gcp linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:35gcp windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:35gcp linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
3:29aws-ucws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
3:18aws-ucws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:51aws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:48azure linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:46aws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:42aws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:39aws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:39azure windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:25azure linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:19azure-ucws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct
2:13azure-ucws windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:10azure windowsTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:09azure-ucws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=terraform
2:08azure-ucws linuxTestAccept/bundle/resources/apps/inline_config/DATABRICKS_BUNDLE_ENGINE=direct

@denikdenik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add config for invariant tests in acceptance/bundle/invariant?

Comment threadlibs/testserver/handlers.go Outdated
- field: storage_root
reason: immutable

external_locations:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question - were you able to run 'make generate-direct' to update resources.generated.yml

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nope, it failed actually with

Traceback (most recent call last):
File "/Users/andrew.nester/cli/bundle/direct/tools/generate_resources.py", line 12, in <module>
import yaml
ModuleNotFoundError: No module named 'yaml'

which seems to be unrelated

Comment threadbundle/direct/dresources/external_location.go Outdated
"custom_tags":
"description": |-
PLACEHOLDER
github.com/databricks/databricks-sdk-go/service/catalog.AwsSqsQueue:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These descriptions should automatically be generated during the next CLI bump. Worth keeping an eye on because those descriptions will auto-generate our public documentation.

@shreyas-goenkashreyas-goenka left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, lgtm except one concern. Can you please TAL whether we can get test coverage for this on some cloud as well. Otherwise this can be fragile.

}

func (e *ExternalLocation) GetURL() string {
// Return empty as external locations don't have a workspace URL

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

optional: Can we still return the revelant s3 URL? Or any UI equivalent we have for the resource. This provides a nice experience when running bundle summary.

Local = true
# External locations require actual storage credentials with cloud IAM setup
# which are environment-specific, so we only test locally with the mock server
Cloud = false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we atleast run these tests on one cloud? Like just AWS maybe?

# which are environment-specific, so we only test locally with the mock server
Cloud = false
RecordRequests = false
RequiresUnityCatalog = true

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

optional: You can also set RunsOnDbr = true no to run these tests on DBR. It's opt-in for now.

bundle:
name: test-bundle-$UNIQUE_NAME

resources:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There needs to be an entry in invariant/test.toml for this to be picked up.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here 758c064

@andrewnester
andrewnester merged commit 7b4bac8 into mainFeb 18, 2026
17 of 18 checks passed
@andrewnester
andrewnester deleted the feat/external-locations branch February 18, 2026 11:42
@eng-dev-ecosystem-bot

Copy link
Copy Markdown
Collaborator

Commit: 7b4bac8

Run: 22138325481

Env❌​FAIL🟨​KNOWN🔄​flaky💚​RECOVERED🙈​SKIP✅​pass🙈​skipTime
❌​aws linux371749071859:12
🟨​aws windows71746272743:48
❌​aws-ucws linux2102141754568103:12
❌​aws-ucws windows21014171957998:10
❌​azure linux311949371658:02
💚​azure windows2946572546:34
❌​azure-ucws linux214873457374:52
❌​azure-ucws windows2124869558493:27
❌​gcp linux311947372560:41
💚​gcp windows2944573447:48
34 interesting tests: 16 KNOWN, 8 RECOVERED, 5 FAIL, 4 flaky, 1 SKIP
Test Nameaws linuxaws windowsaws-ucws linuxaws-ucws windowsazure linuxazure windowsazure-ucws linuxazure-ucws windowsgcp linuxgcp windows
🟨​TestAccept🟨​K🟨​K🟨​K🟨​K🟨​K💚​R🟨​K🟨​K🟨​K💚​R
❌​TestAccept/bundle/config-remote-sync/multiple_resources❌​F🙈​s✅​p🙈​s❌​F🙈​s✅​p🙈​s❌​F🙈​s
❌​TestAccept/bundle/config-remote-sync/multiple_resources/DATABRICKS_BUNDLE_ENGINE=direct❌​F✅​p❌​F✅​p❌​F
❌​TestAccept/bundle/config-remote-sync/multiple_resources/DATABRICKS_BUNDLE_ENGINE=terraform❌​F✅​p❌​F✅​p❌​F
❌​TestAccept/bundle/invariant/no_drift🙈​s🙈​s❌​F❌​F🙈​s🙈​s❌​F❌​F🙈​s🙈​s
❌​TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl❌​F❌​F❌​F❌​F
🙈​TestAccept/bundle/resources/permissions🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🔄​TestAccept/bundle/resources/permissions/factcheck✅​p✅​p✅​p✅​p✅​p✅​p✅​p🔄​f🙈​s🙈​s
🔄​TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform✅​p✅​p✅​p✅​p✅​p✅​p✅​p🔄​f
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions🟨​K🟨​K💚​R💚​R🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct🟨​K🟨​K💚​R💚​R
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform🟨​K🟨​K💚​R💚​R
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions🟨​K🟨​K💚​R💚​R🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct🟨​K🟨​K💚​R💚​R
🟨​TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform🟨​K🟨​K💚​R💚​R
🟨​TestAccept/bundle/resources/postgres_branches/basic🙈​S🙈​S🟨​K🟨​K🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🟨​TestAccept/bundle/resources/postgres_branches/basic/DATABRICKS_BUNDLE_ENGINE=direct🟨​K🟨​K
🟨​TestAccept/bundle/resources/postgres_branches/basic/DATABRICKS_BUNDLE_ENGINE=terraform🟨​K🟨​K
🟨​TestAccept/bundle/resources/postgres_branches/recreate🙈​S🙈​S🟨​K🟨​K🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🟨​TestAccept/bundle/resources/postgres_branches/recreate/DATABRICKS_BUNDLE_ENGINE=direct🟨​K🟨​K
🟨​TestAccept/bundle/resources/postgres_branches/recreate/DATABRICKS_BUNDLE_ENGINE=terraform🟨​K🟨​K
🟨​TestAccept/bundle/resources/postgres_branches/update_protected🙈​S🙈​S🟨​K🟨​K🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🟨​TestAccept/bundle/resources/postgres_branches/update_protected/DATABRICKS_BUNDLE_ENGINE=direct🟨​K🟨​K
🟨​TestAccept/bundle/resources/postgres_branches/update_protected/DATABRICKS_BUNDLE_ENGINE=terraform🟨​K🟨​K
💚​TestAccept/bundle/resources/postgres_branches/without_branch_id🙈​S🙈​S💚​R💚​R🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
💚​TestAccept/bundle/resources/postgres_branches/without_branch_id/DATABRICKS_BUNDLE_ENGINE=direct💚​R💚​R
💚​TestAccept/bundle/resources/postgres_branches/without_branch_id/DATABRICKS_BUNDLE_ENGINE=terraform💚​R💚​R
💚​TestAccept/bundle/resources/postgres_endpoints/recreate🙈​S🙈​S💚​R💚​R🙈​S🙈​S🙈​S🙈​S🙈​S🙈​S
🔄​TestAccept/bundle/resources/postgres_projects/basic🙈​s🙈​s🔄​f✅​p🙈​s🙈​s🙈​s🙈​s🙈​s🙈​s
🔄​TestAccept/bundle/resources/postgres_projects/basic/DATABRICKS_BUNDLE_ENGINE=direct🔄​f✅​p
💚​TestAccept/bundle/resources/synced_database_tables/basic🙈​S🙈​S💚​R💚​R🙈​S🙈​S💚​R💚​R🙈​S🙈​S
💚​TestAccept/bundle/resources/synced_database_tables/basic/DATABRICKS_BUNDLE_ENGINE=direct💚​R💚​R💚​R💚​R
💚​TestAccept/bundle/resources/synced_database_tables/basic/DATABRICKS_BUNDLE_ENGINE=terraform💚​R💚​R💚​R💚​R
💚​TestAccept/ssh/connection💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R💚​R
Top 50 slowest tests (at least 2 minutes):
durationenvtestname
15:07aws-ucws windowsTestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
14:26aws-ucws windowsTestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=direct
13:45azure-ucws windowsTestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
13:27aws-ucws linuxTestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl
12:06gcp windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
11:09aws-ucws linuxTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
10:55azure windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
10:46gcp linuxTestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
10:38aws-ucws windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
10:35aws-ucws linuxTestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
10:11gcp linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
10:05aws-ucws linuxTestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
9:59gcp windowsTestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
9:46azure windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION
9:44gcp windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
9:09aws-ucws windowsTestAccept/bundle/resources/database_catalogs/basic/DATABRICKS_BUNDLE_ENGINE=direct
9:00aws-ucws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION
8:49gcp linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION
8:47azure-ucws windowsTestAccept/bundle/resources/database_catalogs/basic/DATABRICKS_BUNDLE_ENGINE=terraform
8:39azure-ucws windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
8:37gcp windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION
8:33aws windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:32aws-ucws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
8:32gcp linuxTestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
8:28gcp windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:23aws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION
8:22gcp linuxTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
8:18azure windowsTestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=terraform
8:17gcp linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION
8:17aws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION
8:11aws-ucws linuxTestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
8:02aws linuxTestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_14.3_LTS
7:55aws windowsTestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_15.4_LTS
7:53aws windowsTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
7:53aws-ucws windowsTestAccept/bundle/invariant/migrate/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl
7:53gcp linuxTestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
7:48aws windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
7:48gcp linuxTestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=direct
7:46aws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
7:41aws-ucws windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
7:39aws linuxTestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
7:38gcp windowsTestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
7:35azure windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
7:29aws linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
7:29aws linuxTestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_15.4_LTS
7:26gcp linuxTestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=direct
7:22gcp linuxTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
7:19azure-ucws linuxTestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
7:14gcp windowsTestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
7:14gcp windowsTestSparkJarTaskDeployAndRunOnWorkspace/Databricks_Runtime_14.3_LTS

deco-sdk-taggingBot added a commit that referenced this pull request Feb 19, 2026
## Release v0.289.0
### CLI
* Make auth profiles respect DATABRICKS_CLI_PATH env var (([#4467](#4467)))
* Fix arrow key navigation in prompts on Windows (([#4501](#4501)))
### Bundles
* Log artifact build output in debug mode ([#4208](#4208))
* Fix bundle init not working in Azure Government ([#4286](#4286))
* Allow single and double quotes in environment dependencies (([#4511](#4511)))
* Use purge option when deleting alerts (([#4505](#4505)))
* engine/direct: Replace server_side_default with more precise backend_default rule in bundle plan ([#4490](#4490))
* engine/direct: Extend pipelines recreate_on_changes configuration (([#4499](#4499)))
* engine/direct: Added support for UC external locations (direct only) ([#4484](#4484))
### Dependency updates
* Upgrade Go SDK to v0.106.0 (([#4486](#4486)))
* Upgrade Terraform provider to v1.106.0 (([#4542](#4542)))
* Upgrade Go to 1.25.7 (([#4547](#4547)))
@green2k

Copy link
Copy Markdown

Hi, is there a plan for adding support for UC Storage Credentials as well?
I'm asking because it's required to have one before creating UC External Locations 🙂

denik pushed a commit that referenced this pull request May 20, 2026
## Changes
Added support for UC external locations (direct mode only)
## Why
This is a natural extension of support for UC catalogs where UC catalogs
can have references to UC external locations.
## Tests
Added an acceptance test
<!-- If your PR needs to be included in the release notes for next
release,
add a separate entry in NEXT_CHANGELOG.md as part of your PR. -->
denik pushed a commit that referenced this pull request May 20, 2026
## Release v0.289.0
### CLI
* Make auth profiles respect DATABRICKS_CLI_PATH env var (([#4467](#4467)))
* Fix arrow key navigation in prompts on Windows (([#4501](#4501)))
### Bundles
* Log artifact build output in debug mode ([#4208](#4208))
* Fix bundle init not working in Azure Government ([#4286](#4286))
* Allow single and double quotes in environment dependencies (([#4511](#4511)))
* Use purge option when deleting alerts (([#4505](#4505)))
* engine/direct: Replace server_side_default with more precise backend_default rule in bundle plan ([#4490](#4490))
* engine/direct: Extend pipelines recreate_on_changes configuration (([#4499](#4499)))
* engine/direct: Added support for UC external locations (direct only) ([#4484](#4484))
### Dependency updates
* Upgrade Go SDK to v0.106.0 (([#4486](#4486)))
* Upgrade Terraform provider to v1.106.0 (([#4542](#4542)))
* Upgrade Go to 1.25.7 (([#4547](#4547)))
bradleyjamrozik-origindigital pushed a commit to Origin-Digital-LLC/databricks-cli that referenced this pull request Jul 6, 2026
## Summary
`catalog.SseEncryptionDetailsAlgorithm` published a duplicated `enum` in
the generated bundle JSON schema:
```json
"enum": ["AWS_SSE_S3", "AWS_SSE_KMS", "AWS_SSE_KMS", "AWS_SSE_S3"]
```
JSON Schema requires enum values to be unique, so strict validators
(e.g. OPA) reject the entire schema at compile time. The duplicate has
shipped since v0.290.0 (Feb 26 2026); the issue reports it "since
v0.299.1" only because that is the first release where `jsonschema.json`
was published as a downloadable release asset, so it is the earliest
version an external consumer could inspect.
Fixesdatabricks#5713.
## Root cause
The enum was **hand-authored** for
`catalog.SseEncryptionDetailsAlgorithm` in databricks#4484 (UC external locations,
Feb 18 2026), in the hand-authored override annotation file, with order
`[AWS_SSE_KMS, AWS_SSE_S3]`. At that point the SDK-derived annotations
did not define this type, so the generated schema had the correct **2**
entries.
Two days later, databricks#4552 (Upgrade Go SDK to v0.110.0, Feb 20 2026)
regenerated the SDK-derived annotation file, which now defined the same
enum with order `[AWS_SSE_S3, AWS_SSE_KMS]`. From then on **both**
annotation sources supplied the enum. The annotation merge concatenates
sequences, so the two pairs combined into four entries — `[S3, KMS]`
(SDK, merge base) followed by `[KMS, S3]` (override), producing `[S3,
KMS, KMS, S3]`.
The later consolidation of the annotation files into a single
`annotations.yml` + `.codegen/cli.json` (databricks#5484 / databricks#5574) preserved this
pre-existing duplicate rather than causing it; only the file names
changed. `annotations.yml` is **not** generated from `cli.json` —
`./task generate-schema` only syncs descriptions and placeholders and
drops stale entries; it never rewrites hand-authored enums. So the
redundant entry persisted silently across the refactor.
## Fix
- Remove the redundant hand-authored `enum` from `annotations.yml`,
leaving `cli.json` (SDK-derived) as the single source of truth. The
`description` override there is intentional (it differs from cli.json's
text) and is kept.
- Regenerate `bundle/schema/jsonschema.json`; the enum is now
`["AWS_SSE_S3", "AWS_SSE_KMS"]`.
- Add `TestJsonSchemaEnumsAreUnique`, a whole-schema guard that walks
every `enum` in the embedded schema and fails on any duplicate, so this
class of bug cannot return regardless of source.
## Tests
- `go test ./bundle/internal/schema ./bundle/schema -count=1`
- Verified the new guard fails on the pre-fix schema, reporting the
exact path `$defs/.../catalog.SseEncryptionDetailsAlgorithm/oneOf[0]`.
- Confirmed the regenerated schema is reproducible via the schema
generator.
This pull request and its description were written by Isaac, an AI
coding agent.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@andrewnester@eng-dev-ecosystem-bot@green2k@denik@shreyas-goenka