Skip to content

Remove the empty .bundle/<name> directory on destroy - #6317

Merged
shreyas-goenka merged 6 commits into
mainfrom
isaac/destroy-parent-cleanup
Aug 24, 2026
Merged

Remove the empty .bundle/<name> directory on destroy#6317
shreyas-goenka merged 6 commits into
mainfrom
isaac/destroy-parent-cleanup

Conversation

@shreyas-goenka

@shreyas-goenka shreyas-goenka commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Performs additional cleanup on bundle destroy to reduce the number of treenodes we leave around.

Workspace team reported that they were seeing DB issues because of the load we were creating initially because of the number of treenodes our tests were leaving behind.

`bundle destroy` deleted `~/.bundle/<name>/<target>` but never the `<name>`
parent, so every destroy left an empty directory behind. Deployments that use a
fresh bundle name each time never reuse those directories, so they accumulate
and count against the workspace child-node limit; the CLI's own CI workspace
reached ~27k of them per day.

Delete the parent too, non-recursively so it survives while another target of
the bundle is still deployed there. The delete is restricted to the
`~/.bundle/<name>/<target>` layout the CLI generates, since `root_path` is
user-configurable and the parent of an arbitrary path is not ours to remove.

The fake workspace accepted a non-recursive delete of a non-empty directory,
which the real API rejects with DIRECTORY_NOT_EMPTY. Model that, so the
sibling-target case is covered by the local suite.

Co-authored-by: Isaac
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: f1f3a7c

Run: 32714210349

Env 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
💚​ aws linux 1 4 283 1164 7:30
💚​ aws windows 1 4 285 1162 5:36
💚​ azure linux 1 4 282 1164 8:57
💚​ azure windows 1 4 284 1162 7:38
💚​ gcp linux 1 4 283 1164 8:04
💚​ gcp windows 1 4 285 1162 5:45
Test Name aws linux aws windows azure linux azure windows gcp linux gcp windows
💚​ TestAccept 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
Top 5 slowest tests (at least 2 minutes):
duration env testname
4:25 azure windows TestAccept
3:53 gcp windows TestAccept
3:34 aws windows TestAccept
2:15 azure linux TestAccept/bundle/destroy/root-path-not-scoped/DATABRICKS_BUNDLE_ENGINE=direct
2:11 azure windows TestAccept/bundle/destroy/sibling-target/DATABRICKS_BUNDLE_ENGINE=direct

The first version keyed off the path shape (a parent directly under .bundle),
which both missed a root_path pointing elsewhere and could not tell a configured
path from the generated one.

Record instead, in DefineDefaultWorkspaceRoot, whether root_path ends in the
bundle name and target. That mutator runs before variable resolution, so
${bundle.name} and ${bundle.target} are still literal there and a path that
merely happens to end in the same two segments does not qualify. Applying the
default sets the flag too, since the default has exactly that shape.

Destroy removes the directory above the deployment root only when the flag is
set, so it works for any prefix and never touches a directory the configuration
did not scope to this bundle.

Co-authored-by: Isaac
Verified against a live workspace: a non-recursive delete of a directory holding
a file or a subdirectory returns 400 DIRECTORY_NOT_EMPTY with "Folder (<path>)
is not empty". The status and code already matched; align the message too.

Co-authored-by: Isaac
Names and paths now carry $UNIQUE_NAME so concurrent legs do not collide, and
each test cleans up the prefix it created. Also trims two comments to the 1-3
line cap.

