From 7f4779c584ff6e6ace9da850ca6441c881384b77 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Tue, 20 Oct 2026 15:42:06 +0200 Subject: [PATCH 1/4] acc: record main's behaviour for reference, override and required-field edge cases Co-authored-by: Isaac --- .../databricks.yml | 36 +++++++++++++++++ .../out.test.toml | 2 + .../output.txt | 21 ++++++++++ .../script | 2 + .../databricks.yml | 39 +++++++++++++++++++ .../out.test.toml | 2 + .../output.txt | 12 ++++++ .../script | 2 + .../test.toml | 1 + .../databricks.yml | 18 +++++++++ .../out.test.toml | 2 + .../output.txt | 6 +++ .../whole_map_reference_hides_entries/script | 1 + .../required_struct_reference/databricks.yml | 16 ++++++++ .../required_struct_reference/out.test.toml | 2 + .../required_struct_reference/output.txt | 9 +++++ .../validate/required_struct_reference/script | 1 + 17 files changed, 172 insertions(+) create mode 100644 acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml create mode 100644 acceptance/bundle/override/cluster_id_clears_new_cluster_reference/out.test.toml create mode 100644 acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt create mode 100644 acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script create mode 100644 acceptance/bundle/override/preset_clears_forced_schedule_reference/databricks.yml create mode 100644 acceptance/bundle/override/preset_clears_forced_schedule_reference/out.test.toml create mode 100644 acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt create mode 100644 acceptance/bundle/override/preset_clears_forced_schedule_reference/script create mode 100644 acceptance/bundle/override/preset_clears_forced_schedule_reference/test.toml create mode 100644 acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml create mode 100644 acceptance/bundle/resource_deps/whole_map_reference_hides_entries/out.test.toml create mode 100644 acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt create mode 100644 acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script create mode 100644 acceptance/bundle/validate/required_struct_reference/databricks.yml create mode 100644 acceptance/bundle/validate/required_struct_reference/out.test.toml create mode 100644 acceptance/bundle/validate/required_struct_reference/output.txt create mode 100644 acceptance/bundle/validate/required_struct_reference/script diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml new file mode 100644 index 00000000000..f6f8fbb574f --- /dev/null +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml @@ -0,0 +1,36 @@ +bundle: + name: test-bundle + cluster_id: existing-cluster + +variables: + cluster: + type: complex + default: + spark_version: 15.4.x-scala2.12 + node_type_id: i3.xlarge + num_workers: 1 + +resources: + clusters: + source: + cluster_name: source + spark_version: 15.4.x-scala2.12 + node_type_id: i3.xlarge + num_workers: 2 + jobs: + job: + name: job + tasks: + - task_key: task + notebook_task: + notebook_path: /Workspace/notebook + # Replaced by bundle.cluster_id: the reference below new_cluster must go too. + new_cluster: + spark_version: 15.4.x-scala2.12 + node_type_id: i3.xlarge + num_workers: ${resources.clusters.source.num_workers} + - task_key: task_var + notebook_task: + notebook_path: /Workspace/notebook + # A reference at new_cluster must not bring it back either. + new_cluster: ${var.cluster} diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/out.test.toml b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt new file mode 100644 index 00000000000..95a63c43cd6 --- /dev/null +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt @@ -0,0 +1,21 @@ + +>>> [CLI] bundle validate -o json +[ + { + "task_key": "task", + "existing_cluster_id": "existing-cluster", + "new_cluster": null + }, + { + "task_key": "task_var", + "existing_cluster_id": "existing-cluster", + "new_cluster": null + } +] + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files... +Created clusters.source +Created jobs.job +Files: 1 uploaded, 0 deleted +Resources: 2 created, 0 changed, 0 deleted, 0 unchanged diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script new file mode 100644 index 00000000000..403b93598f6 --- /dev/null +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script @@ -0,0 +1,2 @@ +trace $CLI bundle validate -o json | jq '[.resources.jobs.job.tasks[] | {task_key, existing_cluster_id, new_cluster}]' +trace $CLI bundle deploy diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/databricks.yml b/acceptance/bundle/override/preset_clears_forced_schedule_reference/databricks.yml new file mode 100644 index 00000000000..25315e8078e --- /dev/null +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/databricks.yml @@ -0,0 +1,39 @@ +bundle: + name: test-bundle + +resources: + quality_monitors: + src: + table_name: main.default.src + assets_dir: /Workspace/monitors/src + output_schema_name: main.default + inference_log: + granularities: [1 day] + model_id_col: model_id + prediction_col: prediction + problem_type: PROBLEM_TYPE_CLASSIFICATION + timestamp_col: timestamp + schedule: + quartz_cron_expression: "0 0 12 * * ?" + timezone_id: UTC + dst: + table_name: main.default.dst + assets_dir: /Workspace/monitors/dst + output_schema_name: main.default + inference_log: + granularities: [1 day] + model_id_col: model_id + prediction_col: prediction + problem_type: PROBLEM_TYPE_CLASSIFICATION + timestamp_col: timestamp + # Forced null: the target override replaces it with a reference. + schedule: null + +targets: + dev: + presets: + trigger_pause_status: PAUSED + resources: + quality_monitors: + dst: + schedule: ${resources.quality_monitors.src.schedule} diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/out.test.toml b/acceptance/bundle/override/preset_clears_forced_schedule_reference/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt b/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt new file mode 100644 index 00000000000..ab216e1ab9a --- /dev/null +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt @@ -0,0 +1,12 @@ + +>>> [CLI] bundle deploy +Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/dev/files... +Created quality_monitors.dst +Created quality_monitors.src +Files: 1 uploaded, 0 deleted +Resources: 2 created, 0 changed, 0 deleted, 0 unchanged + +>>> print_requests.py //tables/main.default.dst/monitor +{ + "schedule": null +} diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/script b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script new file mode 100644 index 00000000000..c725099d07b --- /dev/null +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script @@ -0,0 +1,2 @@ +trace $CLI bundle deploy +trace print_requests.py //tables/main.default.dst/monitor | jq '{schedule: .body.schedule}' diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/test.toml b/acceptance/bundle/override/preset_clears_forced_schedule_reference/test.toml new file mode 100644 index 00000000000..159efe02696 --- /dev/null +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/test.toml @@ -0,0 +1 @@ +RecordRequests = true diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml new file mode 100644 index 00000000000..643ef4196c1 --- /dev/null +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml @@ -0,0 +1,18 @@ +bundle: + name: test-bundle + +presets: + tags: + owner: ${resources.jobs.j.id} + +resources: + schemas: + s: + name: s + catalog_name: main + properties: {owner: fixed} + jobs: + j: + name: j + # A whole-map reference: the preset's tags added to the typed map stay hidden. + tags: ${resources.schemas.s.properties} diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/out.test.toml b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt new file mode 100644 index 00000000000..0e54725cd03 --- /dev/null +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt @@ -0,0 +1,6 @@ + +>>> [CLI] bundle plan +create jobs.j +create schemas.s + +Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script new file mode 100644 index 00000000000..e896f075ebf --- /dev/null +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script @@ -0,0 +1 @@ +trace $CLI bundle plan diff --git a/acceptance/bundle/validate/required_struct_reference/databricks.yml b/acceptance/bundle/validate/required_struct_reference/databricks.yml new file mode 100644 index 00000000000..74d8baa9c19 --- /dev/null +++ b/acceptance/bundle/validate/required_struct_reference/databricks.yml @@ -0,0 +1,16 @@ +bundle: + name: test-bundle + +resources: + clusters: + source: + cluster_name: source + spark_version: 15.4.x-scala2.12 + is_single_node: true + target: + cluster_name: target + spark_version: 15.4.x-scala2.12 + # clients holds only a reference, so its Go value is zero; it is still set. + workload_type: + clients: + jobs: ${resources.clusters.source.is_single_node} diff --git a/acceptance/bundle/validate/required_struct_reference/out.test.toml b/acceptance/bundle/validate/required_struct_reference/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/validate/required_struct_reference/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/validate/required_struct_reference/output.txt b/acceptance/bundle/validate/required_struct_reference/output.txt new file mode 100644 index 00000000000..d44a21b582a --- /dev/null +++ b/acceptance/bundle/validate/required_struct_reference/output.txt @@ -0,0 +1,9 @@ + +>>> [CLI] bundle validate +Name: test-bundle +Target: default +Workspace: + User: [USERNAME] + Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default + +Validation OK! diff --git a/acceptance/bundle/validate/required_struct_reference/script b/acceptance/bundle/validate/required_struct_reference/script new file mode 100644 index 00000000000..5350876150f --- /dev/null +++ b/acceptance/bundle/validate/required_struct_reference/script @@ -0,0 +1 @@ +trace $CLI bundle validate From 8edb35b4377d7568fcb06f88929dd43181523dec Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Tue, 20 Oct 2026 18:51:44 +0200 Subject: [PATCH 2/4] acc: say what each test checks and print the relevant JSON --- .../script | 1 + .../script | 2 ++ .../databricks.yml | 2 +- .../output.txt | 17 ++++++++++++----- .../whole_map_reference_hides_entries/script | 4 +++- .../required_struct_reference/databricks.yml | 2 +- .../required_struct_reference/output.txt | 15 +++++++-------- .../validate/required_struct_reference/script | 3 ++- 8 files changed, 29 insertions(+), 17 deletions(-) diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script index 403b93598f6..2016268365d 100644 --- a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/script @@ -1,2 +1,3 @@ +# bundle.cluster_id replaces new_cluster on every task, also when new_cluster holds a reference. trace $CLI bundle validate -o json | jq '[.resources.jobs.job.tasks[] | {task_key, existing_cluster_id, new_cluster}]' trace $CLI bundle deploy diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/script b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script index c725099d07b..b8336500d3c 100644 --- a/acceptance/bundle/override/preset_clears_forced_schedule_reference/script +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script @@ -1,2 +1,4 @@ +# A target override can replace a null schedule with a reference to another monitor's schedule. +# The deploy request has to carry the schedule of the referenced monitor. trace $CLI bundle deploy trace print_requests.py //tables/main.default.dst/monitor | jq '{schedule: .body.schedule}' diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml index 643ef4196c1..508eff00ec8 100644 --- a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml @@ -14,5 +14,5 @@ resources: jobs: j: name: j - # A whole-map reference: the preset's tags added to the typed map stay hidden. + # The whole tags map is a reference, so the preset tag above is not added to it. tags: ${resources.schemas.s.properties} diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt index 0e54725cd03..06316029ed1 100644 --- a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/output.txt @@ -1,6 +1,13 @@ ->>> [CLI] bundle plan -create jobs.j -create schemas.s - -Plan: 2 to add, 0 to change, 0 to delete, 0 unchanged +>>> [CLI] bundle plan -o json +{ + "tags": { + "owner": "fixed" + }, + "depends_on": [ + { + "node": "resources.schemas.s", + "label": "${resources.schemas.s.properties}" + } + ] +} diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script index e896f075ebf..5e421cc2150 100644 --- a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/script @@ -1 +1,3 @@ -trace $CLI bundle plan +# When a whole map is a reference, the entries a preset adds to it are not applied: the job gets the +# tags of the referenced schema only, and depends on the schema. +trace $CLI bundle plan -o json | jq '.plan["resources.jobs.j"] | {tags: .new_state.value.tags, depends_on}' diff --git a/acceptance/bundle/validate/required_struct_reference/databricks.yml b/acceptance/bundle/validate/required_struct_reference/databricks.yml index 74d8baa9c19..b75c2f4cbb1 100644 --- a/acceptance/bundle/validate/required_struct_reference/databricks.yml +++ b/acceptance/bundle/validate/required_struct_reference/databricks.yml @@ -10,7 +10,7 @@ resources: target: cluster_name: target spark_version: 15.4.x-scala2.12 - # clients holds only a reference, so its Go value is zero; it is still set. + # clients is a required field of workload_type. Its only field is a reference. workload_type: clients: jobs: ${resources.clusters.source.is_single_node} diff --git a/acceptance/bundle/validate/required_struct_reference/output.txt b/acceptance/bundle/validate/required_struct_reference/output.txt index d44a21b582a..36dd96afff2 100644 --- a/acceptance/bundle/validate/required_struct_reference/output.txt +++ b/acceptance/bundle/validate/required_struct_reference/output.txt @@ -1,9 +1,8 @@ ->>> [CLI] bundle validate -Name: test-bundle -Target: default -Workspace: - User: [USERNAME] - Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default - -Validation OK! +>>> [CLI] bundle validate -o json +{ + "clients": { + "jobs": "${resources.clusters.source.is_single_node}", + "notebooks": true + } +} diff --git a/acceptance/bundle/validate/required_struct_reference/script b/acceptance/bundle/validate/required_struct_reference/script index 5350876150f..2975f06e053 100644 --- a/acceptance/bundle/validate/required_struct_reference/script +++ b/acceptance/bundle/validate/required_struct_reference/script @@ -1 +1,2 @@ -trace $CLI bundle validate +# workload_type.clients is required. A clients that only has a reference in it is not reported as missing. +trace $CLI bundle validate -o json | jq .resources.clusters.target.workload_type From 79b487d5d5c341a9db520c6ac73e65a6bbd8c3f0 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Wed, 21 Oct 2026 18:00:06 +0200 Subject: [PATCH 3/4] acc: make the recorded edge cases exercise what they claim Co-authored-by: Isaac --- .../databricks.yml | 13 +++++++++++++ .../output.txt | 8 +++++++- .../output.txt | 1 + .../preset_clears_forced_schedule_reference/script | 6 +++--- .../databricks.yml | 2 +- .../required_struct_reference/databricks.yml | 3 ++- .../validate/required_struct_reference/output.txt | 2 +- .../validate/required_struct_reference/script | 2 +- 8 files changed, 29 insertions(+), 8 deletions(-) diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml index f6f8fbb574f..d2e913f1abe 100644 --- a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/databricks.yml @@ -34,3 +34,16 @@ resources: notebook_path: /Workspace/notebook # A reference at new_cluster must not bring it back either. new_cluster: ${var.cluster} + - task_key: task_resource_ref + notebook_task: + notebook_path: /Workspace/notebook + # A reference to the new_cluster of another job is resolved after the override. + new_cluster: ${resources.jobs.other.job_clusters[0].new_cluster} + other: + name: other + job_clusters: + - job_cluster_key: shared + new_cluster: + spark_version: 15.4.x-scala2.12 + node_type_id: i3.xlarge + num_workers: 3 diff --git a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt index 95a63c43cd6..14e1e4bbefd 100644 --- a/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt +++ b/acceptance/bundle/override/cluster_id_clears_new_cluster_reference/output.txt @@ -6,6 +6,11 @@ "existing_cluster_id": "existing-cluster", "new_cluster": null }, + { + "task_key": "task_resource_ref", + "existing_cluster_id": "existing-cluster", + "new_cluster": null + }, { "task_key": "task_var", "existing_cluster_id": "existing-cluster", @@ -17,5 +22,6 @@ Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/test-bundle/default/files... Created clusters.source Created jobs.job +Created jobs.other Files: 1 uploaded, 0 deleted -Resources: 2 created, 0 changed, 0 deleted, 0 unchanged +Resources: 3 created, 0 changed, 0 deleted, 0 unchanged diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt b/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt index ab216e1ab9a..eb07e4ec538 100644 --- a/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/output.txt @@ -8,5 +8,6 @@ Resources: 2 created, 0 changed, 0 deleted, 0 unchanged >>> print_requests.py //tables/main.default.dst/monitor { + "has_schedule": false, "schedule": null } diff --git a/acceptance/bundle/override/preset_clears_forced_schedule_reference/script b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script index b8336500d3c..37d355db8c8 100644 --- a/acceptance/bundle/override/preset_clears_forced_schedule_reference/script +++ b/acceptance/bundle/override/preset_clears_forced_schedule_reference/script @@ -1,4 +1,4 @@ -# A target override can replace a null schedule with a reference to another monitor's schedule. -# The deploy request has to carry the schedule of the referenced monitor. +# trigger_pause_status: PAUSED removes the schedules. The target override replaces the null schedule of dst +# with a reference to the schedule of src, which is removed too: the request carries no schedule. trace $CLI bundle deploy -trace print_requests.py //tables/main.default.dst/monitor | jq '{schedule: .body.schedule}' +trace print_requests.py //tables/main.default.dst/monitor | jq '.body | {has_schedule: has("schedule"), schedule}' diff --git a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml index 508eff00ec8..511a289e603 100644 --- a/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml +++ b/acceptance/bundle/resource_deps/whole_map_reference_hides_entries/databricks.yml @@ -3,7 +3,7 @@ bundle: presets: tags: - owner: ${resources.jobs.j.id} + preset_tag: ${resources.jobs.j.id} resources: schemas: diff --git a/acceptance/bundle/validate/required_struct_reference/databricks.yml b/acceptance/bundle/validate/required_struct_reference/databricks.yml index b75c2f4cbb1..60e02ad20cb 100644 --- a/acceptance/bundle/validate/required_struct_reference/databricks.yml +++ b/acceptance/bundle/validate/required_struct_reference/databricks.yml @@ -10,7 +10,8 @@ resources: target: cluster_name: target spark_version: 15.4.x-scala2.12 - # clients is a required field of workload_type. Its only field is a reference. + # clients is a required field of workload_type. Both of its fields are references. workload_type: clients: + notebooks: ${resources.clusters.source.is_single_node} jobs: ${resources.clusters.source.is_single_node} diff --git a/acceptance/bundle/validate/required_struct_reference/output.txt b/acceptance/bundle/validate/required_struct_reference/output.txt index 36dd96afff2..2fc3e5bc32e 100644 --- a/acceptance/bundle/validate/required_struct_reference/output.txt +++ b/acceptance/bundle/validate/required_struct_reference/output.txt @@ -3,6 +3,6 @@ { "clients": { "jobs": "${resources.clusters.source.is_single_node}", - "notebooks": true + "notebooks": "${resources.clusters.source.is_single_node}" } } diff --git a/acceptance/bundle/validate/required_struct_reference/script b/acceptance/bundle/validate/required_struct_reference/script index 2975f06e053..5d37f63d12b 100644 --- a/acceptance/bundle/validate/required_struct_reference/script +++ b/acceptance/bundle/validate/required_struct_reference/script @@ -1,2 +1,2 @@ -# workload_type.clients is required. A clients that only has a reference in it is not reported as missing. +# workload_type.clients is required. A clients whose fields are all references is not reported as missing. trace $CLI bundle validate -o json | jq .resources.clusters.target.workload_type From 0617a1d4bb06b1525154876dee43ce4593dda42e Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Thu, 22 Oct 2026 11:37:27 +0200 Subject: [PATCH 4/4] acc: record that a target can add an explicit null that keeps the default off --- .../target_adds_null_keeps_it/databricks.yml | 18 ++++++++++++++++++ .../nulls/target_adds_null_keeps_it/nb.py | 2 ++ .../target_adds_null_keeps_it/out.test.toml | 2 ++ .../nulls/target_adds_null_keeps_it/output.txt | 7 +++++++ .../nulls/target_adds_null_keeps_it/script | 2 ++ 5 files changed, 31 insertions(+) create mode 100644 acceptance/bundle/validate/nulls/target_adds_null_keeps_it/databricks.yml create mode 100644 acceptance/bundle/validate/nulls/target_adds_null_keeps_it/nb.py create mode 100644 acceptance/bundle/validate/nulls/target_adds_null_keeps_it/out.test.toml create mode 100644 acceptance/bundle/validate/nulls/target_adds_null_keeps_it/output.txt create mode 100644 acceptance/bundle/validate/nulls/target_adds_null_keeps_it/script diff --git a/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/databricks.yml b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/databricks.yml new file mode 100644 index 00000000000..b5a5c0a0aca --- /dev/null +++ b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/databricks.yml @@ -0,0 +1,18 @@ +bundle: + name: test-bundle + +resources: + jobs: + j: + name: j + tasks: + - task_key: t + notebook_task: + notebook_path: ./nb.py + +targets: + dev: + resources: + jobs: + j: + queue: null diff --git a/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/nb.py b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/nb.py new file mode 100644 index 00000000000..7c87acfa794 --- /dev/null +++ b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/nb.py @@ -0,0 +1,2 @@ +# Databricks notebook source +print(1) diff --git a/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/out.test.toml b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/out.test.toml new file mode 100644 index 00000000000..a927a5fbc06 --- /dev/null +++ b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/out.test.toml @@ -0,0 +1,2 @@ +Cloud = false +EnvMatrix.DMS = ["", "true"] diff --git a/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/output.txt b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/output.txt new file mode 100644 index 00000000000..3f0a6236b88 --- /dev/null +++ b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/output.txt @@ -0,0 +1,7 @@ + +>>> [CLI] bundle validate -t dev -o json +Warning: required field "enabled" is not set + at resources.jobs.j.queue + in databricks.yml:18:18 + +null diff --git a/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/script b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/script new file mode 100644 index 00000000000..5b7d2ba4bdb --- /dev/null +++ b/acceptance/bundle/validate/nulls/target_adds_null_keeps_it/script @@ -0,0 +1,2 @@ +# A target can add an explicit null that is kept, like a null in the base file: the default queue is not applied. +trace $CLI bundle validate -t dev -o json | jq '.resources.jobs.j.queue'