From b8c66cef63e11a7a719e586c952cab3ccd5b68fa Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Wed, 28 Oct 2026 15:27:59 +0100 Subject: [PATCH 1/2] Do not check required fields inside a pure reference warnForMissingFields reported every required field of e.g. a schedule as not set when the schedule was "${resources.jobs.base.schedule}". The referenced value is checked where it is defined. Co-authored-by: Isaac --- .../bundles/required-skip-reference.md | 1 + .../job_schedule_whole_reference/output.txt | 18 +----------- .../job_schedule_whole_reference/test.toml | 1 - bundle/config/validate/required.go | 7 +++++ bundle/config/validate/required_test.go | 29 +++++++++++++++++++ 5 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 .nextchanges/bundles/required-skip-reference.md delete mode 100644 acceptance/bundle/validate/references/job_schedule_whole_reference/test.toml create mode 100644 bundle/config/validate/required_test.go diff --git a/.nextchanges/bundles/required-skip-reference.md b/.nextchanges/bundles/required-skip-reference.md new file mode 100644 index 00000000000..e18f3ec6840 --- /dev/null +++ b/.nextchanges/bundles/required-skip-reference.md @@ -0,0 +1 @@ +* Removed spurious "required field is not set" warnings for a field whose value is a reference to a whole block, such as `schedule: ${resources.jobs.base.schedule}`. diff --git a/acceptance/bundle/validate/references/job_schedule_whole_reference/output.txt b/acceptance/bundle/validate/references/job_schedule_whole_reference/output.txt index 406a54ee03d..3479765d9e7 100644 --- a/acceptance/bundle/validate/references/job_schedule_whole_reference/output.txt +++ b/acceptance/bundle/validate/references/job_schedule_whole_reference/output.txt @@ -1,30 +1,14 @@ >>> [CLI] bundle validate -Warning: required field "quartz_cron_expression" is not set - at resources.jobs.viaref.schedule - in databricks.yml:9:17 - -Warning: required field "timezone_id" is not set - at resources.jobs.viaref.schedule - in databricks.yml:9:17 - Name: test-bundle Target: default Workspace: User: [USERNAME] Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default -Found 2 warnings +Validation OK! >>> [CLI] bundle plan -o json -Warning: required field "quartz_cron_expression" is not set - at resources.jobs.viaref.schedule - in databricks.yml:9:17 - -Warning: required field "timezone_id" is not set - at resources.jobs.viaref.schedule - in databricks.yml:9:17 - { "pause_status": "UNPAUSED", "quartz_cron_expression": "0 0 * * * ?", diff --git a/acceptance/bundle/validate/references/job_schedule_whole_reference/test.toml b/acceptance/bundle/validate/references/job_schedule_whole_reference/test.toml deleted file mode 100644 index 6229ff00fb0..00000000000 --- a/acceptance/bundle/validate/references/job_schedule_whole_reference/test.toml +++ /dev/null @@ -1 +0,0 @@ -Badness = "The required-field check looks inside the reference: it warns that quartz_cron_expression and timezone_id are not set at resources.jobs.viaref.schedule, although the referenced schedule sets both." diff --git a/bundle/config/validate/required.go b/bundle/config/validate/required.go index 9e3274b6f00..bb7606bf53f 100644 --- a/bundle/config/validate/required.go +++ b/bundle/config/validate/required.go @@ -11,6 +11,7 @@ import ( "github.com/databricks/cli/bundle/internal/validation/generated" "github.com/databricks/cli/libs/diag" "github.com/databricks/cli/libs/dyn" + "github.com/databricks/cli/libs/dyn/dynvar" "github.com/databricks/cli/libs/structs/structpath" ) @@ -50,6 +51,12 @@ func warnForMissingFields(ctx context.Context, b *bundle.Bundle) diag.Diagnostic return nil } + // A pure reference (e.g. "${resources.jobs.base.schedule}") has no fields of its own; + // the referenced value is checked where it is defined. + if s, ok := v.AsString(); ok && dynvar.IsPureVariableReference(s) { + return nil + } + fields := generated.RequiredFields[pattern.String()] for _, field := range fields { vv := v.Get(field) diff --git a/bundle/config/validate/required_test.go b/bundle/config/validate/required_test.go new file mode 100644 index 00000000000..aad62d2ed52 --- /dev/null +++ b/bundle/config/validate/required_test.go @@ -0,0 +1,29 @@ +package validate + +import ( + "testing" + + "github.com/databricks/cli/bundle" + "github.com/databricks/cli/bundle/config" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRequiredSkipsPureReference(t *testing.T) { + root, diags := config.LoadFromBytes("databricks.yml", []byte(` +resources: + jobs: + viaref: + schedule: ${resources.jobs.base.schedule} + missing: + schedule: + timezone_id: UTC +`)) + require.Empty(t, diags) + b := &bundle.Bundle{Config: *root} + + diags = Required().Apply(t.Context(), b) + require.Len(t, diags, 1) + assert.Equal(t, `required field "quartz_cron_expression" is not set`, diags[0].Summary) + assert.Equal(t, "resources.jobs.missing.schedule", diags[0].Paths[0].String()) +} From faae0bc86bdadbbdfda8ae508fb11c30e0822ed5 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Wed, 28 Oct 2026 15:37:02 +0100 Subject: [PATCH 2/2] Add the PR link to the changelog fragment Co-authored-by: Isaac --- .nextchanges/bundles/required-skip-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nextchanges/bundles/required-skip-reference.md b/.nextchanges/bundles/required-skip-reference.md index e18f3ec6840..5dee270cd12 100644 --- a/.nextchanges/bundles/required-skip-reference.md +++ b/.nextchanges/bundles/required-skip-reference.md @@ -1 +1 @@ -* Removed spurious "required field is not set" warnings for a field whose value is a reference to a whole block, such as `schedule: ${resources.jobs.base.schedule}`. +* Removed spurious "required field is not set" warnings for a field whose value is a reference to a whole block, such as `schedule: ${resources.jobs.base.schedule}`. ([#7226](https://github.com/databricks/cli/pull/7226))