From 1ce1050ced64b48999358846f15e7028f5fce83b Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Thu, 9 Jan 2025 16:39:41 +0100 Subject: [PATCH 1/4] Log warnings to stderr for "bundle validate -o json" --- .../bundle/override/job_tasks/output.txt | 15 ++++++++++++ acceptance/bundle/override/job_tasks/script | 1 + .../override/merge-string-map/output.txt | 4 ++++ cmd/bundle/validate.go | 23 +++++++++++++++---- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/acceptance/bundle/override/job_tasks/output.txt b/acceptance/bundle/override/job_tasks/output.txt index 0d561291ed..3a7b1210bc 100644 --- a/acceptance/bundle/override/job_tasks/output.txt +++ b/acceptance/bundle/override/job_tasks/output.txt @@ -2,6 +2,7 @@ >>> errcode $CLI bundle validate -o json -t development Error: file ./test1.py not found + Exit code: 1 { "name": "job", @@ -36,6 +37,7 @@ Exit code: 1 >>> errcode $CLI bundle validate -o json -t staging Error: file ./test1.py not found + Exit code: 1 { "name": "job", @@ -66,3 +68,16 @@ Exit code: 1 } ] } + +>>> errcode $CLI bundle validate -t staging +Error: file ./test1.py not found + +Name: override_job_tasks +Target: staging +Workspace: + User: tester@databricks.com + Path: /Workspace/Users/tester@databricks.com/.bundle/override_job_tasks/staging + +Found 1 error + +Exit code: 1 diff --git a/acceptance/bundle/override/job_tasks/script b/acceptance/bundle/override/job_tasks/script index 4e08698575..b8648a5e83 100644 --- a/acceptance/bundle/override/job_tasks/script +++ b/acceptance/bundle/override/job_tasks/script @@ -1,2 +1,3 @@ trace errcode $CLI bundle validate -o json -t development | jq .resources.jobs.foo trace errcode $CLI bundle validate -o json -t staging | jq .resources.jobs.foo +trace errcode $CLI bundle validate -t staging diff --git a/acceptance/bundle/override/merge-string-map/output.txt b/acceptance/bundle/override/merge-string-map/output.txt index e1bd7dfb4f..986da81748 100644 --- a/acceptance/bundle/override/merge-string-map/output.txt +++ b/acceptance/bundle/override/merge-string-map/output.txt @@ -1,5 +1,9 @@ >>> $CLI bundle validate -o json -t dev +Warning: expected map, found string + at resources.clusters.my_cluster + in databricks.yml:6:17 + { "clusters": { "my_cluster": { diff --git a/cmd/bundle/validate.go b/cmd/bundle/validate.go index daeb7426d3..2f86147762 100644 --- a/cmd/bundle/validate.go +++ b/cmd/bundle/validate.go @@ -11,18 +11,17 @@ import ( "github.com/databricks/cli/bundle/render" "github.com/databricks/cli/cmd/bundle/utils" "github.com/databricks/cli/cmd/root" - "github.com/databricks/cli/libs/diag" "github.com/databricks/cli/libs/flags" "github.com/spf13/cobra" ) -func renderJsonOutput(cmd *cobra.Command, b *bundle.Bundle, diags diag.Diagnostics) error { +func renderJsonOutput(cmd *cobra.Command, b *bundle.Bundle) error { buf, err := json.MarshalIndent(b.Config.Value().AsAny(), "", " ") if err != nil { return err } _, _ = cmd.OutOrStdout().Write(buf) - return diags.Error() + return nil } func newValidateCommand() *cobra.Command { @@ -66,7 +65,23 @@ func newValidateCommand() *cobra.Command { return nil case flags.OutputJSON: - return renderJsonOutput(cmd, b, diags) + renderOpts := render.RenderOptions{RenderSummaryTable: false} + err1 := render.RenderDiagnostics(cmd.OutOrStderr(), b, diags, renderOpts) + err2 := renderJsonOutput(cmd, b) + + if err2 != nil { + return err2 + } + + if err1 != nil { + return err1 + } + + if diags.HasError() { + return root.ErrAlreadyPrinted + } + + return nil default: return fmt.Errorf("unknown output type %s", root.OutputType(cmd)) } From 7531f16a6b73743cadbc6e52f18d93626d35a27e Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Thu, 9 Jan 2025 17:31:00 +0100 Subject: [PATCH 2/4] switch to ErrOrStderr --- cmd/bundle/validate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/bundle/validate.go b/cmd/bundle/validate.go index 2f86147762..41fa87f30d 100644 --- a/cmd/bundle/validate.go +++ b/cmd/bundle/validate.go @@ -66,7 +66,7 @@ func newValidateCommand() *cobra.Command { return nil case flags.OutputJSON: renderOpts := render.RenderOptions{RenderSummaryTable: false} - err1 := render.RenderDiagnostics(cmd.OutOrStderr(), b, diags, renderOpts) + err1 := render.RenderDiagnostics(cmd.ErrOrStderr(), b, diags, renderOpts) err2 := renderJsonOutput(cmd, b) if err2 != nil { From 694ad7e42c758dd17f32b8e4386664c7ef2c1376 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Thu, 9 Jan 2025 17:32:39 +0100 Subject: [PATCH 3/4] explicit redirect of stderr --- .../bundle/override/job_tasks/out.development.stderr.txt | 6 ++++++ acceptance/bundle/override/job_tasks/output.txt | 6 ------ acceptance/bundle/override/job_tasks/script | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 acceptance/bundle/override/job_tasks/out.development.stderr.txt diff --git a/acceptance/bundle/override/job_tasks/out.development.stderr.txt b/acceptance/bundle/override/job_tasks/out.development.stderr.txt new file mode 100644 index 0000000000..184dad5711 --- /dev/null +++ b/acceptance/bundle/override/job_tasks/out.development.stderr.txt @@ -0,0 +1,6 @@ + +>>> errcode /Users/denis.bilenko/work/cli/acceptance/build/databricks bundle validate -o json -t development +Error: file ./test1.py not found + + +Exit code: 1 diff --git a/acceptance/bundle/override/job_tasks/output.txt b/acceptance/bundle/override/job_tasks/output.txt index 3a7b1210bc..0bb0b18125 100644 --- a/acceptance/bundle/override/job_tasks/output.txt +++ b/acceptance/bundle/override/job_tasks/output.txt @@ -1,9 +1,3 @@ - ->>> errcode $CLI bundle validate -o json -t development -Error: file ./test1.py not found - - -Exit code: 1 { "name": "job", "queue": { diff --git a/acceptance/bundle/override/job_tasks/script b/acceptance/bundle/override/job_tasks/script index b8648a5e83..f41729c1e5 100644 --- a/acceptance/bundle/override/job_tasks/script +++ b/acceptance/bundle/override/job_tasks/script @@ -1,3 +1,3 @@ -trace errcode $CLI bundle validate -o json -t development | jq .resources.jobs.foo +trace errcode $CLI bundle validate -o json -t development 2> out.development.stderr.txt | jq .resources.jobs.foo trace errcode $CLI bundle validate -o json -t staging | jq .resources.jobs.foo trace errcode $CLI bundle validate -t staging From a622d6bda675ed1dde88c64f3c1057f3df6c272b Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Thu, 9 Jan 2025 20:35:42 +0100 Subject: [PATCH 4/4] make sure all comparison go through s/execPath/$CLI --- acceptance/acceptance_test.go | 13 +++++++++---- .../override/job_tasks/out.development.stderr.txt | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index 033f26dfb3..b9fb219dcb 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -55,12 +55,15 @@ func TestAccept(t *testing.T) { // Do not read user's ~/.databrickscfg t.Setenv(env.HomeEnvVar(), homeDir) + repls := testdiff.ReplacementsContext{} + repls.Set(execPath, "$CLI") + testDirs := getTests(t) require.NotEmpty(t, testDirs) for _, dir := range testDirs { t.Run(dir, func(t *testing.T) { t.Parallel() - runTest(t, dir) + runTest(t, dir, repls) }) } } @@ -85,7 +88,7 @@ func getTests(t *testing.T) []string { return testDirs } -func runTest(t *testing.T, dir string) { +func runTest(t *testing.T, dir string, repls testdiff.ReplacementsContext) { var tmpDir string var err error if KeepTmp { @@ -112,7 +115,7 @@ func runTest(t *testing.T, dir string) { outB, err := cmd.CombinedOutput() out := formatOutput(string(outB), err) - out = strings.ReplaceAll(out, os.Getenv("CLI"), "$CLI") + out = repls.Replace(out) doComparison(t, filepath.Join(dir, "output.txt"), "script output", out) for key := range outputs { @@ -131,7 +134,8 @@ func runTest(t *testing.T, dir string) { continue } pathExpected := filepath.Join(dir, key) - doComparison(t, pathExpected, pathNew, string(newValBytes)) + newVal := repls.Replace(string(newValBytes)) + doComparison(t, pathExpected, pathNew, newVal) } // Make sure there are not unaccounted for new files @@ -152,6 +156,7 @@ func runTest(t *testing.T, dir string) { // Show the contents & support overwrite mode for it: pathNew := filepath.Join(tmpDir, name) newVal := testutil.ReadFile(t, pathNew) + newVal = repls.Replace(newVal) doComparison(t, filepath.Join(dir, name), filepath.Join(tmpDir, name), newVal) } } diff --git a/acceptance/bundle/override/job_tasks/out.development.stderr.txt b/acceptance/bundle/override/job_tasks/out.development.stderr.txt index 184dad5711..7b6fef0cc1 100644 --- a/acceptance/bundle/override/job_tasks/out.development.stderr.txt +++ b/acceptance/bundle/override/job_tasks/out.development.stderr.txt @@ -1,5 +1,5 @@ ->>> errcode /Users/denis.bilenko/work/cli/acceptance/build/databricks bundle validate -o json -t development +>>> errcode $CLI bundle validate -o json -t development Error: file ./test1.py not found