add special error handling for remote secrets management
This commit is contained in:
1 parent
55fde1499a
commit
e3eefbcd3c
3 files changed
+38
-7
No files matched your search
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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}
|
||||
}
|
||||
Reference in new issue
Block a user