Chore: Aggregate save dashboard error (#26443)

* Chore: Aggregate save dashboard error
* Use errors package for error detection

Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com>
Co-authored-by: Sofia Papagiannaki <papagian@users.noreply.github.com>
This commit is contained in:
gastonqiu
2020-07-21 11:12:01 +02:00
committed by GitHub
co-authored by Arve Knudsen Sofia Papagiannaki
parent 3c72b2f988
commit f427f90a45
7 changed files with 151 additions and 64 deletions
+27 -35
View File
@@ -2,6 +2,7 @@ package api
import (
"encoding/json"
"errors"
"fmt"
"os"
"path"
@@ -195,9 +196,14 @@ func deleteDashboard(c *models.ReqContext) Response {
}
err := dashboards.NewService().DeleteDashboard(dash.Id, c.OrgId)
if err == models.ErrDashboardCannotDeleteProvisionedDashboard {
return Error(400, "Dashboard cannot be deleted because it was provisioned", err)
} else if err != nil {
if err != nil {
var dashboardErr models.DashboardErr
if ok := errors.As(err, &dashboardErr); ok {
if errors.Is(err, models.ErrDashboardCannotDeleteProvisionedDashboard) {
return Error(dashboardErr.StatusCode, dashboardErr.Error(), err)
}
}
return Error(500, "Failed to delete dashboard", err)
}
@@ -267,50 +273,36 @@ func (hs *HTTPServer) PostDashboard(c *models.ReqContext, cmd models.SaveDashboa
}
func dashboardSaveErrorToApiResponse(err error) Response {
if err == models.ErrDashboardTitleEmpty ||
err == models.ErrDashboardWithSameNameAsFolder ||
err == models.ErrDashboardFolderWithSameNameAsDashboard ||
err == models.ErrDashboardTypeMismatch ||
err == models.ErrDashboardInvalidUid ||
err == models.ErrDashboardUidToLong ||
err == models.ErrDashboardWithSameUIDExists ||
err == models.ErrFolderNotFound ||
err == models.ErrDashboardFolderCannotHaveParent ||
err == models.ErrDashboardFolderNameExists ||
err == models.ErrDashboardRefreshIntervalTooShort ||
err == models.ErrDashboardCannotSaveProvisionedDashboard {
var dashboardErr models.DashboardErr
if ok := errors.As(err, &dashboardErr); ok {
if body := dashboardErr.Body(); body != nil {
return JSON(dashboardErr.StatusCode, body)
}
if errors.Is(dashboardErr, models.ErrDashboardUpdateAccessDenied) {
return Error(dashboardErr.StatusCode, dashboardErr.Error(), err)
}
return Error(dashboardErr.StatusCode, dashboardErr.Error(), nil)
}
if errors.Is(err, models.ErrFolderNotFound) {
return Error(400, err.Error(), nil)
}
if err == models.ErrDashboardUpdateAccessDenied {
return Error(403, err.Error(), err)
}
if validationErr, ok := err.(alerting.ValidationError); ok {
var validationErr alerting.ValidationError
if ok := errors.As(err, &validationErr); ok {
return Error(422, validationErr.Error(), nil)
}
if err == models.ErrDashboardWithSameNameInFolderExists {
return JSON(412, util.DynMap{"status": "name-exists", "message": err.Error()})
}
if err == models.ErrDashboardVersionMismatch {
return JSON(412, util.DynMap{"status": "version-mismatch", "message": err.Error()})
}
if pluginErr, ok := err.(models.UpdatePluginDashboardError); ok {
message := "The dashboard belongs to plugin " + pluginErr.PluginId + "."
var pluginErr models.UpdatePluginDashboardError
if ok := errors.As(err, &pluginErr); ok {
message := fmt.Sprintf("The dashboard belongs to plugin %s.", pluginErr.PluginId)
// look up plugin name
if pluginDef, exist := plugins.Plugins[pluginErr.PluginId]; exist {
message = "The dashboard belongs to plugin " + pluginDef.Name + "."
message = fmt.Sprintf("The dashboard belongs to plugin %s.", pluginDef.Name)
}
return JSON(412, util.DynMap{"status": "plugin-dashboard", "message": message})
}
if err == models.ErrDashboardNotFound {
return JSON(404, util.DynMap{"status": "not-found", "message": err.Error()})
}
return Error(500, "Failed to save dashboard", err)
}
+1 -1
View File
@@ -788,7 +788,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
{SaveError: models.ErrDashboardFolderNameExists, ExpectedStatusCode: 400},
{SaveError: models.ErrDashboardUpdateAccessDenied, ExpectedStatusCode: 403},
{SaveError: models.ErrDashboardInvalidUid, ExpectedStatusCode: 400},
{SaveError: models.ErrDashboardUidToLong, ExpectedStatusCode: 400},
{SaveError: models.ErrDashboardUidTooLong, ExpectedStatusCode: 400},
{SaveError: models.ErrDashboardCannotSaveProvisionedDashboard, ExpectedStatusCode: 400},
{SaveError: models.UpdatePluginDashboardError{PluginId: "plug"}, ExpectedStatusCode: 412},
}
+1 -1
View File
@@ -132,7 +132,7 @@ func toFolderError(err error) Response {
err == models.ErrFolderWithSameUIDExists ||
err == models.ErrDashboardTypeMismatch ||
err == models.ErrDashboardInvalidUid ||
err == models.ErrDashboardUidToLong {
err == models.ErrDashboardUidTooLong {
return Error(400, err.Error(), nil)
}
+2 -2
View File
@@ -49,7 +49,7 @@ func TestFoldersApiEndpoint(t *testing.T) {
{Error: models.ErrFolderTitleEmpty, ExpectedStatusCode: 400},
{Error: models.ErrFolderSameNameExists, ExpectedStatusCode: 400},
{Error: models.ErrDashboardInvalidUid, ExpectedStatusCode: 400},
{Error: models.ErrDashboardUidToLong, ExpectedStatusCode: 400},
{Error: models.ErrDashboardUidTooLong, ExpectedStatusCode: 400},
{Error: models.ErrFolderAccessDenied, ExpectedStatusCode: 403},
{Error: models.ErrFolderNotFound, ExpectedStatusCode: 404},
{Error: models.ErrFolderVersionMismatch, ExpectedStatusCode: 412},
@@ -107,7 +107,7 @@ func TestFoldersApiEndpoint(t *testing.T) {
{Error: models.ErrFolderTitleEmpty, ExpectedStatusCode: 400},
{Error: models.ErrFolderSameNameExists, ExpectedStatusCode: 400},
{Error: models.ErrDashboardInvalidUid, ExpectedStatusCode: 400},
{Error: models.ErrDashboardUidToLong, ExpectedStatusCode: 400},
{Error: models.ErrDashboardUidTooLong, ExpectedStatusCode: 400},
{Error: models.ErrFolderAccessDenied, ExpectedStatusCode: 403},
{Error: models.ErrFolderNotFound, ExpectedStatusCode: 404},
{Error: models.ErrFolderVersionMismatch, ExpectedStatusCode: 412},