Skip to content

Check live dependents of deletes reached as dependencies in --select - #7334

Draft
pietern wants to merge 2 commits into
mainfrom
pietern/f02-7023-select-delete-dependents
Draft

pietern wants to merge 2 commits into
mainfrom
pietern/f02-7023-select-delete-dependents

Conversation

@pietern

@pietern pietern commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Changes

bundle deploy --select jobs.consumer could delete jobs.producer (removed from the config) while consumer still references it, because the live-dependent check only ran for deletes the user selected. It now runs for every delete in the selection. A delete pulled in as a dependency is reported as cannot delete jobs.producer (not selected, but required by the selection): jobs.consumer still references it.

Why

Gap in the --select deletion support added in #7023.

Tests

  • Unit tests for the dependency and cascade cases.
  • acceptance/bundle/select/deletion_dependents covers bundle plan and bundle deploy.

This pull request and its description were written by Isaac.

@github-actions github-actions Bot added the DABs DABs related issues label Nov 4, 2026
FilterToSelected only built reverse edges when a selected resource was a
delete. A delete pulled in through a forward DependsOn edge of a selected
resource (e.g. `--select jobs.consumer` where consumer still references a
removed jobs.producer) was therefore never checked for live dependents and
was deleted, while `--select jobs.consumer,jobs.producer` correctly errored.

Build the reverse edges lazily on the first delete visited by the BFS so
every delete gets the same live-dependent check. When the offending delete
was not itself selected, say so in the error, since the user never named it.

Co-authored-by: Isaac <no-reply@databricks.com>
@pietern
pietern force-pushed the pietern/f02-7023-select-delete-dependents branch from 7c53f97 to 290054b Compare November 4, 2026 10:09
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Commit: 04bce2306 | Workflow run

Regression test report

Selected 1 changed tests (limit=20, 0 not selected)

2 tests: regression=2 unreleased=0 coverage=0 failing=0
test branch main (e1b8c92) latest (v1.24.0)
TestAccept/bundle/select/deletion_dependents/DMS= ✅ ❌ ❌
TestAccept/bundle/select/deletion_dependents/DMS=true ✅ ❌ ❌
TestAccept/bundle/select/deletion_dependents/DMS=: branch ✅ | main (e1b8c92) ❌ | latest (v1.24.0) ❌

main (e1b8c92):

acceptance_test.go:1342: Diff:
        --- bundle/select/deletion_dependents/output.txt
        +++ /tmp/TestAcceptbundleselectdeletion_dependentsDMS=1745116913/002/output.txt
        @@ -20,62 +20,22 @@
         Files: 1 uploaded, 0 deleted
         
         >>> [CLI] bundle plan --select jobs.consumer
        -Error: cannot delete jobs.producer (not selected, but required by the selection): jobs.consumer still references it; remove the reference or also remove jobs.consumer from the config
        -
        -
        ->>> [CLI] bundle deploy --select jobs.consumer
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default/files...
        -Error: cannot delete jobs.producer (not selected, but required by the selection): jobs.consumer still references it; remove the reference or also remove jobs.consumer from the config
        -
        -Files: 0 uploaded, 0 deleted
        -
        ->>> print_requests.py --sort //jobs/delete --keep
        -
        ->>> [CLI] bundle plan
         update jobs.consumer
         delete jobs.producer
         
        -Plan: 0 to add, 1 to change, 1 to delete, 1 unchanged
        +Plan: 0 to add, 1 to change, 1 to delete, 0 unchanged, 1 not selected
         
        ->>> [CLI] bundle plan --select jobs.producer
        -delete jobs.consumer
        -delete jobs.producer
        +Unexpected success
         
        -Plan: 0 to add, 0 to change, 2 to delete, 0 unchanged, 1 not selected
        -
        -=== bundle deploy --select jobs.producer
        -
        ->>> [CLI] bundle deploy --select jobs.producer
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default/files...
        -Deleted jobs.consumer
        -Deleted jobs.producer
        -Files: 1 uploaded, 0 deleted
        -Resources: 0 created, 0 changed, 2 deleted, 0 unchanged, 1 not selected
        -
        ->>> print_requests.py //jobs/delete
        -{
        -  "method": "POST",
        -  "path": "/api/2.2/jobs/delete",
        -  "body": {
        -    "job_id": [CONSUMER_ID]
        -  }
        -}
        -{
        -  "method": "POST",
        -  "path": "/api/2.2/jobs/delete",
        -  "body": {
        -    "job_id": [PRODUCER_ID]
        -  }
        -}
        -
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         === Destroy
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
        +  delete resources.jobs.consumer
           delete resources.jobs.keep
        +  delete resources.jobs.producer
         
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default
         
        -Destroy: 1 deleted
        +Destroy: 3 deleted
        +
        +Exit code: 1

