direct: Add hidden --local flag to bundle plan and deploy#5680
Draft
denik wants to merge 17 commits into
Draft
Conversation
Contributor
Approval status: pending
|
Collaborator
Integration test reportCommit: 151bc11
8 interesting tests: 4 RECOVERED, 4 SKIP
Top 10 slowest tests (at least 2 minutes):
|
bradleyjamrozik-origindigital
pushed a commit
to Origin-Digital-LLC/databricks-cli
that referenced
this pull request
Jun 25, 2026
…e if resize failed due to INVALID_STATE (databricks#5716) ## Changes `DoResize` now tries `clusters/resize` first and falls back to `clusters/edit` (via `DoUpdate`) on `INVALID_STATE`. `PlanEntry` is threaded through to `DoResize` so the fallback reuses the existing edit+retry logic without duplication. ## Why A saved plan records the action at plan time (e.g. `resize` when the cluster was running). If the cluster terminates before the plan is applied, the resize API returns `INVALID_STATE` and the deploy fails. The fallback makes apply resilient to this race. This also helps for local-only plan (databricks#5680) where we don't have remote state available to check. With this change we can always plan 'resize' based on changed attributes. ## Tests New acceptance test `resize-terminated-fallback`: plans while the cluster is running (plan shows `resize`), terminates the cluster, applies the saved plan, and confirms both a failed resize request and a successful edit fallback in the request log. _This PR was written by Claude Code._
When passed, the plan is computed from the local state only: the per-resource remote read is skipped, so the remote state of resources is neither fetched nor considered. References that genuinely need a target's remote state (e.g. a remote-only field) fetch that target on demand, so $resources references still resolve. Direct engine only; rejected on terraform. Exercise it in the no_drift invariant via a LOCAL_DIFF matrix. Co-authored-by: Isaac
When --local resolves a reference that needs a target's remote-only field, it already fetches that target on demand. Copy those fetched states onto their plan entries (entry.RemoteState) so the plan shows what was actually read. Done in a single-threaded pass after the parallel walk: during the walk a target is fetched from a dependent's goroutine under the target's read lock, where writing its entry would race with sibling dependents. Co-authored-by: Isaac
Add a LOCAL=["", "--local"] matrix to three resource tests (jobs/num_workers, schemas/update, volumes/change-name) so plan/deploy run both with and without --local. Deploy issues the same mutating requests either way (only GET reads differ, which print_requests.py excludes), so output is identical across variants. --local is excluded on terraform (rejected there) and not applied to `bundle plan -o json`, whose remote_state would diverge. Co-authored-by: Isaac
A --local plan is computed without remote state, so a saved plan can miss out-of-band drift. Add a top-level local_only field (omitempty, so normal plans are unchanged) and warn when deploy --plan applies a local-only plan. Extend local/basic to record the JSON plan, showing local_only: true and the absence of remote_state. Co-authored-by: Isaac
Drop the redundant b.localOnly field (remoteStateForRef reads b.Plan.LocalOnly, set before the walk), remove a dead nil-guard in the post-walk reconciliation loop (entries are always nil there in --local mode), and trim a duplicated comment. No behavior change. Also regenerate no_drift/out.test.toml for the merged LOCAL_DIFF matrix. Co-authored-by: Isaac
Co-authored-by: Isaac
Tested commit: 6b94feb7d acc: regenerate no_drift/out.test.toml with LOCAL_DIFF matrix entry
<!-- Acceptance tests: 6 (2 added, 4 modified) — 6 regression -->
| test | branch | main (de465e09b) | latest (v1.6.0) |
| --- | --- | --- | --- |
| TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct | ✅ | ❌ | ❌ |
| TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=genie_space.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=genie_space.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_index.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_index.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |
<details>
<summary>TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>
**main (de465e09b):**
```
=== RUN TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
acceptance_test.go:1083: Diff:
--- bundle/local/basic/output.txt
+++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalbasicDATABRICKS_BUNDLE_ENGINE=direct2985499174/001/output.txt
@@ -6,46 +6,25 @@
Deployment complete!
>>> [CLI] bundle plan --local
-Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged
+Error: unknown flag: --local
-=== Job reads during 'bundle plan --local':
+Usage:
+ databricks bundle plan [flags]
->>> print_requests.py --get //jobs/get
+Flags:
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --force Force-override Git branch validation.
+ -h, --help help for plan
+ --select strings Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
-=== Plan --local as JSON:
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
->>> [CLI] bundle plan --local -o json
-{
- "plan_version": 2,
- "cli_version": "[DEV_VERSION]",
- "lineage": "[UUID]",
- "serial": 1,
- "local_only": true,
- "plan": {
- "resources.jobs.bar": {
- "action": "skip"
- },
- "resources.jobs.foo": {
- "depends_on": [
- {
- "node": "resources.jobs.bar",
- "label": "${resources.jobs.bar.id}"
- }
- ],
- "action": "skip"
- }
- }
-}
->>> [CLI] bundle deploy --local
-Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/local-[UNIQUE_NAME]/default/files...
-Deploying resources...
-Updating deployment state...
-Deployment complete!
-
-=== Telemetry:
-local_used true
-
=== Destroy
>>> [CLI] bundle destroy --auto-approve
The following resources will be deleted:
@@ -56,3 +30,5 @@
Deleting files...
Destroy complete!
+
+Exit code: 1
--- FAIL: TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct (1.07s)
```
**latest (v1.6.0):**
```
=== RUN TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
acceptance_test.go:1083: Diff:
--- bundle/local/basic/output.txt
+++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalbasicDATABRICKS_BUNDLE_ENGINE=direct798157468/001/output.txt
@@ -6,46 +6,25 @@
Deployment complete!
>>> [CLI] bundle plan --local
-Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged
+Error: unknown flag: --local
-=== Job reads during 'bundle plan --local':
+Usage:
+ databricks bundle plan [flags]
->>> print_requests.py --get //jobs/get
+Flags:
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --force Force-override Git branch validation.
+ -h, --help help for plan
+ --select strings Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
-=== Plan --local as JSON:
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
->>> [CLI] bundle plan --local -o json
-{
- "plan_version": 2,
- "cli_version": "[DEV_VERSION]",
- "lineage": "[UUID]",
- "serial": 1,
- "local_only": true,
- "plan": {
- "resources.jobs.bar": {
- "action": "skip"
- },
- "resources.jobs.foo": {
- "depends_on": [
- {
- "node": "resources.jobs.bar",
- "label": "${resources.jobs.bar.id}"
- }
- ],
- "action": "skip"
- }
- }
-}
->>> [CLI] bundle deploy --local
-Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/local-[UNIQUE_NAME]/default/files...
-Deploying resources...
-Updating deployment state...
-Deployment complete!
-
-=== Telemetry:
-local_used true
-
=== Destroy
>>> [CLI] bundle destroy --auto-approve
The following resources will be deleted:
@@ -56,3 +30,5 @@
Deleting files...
Destroy complete!
+
+Exit code: 1
--- FAIL: TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct (0.77s)
```
</details>
<details>
<summary>TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>
**main (de465e09b):**
```
=== RUN TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== PAUSE TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== CONT TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
acceptance_test.go:1083: Diff:
--- bundle/local/rejected/output.txt
+++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalrejectedDATABRICKS_BUNDLE_ENGINE=terraf1530229415/001/output.txt
@@ -1,12 +1,48 @@
>>> [CLI] bundle plan --local
-Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
+Error: unknown flag: --local
+Usage:
+ databricks bundle plan [flags]
+Flags:
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --force Force-override Git branch validation.
+ -h, --help help for plan
+ --select strings Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
+
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
+
+
Exit code: 1
>>> [CLI] bundle deploy --local
-Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
+Error: unknown flag: --local
+Usage:
+ databricks bundle deploy [flags]
+Flags:
+ --auto-approve Skip interactive approvals that might be required for deployment.
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --fail-on-active-runs Fail if there are running jobs or pipelines in the deployment.
+ --force Force-override Git branch validation.
+ --force-lock Force acquisition of deployment lock.
+ -h, --help help for deploy
+ --plan string Path to a JSON plan file to apply instead of planning (direct engine only).
+ --select strings Deploy only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
+
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
+
+
Exit code: 1
--- FAIL: TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform (0.05s)
```
**latest (v1.6.0):**
```
=== RUN TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== PAUSE TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== CONT TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
acceptance_test.go:1083: Diff:
--- bundle/local/rejected/output.txt
+++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalrejectedDATABRICKS_BUNDLE_ENGINE=terraf2105928878/001/output.txt
@@ -1,12 +1,48 @@
>>> [CLI] bundle plan --local
-Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
+Error: unknown flag: --local
+Usage:
+ databricks bundle plan [flags]
+Flags:
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --force Force-override Git branch validation.
+ -h, --help help for plan
+ --select strings Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
+
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
+
+
Exit code: 1
>>> [CLI] bundle deploy --local
-Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
+Error: unknown flag: --local
+Usage:
+ databricks bundle deploy [flags]
+Flags:
+ --auto-approve Skip interactive approvals that might be required for deployment.
+ -c, --cluster-id string Override cluster in the deployment with the given cluster ID.
+ --fail-on-active-runs Fail if there are running jobs or pipelines in the deployment.
+ --force Force-override Git branch validation.
+ --force-lock Force acquisition of deployment lock.
+ -h, --help help for deploy
+ --plan string Path to a JSON plan file to apply instead of planning (direct engine only).
+ --select strings Deploy only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
+
+Global Flags:
+ --debug enable debug logging
+ -o, --output type output type: text or json (default text)
+ -p, --profile string ~/.databrickscfg profile
+ -t, --target string bundle target to use (if applicable)
+ --var strings set values for variables defined in bundle config. Example: --var="foo=bar"
+
+
Exit code: 1
--- FAIL: TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform (0.06s)
```
</details>
<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>
**main (de465e09b):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di3172530878/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
LOG.config: name: test-bundle-3qcizlrz6zeqlokrmg4s54rgne
LOG.config:
LOG.config: resources:
LOG.config: alerts:
LOG.config: foo:
LOG.config: warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
LOG.config: display_name: test-alert-3qcizlrz6zeqlokrmg4s54rgne
LOG.config: file_path: ./alert.dbalert.json
LOG.config: permissions:
LOG.config: - level: CAN_MANAGE
LOG.config: group_name: users
acceptance_test.go:942: LOG.cp:
acceptance_test.go:942:
LOG.deploy:
LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy
LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default/files...
LOG.deploy: Deploying resources...
LOG.deploy: Updating deployment state...
LOG.deploy: Deployment complete!
acceptance_test.go:942:
LOG.destroy:
LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
LOG.destroy: The following resources will be deleted:
LOG.destroy: delete resources.alerts.foo
LOG.destroy:
LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default
LOG.destroy:
LOG.destroy: Deleting files...
LOG.destroy: Destroy complete!
acceptance_test.go:942: LOG.planjson:
acceptance_test.go:942:
LOG.validate:
LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
LOG.validate: Name: test-bundle-3qcizlrz6zeqlokrmg4s54rgne
LOG.validate: Target: default
LOG.validate: Workspace:
LOG.validate: User: tester@databricks.com
LOG.validate: Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default
LOG.validate:
LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.38s)
```
**latest (v1.6.0):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di2526780256/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
LOG.config: name: test-bundle-q74yvfo34ffezmspxodeoenate
LOG.config:
LOG.config: resources:
LOG.config: alerts:
LOG.config: foo:
LOG.config: warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
LOG.config: display_name: test-alert-q74yvfo34ffezmspxodeoenate
LOG.config: file_path: ./alert.dbalert.json
LOG.config: permissions:
LOG.config: - level: CAN_MANAGE
LOG.config: group_name: users
acceptance_test.go:942: LOG.cp:
acceptance_test.go:942:
LOG.deploy:
LOG.deploy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle deploy
LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default/files...
LOG.deploy: Deploying resources...
LOG.deploy: Updating deployment state...
LOG.deploy: Deployment complete!
acceptance_test.go:942:
LOG.destroy:
LOG.destroy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle destroy --auto-approve
LOG.destroy: The following resources will be deleted:
LOG.destroy: delete resources.alerts.foo
LOG.destroy:
LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default
LOG.destroy:
LOG.destroy: Deleting files...
LOG.destroy: Destroy complete!
acceptance_test.go:942: LOG.planjson:
acceptance_test.go:942:
LOG.validate:
LOG.validate: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle validate
LOG.validate: Name: test-bundle-q74yvfo34ffezmspxodeoenate
LOG.validate: Target: default
LOG.validate: Workspace:
LOG.validate: User: tester@databricks.com
LOG.validate: Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default
LOG.validate:
LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.32s)
```
</details>
<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>
**main (de465e09b):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1652478110/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
LOG.config: name: test-bundle-yjzfni652vbtvi5ymltuu4jisu
LOG.config:
LOG.config: resources:
LOG.config: alerts:
LOG.config: foo:
LOG.config: warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
LOG.config: display_name: test-alert-yjzfni652vbtvi5ymltuu4jisu
LOG.config: file_path: ./alert.dbalert.json
LOG.config: permissions:
LOG.config: - level: CAN_MANAGE
LOG.config: group_name: users
acceptance_test.go:942: LOG.cp:
acceptance_test.go:942:
LOG.deploy:
LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy --plan plan.json
LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default/files...
LOG.deploy: Deploying resources...
LOG.deploy: Updating deployment state...
LOG.deploy: Deployment complete!
acceptance_test.go:942:
LOG.destroy:
LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
LOG.destroy: The following resources will be deleted:
LOG.destroy: delete resources.alerts.foo
LOG.destroy:
LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default
LOG.destroy:
LOG.destroy: Deleting files...
LOG.destroy: Destroy complete!
acceptance_test.go:942: LOG.planjson:
acceptance_test.go:942:
LOG.validate:
LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
LOG.validate: Name: test-bundle-yjzfni652vbtvi5ymltuu4jisu
LOG.validate: Target: default
LOG.validate: Workspace:
LOG.validate: User: tester@databricks.com
LOG.validate: Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default
LOG.validate:
LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 (0.32s)
```
**latest (v1.6.0):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1892342805/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
LOG.config: name: test-bundle-ly7ipbof5naa5eogrk43vhpxay
LOG.config:
LOG.config: resources:
LOG.config: alerts:
LOG.config: foo:
LOG.config: warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
LOG.config: display_name: test-alert-ly7ipbof5naa5eogrk43vhpxay
LOG.config: file_path: ./alert.dbalert.json
LOG.config: permissions:
LOG.config: - level: CAN_MANAGE
LOG.config: group_name: users
acceptance_test.go:942: LOG.cp:
acceptance_test.go:942:
LOG.deploy:
LOG.deploy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle deploy --plan plan.json
LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default/files...
LOG.deploy: Deploying resources...
LOG.deploy: Updating deployment state...
LOG.deploy: Deployment complete!
acceptance_test.go:942:
LOG.destroy:
LOG.destroy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle destroy --auto-approve
LOG.destroy: The following resources will be deleted:
LOG.destroy: delete resources.alerts.foo
LOG.destroy:
LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default
LOG.destroy:
LOG.destroy: Deleting files...
LOG.destroy: Destroy complete!
acceptance_test.go:942: LOG.planjson:
acceptance_test.go:942:
LOG.validate:
LOG.validate: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle validate
LOG.validate: Name: test-bundle-ly7ipbof5naa5eogrk43vhpxay
LOG.validate: Target: default
LOG.validate: Workspace:
LOG.validate: User: tester@databricks.com
LOG.validate: Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default
LOG.validate:
LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 (0.32s)
```
</details>
<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>
**main (de465e09b):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1994182820/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
LOG.config: name: test-bundle-42b7orzkifflve5iq6gr7qgpnu
LOG.config:
LOG.config: resources:
LOG.config: apps:
LOG.config: foo:
LOG.config: name: app-42b7orzkifflve5iq6gr7qgpnu
LOG.config: source_code_path: ./app
LOG.config: permissions:
LOG.config: - level: CAN_USE
LOG.config: group_name: users
acceptance_test.go:942: LOG.cp:
acceptance_test.go:942:
LOG.deploy:
LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy
LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default/files...
LOG.deploy: Deploying resources...
LOG.deploy: Updating deployment state...
LOG.deploy: Deployment complete!
acceptance_test.go:942:
LOG.destroy:
LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
LOG.destroy: The following resources will be deleted:
LOG.destroy: delete resources.apps.foo
LOG.destroy:
LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default
LOG.destroy:
LOG.destroy: Deleting files...
LOG.destroy: Destroy complete!
acceptance_test.go:942: LOG.planjson:
acceptance_test.go:942:
LOG.validate:
LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
LOG.validate: Name: test-bundle-42b7orzkifflve5iq6gr7qgpnu
LOG.validate: Target: default
LOG.validate: Workspace:
LOG.validate: User: tester@databricks.com
LOG.validate: Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default
LOG.validate:
LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.32s)
```
**latest (v1.6.0):**
```
=== RUN TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
acceptance_test.go:1083:
Error Trace: /Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
Error: Not equal:
expected: "INPUT_CONFIG_OK\n"
actual : "INPUT_CONFIG_OK\n\nExit code: 1\n"
Diff:
--- Expected
+++ Actual
@@ -2 +2,3 @@
+Exit code: 1
+
Test: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
Messages: bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di992411277/001/output.txt
acceptance_test.go:942:
LOG.config: bundle:
…
…t tests Co-authored-by: Isaac
Co-authored-by: Isaac
…ly field Co-authored-by: Isaac
Co-authored-by: Isaac
In --local mode the per-resource remote read is skipped. Previously this left the remote comparison value nil, so state-only fields reconciled via OverrideChangeDesc (dashboard/genie etag, vector_search_index endpoint_uuid) read as spurious drift. Treat the saved state as the remote stand-in: it is our last recorded snapshot of remote, so drift is computed purely from saved-state vs config and these fields reconcile against their saved value. VectorSearchIndex.OverrideChangeDesc now reads change.Remote (equal to the raw remote's EndpointUuid) instead of the raw remote param, which is nil in --local. Drops the three no_drift EnvMatrixExclude entries that worked around this, and reverts the --local matrix on schemas/drift/managed_properties (its subject is a remote-only managed-properties map that has no local stand-in, so it is a genuine bad fit for --local). Co-authored-by: Isaac
Co-authored-by: Isaac
The hook dereferenced its raw remote *AppRemote param, but calladapt delivers a typed nil when the remote read is skipped (--local) or the resource does not exist remotely. Read change.Remote instead, matching the pattern used by vector_search_index. Co-authored-by: Isaac
Every row now passes a typed-nil raw remote param, so the nil-safety guarantee is exercised on every case rather than a dedicated subtest. Co-authored-by: Isaac
Introduce deployplan.PlanMode enum (Full, Local, Offline) and thread it through the planner and CLI. --local becomes --plan-mode=local; Offline is reserved for a follow-up. Bundle.Local becomes Bundle.PlanMode, and the local_used telemetry key becomes plan_mode_used_<mode>. Co-authored-by: Isaac
Two fixes from the cursor-agent review: 1. In --plan-mode=local, entry.RemoteState was being set to savedState (state type, e.g. *AppState). Apply-time consumers like remoteIsStarted type-assert to the remote type (*AppRemote) and silently returned false, which made manageLifecycle skip a Stop when config toggled lifecycle.started true → false. Leave entry.RemoteState nil in local mode; classification still uses savedState via the local remoteStateComparable variable that feeds change.Remote. 2. --plan-mode=offline was accepted at flag-parse but not wired: a reference to a remote-only field on an unchanged target hit an internal error in LookupReferencePreDeploy. Reject the value at parse time until Offline semantics are implemented. SkipsRemoteReads() narrowed to Local only. acc: local/rejected covers the offline rejection and unknown values. acc: local/basic output.txt regenerated (remote_state no longer present in local-mode plan JSON). Co-authored-by: Isaac
denik
marked this pull request as draft
July 20, 2026 08:51
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.
Adds a hidden
--localflag tobundle planandbundle deploy. When passed, the plan is computed from the local state only — the per-resource remote read is skipped, so the remote state of resources is neither fetched nor considered.${resources...}references still resolve: if fetching remote state is needed for resolution, we'll still fetchthe remote state.In
--localmode the saved state is used as the stand-in for remote, so state-only fields (dashboard/genie_space etag, vector_search_index endpoint_uuid) reconcile against their saved value rather than nil — avoiding spurious drift.Why
Tests
acceptance/bundle/local/basic—plan --localreports no drift and issues no resource reads; resolves a cross-resource.idreference from local state;local_usedtelemetry on deploy; out-of-band rename is invisible to--local plan;deploy --planwith a--localplan warns;READPLANmatrix covers the warning.acceptance/bundle/local/references—plan --localfetches only the one referenced target on-demand (for a remote-only field), reports no drift, and is unaffected by out-of-band drift on that target; a normal plan detects the same drift.acceptance/bundle/local/rejected— terraform rejects the flag.no_driftinvariant gains aLOCAL_DIFFmatrix that runs every config with and without--local.acceptance/bundle/resources—--localmatrix added to catalogs, external_locations, jobs/num_workers, volumes/change-name for smoke coverage.