Co-authored-by: Isaac
@shreyas-goenka
shreyas-goenka requested a review from denik August 24, 2026 09:36
@shreyas-goenka
shreyas-goenka marked this pull request as ready for review August 24, 2026 09:36
Comment thread acceptance/bundle/destroy/root-path-name-target/script Outdated
// bundle name and target references.
func endsWithNameAndTarget(rootPath string) bool {
rootPath = strings.TrimSuffix(rootPath, "/")
return path.Base(rootPath) == bundleTargetRef && path.Base(path.Dir(rootPath)) == bundleNameRef

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.

why not just HasSuffix(strings.TrimSuffix(rootPath, "/"), "${bundle.name}/${bundle.target}")?

given that that this is uninterpolated string, using path module on it might not work.

Also, I'd narrow it further HasSuffix(strings.TrimSuffix(rootPath, "/"), "/${bundle.target}"), the fact that it ends with target already tells us that parent is bundle-scoped.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

the fact that it ends with target already tells us that parent is bundle-scoped.

The directory we are deleting is ${bundle.name} directory though. If a user has something configurd:

workspace:
  root_path: /Worksapce/my_personal_project/${bundle.target}`

Then we should avoid deleting an empty my_personal_project directory since that could be suprising / annoying to users, even though we know it was scoped to a single bundle.

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.

but it's empty and when it was not empty it had children such as 'dev', 'prod' without any other context. So no harm in deleting it when last target is gone.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I get that. I'd just be annoyed as a user if you started cleaning up my directories though. No strong feelings either ways for me though.

Comment thread bundle/deploy/files/delete.go Outdated
- Ignored release of the bundle directory logs at Info, the highest level that
  stays hidden, so it lines up with -q/-v once log levels are wired up.
- The "directory is gone" assertions use musterr, so the test fails if
  get-status ever succeeds instead of merely tolerating the error.
- endsWithNameAndTarget matches the suffix as a plain string. root_path is not
  interpolated yet, so path.Base/path.Dir on it are not dependable.

Co-authored-by: Isaac
@shreyas-goenka
shreyas-goenka added this pull request to the merge queue Aug 24, 2026
Merged via the queue into main with commit a387244 Aug 24, 2026
26 checks passed
@shreyas-goenka
shreyas-goenka deleted the isaac/destroy-parent-cleanup branch August 24, 2026 10:53
@eng-dev-ecosystem-bot

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: a387244

Run: 32719094416

Env ❌​FAIL 🟨​KNOWN 🤯​MISS 🔄​flaky 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
🔄​ aws linux 6 2 2 1180 965 340:42
❌​ aws windows 10 18 2 2 1099 982 345:47
❌​ azure linux 20 2 1 2 1059 1002 329:55
❌​ azure windows 2 4 3 2 1012 1021 347:16
❌​ gcp linux 13 1 2 2 1056 1006 339:10
❌​ gcp windows 12 25 2 2 974 1023 345:02
83 interesting tests: 46 FAIL, 25 MISS, 7 flaky, 2 KNOWN, 2 SKIP, 1 RECOVERED
Test Name aws linux aws windows azure linux azure windows gcp linux gcp windows
🟨​ TestAccept 💚​R 🤯​M 🟨​K 💚​R 🟨​K 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=direct ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=true/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=true/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p 🤯​M ✅​p ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/invariant/migrate ✅​p ❌​F ✅​p ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/invariant/migrate/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl ✅​p ❌​F ✅​p ✅​p ✅​p ✅​p
💚​ TestAccept/bundle/invariant/no_drift 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
❌​ TestAccept/bundle/resources/apps/lifecycle-started ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/clusters/deploy/update-after-create ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/clusters/deploy/update-after-create/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/clusters/lifecycle-started-toggle ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/clusters/lifecycle-started-toggle/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/dashboards/change-parent-path ✅​p ✅​p ❌​F ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/dashboards/change-parent-path/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/dashboards/dataset-catalog-schema ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/dashboards/dataset-catalog-schema/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/genie_spaces/simple ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/genie_spaces/simple/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/genie_spaces/version_migration ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/genie_spaces/version_migration/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/grants/catalogs ✅​p ✅​p ❌​F ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/grants/catalogs/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/grants/schemas/all_privileges ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/all_privileges/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/all_privileges_coexist ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/all_privileges_coexist/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/change_privilege ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/change_privilege/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/change_privilege/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/duplicate_principals ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/grants/schemas/duplicate_principals/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/grants/schemas/out_of_band_principal ✅​p ❌​F ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/out_of_band_principal/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ❌​F ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/remove_all ✅​p ❌​F ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/schemas/remove_all/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ❌​F ✅​p ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/grants/volumes ✅​p ❌​F ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/grants/volumes/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/grants/volumes/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ❌​F ✅​p ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/permissions/jobs/delete_one ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/resources/permissions/jobs/delete_one/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p ✅​p ✅​p ❌​F
🔄​ TestAccept/bundle/resources/pipelines/allow-duplicate-names 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/resources/pipelines/allow-duplicate-names/DATABRICKS_BUNDLE_ENGINE=terraform 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/pipelines/update 🔄​f ✅​p ❌​F ✅​p ✅​p ✅​p
🔄​ TestAccept/bundle/resources/pipelines/update/DATABRICKS_BUNDLE_ENGINE=direct 🔄​f ✅​p ✅​p ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/pipelines/update/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
❌​ TestAccept/bundle/resources/postgres_branches/purge_on_delete_transitions ✅​p ❌​F 🙈​s 🙈​s 🙈​s 🙈​s
❌​ TestAccept/bundle/resources/postgres_branches/purge_on_delete_transitions/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ❌​F
❌​ TestAccept/bundle/resources/quality_monitors/change_assets_dir ✅​p ✅​p ✅​p ❌​F ✅​p ✅​p
❌​ TestAccept/bundle/resources/quality_monitors/change_assets_dir/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p ❌​F ✅​p ✅​p
🔄​ TestAccept/bundle/resources/quality_monitors/create/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🔄​ TestAccept/bundle/resources/quality_monitors/create/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🔄​ TestAccept/bundle/resources/registered_models/basic/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🔄​ TestAccept/bundle/resources/registered_models/basic/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
🟨​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🔄​f 💚​R 🟨​K 💚​R 💚​R 💚​R
❌​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name/DATABRICKS_BUNDLE_ENGINE=direct 🔄​f ✅​p ❌​F ✅​p ✅​p ✅​p
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
❌​ TestAccept/bundle/run_as/job_default ✅​p ✅​p ❌​F ✅​p ✅​p ❌​F
❌​ TestAccept/bundle/run_as/job_default/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p ❌​F ✅​p ✅​p ❌​F
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🤯​ TestCIUniqueName ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestDbrAcceptance 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s 🤯​M
🤯​ TestInprocessMode 🙈​s 🤯​M 🙈​s 🙈​s 🙈​s 🤯​M
🤯​ TestInvariantConfigsCoverage ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetApproximatesPct ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetChangedAlwaysRuns ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetChangedVariantFilter ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetDisabled ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetPctBoundaries ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetSeedChangesSelection ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetSeedDeterministic ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
🤯​ TestSubsetVariantsIndependent ✅​p 🤯​M ✅​p ✅​p ✅​p 🤯​M
❌​ TestSyncIncrementalSyncPythonNotebookDelete ✅​p ✅​p ❌​F ✅​p ✅​p ✅​p
Top 50 slowest tests (at least 2 minutes):
duration env testname
17:42 gcp windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
14:29 gcp windows TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
13:52 azure windows TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
11:32 aws windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
10:29 azure linux TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
10:24 azure windows TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=terraform
10:20 aws linux TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
10:09 gcp linux TestAccept/bundle/invariant/destroy_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
9:33 gcp linux TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
8:59 azure windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
8:40 gcp windows TestAccept/bundle/resources/apps/lifecycle-started-omitted/DATABRICKS_BUNDLE_ENGINE=direct
8:23 aws windows TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
8:21 aws linux TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
8:01 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/READPLAN=1
7:58 aws linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
7:51 aws windows TestAccept/bundle/quiet-levels/DATABRICKS_BUNDLE_ENGINE=terraform
7:49 gcp linux TestAccept/bundle/resources/clusters/deploy/local_ssd_count/DATABRICKS_BUNDLE_ENGINE=direct
7:45 azure linux TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
7:37 aws linux TestAccept/bundle/config-remote-sync/multiple_resources/DATABRICKS_BUNDLE_ENGINE=terraform
7:34 gcp linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN=1
7:30 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/READPLAN=1
7:28 azure windows TestAccept/bundle/resources/clusters/deploy/update-after-create/DATABRICKS_BUNDLE_ENGINE=terraform
7:25 azure windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/READPLAN=
7:24 azure windows TestAccept/bundle/resources/clusters/deploy/simple/DATABRICKS_BUNDLE_ENGINE=direct
7:23 gcp windows TestAccept/bundle/invariant/destroy_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
7:17 azure linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
7:16 aws windows TestAccept/bundle/quiet-levels/DATABRICKS_BUNDLE_ENGINE=direct
7:14 gcp windows TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=terraform
7:10 azure windows TestAccept/bundle/templates/default-python/combinations/serverless/DATABRICKS_BUNDLE_ENGINE=terraform/DLT=no/NBOOK=yes/PY=yes/READPLAN=
7:03 aws linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
6:55 azure windows TestAccept/bundle/quiet-levels/DATABRICKS_BUNDLE_ENGINE=terraform
6:49 gcp linux TestAccept/bundle/resources/apps/lifecycle-started-omitted/DATABRICKS_BUNDLE_ENGINE=direct
6:47 gcp windows TestAccept/bundle/resources/clusters/deploy/local_ssd_count/DATABRICKS_BUNDLE_ENGINE=direct
6:41 aws windows TestAccept/bundle/resources/apps/lifecycle-started-omitted/DATABRICKS_BUNDLE_ENGINE=direct
6:40 aws linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
6:34 aws linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run.yml.tmpl/READPLAN=
6:34 azure linux TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
6:29 azure linux TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=direct
6:29 azure linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
6:28 gcp linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
6:27 aws windows TestAccept/bundle/templates/default-python/combinations/classic/DATABRICKS_BUNDLE_ENGINE=direct/DLT=no/NBOOK=no/PY=no/READPLAN=1
6:26 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/READPLAN=1
6:25 aws windows TestAccept/bundle/resources/models/basic/DATABRICKS_BUNDLE_ENGINE=direct
6:23 azure linux TestAccept/bundle/resources/clusters/lifecycle-started-toggle/DATABRICKS_BUNDLE_ENGINE=direct
6:22 aws linux TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=terraform
6:21 azure linux TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN=1
6:21 gcp linux TestAccept/bundle/resources/apps/lifecycle-started-toggle/DATABRICKS_BUNDLE_ENGINE=direct
6:21 gcp linux TestAccept/bundle/templates/default-python/integration_classic/DATABRICKS_BUNDLE_ENGINE=direct/UV_PYTHON=3.12
6:20 gcp windows TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=direct
6:17 gcp linux TestAccept/bundle/templates/default-python/combinations/serverless/DATABRICKS_BUNDLE_ENGINE=direct/DLT=no/NBOOK=yes/PY=no/READPLAN=1

deco-sdk-tagging Bot added a commit that referenced this pull request Aug 26, 2026
## Release v1.14.0

### Notable Changes

 * Bundles still on Terraform state are now migrated to the direct engine automatically, after a deploy whose dry-run conversion comes back clean. To opt out, set `engine: terraform` under `bundle` or `DATABRICKS_BUNDLE_ENGINE=terraform`. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct

### CLI

 * Fixed idle `databricks ssh connect` sessions disconnecting after a few minutes, on dedicated clusters and on serverless. The tunnel now keeps itself warm: the SSH client and the SSH server on the compute exchange keepalives every 30 seconds, and the CLI's proxy pings the tunnel's websocket every 20 seconds. A session nobody is typing into stays connected, with no need to set `ServerAliveInterval` by hand.

### Bundles

 * `bundle plan` no longer reports a permanent, unconvergeable update on `securable_kind` for Unity Catalog `TABLE` securables declared under an app's `resources`. The field is computed by the backend (output-only), so it is now ignored during drift detection. Direct engine only ([#6342](#6342)).
 * Add support for the `cluster_policies` resource type in Declarative Automation Bundles. Cluster policies are only supported in direct deployment mode.
 * `bundle destroy` no longer counts resources that are already gone remotely in its `Destroy: N deleted` summary. Such deletes only clean up stale state and are not listed under the deletion prompt, so they are now excluded from the count as well, matching the terraform engine.
 * `bundle destroy` now also removes the directory named after the bundle, not just the target directory beneath it, when `workspace.root_path` ends in `${bundle.name}/${bundle.target}` — which includes the default root path. It is removed non-recursively, so it stays in place while another target of the same bundle is still deployed there. Previously every destroy left an empty directory behind ([#6317](#6317)).
 * `job_runs` now plans skip for a run that is still in progress and when `on_bundle_deploy` is removed, instead of treating either case as an update. ([#6357](#6357))
 * Added `DATABRICKS_BUNDLE_RESOURCE_MAX_WAIT` (in seconds) to cap how long deploy and destroy wait for a resource. Direct engine only.
 * Fixed `bundle deploy` on the direct engine failing with `Nothing to update`, or reporting a change it never applied, when a schema, catalog, volume, registered model or external location field was removed from the configuration or set outside the bundle. The update now sends the fields the plan reports as cleared instead of dropping them.

### Dependency Updates

 * Bump `github.com/databricks/databricks-sdk-go` from v0.171.0 to v0.175.0 ([#6322](#6322)).
 * Bump Terraform provider from v1.127.0 to v1.128.0 ([#6323](#6323)).
Sign up for free to 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.

3 participants