mirror of https://github.com/databricks/cli.git
Specialize error when the path points to a legacy dashboard
This commit is contained in:
parent
e19f9b71f0
commit
6057c135cf
|
@ -3,6 +3,7 @@ package generate
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
@ -14,6 +15,7 @@ import (
|
||||||
"github.com/databricks/cli/bundle/config/generate"
|
"github.com/databricks/cli/bundle/config/generate"
|
||||||
"github.com/databricks/cli/bundle/deploy/terraform"
|
"github.com/databricks/cli/bundle/deploy/terraform"
|
||||||
"github.com/databricks/cli/bundle/phases"
|
"github.com/databricks/cli/bundle/phases"
|
||||||
|
"github.com/databricks/cli/bundle/render"
|
||||||
"github.com/databricks/cli/cmd/root"
|
"github.com/databricks/cli/cmd/root"
|
||||||
"github.com/databricks/cli/libs/diag"
|
"github.com/databricks/cli/libs/diag"
|
||||||
"github.com/databricks/cli/libs/dyn"
|
"github.com/databricks/cli/libs/dyn"
|
||||||
|
@ -64,8 +66,24 @@ func (d *dashboard) resolveFromPath(ctx context.Context, b *bundle.Bundle) (stri
|
||||||
obj, err := w.Workspace.GetStatusByPath(ctx, d.dashboardPath)
|
obj, err := w.Workspace.GetStatusByPath(ctx, d.dashboardPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if apierr.IsMissing(err) {
|
if apierr.IsMissing(err) {
|
||||||
return "", diag.Errorf("dashboard at path %q not found", d.dashboardPath)
|
return "", diag.Errorf("dashboard %q not found", path.Base(d.dashboardPath))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Emit a more descriptive error message for legacy dashboards.
|
||||||
|
if errors.Is(err, apierr.ErrBadRequest) && strings.HasPrefix(err.Error(), "dbsqlDashboard ") {
|
||||||
|
return "", diag.Diagnostics{
|
||||||
|
{
|
||||||
|
Severity: diag.Error,
|
||||||
|
Summary: fmt.Sprintf("dashboard %q is a legacy dashboard", path.Base(d.dashboardPath)),
|
||||||
|
Detail: "" +
|
||||||
|
"Databricks Asset Bundles work exclusively with AI/BI dashboards.\n" +
|
||||||
|
"\n" +
|
||||||
|
"Instructions on how to convert a legacy dashboard to an AI/BI dashboard\n" +
|
||||||
|
"can be found at: https://docs.databricks.com/en/dashboards/clone-legacy-to-aibi.html.",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return "", diag.FromErr(err)
|
return "", diag.FromErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +365,17 @@ func (d *dashboard) RunE(cmd *cobra.Command, args []string) error {
|
||||||
diags = d.runForExisting(ctx, b)
|
diags = d.runForExisting(ctx, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
return diags.Error()
|
renderOpts := render.RenderOptions{RenderSummaryTable: false}
|
||||||
|
err := render.RenderDiagnostics(cmd.OutOrStdout(), b, diags, renderOpts)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to render output: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if diags.HasError() {
|
||||||
|
return root.ErrAlreadyPrinted
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGenerateDashboardCommand() *cobra.Command {
|
func NewGenerateDashboardCommand() *cobra.Command {
|
||||||
|
|
|
@ -1 +1,43 @@
|
||||||
package generate
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/databricks/cli/bundle"
|
||||||
|
"github.com/databricks/databricks-sdk-go/apierr"
|
||||||
|
"github.com/databricks/databricks-sdk-go/experimental/mocks"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDashboard_ErrorOnLegacyDashboard(t *testing.T) {
|
||||||
|
// Response to a GetStatus request on a path pointing to a legacy dashboard.
|
||||||
|
//
|
||||||
|
// < HTTP/2.0 400 Bad Request
|
||||||
|
// < {
|
||||||
|
// < "error_code": "BAD_REQUEST",
|
||||||
|
// < "message": "dbsqlDashboard is not user-facing."
|
||||||
|
// < }
|
||||||
|
|
||||||
|
d := dashboard{
|
||||||
|
dashboardPath: "/path/to/legacy dashboard",
|
||||||
|
}
|
||||||
|
|
||||||
|
m := mocks.NewMockWorkspaceClient(t)
|
||||||
|
w := m.GetMockWorkspaceAPI()
|
||||||
|
w.On("GetStatusByPath", mock.Anything, "/path/to/legacy dashboard").Return(nil, &apierr.APIError{
|
||||||
|
StatusCode: 400,
|
||||||
|
ErrorCode: "BAD_REQUEST",
|
||||||
|
Message: "dbsqlDashboard is not user-facing.",
|
||||||
|
})
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
b := &bundle.Bundle{}
|
||||||
|
b.SetWorkpaceClient(m.WorkspaceClient)
|
||||||
|
|
||||||
|
_, diags := d.resolveID(ctx, b)
|
||||||
|
require.Len(t, diags, 1)
|
||||||
|
assert.Equal(t, diags[0].Summary, "dashboard \"legacy dashboard\" is a legacy dashboard")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue