From 59549b5dbb74e7ce0424b402e65102eb40543ae2 Mon Sep 17 00:00:00 2001 From: Russell Clarey Date: Wed, 10 Sep 2025 13:19:46 +0200 Subject: [PATCH 1/4] add resolve-config flag --- cmd/bundle/summary.go | 68 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/cmd/bundle/summary.go b/cmd/bundle/summary.go index 4688a02be3..38dec6e13d 100644 --- a/cmd/bundle/summary.go +++ b/cmd/bundle/summary.go @@ -1,6 +1,7 @@ package bundle import ( + "context" "errors" "os" "path/filepath" @@ -30,9 +31,12 @@ Useful after deployment to see what was created and where to find it.`, var forcePull bool var includeLocations bool + var resolveConfig bool cmd.Flags().BoolVar(&forcePull, "force-pull", false, "Skip local cache and load the state from the remote workspace") cmd.Flags().BoolVar(&includeLocations, "include-locations", false, "Include location information in the output") cmd.Flags().MarkHidden("include-locations") + cmd.Flags().BoolVar(&resolveConfig, "resolve-config", false, "Resolve and output the bundle config") + cmd.Flags().MarkHidden("resolve-config") cmd.RunE = func(cmd *cobra.Command, args []string) error { var err error @@ -40,20 +44,15 @@ Useful after deployment to see what was created and where to find it.`, cmd.SetContext(ctx) logdiag.SetSeverity(ctx, diag.Warning) - b := prepareBundleForSummary(cmd, forcePull, includeLocations) - - if b != nil { - if root.OutputType(cmd) == flags.OutputText { - err = render.RenderSummary(ctx, cmd.OutOrStdout(), b) - if err != nil { - return err - } + if resolveConfig { + err = runResolveConfig(ctx, cmd) + if err != nil { + return err } - if root.OutputType(cmd) == flags.OutputJSON { - err = renderJsonOutput(cmd, b) - if err != nil { - return err - } + } else { + err = runSummary(ctx, cmd, forcePull, includeLocations) + if err != nil { + return err } } @@ -67,6 +66,49 @@ Useful after deployment to see what was created and where to find it.`, return cmd } +func runResolveConfig(ctx context.Context, cmd *cobra.Command) error { + // call `MustLoad` directly instead of `MustConfigureBundle` because the latter does + // validation that we're not interested in here + b := bundle.MustLoad(ctx) + if b == nil || logdiag.HasError(ctx) { + return nil + } + + mutator.DefaultMutators(ctx, b) + if logdiag.HasError(ctx) { + return nil + } + + err := renderJsonOutput(cmd, b) + if err != nil { + return err + } + + return nil +} + +func runSummary(ctx context.Context, cmd *cobra.Command, forcePull, includeLocations bool) error { + var err error + b := prepareBundleForSummary(cmd, forcePull, includeLocations) + + if b != nil { + if root.OutputType(cmd) == flags.OutputText { + err = render.RenderSummary(ctx, cmd.OutOrStdout(), b) + if err != nil { + return err + } + } + if root.OutputType(cmd) == flags.OutputJSON { + err = renderJsonOutput(cmd, b) + if err != nil { + return err + } + } + } + + return nil +} + func prepareBundleForSummary(cmd *cobra.Command, forcePull, includeLocations bool) *bundle.Bundle { b := utils.ConfigureBundleWithVariables(cmd) ctx := cmd.Context() From 018d6d28aae6fa04c928d8006d7e7845f6662a1d Mon Sep 17 00:00:00 2001 From: Russell Clarey Date: Wed, 17 Sep 2025 13:47:29 +0200 Subject: [PATCH 2/4] add acceptance test --- .../summary/resolve-config/databricks.yml | 15 +++++++ .../summary/resolve-config/out.test.toml | 5 +++ .../bundle/summary/resolve-config/output.txt | 43 +++++++++++++++++++ .../bundle/summary/resolve-config/script | 1 + .../resolve-config/targets/default.yml | 4 ++ .../resolve-config/targets/not_default.yml | 3 ++ .../targets/variable_default.yml | 3 ++ .../resolve-config/targets/variable_mode.yml | 3 ++ 8 files changed, 77 insertions(+) create mode 100644 acceptance/bundle/summary/resolve-config/databricks.yml create mode 100644 acceptance/bundle/summary/resolve-config/out.test.toml create mode 100644 acceptance/bundle/summary/resolve-config/output.txt create mode 100644 acceptance/bundle/summary/resolve-config/script create mode 100644 acceptance/bundle/summary/resolve-config/targets/default.yml create mode 100644 acceptance/bundle/summary/resolve-config/targets/not_default.yml create mode 100644 acceptance/bundle/summary/resolve-config/targets/variable_default.yml create mode 100644 acceptance/bundle/summary/resolve-config/targets/variable_mode.yml diff --git a/acceptance/bundle/summary/resolve-config/databricks.yml b/acceptance/bundle/summary/resolve-config/databricks.yml new file mode 100644 index 0000000000..db7844a189 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/databricks.yml @@ -0,0 +1,15 @@ +include: + - targets/*.yml + +variables: + mode: + default: development + default: + default: false + +targets: + also_default: + mode: development + default: true + workspace: + host: https://example.com diff --git a/acceptance/bundle/summary/resolve-config/out.test.toml b/acceptance/bundle/summary/resolve-config/out.test.toml new file mode 100644 index 0000000000..e092fd5ed6 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/out.test.toml @@ -0,0 +1,5 @@ +Local = true +Cloud = false + +[EnvMatrix] + DATABRICKS_BUNDLE_ENGINE = ["terraform", "direct-exp"] diff --git a/acceptance/bundle/summary/resolve-config/output.txt b/acceptance/bundle/summary/resolve-config/output.txt new file mode 100644 index 0000000000..4e7f38c700 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/output.txt @@ -0,0 +1,43 @@ + +>>> [CLI] bundle summary --resolve-config +{ + "bundle": { + "name": "test-bundle" + }, + "include": [ + "targets/default.yml", + "targets/not_default.yml", + "targets/variable_default.yml", + "targets/variable_mode.yml" + ], + "targets": { + "also_default": { + "default": true, + "mode": "development", + "workspace": { + "host": "https://example.com" + } + }, + "default": { + "default": true, + "mode": "development" + }, + "not_default": { + "mode": "production" + }, + "variable_default": { + "default": "${var.default}" + }, + "variable_mode": { + "mode": "${var.mode}" + } + }, + "variables": { + "default": { + "default": false + }, + "mode": { + "default": "development" + } + } +} diff --git a/acceptance/bundle/summary/resolve-config/script b/acceptance/bundle/summary/resolve-config/script new file mode 100644 index 0000000000..92d33ccb38 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/script @@ -0,0 +1 @@ +trace $CLI bundle summary --resolve-config diff --git a/acceptance/bundle/summary/resolve-config/targets/default.yml b/acceptance/bundle/summary/resolve-config/targets/default.yml new file mode 100644 index 0000000000..7dd22abd89 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/targets/default.yml @@ -0,0 +1,4 @@ +targets: + default: + mode: development + default: true diff --git a/acceptance/bundle/summary/resolve-config/targets/not_default.yml b/acceptance/bundle/summary/resolve-config/targets/not_default.yml new file mode 100644 index 0000000000..44f4a59fab --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/targets/not_default.yml @@ -0,0 +1,3 @@ +targets: + not_default: + mode: production diff --git a/acceptance/bundle/summary/resolve-config/targets/variable_default.yml b/acceptance/bundle/summary/resolve-config/targets/variable_default.yml new file mode 100644 index 0000000000..3b086d8bfb --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/targets/variable_default.yml @@ -0,0 +1,3 @@ +targets: + variable_default: + default: ${var.default} diff --git a/acceptance/bundle/summary/resolve-config/targets/variable_mode.yml b/acceptance/bundle/summary/resolve-config/targets/variable_mode.yml new file mode 100644 index 0000000000..2d0339c4b1 --- /dev/null +++ b/acceptance/bundle/summary/resolve-config/targets/variable_mode.yml @@ -0,0 +1,3 @@ +targets: + variable_mode: + mode: ${var.mode} From d860edb262821c04521f1404d3499711e4f31619 Mon Sep 17 00:00:00 2001 From: Russell Clarey Date: Wed, 17 Sep 2025 15:01:48 +0200 Subject: [PATCH 3/4] normalize paths --- cmd/bundle/summary.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/bundle/summary.go b/cmd/bundle/summary.go index 38dec6e13d..2af1614df4 100644 --- a/cmd/bundle/summary.go +++ b/cmd/bundle/summary.go @@ -78,6 +78,10 @@ func runResolveConfig(ctx context.Context, cmd *cobra.Command) error { if logdiag.HasError(ctx) { return nil } + bundle.ApplyContext(ctx, b, mutator.NormalizePaths()) + if logdiag.HasError(ctx) { + return nil + } err := renderJsonOutput(cmd, b) if err != nil { From 8e0df0eb3cb3cec57b3531ee96a667ad53bef3c2 Mon Sep 17 00:00:00 2001 From: Russell Clarey Date: Thu, 18 Sep 2025 15:05:08 +0200 Subject: [PATCH 4/4] address feedback --- .../bundle/summary/resolve-config/script | 1 - .../databricks.yml | 0 .../out.test.toml | 0 .../output.txt | 2 +- .../bundle/summary/show-full-config/script | 1 + .../targets/default.yml | 0 .../targets/not_default.yml | 0 .../targets/variable_default.yml | 0 .../targets/variable_mode.yml | 0 .../bundle/summary/show-full-config/test.toml | 3 +++ cmd/bundle/summary.go | 20 ++++++++----------- 11 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 acceptance/bundle/summary/resolve-config/script rename acceptance/bundle/summary/{resolve-config => show-full-config}/databricks.yml (100%) rename acceptance/bundle/summary/{resolve-config => show-full-config}/out.test.toml (100%) rename acceptance/bundle/summary/{resolve-config => show-full-config}/output.txt (94%) create mode 100644 acceptance/bundle/summary/show-full-config/script rename acceptance/bundle/summary/{resolve-config => show-full-config}/targets/default.yml (100%) rename acceptance/bundle/summary/{resolve-config => show-full-config}/targets/not_default.yml (100%) rename acceptance/bundle/summary/{resolve-config => show-full-config}/targets/variable_default.yml (100%) rename acceptance/bundle/summary/{resolve-config => show-full-config}/targets/variable_mode.yml (100%) create mode 100644 acceptance/bundle/summary/show-full-config/test.toml diff --git a/acceptance/bundle/summary/resolve-config/script b/acceptance/bundle/summary/resolve-config/script deleted file mode 100644 index 92d33ccb38..0000000000 --- a/acceptance/bundle/summary/resolve-config/script +++ /dev/null @@ -1 +0,0 @@ -trace $CLI bundle summary --resolve-config diff --git a/acceptance/bundle/summary/resolve-config/databricks.yml b/acceptance/bundle/summary/show-full-config/databricks.yml similarity index 100% rename from acceptance/bundle/summary/resolve-config/databricks.yml rename to acceptance/bundle/summary/show-full-config/databricks.yml diff --git a/acceptance/bundle/summary/resolve-config/out.test.toml b/acceptance/bundle/summary/show-full-config/out.test.toml similarity index 100% rename from acceptance/bundle/summary/resolve-config/out.test.toml rename to acceptance/bundle/summary/show-full-config/out.test.toml diff --git a/acceptance/bundle/summary/resolve-config/output.txt b/acceptance/bundle/summary/show-full-config/output.txt similarity index 94% rename from acceptance/bundle/summary/resolve-config/output.txt rename to acceptance/bundle/summary/show-full-config/output.txt index 4e7f38c700..c75fca854b 100644 --- a/acceptance/bundle/summary/resolve-config/output.txt +++ b/acceptance/bundle/summary/show-full-config/output.txt @@ -1,5 +1,5 @@ ->>> [CLI] bundle summary --resolve-config +>>> [CLI] bundle summary --show-full-config { "bundle": { "name": "test-bundle" diff --git a/acceptance/bundle/summary/show-full-config/script b/acceptance/bundle/summary/show-full-config/script new file mode 100644 index 0000000000..1c76f0c443 --- /dev/null +++ b/acceptance/bundle/summary/show-full-config/script @@ -0,0 +1 @@ +trace $CLI bundle summary --show-full-config diff --git a/acceptance/bundle/summary/resolve-config/targets/default.yml b/acceptance/bundle/summary/show-full-config/targets/default.yml similarity index 100% rename from acceptance/bundle/summary/resolve-config/targets/default.yml rename to acceptance/bundle/summary/show-full-config/targets/default.yml diff --git a/acceptance/bundle/summary/resolve-config/targets/not_default.yml b/acceptance/bundle/summary/show-full-config/targets/not_default.yml similarity index 100% rename from acceptance/bundle/summary/resolve-config/targets/not_default.yml rename to acceptance/bundle/summary/show-full-config/targets/not_default.yml diff --git a/acceptance/bundle/summary/resolve-config/targets/variable_default.yml b/acceptance/bundle/summary/show-full-config/targets/variable_default.yml similarity index 100% rename from acceptance/bundle/summary/resolve-config/targets/variable_default.yml rename to acceptance/bundle/summary/show-full-config/targets/variable_default.yml diff --git a/acceptance/bundle/summary/resolve-config/targets/variable_mode.yml b/acceptance/bundle/summary/show-full-config/targets/variable_mode.yml similarity index 100% rename from acceptance/bundle/summary/resolve-config/targets/variable_mode.yml rename to acceptance/bundle/summary/show-full-config/targets/variable_mode.yml diff --git a/acceptance/bundle/summary/show-full-config/test.toml b/acceptance/bundle/summary/show-full-config/test.toml new file mode 100644 index 0000000000..9cf9b33eca --- /dev/null +++ b/acceptance/bundle/summary/show-full-config/test.toml @@ -0,0 +1,3 @@ +[[Repls]] +Old = '\\\\' +New = '/' diff --git a/cmd/bundle/summary.go b/cmd/bundle/summary.go index 2af1614df4..70b663f56a 100644 --- a/cmd/bundle/summary.go +++ b/cmd/bundle/summary.go @@ -31,12 +31,12 @@ Useful after deployment to see what was created and where to find it.`, var forcePull bool var includeLocations bool - var resolveConfig bool + var shouldShowFullConfig bool cmd.Flags().BoolVar(&forcePull, "force-pull", false, "Skip local cache and load the state from the remote workspace") cmd.Flags().BoolVar(&includeLocations, "include-locations", false, "Include location information in the output") cmd.Flags().MarkHidden("include-locations") - cmd.Flags().BoolVar(&resolveConfig, "resolve-config", false, "Resolve and output the bundle config") - cmd.Flags().MarkHidden("resolve-config") + cmd.Flags().BoolVar(&shouldShowFullConfig, "show-full-config", false, "Load and output the full bundle config") + cmd.Flags().MarkHidden("show-full-config") cmd.RunE = func(cmd *cobra.Command, args []string) error { var err error @@ -44,13 +44,13 @@ Useful after deployment to see what was created and where to find it.`, cmd.SetContext(ctx) logdiag.SetSeverity(ctx, diag.Warning) - if resolveConfig { - err = runResolveConfig(ctx, cmd) + if shouldShowFullConfig { + err = showFullConfig(ctx, cmd) if err != nil { return err } } else { - err = runSummary(ctx, cmd, forcePull, includeLocations) + err = showSummary(ctx, cmd, forcePull, includeLocations) if err != nil { return err } @@ -66,7 +66,7 @@ Useful after deployment to see what was created and where to find it.`, return cmd } -func runResolveConfig(ctx context.Context, cmd *cobra.Command) error { +func showFullConfig(ctx context.Context, cmd *cobra.Command) error { // call `MustLoad` directly instead of `MustConfigureBundle` because the latter does // validation that we're not interested in here b := bundle.MustLoad(ctx) @@ -78,10 +78,6 @@ func runResolveConfig(ctx context.Context, cmd *cobra.Command) error { if logdiag.HasError(ctx) { return nil } - bundle.ApplyContext(ctx, b, mutator.NormalizePaths()) - if logdiag.HasError(ctx) { - return nil - } err := renderJsonOutput(cmd, b) if err != nil { @@ -91,7 +87,7 @@ func runResolveConfig(ctx context.Context, cmd *cobra.Command) error { return nil } -func runSummary(ctx context.Context, cmd *cobra.Command, forcePull, includeLocations bool) error { +func showSummary(ctx context.Context, cmd *cobra.Command, forcePull, includeLocations bool) error { var err error b := prepareBundleForSummary(cmd, forcePull, includeLocations)