From e3eefbcd3c03013df6fcdaf3c3f6f10b863b1847 Mon Sep 17 00:00:00 2001 From: Michael Mandrus Date: Thu, 9 Jun 2022 10:52:31 -0400 Subject: [PATCH] add special error handling for remote secrets management --- pkg/api/datasources.go | 17 +++++++++++++++++ pkg/models/datasource.go | 9 +++++++++ pkg/services/secrets/kvstore/remote_plugin.go | 19 ++++++++++++------- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index ee331ae92a8..4c4e7b9e78a 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -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) } diff --git a/pkg/models/datasource.go b/pkg/models/datasource.go index 52298d505b9..655dfab09e7 100644 --- a/pkg/models/datasource.go +++ b/pkg/models/datasource.go @@ -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 diff --git a/pkg/services/secrets/kvstore/remote_plugin.go b/pkg/services/secrets/kvstore/remote_plugin.go index 97222e646e9..8216140c624 100644 --- a/pkg/services/secrets/kvstore/remote_plugin.go +++ b/pkg/services/secrets/kvstore/remote_plugin.go @@ -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} +}