Skip to content

Add lifecycle.bind to adopt existing workspace resources at deploy time - #7321

Draft
janniklasrose wants to merge 26 commits into
mainfrom
janniklasrose/declarative-bind
Draft

janniklasrose wants to merge 26 commits into
mainfrom
janniklasrose/declarative-bind

Conversation

@janniklasrose

Copy link
Copy Markdown
Member

What this does

Adds a lifecycle.bind setting to bundle resources. On the next bundle deploy, the CLI adopts the existing workspace resource with that ID into the deployment state instead of creating a new one; from then on the bundle manages it like any other resource.

resources:
  jobs:
    my_job:
      name: my job
      lifecycle:
        bind:
          id: "12345"

targets:
  prod:
    resources:
      jobs:
        my_job:
          lifecycle:
            bind:
              id: "67890"   # per-target IDs via the usual override

This is the declarative counterpart of databricks bundle deployment bind, which stays as is.

Semantics

  • First deploy: bind when the remote resource already matches the config, bind_and_update when the config differs (the configured changes are applied through the same update/resize paths as a normal deploy). Both show up in bundle plan (text, and JSON with bind_id), in the deploy output (Bound ..., Bound and updated ..., N bound) and in deployment history.
  • While lifecycle.bind is present, a change that would recreate the resource or change its ID is an error that names the fields and the two ways out (revert the fields, or remove the block). The block is state-less: nothing in the state records the adoption, so the guard is exactly the presence of the block, like prevent_destroy.
  • Removing the resource from config removes the block with it and the deploy deletes the resource, as with prevent_destroy. bundle destroy deletes bound resources like any other.
  • A bound resource that was deleted out-of-band is an error (remove the block to create a new one), not a silent re-create under a new ID.
  • bundle deployment unbind warns when the resource still has lifecycle.bind, since the next deploy re-binds it.
  • Variable references in id are resolved like any other resource field.

Note for adopters: the bundle sets deployment, edit_mode and similar fields on every job and pipeline, so the first bind of a resource that was never bundle-deployed is a bind_and_update (for jobs a full reset), and mode: development transforms (name prefix, paused schedules, tags) apply to the adopted resource. bundle plan -o json lists the fields.

Errors caught at plan time

  • an ID that does not exist in the workspace
  • two resources of the same type binding the same ID, or a bind ID equal to another in-state resource's ID of that type
  • a resource already in state under a different ID
  • an update for a resource type that has no update operation

Relation to #4630 and the design

Builds on #4630 and keeps its commits. Changes against the design as approved:

  • the block moved from targets.<name>.bind to the resource's lifecycle, so misplaced or stale blocks cannot happen and the regular config pipeline handles variables, locations and overrides;
  • the terraform-engine and bundle deployment migrate restrictions are moot since the terraform engine was removed in v1.20.0;
  • bundle destroy is allowed, as the design states.

Test plan

Acceptance tests under acceptance/bundle/deploy/bind/ (all Cloud = true; run locally in both deployment-history variants): happy paths (basic, bind-and-update, bind-and-resize, pure-bind, variable-id, int-id, target-override, ref-to-bound), guards (recreate-blocked, recreate-blocked-in-state, gone-in-state, rebind-different-id, duplicate-bind-id, duplicate-bind-id-config, delete-and-bind-conflict, id-collision-different-type, resource-not-found), lifecycle semantics (removed-from-config, block-removed, destroy-allowed, dev-mode). Unit tests for the touched packages pass; lint is clean.

This pull request and its description were written by Isaac.

shreyas-goenka and others added 22 commits May 7, 2026 12:42
Allow users to bring existing workspace resources under bundle management
declaratively via `bind` blocks under a target. Adds:

- `Bind` config type and `bind` field on `Target` in `bundle/config`,
  with a structural validator that rejects child resources
  (`*.permissions`, `*.grants`).
- `Bind` and `BindAndUpdate` action types in the deploy plan, surfaced
  in `bundle plan` output (and in the summary as "N to bind").
- `DeploymentBundle.ApplyBindToPlan` (in `bundle/direct/bundle_plan_bind.go`),
  which runs after `CalculatePlan`, validates bind references, detects
  bind-ID/state-ID conflicts, and reads remote state to choose
  `Bind` vs `BindAndUpdate` per resource.
- `DeploymentUnit.DeclarativeBind` apply path that persists the bound ID
  (and optionally invokes `DoUpdate` for `BindAndUpdate`).
- Targeted error in `libs/dyn/convert/normalize.go` for `bind` placed at
  the root level.
- Rejection of bind blocks in the terraform path (`RunPlan`),
  `bundle deployment migrate`, and `bundle destroy` when the bind
  matches a resource currently in state.

Acceptance coverage in `acceptance/bundle/deploy/bind/` covers the
happy path (basic, bind_and_update), validation errors (invalid
resource type, orphaned bind, top-level bind, duplicate id, terraform
engine, child resources), runtime errors (resource not found, recreate
blocked), and the destroy / migrate guards.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Isaac
# Conflicts:
#	bundle/deployplan/plan.go
#	bundle/direct/bundle_apply.go
#	bundle/internal/schema/annotations.yml
#	bundle/phases/deploy.go
#	bundle/phases/destroy.go
- validateBindConfig now rejects two bind blocks pointing at the same
  workspace ID. Previously duplicate IDs were only checked against state,
  so two first-time binds could create two state entries managing one
  remote resource.
- DeclarativeBind's BindAndUpdate path now defers to Update, so DoUpdate
  runs with transient retries and WaitAfterUpdate is invoked. Async
  resources rely on that hook; the previous inline path skipped it.
- Add acceptance test duplicate-bind-id-config for the new validation.

Co-authored-by: Isaac
…, drop root-bind error

- Bind.Validate now checks resource types against the closed allowlist
  from config.SupportedResources() instead of an open blocklist of
  *.permissions / *.grants. Only types valid under the resources block
  are bindable; anything else (typo, child key, etc.) is rejected with a
  "not supported" message. Drops the child-resource terminology.