latest (v1.24.0): same output as main (e1b8c92)

TestAccept/bundle/select/deletion_dependents/DMS=true: branch ✅ | main (e1b8c92) ❌ | latest (v1.24.0) ❌

main (e1b8c92):

acceptance_test.go:1342: Diff:
        --- bundle/select/deletion_dependents/output.txt
        +++ /tmp/TestAcceptbundleselectdeletion_dependentsDMS=true3005034743/002/output.txt
        @@ -20,62 +20,22 @@
         Files: 1 uploaded, 0 deleted
         
         >>> [CLI] bundle plan --select jobs.consumer
        -Error: cannot delete jobs.producer (not selected, but required by the selection): jobs.consumer still references it; remove the reference or also remove jobs.consumer from the config
        -
        -
        ->>> [CLI] bundle deploy --select jobs.consumer
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default/files...
        -Error: cannot delete jobs.producer (not selected, but required by the selection): jobs.consumer still references it; remove the reference or also remove jobs.consumer from the config
        -
        -Files: 0 uploaded, 0 deleted
        -
        ->>> print_requests.py --sort //jobs/delete --keep
        -
        ->>> [CLI] bundle plan
         update jobs.consumer
         delete jobs.producer
         
        -Plan: 0 to add, 1 to change, 1 to delete, 1 unchanged
        +Plan: 0 to add, 1 to change, 1 to delete, 0 unchanged, 1 not selected
         
        ->>> [CLI] bundle plan --select jobs.producer
        -delete jobs.consumer
        -delete jobs.producer
        +Unexpected success
         
        -Plan: 0 to add, 0 to change, 2 to delete, 0 unchanged, 1 not selected
        -
        -=== bundle deploy --select jobs.producer
        -
        ->>> [CLI] bundle deploy --select jobs.producer
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default/files...
        -Deleted jobs.consumer
        -Deleted jobs.producer
        -Files: 1 uploaded, 0 deleted
        -Resources: 0 created, 0 changed, 2 deleted, 0 unchanged, 1 not selected
        -
        ->>> print_requests.py //jobs/delete
        -{
        -  "method": "POST",
        -  "path": "/api/2.2/jobs/delete",
        -  "body": {
        -    "job_id": [CONSUMER_ID]
        -  }
        -}
        -{
        -  "method": "POST",
        -  "path": "/api/2.2/jobs/delete",
        -  "body": {
        -    "job_id": [PRODUCER_ID]
        -  }
        -}
        -
        ->>> [CLI] bundle plan
        -Plan: 0 to add, 0 to change, 0 to delete, 1 unchanged
        -
         === Destroy
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
        +  delete resources.jobs.consumer
           delete resources.jobs.keep
        +  delete resources.jobs.producer
         
         All files and directories at the following location will be deleted: /Workspace/Users/[USERNAME]/.bundle/select-deldep-[UNIQUE_NAME]/default
         
        -Destroy: 1 deleted
        +Destroy: 3 deleted
        +
        +Exit code: 1
        
FAIL

latest (v1.24.0): same output as main (e1b8c92)

@eng-dev-ecosystem-bot

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

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 04bce23

Run: 41864534424

Env ✅​pass 🙈​skip Time
✅​ aws linux-2core-8gb 274 15 7:02
✅​ aws-windows-latest-4core-16gb 276 13 5:34
✅​ azure linux-2core-8gb 273 15 6:24
✅​ azure-windows-latest-4core-16gb 275 13 4:53
✅​ gcp linux-2core-8gb 274 15 6:04
✅​ gcp-windows-latest-4core-16gb 276 13 5:10
Top 3 slowest tests (at least 2 minutes):
duration env testname
4:00 gcp-windows-latest-4core-16gb TestAccept
3:35 azure-windows-latest-4core-16gb TestAccept
2:45 aws-windows-latest-4core-16gb TestAccept

The "(not selected, but required by the selection)" suffix was also added
to deletes pulled in through the cascade (reverse) edge of a selected
delete. Those keep the plain error message again. The suffix is now
decided after the BFS, since a delete can be reached through both edge
directions and the forward route may be found after it was visited.

Also reword the changelog entry, which no longer reports the exact same
error as selecting the deleted resource directly.

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.

2 participants