diff --git a/bundle/config/mutator/apply_presets.go b/bundle/config/mutator/apply_presets.go index 1fd49206..fac1795e 100644 --- a/bundle/config/mutator/apply_presets.go +++ b/bundle/config/mutator/apply_presets.go @@ -220,10 +220,16 @@ func validatePauseStatus(b *bundle.Bundle) diag.Diagnostics { if p == "" || p == config.Paused || p == config.Unpaused { return nil } + // TODO: test this. return diag.Diagnostics{{ - Summary: "Invalid value for trigger_pause_status, should be PAUSED or UNPAUSED", - Severity: diag.Error, - Locations: []dyn.Location{b.Config.GetLocation("presets.trigger_pause_status")}, + Summary: "Invalid value for trigger_pause_status, should be PAUSED or UNPAUSED", + Severity: diag.Error, + LocationPathPairs: []diag.LocationPathPair{ + { + L: b.Config.GetLocation("presets.trigger_pause_status"), + P: dyn.MustPathFromString("presets.trigger_pause_status"), + }, + }, }} } diff --git a/bundle/config/mutator/compute_id_compat.go b/bundle/config/mutator/compute_id_compat.go index 3afe02e9..ae9a4445 100644 --- a/bundle/config/mutator/compute_id_compat.go +++ b/bundle/config/mutator/compute_id_compat.go @@ -52,11 +52,19 @@ func rewriteComputeIdToClusterId(v dyn.Value, p dyn.Path) (dyn.Value, diag.Diagn return v, nil } + // TODO: test this. + locationPathPaths := []diag.LocationPathPair{} + for _, l := range computeId.Locations() { + locationPathPaths = append(locationPathPaths, diag.LocationPathPair{ + L: l, + P: computeIdPath, + }) + } + diags = diags.Append(diag.Diagnostic{ - Severity: diag.Warning, - Summary: "compute_id is deprecated, please use cluster_id instead", - Locations: computeId.Locations(), - Paths: []dyn.Path{computeIdPath}, + Severity: diag.Warning, + Summary: "compute_id is deprecated, please use cluster_id instead", + LocationPathPairs: locationPathPaths, }) clusterIdPath := p.Append(dyn.Key("cluster_id")) diff --git a/bundle/config/mutator/process_target_mode.go b/bundle/config/mutator/process_target_mode.go index 44b53681..c44dd0cb 100644 --- a/bundle/config/mutator/process_target_mode.go +++ b/bundle/config/mutator/process_target_mode.go @@ -76,9 +76,15 @@ func validateDevelopmentMode(b *bundle.Bundle) diag.Diagnostics { // historically allowed.) if p.TriggerPauseStatus == config.Unpaused { diags = diags.Append(diag.Diagnostic{ - Severity: diag.Error, - Summary: "target with 'mode: development' cannot set trigger pause status to UNPAUSED by default", - Locations: []dyn.Location{b.Config.GetLocation("presets.trigger_pause_status")}, + Severity: diag.Error, + Summary: "target with 'mode: development' cannot set trigger pause status to UNPAUSED by default", + // TODO: test this. + LocationPathPairs: []diag.LocationPathPair{ + { + L: b.Config.GetLocation("presets.trigger_pause_status"), + P: dyn.MustPathFromString("presets.trigger_pause_status"), + }, + }, }) } @@ -98,9 +104,15 @@ func validateDevelopmentMode(b *bundle.Bundle) diag.Diagnostics { // it's a pitfall for users if they don't include it and later find out that // only a single user can do development deployments. diags = diags.Append(diag.Diagnostic{ - Severity: diag.Error, - Summary: "prefix should contain the current username or ${workspace.current_user.short_name} to ensure uniqueness when using 'mode: development'", - Locations: []dyn.Location{b.Config.GetLocation("presets.name_prefix")}, + Severity: diag.Error, + Summary: "prefix should contain the current username or ${workspace.current_user.short_name} to ensure uniqueness when using 'mode: development'", + // TODO: test this. + LocationPathPairs: []diag.LocationPathPair{ + { + L: b.Config.GetLocation("presets.name_prefix"), + P: dyn.MustPathFromString("presets.name_prefix"), + }, + }, }) } return diags diff --git a/bundle/config/mutator/python/python_diagnostics.go b/bundle/config/mutator/python/python_diagnostics.go index 12822065..0ae8905e 100644 --- a/bundle/config/mutator/python/python_diagnostics.go +++ b/bundle/config/mutator/python/python_diagnostics.go @@ -54,23 +54,23 @@ func parsePythonDiagnostics(input io.Reader) (diag.Diagnostics, error) { if err != nil { return nil, fmt.Errorf("failed to parse path: %s", err) } - var paths []dyn.Path - if path != nil { - paths = []dyn.Path{path} - } - var locations []dyn.Location location := convertPythonLocation(parsedLine.Location) - if location != (dyn.Location{}) { - locations = append(locations, location) + + // TODO: test this. + locationPathPairs := []diag.LocationPathPair{} + if path != nil || location != (dyn.Location{}) { + locationPathPairs = append(locationPathPairs, diag.LocationPathPair{ + L: location, + P: path, + }) } diag := diag.Diagnostic{ - Severity: severity, - Summary: parsedLine.Summary, - Detail: parsedLine.Detail, - Locations: locations, - Paths: paths, + Severity: severity, + Summary: parsedLine.Summary, + Detail: parsedLine.Detail, + LocationPathPairs: locationPathPairs, } diags = diags.Append(diag) diff --git a/bundle/config/mutator/rewrite_workspace_prefix.go b/bundle/config/mutator/rewrite_workspace_prefix.go index 8a39ee8a..9f93a500 100644 --- a/bundle/config/mutator/rewrite_workspace_prefix.go +++ b/bundle/config/mutator/rewrite_workspace_prefix.go @@ -47,12 +47,21 @@ func (m *rewriteWorkspacePrefix) Apply(ctx context.Context, b *bundle.Bundle) di for path, replacePath := range paths { if strings.Contains(vv, path) { newPath := strings.Replace(vv, path, replacePath, 1) + + locationPathPairs := []diag.LocationPathPair{} + for _, l := range v.Locations() { + locationPathPairs = append(locationPathPairs, diag.LocationPathPair{ + L: l, + P: p, + }) + } + + // TODO: test this. diags = append(diags, diag.Diagnostic{ - Severity: diag.Warning, - Summary: fmt.Sprintf("substring %q found in %q. Please update this to %q.", path, vv, newPath), - Detail: "For more information, please refer to: https://docs.databricks.com/en/release-notes/dev-tools/bundles.html#workspace-paths", - Locations: v.Locations(), - Paths: []dyn.Path{p}, + Severity: diag.Warning, + Summary: fmt.Sprintf("substring %q found in %q. Please update this to %q.", path, vv, newPath), + Detail: "For more information, please refer to: https://docs.databricks.com/en/release-notes/dev-tools/bundles.html#workspace-paths", + LocationPathPairs: locationPathPairs, }) // Remove the workspace prefix from the string. diff --git a/bundle/config/mutator/run_as.go b/bundle/config/mutator/run_as.go index 6b3069d4..bddd091e 100644 --- a/bundle/config/mutator/run_as.go +++ b/bundle/config/mutator/run_as.go @@ -30,11 +30,19 @@ func (m *setRunAs) Name() string { return "SetRunAs" } -func reportRunAsNotSupported(resourceType string, location dyn.Location, currentUser string, runAsUser string) diag.Diagnostics { + +// TODO: CONTINUE with transformation to pair and test this. +func reportRunAsNotSupported(resourceType string, location dyn.Location, path dyn.Path, currentUser string, runAsUser string) diag.Diagnostics { return diag.Diagnostics{{ Summary: fmt.Sprintf("%s do not support a setting a run_as user that is different from the owner.\n"+ "Current identity: %s. Run as identity: %s.\n"+ "See https://docs.databricks.com/dev-tools/bundles/run-as.html to learn more about the run_as property.", resourceType, currentUser, runAsUser), + LocationPathPairs: []diag.LocationPathPair{ + { + L: location, + + }, + }, Locations: []dyn.Location{location}, Severity: diag.Error, }} diff --git a/bundle/render/render_text_output.go b/bundle/render/render_text_output.go index 3e52d5f1..2e5f77e4 100644 --- a/bundle/render/render_text_output.go +++ b/bundle/render/render_text_output.go @@ -112,18 +112,19 @@ func renderSummaryTemplate(out io.Writer, b *bundle.Bundle, diags diag.Diagnosti } func renderDiagnostics(out io.Writer, b *bundle.Bundle, diags diag.Diagnostics) error { + // TODO: test this. for _, d := range diags { - for i := range d.Locations { + for i := range d.LocationPathPairs { if b == nil { break } // Make location relative to bundle root - if d.Locations[i].File != "" { - out, err := filepath.Rel(b.BundleRootPath, d.Locations[i].File) + if d.LocationPathPairs[i].L.File != "" { + out, err := filepath.Rel(b.BundleRootPath, d.LocationPathPairs[i].L.File) // if we can't relativize the path, just use path as-is if err == nil { - d.Locations[i].File = out + d.LocationPathPairs[i].L.File = out } } } diff --git a/libs/cmdio/render.go b/libs/cmdio/render.go index 58fcab44..fc7adf08 100644 --- a/libs/cmdio/render.go +++ b/libs/cmdio/render.go @@ -394,10 +394,7 @@ func fancyJSON(v any) ([]byte, error) { const errorTemplate = `{{ "Error" | red }}: {{ .Summary }} {{- range $index, $element := .Paths }} - {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.String | green }} -{{- end }} -{{- range $index, $element := .Locations }} - {{ if eq $index 0 }}in {{else}} {{ end}}{{ $element.String | cyan }} + {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.P.String | green }} in {{ $element.L.String | cyan }} {{- end }} {{- if .Detail }} @@ -406,12 +403,11 @@ const errorTemplate = `{{ "Error" | red }}: {{ .Summary }} ` +// TODO: Only print "at" and "in" if both are not nil. +// TODO: also add tests for this. const warningTemplate = `{{ "Warning" | yellow }}: {{ .Summary }} {{- range $index, $element := .Paths }} - {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.String | green }} -{{- end }} -{{- range $index, $element := .Locations }} - {{ if eq $index 0 }}in {{else}} {{ end}}{{ $element.String | cyan }} + {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.P.String | green }} in {{ $element.L.String | cyan }} {{- end }} {{- if .Detail }} @@ -420,23 +416,9 @@ const warningTemplate = `{{ "Warning" | yellow }}: {{ .Summary }} ` -// const recommendationTemplate = `{{ "Recommendation" | blue }}: {{ .Summary }} -// {{- range $index, $element := .Paths }} -// {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.String | green }} -// {{- end }} -// {{- range $index, $element := .Locations }} -// {{ if eq $index 0 }}in {{else}} {{ end}}{{ $element.String | cyan }} -// {{- end }} -// {{- if .Detail }} - -// {{ .Detail }} -// {{- end }} - -// ` - const recommendationTemplate = `{{ "Recommendation" | blue }}: {{ .Summary }} {{- range $index, $element := .LocationPathPairs}} - {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.L.String | green }} in {{ $element.P.String | cyan }} + {{ if eq $index 0 }}at {{else}} {{ end}}{{ $element.P.String | green }} in {{ $element.L.String | cyan }} {{- end }} {{- if .Detail }}