- Split DeclarativeBind into Bind and BindAndUpdate DeploymentUnit
  methods, dispatched from the apply loop like the other action types.
- Remove the special root-level bind error in normalize.go; a root bind
  block is just an ignored unknown-field warning now.
- Move the changelog entry from NEXT_CHANGELOG.md to a
  .nextchanges/bundles/ fragment (new convention, #5534).
- Regenerate affected acceptance goldens (bind-permissions,
  invalid-resource-type, top-level-bind).

Co-authored-by: Isaac
Previously ApplyBindToPlan ran as a separate step after CalculatePlan,
re-reading remote state for bound resources with its own error handling.
Since binding a resource is just the "resource exists remotely under a
known ID but isn't in state yet" variant of normal planning, fold it in:

- CalculatePlan takes a bindConfig parameter. Cross-resource bind
  validation runs once up front; the per-resource bind flow
  (handleBindPlan) runs inside the DAG walk, in the not-in-state branch,
  instead of defaulting to Create.
- Bound-resource remote reads now go through retryOnTransient and the
  parallel DAG walk like every other resource read.
- The "already in state under a different ID" check moved into
  validateBindConfig (it is cross-resource, so it stays out of the
  parallel closure).
- Remove ApplyBindToPlan; update all CalculatePlan callers.

Bind planning errors now surface under the shared "planning failed"
summary instead of "bind planning failed" (goldens regenerated); the
detailed per-resource messages are unchanged.

Co-authored-by: Isaac
staticcheck QF1002: prefer a tagged switch over switch-true with
equality cases.

Co-authored-by: Isaac
The design allows `bundle destroy` even when bind blocks reference
resources in state: naming destroy explicitly captures the user's intent
to tear the deployment down. The bind block guards against *accidental*
deletion during a normal deploy, not against a deliberate destroy.

Remove errIfBoundResourcesInState and the destroy-time guard, repurpose
the destroy-blocked acceptance test as destroy-allowed, and drop the
now-unnecessary "remove bind block before destroy" workaround from the
basic and bind-and-update tests.

Co-authored-by: Isaac
BindAndUpdate hard-coded d.Update, so a bound running cluster with only
num_workers/autoscale drift was applied via clusters/edit (which restarts
the cluster) instead of the graceful clusters/resize path a normal deploy
would take. Dispatch on the planned action instead: Resize for a resize
diff, Update otherwise. Recreate/UpdateWithID are already rejected at plan
time, so only those two actions can reach here.

Add a bind-and-resize acceptance test that binds a running cluster with
worker-count-only drift and asserts the resize API is called.

Co-authored-by: Isaac
The text plan printed bind actions via StringShort(), which truncates at
the first underscore, so bind_and_update rendered as "bind" and was
indistinguishable from a pure bind. Print the full action string for bind
actions instead, matching the design's plan example and the JSON output.

Co-authored-by: Isaac
The recreate/update_id guard only fired during the initial bind, when the
resource was still absent from state. Once bound, a later config change
that forced a recreate took the normal approval flow with no bind-block
guard, so a bound resource could be recreated while its bind block was
still defined.

Extend the guard to the in-state deploy path: while an active bind block
references a resource, a planned Recreate/UpdateWithID surfaces the same
actionable error as the initial bind. Removing the bind block remains the
explicit opt-out. Add a recreate-blocked-in-state acceptance test.

Co-authored-by: Isaac
Main removed the terraform deployment engine (v1.20.0), so the terraform
rejection in RunPlan and the terraform-with-bind test are gone; bind now
runs on the only engine. Bind actions are wired into main's per-resource
deploy reporting ("Bound" / "Bound and updated" lines, "N bound" in the
summary), into plan.CountActions, and into the deployment history
operation types (OPERATION_ACTION_TYPE_BIND / _BIND_AND_UPDATE).

Co-authored-by: Isaac <no-reply@databricks.com>
A bind block whose resource is not in the resources section was only caught
at plan time, by looking the key up in the plan map. State-only keys are in
that map as delete entries, so removing a bound resource from config while
keeping its bind block passed validation and 'bundle deploy' deleted the
bound workspace resource. The agreed behaviour is that delete protection
applies for as long as the bind block remains.

Move the check into ValidateBindResources (initialize phase): it needs only
config, so 'bundle validate' now reports it, and a delete can no longer be
planned for a key that still has a bind block.

Co-authored-by: Isaac <no-reply@databricks.com>
When a bound resource (in state, bind block present) no longer exists in the
workspace, the in-state plan path mapped the 404 to a create. The deploy then
created a replacement under a new ID, and every following plan failed with
'already bound to a different ID' until the user edited the bind block.

A bind block pins the resource to one ID, so report the deletion and let the
user decide: remove the block to create a new resource.

Co-authored-by: Isaac <no-reply@databricks.com>
A bind block outside targets was dropped as an unknown field with only a
warning, and the deploy then created the resources it named instead of
binding the existing ones. Fail config loading with a pointer to
targets.<target>.bind instead.

Co-authored-by: Isaac <no-reply@databricks.com>
SelectTarget keeps the selected target as a typed snapshot and drops the
targets section from the config tree, so ${var.*} in a bind ID was never
interpolated: the plan tried to read a job with the literal ID
'${var.job_id}'. The generated schema already advertises the variable
pattern for this field.

Add a mutator that resolves bundle, workspace and variable references in
the target's bind IDs after the regular variable resolution, sharing the
${var.x} shorthand rewrite with it.

Co-authored-by: Isaac <no-reply@databricks.com>
- Scope the state ID collision check to the bind's own resource type: IDs
  are only unique per type, so a job and an experiment may share one.
- Resolve ${resources.<key>.id} references to a resource being bound from
  the bind block instead of deferring them to after apply; the ID is known.
- Reuse the remote state read at plan time in Bind, so dependents such as
  permissions no longer trigger a second read of the bound resource.
- Reword the persistent recreate guard for resources already in state: they
  are bound, not being bound, and 'make this a bind-only operation' does not
  apply. Drop the trailing newline from the error text.
- Mirror the in-state DoUpdate check in first-time bind planning so a
  resource without DoUpdate fails at plan time, not at apply time.
- Return a status from handleBindPlan instead of reading the shared error
  flag, which is racy under parallel planning.

Co-authored-by: Isaac <no-reply@databricks.com>
Bind is state-less: nothing records that a resource was just unbound, so a
bind block still in config re-adopts it on the next deploy. Say so when
'bundle deployment unbind' runs for a key that has a bind block in the
selected target.

The new pure-bind test also pins the re-bind round trip itself, the pure
'bind' action (the first deploy of a job is always a bind_and_update because
the bundle sets deployment metadata on it), and the single remote read of a
pure bind.

Co-authored-by: Isaac <no-reply@databricks.com>
The command only converts an existing terraform state into a direct state
now that the terraform engine is gone; it no longer plans anything, and
'bundle deploy' already migrates automatically with bind blocks present.
Rejecting bind blocks here only forced users to remove and re-add them.

Also note at the remote-sync call site why it plans without bind blocks.

Co-authored-by: Isaac <no-reply@databricks.com>
- int-id: an unquoted (integer) ID, as written in the design doc, binds.
- dev-mode: development mode transforms (rename, paused schedule, tags)
  apply to the adopted resource and are visible in the plan.
- block-removed: removing the bind block is the opt-out; the same immutable
  change then plans a recreate.
- rebind-different-id: a bind block for a resource already in state must
  carry the state ID.

Co-authored-by: Isaac <no-reply@databricks.com>
Spell out in the schema descriptions what a bind block does on the first
deploy (adopt, and update if the config differs, including target mode
transforms), what it guards while it remains (delete, recreate), and what
it does not (bundle destroy; no marker in state). The regenerated schema
also picks up main's current variable pattern for the bind definitions.

Co-authored-by: Isaac <no-reply@databricks.com>
…inter

Co-authored-by: Isaac <no-reply@databricks.com>
Bind becomes a lifecycle setting of the resource it adopts:

    resources:
      jobs:
        my_job:
          lifecycle:
            bind:
              id: "12345"

with per-target IDs set through the usual target override of the resource.
This replaces the target-level 'bind' block (design decision DD2 reversed).

The block now lives on the resource, so a whole class of misplacements
cannot happen: a bind for an undefined resource, a root-level or target-level
misplacement that silently created a duplicate, and a stale block whose
resource was removed. Variable references, diagnostic locations and target
overrides come from the regular config pipeline, which removes the dedicated
resolver and validator and the typed target snapshot they worked around.
CalculatePlan derives the bind IDs from the config root again.

Semantics follow prevent_destroy: the guard against recreating the bound
resource holds while the block is in config; removing the resource removes
the block with it and the deploy deletes the resource, which the
removed-from-config test pins. Duplicate-ID detection is now scoped per
resource type, matching the state collision check.

Tests: configs moved to the new shape; orphaned-bind, invalid-resource-type,
bind-permissions and top-level-bind are gone (not expressible); new
target-override test; errors now point at resources.<type>.<name>.lifecycle.bind.id
with file locations.

Co-authored-by: Isaac <no-reply@databricks.com>
@github-actions github-actions Bot added the DABs DABs related issues label Nov 3, 2026
Co-authored-by: Isaac <no-reply@databricks.com>
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Commit: 0e9256fa7 | Workflow run

Regression test report

Selected 20 changed tests (limit=20, 2 not selected)

40 tests: regression=40 unreleased=0 coverage=0 failing=0
test branch main (44f2eda) latest (v1.23.0)
TestAccept/bundle/deploy/bind/basic/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/basic/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/bind-and-resize/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/bind-and-update/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/bind-and-update/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/block-removed/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/block-removed/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/destroy-allowed/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/destroy-allowed/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/dev-mode/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/dev-mode/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/duplicate-bind-id/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/duplicate-bind-id/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/gone-in-state/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/gone-in-state/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/id-collision-different-type/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/id-collision-different-type/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/int-id/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/int-id/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/pure-bind/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/pure-bind/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/rebind-different-id/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/rebind-different-id/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/recreate-blocked-in-state/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/recreate-blocked-in-state/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/recreate-blocked/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/recreate-blocked/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/ref-to-bound/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/ref-to-bound/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/removed-from-config/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/removed-from-config/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/resource-not-found/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/resource-not-found/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/target-override/DMS= ✅ ❌ ❌
TestAccept/bundle/deploy/bind/target-override/DMS=true ✅ ❌ ❌
TestAccept/bundle/deploy/bind/basic/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/basic/output.txt
        +++ /tmp/TestAcceptbundledeploybindbasicDMS=2652682987/002/output.txt
        @@ -1,16 +1,32 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
         
         >>> print_state.py
        @@ -21,7 +28,7 @@
          "serial": 1,
          "state": {
           "resources.jobs.foo": {
        -   "__id__": "[NEW_JOB_ID]",
        +   "__id__": "8793726025247954615",
            "state": {
             "deployment": {
              "kind": "BUNDLE",
        @@ -55,11 +62,6 @@
           }
          }
         }
        +contains error: '[NEW_JOB_ID]' not found in the output.
         
        ->>> [CLI] bundle destroy --auto-approve
        -The following resources will be deleted:
        -  delete resources.jobs.foo
        -
        -All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default
        -
        -Destroy: 1 deleted
        +Exit code: 1

latest (v1.23.0):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/basic/output.txt
        +++ /tmp/TestAcceptbundledeploybindbasicDMS=987516876/002/output.txt
        @@ -1,16 +1,32 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
         
         >>> print_state.py
        @@ -21,7 +28,7 @@
          "serial": 1,
          "state": {
           "resources.jobs.foo": {
        -   "__id__": "[NEW_JOB_ID]",
        +   "__id__": "8793726042466713238",
            "state": {
             "deployment": {
              "kind": "BUNDLE",
        @@ -55,11 +62,6 @@
           }
          }
         }
        +contains error: '[NEW_JOB_ID]' not found in the output.
         
        ->>> [CLI] bundle destroy --auto-approve
        -The following resources will be deleted:
        -  delete resources.jobs.foo
        -
        -All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default
        -
        -Destroy: 1 deleted
        +Exit code: 1
TestAccept/bundle/deploy/bind/basic/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/basic/output.txt
        +++ /tmp/TestAcceptbundledeploybindbasicDMS=true3496580772/002/output.txt
        @@ -1,16 +1,32 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
         
         >>> print_state.py
        @@ -21,7 +28,7 @@
          "serial": 1,
          "state": {
           "resources.jobs.foo": {
        -   "__id__": "[NEW_JOB_ID]",
        +   "__id__": "8793726026850164345",
            "state": {
             "deployment": {
              "kind": "BUNDLE",
        @@ -55,11 +62,6 @@
           }
          }
         }
        +contains error: '[NEW_JOB_ID]' not found in the output.
         
        ->>> [CLI] bundle destroy --auto-approve
        -The following resources will be deleted:
        -  delete resources.jobs.foo
        -
        -All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default
        -
        -Destroy: 1 deleted
        +Exit code: 1

latest (v1.23.0):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/basic/output.txt
        +++ /tmp/TestAcceptbundledeploybindbasicDMS=true3753338109/002/output.txt
        @@ -1,16 +1,32 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
         
         >>> print_state.py
        @@ -21,7 +28,7 @@
          "serial": 1,
          "state": {
           "resources.jobs.foo": {
        -   "__id__": "[NEW_JOB_ID]",
        +   "__id__": "8793726042419628199",
            "state": {
             "deployment": {
              "kind": "BUNDLE",
        @@ -55,11 +62,6 @@
           }
          }
         }
        +contains error: '[NEW_JOB_ID]' not found in the output.
         
        ->>> [CLI] bundle destroy --auto-approve
        -The following resources will be deleted:
        -  delete resources.jobs.foo
        -
        -All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-basic-[UNIQUE_NAME]/default
        -
        -Destroy: 1 deleted
        +Exit code: 1
TestAccept/bundle/deploy/bind/bind-and-resize/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/bind-and-resize/output.txt
        +++ /tmp/TestAcceptbundledeploybindbind-and-resizeDMS=3934607270/002/output.txt
        @@ -1,34 +1,50 @@
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
        +
         >>> [CLI] bundle plan
        -bind_and_update clusters.test_cluster (id: [CLUSTER_ID])
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create clusters.test_cluster
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/[UNIQUE_NAME]/files...
        -Bound and updated clusters.test_cluster
        +Created clusters.test_cluster
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> print_requests.py //clusters/resize //clusters/edit
        -{
        -  "method": "POST",
        -  "path": "/api/2.1/clusters/resize",
        -  "body": {
        -    "cluster_id": "[CLUSTER_ID]",
        -    "num_workers": 3
        -  }
        -}
         
         === Cluster should have new num_workers
         
         >>> [CLI] clusters get [CLUSTER_ID]
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         {
           "cluster_name": "test-cluster-[UNIQUE_NAME]",
        -  "num_workers": 3
        +  "num_workers": 2
         }
         
         >>> [CLI] bundle destroy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         The following resources will be deleted:
           delete resources.clusters.test_cluster

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/bind-and-resize/output.txt
        +++ /tmp/TestAcceptbundledeploybindbind-and-resizeDMS=true3318540027/002/output.txt
        @@ -1,34 +1,50 @@
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
        +
         >>> [CLI] bundle plan
        -bind_and_update clusters.test_cluster (id: [CLUSTER_ID])
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create clusters.test_cluster
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/[UNIQUE_NAME]/files...
        -Bound and updated clusters.test_cluster
        +Created clusters.test_cluster
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> print_requests.py //clusters/resize //clusters/edit
        -{
        -  "method": "POST",
        -  "path": "/api/2.1/clusters/resize",
        -  "body": {
        -    "cluster_id": "[CLUSTER_ID]",
        -    "num_workers": 3
        -  }
        -}
         
         === Cluster should have new num_workers
         
         >>> [CLI] clusters get [CLUSTER_ID]
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         {
           "cluster_name": "test-cluster-[UNIQUE_NAME]",
        -  "num_workers": 3
        +  "num_workers": 2
         }
         
         >>> [CLI] bundle destroy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         The following resources will be deleted:
           delete resources.clusters.test_cluster

latest (v1.23.0):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/bind-and-resize/output.txt
        +++ /tmp/TestAcceptbundledeploybindbind-and-resizeDMS=true2494972457/002/output.txt
        @@ -1,34 +1,50 @@
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
        +
         >>> [CLI] bundle plan
        -bind_and_update clusters.test_cluster (id: [CLUSTER_ID])
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create clusters.test_cluster
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/[UNIQUE_NAME]/files...
        -Bound and updated clusters.test_cluster
        +Created clusters.test_cluster
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> print_requests.py //clusters/resize //clusters/edit
        -{
        -  "method": "POST",
        -  "path": "/api/2.1/clusters/resize",
        -  "body": {
        -    "cluster_id": "[CLUSTER_ID]",
        -    "num_workers": 3
        -  }
        -}
         
         === Cluster should have new num_workers
         
         >>> [CLI] clusters get [CLUSTER_ID]
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         {
           "cluster_name": "test-cluster-[UNIQUE_NAME]",
        -  "num_workers": 3
        +  "num_workers": 2
         }
         
         >>> [CLI] bundle destroy --auto-approve
        +Warning: unknown field: bind
        +  at resources.clusters.test_cluster.lifecycle
        +  in databricks.yml:15:9
        +
         The following resources will be deleted:
           delete resources.clusters.test_cluster
         
        
FAIL
TestAccept/bundle/deploy/bind/bind-and-update/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/bind-and-update/output.txt
        +++ /tmp/TestAcceptbundledeploybindbind-and-updateDMS=1431931658/002/output.txt
        @@ -1,33 +1,65 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-update-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] jobs get [NEW_JOB_ID]
        -updated-job-name
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +original-job-name
        +
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         update jobs.foo
         
         Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged
         
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-update-[UNIQUE_NAME]/default/files...
         Updated jobs.foo
         Files: 1 uploaded, 0 deleted
         Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] jobs get [NEW_JOB_ID]
        -second-update-name
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +original-job-name
        +
         >>> [CLI] bundle destroy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         The following resources will be deleted:
           delete resources.jobs.foo

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/bind-and-update/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/bind-and-update/output.txt
        +++ /tmp/TestAcceptbundledeploybindbind-and-updateDMS=true1922727024/002/output.txt
        @@ -1,33 +1,65 @@
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +
         >>> [CLI] bundle plan
        -bind_and_update jobs.foo (id: [NEW_JOB_ID])
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        -Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        +create jobs.foo
         
        +Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-update-[UNIQUE_NAME]/default/files...
        -Bound and updated jobs.foo
        +Created jobs.foo
         Files: 2 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] jobs get [NEW_JOB_ID]
        -updated-job-name
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +original-job-name
        +
         >>> [CLI] bundle plan
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         update jobs.foo
         
         Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged
         
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-update-[UNIQUE_NAME]/default/files...
         Updated jobs.foo
         Files: 1 uploaded, 0 deleted
         Resources: 0 created, 1 changed, 0 deleted, 0 unchanged
         
         >>> [CLI] jobs get [NEW_JOB_ID]
        -second-update-name
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
         
        +original-job-name
        +
         >>> [CLI] bundle destroy --auto-approve
        +Warning: unknown field: bind
        +  at resources.jobs.foo.lifecycle
        +  in databricks.yml:18:9
        +
         The following resources will be deleted:
           delete resources.jobs.foo

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/block-removed/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/block-removed/output.txt
        +++ /tmp/TestAcceptbundledeploybindblock-removedDMS=3876576071/002/output.txt
        @@ -1,9 +1,17 @@
        +Warning: unknown field: bind
        +  at resources.pipelines.foo.lifecycle
        +  in databricks.yml:13:9
         
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.pipelines.foo.lifecycle
        +  in databricks.yml:13:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-block-removed-[UNIQUE_NAME]/default/files...
        -Bound and updated pipelines.foo
        +Created pipelines.foo
         Files: 3 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         === Removing the bind block is the opt-out: with it gone, the same storage change plans a recreate
         >>> [CLI] bundle plan

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/block-removed/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: Diff:
        --- bundle/deploy/bind/block-removed/output.txt
        +++ /tmp/TestAcceptbundledeploybindblock-removedDMS=true3916047109/002/output.txt
        @@ -1,9 +1,17 @@
        +Warning: unknown field: bind
        +  at resources.pipelines.foo.lifecycle
        +  in databricks.yml:13:9
         
        +
         >>> [CLI] bundle deploy --auto-approve
        +Warning: unknown field: bind
        +  at resources.pipelines.foo.lifecycle
        +  in databricks.yml:13:9
        +
         Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-block-removed-[UNIQUE_NAME]/default/files...
        -Bound and updated pipelines.foo
        +Created pipelines.foo
         Files: 3 uploaded, 0 deleted
        -Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        +Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
         
         === Removing the bind block is the opt-out: with it gone, the same storage change plans a recreate
         >>> [CLI] bundle plan

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 3 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> musterr [CLI] bundle plan\nError: resources.jobs.bar has the same lifecycle.bind ID \"[FOO_ID]\" as existing resource \"resources.jobs.foo\"; remove lifecycle.bind or the conflicting resource\n  at resources.jobs.bar.lifecycle.bind.id\n  in databricks.yml:19:15\n\nError: bind validation failed\n\n\n>>> [CLI] bundle destroy --auto-approve\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	actual  : "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 3 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> musterr [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.bar.lifecycle\n  in databricks.yml:18:9\n\ncreate jobs.bar\ndelete jobs.foo\n\nPlan: 1 to add, 0 to change, 1 to delete, 0 unchanged\n\nUnexpected success\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -8,16 +8,14 @@
        	            	 >>> musterr [CLI] bundle plan
        	            	-Error: resources.jobs.bar has the same lifecycle.bind ID "[FOO_ID]" as existing resource "resources.jobs.foo"; remove lifecycle.bind or the conflicting resource
        	            	-  at resources.jobs.bar.lifecycle.bind.id
        	            	-  in databricks.yml:19:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.bar.lifecycle
        	            	+  in databricks.yml:18:9
        	            	 
        	            	-Error: bind validation failed
        	            	+create jobs.bar
        	            	+delete jobs.foo
        	            	 
        	            	+Plan: 1 to add, 0 to change, 1 to delete, 0 unchanged
        	            	 
        	            	->>> [CLI] bundle destroy --auto-approve
        	            	-The following resources will be deleted:
        	            	-  delete resources.jobs.foo
        	            	+Unexpected success
        	            	 
        	            	-All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default
        	            	+Exit code: 1
        	            	 
        	            	-Destroy: 1 deleted
        	            	-
        	Test:       	TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=
        	Messages:   	bundle/deploy/bind/delete-and-bind-conflict/output.txt vs /tmp/TestAcceptbundledeploybinddelete-and-bind-conflictDMS=2032460938/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 3 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> musterr [CLI] bundle plan\nError: resources.jobs.bar has the same lifecycle.bind ID \"[FOO_ID]\" as existing resource \"resources.jobs.foo\"; remove lifecycle.bind or the conflicting resource\n  at resources.jobs.bar.lifecycle.bind.id\n  in databricks.yml:19:15\n\nError: bind validation failed\n\n\n>>> [CLI] bundle destroy --auto-approve\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	actual  : "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 3 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> musterr [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.bar.lifecycle\n  in databricks.yml:18:9\n\ncreate jobs.bar\ndelete jobs.foo\n\nPlan: 1 to add, 0 to change, 1 to delete, 0 unchanged\n\nUnexpected success\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -8,16 +8,14 @@
        	            	 >>> musterr [CLI] bundle plan
        	            	-Error: resources.jobs.bar has the same lifecycle.bind ID "[FOO_ID]" as existing resource "resources.jobs.foo"; remove lifecycle.bind or the conflicting resource
        	            	-  at resources.jobs.bar.lifecycle.bind.id
        	            	-  in databricks.yml:19:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.bar.lifecycle
        	            	+  in databricks.yml:18:9
        	            	 
        	            	-Error: bind validation failed
        	            	+create jobs.bar
        	            	+delete jobs.foo
        	            	 
        	            	+Plan: 1 to add, 0 to change, 1 to delete, 0 unchanged
        	            	 
        	            	->>> [CLI] bundle destroy --auto-approve
        	            	-The following resources will be deleted:
        	            	-  delete resources.jobs.foo
        	            	+Unexpected success
        	            	 
        	            	-All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-delete-conflict-[UNIQUE_NAME]/default
        	            	+Exit code: 1
        	            	 
        	            	-Destroy: 1 deleted
        	            	-
        	Test:       	TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=true
        	Messages:   	bundle/deploy/bind/delete-and-bind-conflict/output.txt vs /tmp/TestAcceptbundledeploybinddelete-and-bind-conflictDMS=true3780507896/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/destroy-allowed/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...\nBound and updated jobs.foo\nFiles: 2 uploaded, 0 deleted\nResources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound\n\n>>> [CLI] bundle destroy --auto-approve\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	actual  : "Warning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\n\n>>> [CLI] bundle deploy --auto-approve\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 2 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> [CLI] bundle destroy --auto-approve\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,9 +1,21 @@
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 
        	            	 >>> [CLI] bundle deploy --auto-approve
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...
        	            	-Bound and updated jobs.foo
        	            	+Created jobs.foo
        	            	 Files: 2 uploaded, 0 deleted
        	            	-Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        	            	+Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
        	            	 
        	            	 >>> [CLI] bundle destroy --auto-approve
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 The following resources will be deleted:
        	Test:       	TestAccept/bundle/deploy/bind/destroy-allowed/DMS=
        	Messages:   	bundle/deploy/bind/destroy-allowed/output.txt vs /tmp/TestAcceptbundledeploybinddestroy-allowedDMS=2464303663/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/destroy-allowed/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle deploy --auto-approve\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...\nBound and updated jobs.foo\nFiles: 2 uploaded, 0 deleted\nResources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound\n\n>>> [CLI] bundle destroy --auto-approve\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	actual  : "Warning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\n\n>>> [CLI] bundle deploy --auto-approve\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nUploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...\nCreated jobs.foo\nFiles: 2 uploaded, 0 deleted\nResources: 1 created, 0 changed, 0 deleted, 0 unchanged\n\n>>> [CLI] bundle destroy --auto-approve\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nThe following resources will be deleted:\n  delete resources.jobs.foo\n\nAll files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default\n\nDestroy: 1 deleted\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,9 +1,21 @@
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 
        	            	 >>> [CLI] bundle deploy --auto-approve
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bind-destroy-allowed-[UNIQUE_NAME]/default/files...
        	            	-Bound and updated jobs.foo
        	            	+Created jobs.foo
        	            	 Files: 2 uploaded, 0 deleted
        	            	-Resources: 0 created, 1 changed, 0 deleted, 0 unchanged, 1 bound
        	            	+Resources: 1 created, 0 changed, 0 deleted, 0 unchanged
        	            	 
        	            	 >>> [CLI] bundle destroy --auto-approve
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	+
        	            	 The following resources will be deleted:
        	Test:       	TestAccept/bundle/deploy/bind/destroy-allowed/DMS=true
        	Messages:   	bundle/deploy/bind/destroy-allowed/output.txt vs /tmp/TestAcceptbundledeploybinddestroy-allowedDMS=true1689033070/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/dev-mode/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle plan\nbind_and_update jobs.foo (id: [NEW_JOB_ID])\n\nPlan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind\n\n>>> [CLI] bundle plan -o json\njson.plan.resources.jobs.foo.changes.name.new = \"[dev [USERNAME]] test-bind-job\";\njson.plan.resources.jobs.foo.changes.schedule.pause_status.new = \"PAUSED\";\njson.plan.resources.jobs.foo.changes.tags.new.dev = \"[USERNAME]\";\n"
        	            	actual  : "Warning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\n\n>>> [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\ncreate jobs.foo\n\nPlan: 1 to add, 0 to change, 0 to delete, 0 unchanged\n\n>>> [CLI] bundle plan -o json\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,11 +1,22 @@
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	+
        	            	 
        	            	 >>> [CLI] bundle plan
        	            	-bind_and_update jobs.foo (id: [NEW_JOB_ID])
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	 
        	            	-Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        	            	+create jobs.foo
        	            	+
        	            	+Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        	            	 
        	            	 >>> [CLI] bundle plan -o json
        	            	-json.plan.resources.jobs.foo.changes.name.new = "[dev [USERNAME]] test-bind-job";
        	            	-json.plan.resources.jobs.foo.changes.schedule.pause_status.new = "PAUSED";
        	            	-json.plan.resources.jobs.foo.changes.tags.new.dev = "[USERNAME]";
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	 
        	            	+
        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/deploy/bind/dev-mode/DMS=
        	Messages:   	bundle/deploy/bind/dev-mode/output.txt vs /tmp/TestAcceptbundledeploybinddev-modeDMS=973961711/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/dev-mode/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle plan\nbind_and_update jobs.foo (id: [NEW_JOB_ID])\n\nPlan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind\n\n>>> [CLI] bundle plan -o json\njson.plan.resources.jobs.foo.changes.name.new = \"[dev [USERNAME]] test-bind-job\";\njson.plan.resources.jobs.foo.changes.schedule.pause_status.new = \"PAUSED\";\njson.plan.resources.jobs.foo.changes.tags.new.dev = \"[USERNAME]\";\n"
        	            	actual  : "Warning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\n\n>>> [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\ncreate jobs.foo\n\nPlan: 1 to add, 0 to change, 0 to delete, 0 unchanged\n\n>>> [CLI] bundle plan -o json\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:21:9\n\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1,11 +1,22 @@
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	+
        	            	 
        	            	 >>> [CLI] bundle plan
        	            	-bind_and_update jobs.foo (id: [NEW_JOB_ID])
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	 
        	            	-Plan: 0 to add, 1 to change, 0 to delete, 0 unchanged, 1 to bind
        	            	+create jobs.foo
        	            	+
        	            	+Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
        	            	 
        	            	 >>> [CLI] bundle plan -o json
        	            	-json.plan.resources.jobs.foo.changes.name.new = "[dev [USERNAME]] test-bind-job";
        	            	-json.plan.resources.jobs.foo.changes.schedule.pause_status.new = "PAUSED";
        	            	-json.plan.resources.jobs.foo.changes.tags.new.dev = "[USERNAME]";
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:21:9
        	            	 
        	            	+
        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/deploy/bind/dev-mode/DMS=true
        	Messages:   	bundle/deploy/bind/dev-mode/output.txt vs /tmp/TestAcceptbundledeploybinddev-modeDMS=true3786039196/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS=: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> musterr [CLI] bundle plan\nError: resources.jobs.bar has the same lifecycle.bind ID \"12345\" as resources.jobs.foo; each workspace resource can only be bound once\n  at resources.jobs.bar.lifecycle.bind.id\n  in databricks.yml:33:15\n\nError: resources.jobs.foo has the same lifecycle.bind ID \"12345\" as resources.jobs.bar; each workspace resource can only be bound once\n  at resources.jobs.foo.lifecycle.bind.id\n  in databricks.yml:19:15\n\nError: bind validation failed\n\n"
        	            	actual  : "\n>>> musterr [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nWarning: unknown field: bind\n  at resources.jobs.bar.lifecycle\n  in databricks.yml:32:9\n\ncreate jobs.bar\ncreate jobs.foo\n\nPlan: 2 to add, 0 to change, 0 to delete, 0 unchanged\n\nUnexpected success\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,12 +2,18 @@
        	            	 >>> musterr [CLI] bundle plan
        	            	-Error: resources.jobs.bar has the same lifecycle.bind ID "12345" as resources.jobs.foo; each workspace resource can only be bound once
        	            	-  at resources.jobs.bar.lifecycle.bind.id
        	            	-  in databricks.yml:33:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	 
        	            	-Error: resources.jobs.foo has the same lifecycle.bind ID "12345" as resources.jobs.bar; each workspace resource can only be bound once
        	            	-  at resources.jobs.foo.lifecycle.bind.id
        	            	-  in databricks.yml:19:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.bar.lifecycle
        	            	+  in databricks.yml:32:9
        	            	 
        	            	-Error: bind validation failed
        	            	+create jobs.bar
        	            	+create jobs.foo
        	            	 
        	            	+Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged
        	            	 
        	            	+Unexpected success
        	            	+
        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS=
        	Messages:   	bundle/deploy/bind/duplicate-bind-id-config/output.txt vs /tmp/TestAcceptbundledeploybindduplicate-bind-id-configDMS=2147421987/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS=true: branch ✅ | main (44f2eda) ❌ | latest (v1.23.0) ❌

main (44f2eda):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> musterr [CLI] bundle plan\nError: resources.jobs.bar has the same lifecycle.bind ID \"12345\" as resources.jobs.foo; each workspace resource can only be bound once\n  at resources.jobs.bar.lifecycle.bind.id\n  in databricks.yml:33:15\n\nError: resources.jobs.foo has the same lifecycle.bind ID \"12345\" as resources.jobs.bar; each workspace resource can only be bound once\n  at resources.jobs.foo.lifecycle.bind.id\n  in databricks.yml:19:15\n\nError: bind validation failed\n\n"
        	            	actual  : "\n>>> musterr [CLI] bundle plan\nWarning: unknown field: bind\n  at resources.jobs.foo.lifecycle\n  in databricks.yml:18:9\n\nWarning: unknown field: bind\n  at resources.jobs.bar.lifecycle\n  in databricks.yml:32:9\n\ncreate jobs.bar\ncreate jobs.foo\n\nPlan: 2 to add, 0 to change, 0 to delete, 0 unchanged\n\nUnexpected success\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2,12 +2,18 @@
        	            	 >>> musterr [CLI] bundle plan
        	            	-Error: resources.jobs.bar has the same lifecycle.bind ID "12345" as resources.jobs.foo; each workspace resource can only be bound once
        	            	-  at resources.jobs.bar.lifecycle.bind.id
        	            	-  in databricks.yml:33:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.foo.lifecycle
        	            	+  in databricks.yml:18:9
        	            	 
        	            	-Error: resources.jobs.foo has the same lifecycle.bind ID "12345" as resources.jobs.bar; each workspace resource can only be bound once
        	            	-  at resources.jobs.foo.lifecycle.bind.id
        	            	-  in databricks.yml:19:15
        	            	+Warning: unknown field: bind
        	            	+  at resources.jobs.bar.lifecycle
        	            	+  in databricks.yml:32:9
        	            	 
        	            	-Error: bind validation failed
        	            	+create jobs.bar
        	            	+create jobs.foo
        	            	 
        	            	+Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged
        	            	 
        	            	+Unexpected success
        	            	+
        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/deploy/bind/duplicate-bind-id-config/DMS=true
        	Messages:   	bundle/deploy/bind/duplicate-bind-id-config/output.txt vs /tmp/TestAcceptbundledeploybindduplicate-bind-id-configDMS=true3870473424/002/output.txt

latest (v1.23.0): same output as main (44f2eda)

24 more failure details omitted, see the full report in the run.

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 0e9256f

Run: 41680914296

Env 🔄​flaky ✅​pass 🙈​skip Time
🔄​ aws linux-2core-8gb 3 331 16 26:17
✅​ aws-windows-latest-4core-16gb 336 14 21:01
✅​ azure linux-2core-8gb 333 16 19:45
✅​ azure-windows-latest-4core-16gb 335 14 17:49
✅​ gcp linux-2core-8gb 334 16 20:24
✅​ gcp-windows-latest-4core-16gb 336 14 14:37
Test Name aws linux-2core-8gb
🔄​ TestAccept 🔄​f
🔄​ TestAccept/bundle/deploy/bind/bind-and-resize 🔄​f
🔄​ TestAccept/bundle/deploy/bind/bind-and-resize/DMS= 🔄​f
Top 50 slowest tests (at least 2 minutes):
duration env testname
7:49 aws-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true
7:26 aws linux-2core-8gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true
6:38 aws-windows-latest-4core-16gb TestFilerWorkspaceFilesExtensionsReadDir
5:50 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/gone-in-state/DMS=
5:30 azure linux-2core-8gb TestAccept/bundle/deploy/bind/rebind-different-id/DMS=true
4:52 aws linux-2core-8gb TestAccept/bundle/deploy/bind/duplicate-bind-id/DMS=true
4:46 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/rebind-different-id/DMS=true
4:04 azure linux-2core-8gb TestFilerWorkspaceFilesExtensionsRead
3:54 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/removed-from-config/DMS=
3:49 aws linux-2core-8gb TestAccept/bundle/deploy/bind/pure-bind/DMS=true
3:48 azure linux-2core-8gb TestAccept/bundle/deploy/bind/gone-in-state/DMS=true
3:45 aws-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/removed-from-config/DMS=
3:45 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true
3:37 aws-windows-latest-4core-16gb TestFilerRecursiveDelete/workspace_files
3:23 gcp-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-update/DMS=true
3:16 aws linux-2core-8gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=
3:13 azure linux-2core-8gb TestSyncIncrementalFileSync
3:12 azure-windows-latest-4core-16gb TestAccept
3:11 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-update/DMS=true
3:07 aws-windows-latest-4core-16gb TestFilerRecursiveDelete/workspace_files_extensions
3:05 aws-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/removed-from-config/DMS=true
3:03 azure linux-2core-8gb TestImportDirDoesNotOverwrite
3:01 gcp-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true
3:00 aws-windows-latest-4core-16gb TestFilerWorkspaceFilesExtensionsRead
3:00 azure linux-2core-8gb TestFilerRecursiveDelete/workspace_files_extensions
2:54 gcp-windows-latest-4core-16gb TestExportDir
2:53 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/pure-bind/DMS=
2:53 gcp-windows-latest-4core-16gb TestFilerWorkspaceFilesExtensionsReadDir
2:48 gcp linux-2core-8gb TestExportDir
2:47 aws-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/gone-in-state/DMS=
2:44 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/pure-bind/DMS=true
2:44 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=
2:41 aws-windows-latest-4core-16gb TestAccept
2:41 gcp-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/basic/DMS=true
2:41 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/delete-and-bind-conflict/DMS=true
2:41 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=
2:39 azure-windows-latest-4core-16gb TestExportDir
2:35 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/pure-bind/DMS=true
2:34 gcp-windows-latest-4core-16gb TestAccept
2:34 azure linux-2core-8gb TestFilerWorkspaceFilesExtensionsDelete
2:34 gcp-windows-latest-4core-16gb TestImportDir
2:33 gcp-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=
2:32 azure-windows-latest-4core-16gb TestFilerReadWrite/workspace_files
2:27 azure-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/duplicate-bind-id/DMS=
2:24 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/bind-and-resize/DMS=true
2:23 gcp linux-2core-8gb TestAccept/bundle/deploy/bind/gone-in-state/DMS=
2:21 azure linux-2core-8gb TestAccept/bundle/deploy/bind/id-collision-different-type/DMS=true
2:19 azure-windows-latest-4core-16gb TestFilerRecursiveDelete/workspace_files_extensions
2:19 aws linux-2core-8gb TestFilerWorkspaceFilesExtensionsReadDir
2:17 aws-windows-latest-4core-16gb TestAccept/bundle/deploy/bind/pure-bind/DMS=

janniklasrose and others added 3 commits November 3, 2026 15:20
… test isolation

- Regenerate the PyDABs models: Lifecycle gains bind (validate-generated).
- List lifecycle.bind as a non-state field for the resources whose state keeps
  a lifecycle sub-struct (apps, clusters, sql_warehouses, job_runs), like
  prevent_destroy and depends_on (TestInputSubset).
- Give every deploying bind test a per-run bundle name. The deployment-history
  variants and the OS runners run concurrently against one workspace, so a
  fixed name shared the root path and failed with 'Failed to acquire
  deployment lock' or with the other variant's state.
- bind-and-resize: create the cluster with the instance pool only; the cloud
  API rejects node_type_id together with instance_pool_id.
- dev-mode: assert only the planned new values; a real workspace reports
  schedule.pause_status: UNPAUSED where the test server omits it.

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
Git Bash on Windows rewrites a leading-slash argument as a Windows path
('C:/Program Files/Git/old/storage/path'), so update_file.py did not find the
value and the test failed on every Windows cloud runner. Match the path
without its leading slash instead.

Co-authored-by: Isaac <no-reply@databricks.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DABs DABs related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants