add special error handling for remote secrets management

This commit is contained in:
Michael Mandrus committed 2022-06-09 10:52:31 -04:00
1 parent 55fde1499a
commit e3eefbcd3c
3 files changed
+38 -7

No files matched your search

+17
View File
@@ -132,6 +132,9 @@ func (hs *HTTPServer) DeleteDataSourceById(c *models.ReqContext) response.Respon
err = hs.DataSourcesService.DeleteDataSource(c.Req.Context(), cmd)
if err != nil {
if _, ok := err.(models.ErrDatasourceSecretsPlugin); ok {
return response.Error(500, "Failed to delete datasource: "+err.Error(), err)
}
return response.Error(500, "Failed to delete datasource", err)
}
@@ -188,6 +191,9 @@ func (hs *HTTPServer) DeleteDataSourceByUID(c *models.ReqContext) response.Respo
err = hs.DataSourcesService.DeleteDataSource(c.Req.Context(), cmd)
if err != nil {
if _, ok := err.(models.ErrDatasourceSecretsPlugin); ok {
return response.Error(500, "Failed to delete datasource: "+err.Error(), err)
}
return response.Error(500, "Failed to delete datasource", err)
}
@@ -222,6 +228,9 @@ func (hs *HTTPServer) DeleteDataSourceByName(c *models.ReqContext) response.Resp
cmd := &models.DeleteDataSourceCommand{Name: name, OrgID: c.OrgId}
err := hs.DataSourcesService.DeleteDataSource(c.Req.Context(), cmd)
if err != nil {
if _, ok := err.(models.ErrDatasourceSecretsPlugin); ok {
return response.Error(500, "Failed to delete datasource: "+err.Error(), err)
}
return response.Error(500, "Failed to delete datasource", err)
}
@@ -262,6 +271,10 @@ func (hs *HTTPServer) AddDataSource(c *models.ReqContext) response.Response {
return response.Error(409, err.Error(), err)
}
if _, ok := err.(models.ErrDatasourceSecretsPlugin); ok {
return response.Error(500, "Failed to add datasource: "+err.Error(), err)
}
return response.Error(500, "Failed to add datasource", err)
}
@@ -333,6 +346,10 @@ func (hs *HTTPServer) updateDataSourceByID(c *models.ReqContext, ds *models.Data
if errors.Is(err, models.ErrDataSourceUpdatingOldVersion) {
return response.Error(409, "Datasource has already been updated by someone else. Please reload and try again", err)
}
if _, ok := err.(models.ErrDatasourceSecretsPlugin); ok {
return response.Error(500, "Failed to update datasource: "+err.Error(), err)
}
return response.Error(500, "Failed to update datasource", err)
}
+9
View File
@@ -81,6 +81,15 @@ func (ds DataSource) AllowedCookies() []string {
return []string{}
}
// Specific error type for grpc secrets management so that we can show more detailed plugin errors to users
type ErrDatasourceSecretsPlugin struct {
Err error
}
func (e ErrDatasourceSecretsPlugin) Error() string {
return e.Err.Error()
}
// ----------------------
// COMMANDS
+12 -7
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models"
smp "github.com/grafana/grafana/pkg/plugins/backendplugin/secretsmanagerplugin"
"github.com/grafana/grafana/pkg/services/secrets"
)
@@ -27,12 +28,12 @@ func (kv *secretsKVStorePlugin) Get(ctx context.Context, orgId int64, namespace
}
res, err := kv.secretsPlugin.Get(ctx, req)
if err != nil {
return "", false, err
return "", false, wrapSecretError(err)
} else if res.Error != "" {
err = fmt.Errorf(res.Error)
}
return res.DecryptedValue, res.Exists, err
return res.DecryptedValue, res.Exists, wrapSecretError(err)
}
// Set an item in the store
@@ -51,7 +52,7 @@ func (kv *secretsKVStorePlugin) Set(ctx context.Context, orgId int64, namespace
err = fmt.Errorf(res.Error)
}
return err
return wrapSecretError(err)
}
// Del deletes an item from the store.
@@ -69,7 +70,7 @@ func (kv *secretsKVStorePlugin) Del(ctx context.Context, orgId int64, namespace
err = fmt.Errorf(res.Error)
}
return err
return wrapSecretError(err)
}
// Keys get all keys for a given namespace. To query for all
@@ -86,12 +87,12 @@ func (kv *secretsKVStorePlugin) Keys(ctx context.Context, orgId int64, namespace
res, err := kv.secretsPlugin.Keys(ctx, req)
if err != nil {
return nil, err
return nil, wrapSecretError(err)
} else if res.Error != "" {
err = fmt.Errorf(res.Error)
}
return parseKeys(res.Keys), err
return parseKeys(res.Keys), wrapSecretError(err)
}
// Rename an item in the store
@@ -110,7 +111,7 @@ func (kv *secretsKVStorePlugin) Rename(ctx context.Context, orgId int64, namespa
err = fmt.Errorf(res.Error)
}
return err
return wrapSecretError(err)
}
func parseKeys(keys []*smp.Key) []Key {
@@ -123,3 +124,7 @@ func parseKeys(keys []*smp.Key) []Key {
return newKeys
}
func wrapSecretError(err error) models.ErrDatasourceSecretsPlugin {
return models.ErrDatasourceSecretsPlugin{Err: err}
}