diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index d4449139649..c3d737209fb 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -1,6 +1,7 @@ package api import ( + "context" "errors" "strconv" @@ -145,7 +146,7 @@ func (hs *HTTPServer) getFSDataSources(c *models.ReqContext, enabledPlugins Enab // getFrontendSettingsMap returns a json object with all the settings needed for front end initialisation. func (hs *HTTPServer) getFrontendSettingsMap(c *models.ReqContext) (map[string]interface{}, error) { - enabledPlugins, err := hs.enabledPlugins(c.OrgId) + enabledPlugins, err := hs.enabledPlugins(c.Req.Context(), c.OrgId) if err != nil { return nil, err } @@ -360,10 +361,10 @@ func (ep EnabledPlugins) Get(pluginType plugins.Type, pluginID string) (*plugins return nil, false } -func (hs *HTTPServer) enabledPlugins(orgID int64) (EnabledPlugins, error) { +func (hs *HTTPServer) enabledPlugins(ctx context.Context, orgID int64) (EnabledPlugins, error) { ep := make(EnabledPlugins) - pluginSettingMap, err := hs.pluginSettings(orgID) + pluginSettingMap, err := hs.pluginSettings(ctx, orgID) if err != nil { return ep, err } @@ -396,8 +397,8 @@ func (hs *HTTPServer) enabledPlugins(orgID int64) (EnabledPlugins, error) { return ep, nil } -func (hs *HTTPServer) pluginSettings(orgID int64) (map[string]*models.PluginSettingInfoDTO, error) { - pluginSettings, err := hs.SQLStore.GetPluginSettings(orgID) +func (hs *HTTPServer) pluginSettings(ctx context.Context, orgID int64) (map[string]*models.PluginSettingInfoDTO, error) { + pluginSettings, err := hs.SQLStore.GetPluginSettings(ctx, orgID) if err != nil { return nil, err } diff --git a/pkg/api/index.go b/pkg/api/index.go index e2132247670..76353833398 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -66,7 +66,7 @@ func (hs *HTTPServer) getProfileNode(c *models.ReqContext) *dtos.NavLink { } func (hs *HTTPServer) getAppLinks(c *models.ReqContext) ([]*dtos.NavLink, error) { - enabledPlugins, err := hs.enabledPlugins(c.OrgId) + enabledPlugins, err := hs.enabledPlugins(c.Req.Context(), c.OrgId) if err != nil { return nil, err } diff --git a/pkg/api/pluginproxy/pluginproxy.go b/pkg/api/pluginproxy/pluginproxy.go index a9ad7066e9e..7ec81301d7c 100644 --- a/pkg/api/pluginproxy/pluginproxy.go +++ b/pkg/api/pluginproxy/pluginproxy.go @@ -25,7 +25,7 @@ func NewApiPluginProxy(ctx *models.ReqContext, proxyPath string, route *plugins. appID string, cfg *setting.Cfg, encryptionService encryption.Service) *httputil.ReverseProxy { director := func(req *http.Request) { query := models.GetPluginSettingByIdQuery{OrgId: ctx.OrgId, PluginId: appID} - if err := bus.Dispatch(&query); err != nil { + if err := bus.DispatchCtx(ctx.Req.Context(), &query); err != nil { ctx.JsonApiErr(500, "Failed to fetch plugin settings", err) return } diff --git a/pkg/api/pluginproxy/pluginproxy_test.go b/pkg/api/pluginproxy/pluginproxy_test.go index f59026afc0d..4ea7b20d029 100644 --- a/pkg/api/pluginproxy/pluginproxy_test.go +++ b/pkg/api/pluginproxy/pluginproxy_test.go @@ -164,7 +164,7 @@ func TestPluginProxy(t *testing.T) { Method: "GET", } - bus.AddHandler("test", func(query *models.GetPluginSettingByIdQuery) error { + bus.AddHandlerCtx("test", func(_ context.Context, query *models.GetPluginSettingByIdQuery) error { query.Result = &models.PluginSetting{} return nil }) diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index d410ffdb682..8aed9a64a10 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -35,7 +35,7 @@ func (hs *HTTPServer) GetPluginList(c *models.ReqContext) response.Response { coreFilter = "1" } - pluginSettingsMap, err := hs.pluginSettings(c.OrgId) + pluginSettingsMap, err := hs.pluginSettings(c.Req.Context(), c.OrgId) if err != nil { return response.Error(500, "Failed to get list of plugins", err) } @@ -134,7 +134,7 @@ func (hs *HTTPServer) GetPluginSettingByID(c *models.ReqContext) response.Respon } query := models.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: c.OrgId} - if err := bus.Dispatch(&query); err != nil { + if err := bus.DispatchCtx(c.Req.Context(), &query); err != nil { if !errors.Is(err, models.ErrPluginSettingNotFound) { return response.Error(500, "Failed to get login settings", nil) } @@ -156,7 +156,7 @@ func (hs *HTTPServer) UpdatePluginSetting(c *models.ReqContext, cmd models.Updat cmd.OrgId = c.OrgId cmd.PluginId = pluginID - if err := bus.Dispatch(&cmd); err != nil { + if err := bus.DispatchCtx(c.Req.Context(), &cmd); err != nil { return response.Error(500, "Failed to update plugin setting", err) } @@ -317,7 +317,7 @@ func (hs *HTTPServer) getPluginAssets(c *models.ReqContext) { func (hs *HTTPServer) CheckHealth(c *models.ReqContext) response.Response { pluginID := web.Params(c.Req)[":pluginId"] - pCtx, found, err := hs.PluginContextProvider.Get(pluginID, "", c.SignedInUser, false) + pCtx, found, err := hs.PluginContextProvider.Get(c.Req.Context(), pluginID, "", c.SignedInUser, false) if err != nil { return response.Error(500, "Failed to get plugin settings", err) } @@ -361,7 +361,7 @@ func (hs *HTTPServer) CheckHealth(c *models.ReqContext) response.Response { func (hs *HTTPServer) CallResource(c *models.ReqContext) { pluginID := web.Params(c.Req)[":pluginId"] - pCtx, found, err := hs.PluginContextProvider.Get(pluginID, "", c.SignedInUser, false) + pCtx, found, err := hs.PluginContextProvider.Get(c.Req.Context(), pluginID, "", c.SignedInUser, false) if err != nil { c.JsonApiErr(500, "Failed to get plugin settings", err) return diff --git a/pkg/plugins/plugincontext/plugincontext.go b/pkg/plugins/plugincontext/plugincontext.go index 4efb903820c..e8496f8e134 100644 --- a/pkg/plugins/plugincontext/plugincontext.go +++ b/pkg/plugins/plugincontext/plugincontext.go @@ -48,7 +48,7 @@ type Provider struct { // Get allows getting plugin context by its ID. If datasourceUID is not empty string // then PluginContext.DataSourceInstanceSettings will be resolved and appended to // returned context. -func (p *Provider) Get(pluginID string, datasourceUID string, user *models.SignedInUser, skipCache bool) (backend.PluginContext, bool, error) { +func (p *Provider) Get(ctx context.Context, pluginID string, datasourceUID string, user *models.SignedInUser, skipCache bool) (backend.PluginContext, bool, error) { pc := backend.PluginContext{} plugin := p.pluginStore.Plugin(pluginID) if plugin == nil { @@ -59,7 +59,7 @@ func (p *Provider) Get(pluginID string, datasourceUID string, user *models.Signe decryptedSecureJSONData := map[string]string{} var updated time.Time - ps, err := p.getCachedPluginSettings(pluginID, user) + ps, err := p.getCachedPluginSettings(ctx, pluginID, user) if err != nil { // models.ErrPluginSettingNotFound is expected if there's no row found for plugin setting in database (if non-app plugin). // If it's not this expected error something is wrong with cache or database and we return the error to the client. @@ -104,7 +104,7 @@ func (p *Provider) Get(pluginID string, datasourceUID string, user *models.Signe const pluginSettingsCacheTTL = 5 * time.Second const pluginSettingsCachePrefix = "plugin-setting-" -func (p *Provider) getCachedPluginSettings(pluginID string, user *models.SignedInUser) (*models.PluginSetting, error) { +func (p *Provider) getCachedPluginSettings(ctx context.Context, pluginID string, user *models.SignedInUser) (*models.PluginSetting, error) { cacheKey := pluginSettingsCachePrefix + pluginID if cached, found := p.CacheService.Get(cacheKey); found { @@ -115,7 +115,7 @@ func (p *Provider) getCachedPluginSettings(pluginID string, user *models.SignedI } query := models.GetPluginSettingByIdQuery{PluginId: pluginID, OrgId: user.OrgId} - if err := p.Bus.Dispatch(&query); err != nil { + if err := p.Bus.DispatchCtx(ctx, &query); err != nil { return nil, err } diff --git a/pkg/plugins/plugindashboards/service.go b/pkg/plugins/plugindashboards/service.go index 88f98bdeda7..e74a88ba158 100644 --- a/pkg/plugins/plugindashboards/service.go +++ b/pkg/plugins/plugindashboards/service.go @@ -1,6 +1,8 @@ package plugindashboards import ( + "context" + "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/models" @@ -32,7 +34,7 @@ type Service struct { func (s *Service) updateAppDashboards() { s.logger.Debug("Looking for app dashboard updates") - pluginSettings, err := s.sqlStore.GetPluginSettings(0) + pluginSettings, err := s.sqlStore.GetPluginSettings(context.Background(), 0) if err != nil { s.logger.Error("Failed to get all plugin settings", "error", err) return @@ -46,13 +48,13 @@ func (s *Service) updateAppDashboards() { if pluginDef := s.pluginStore.Plugin(pluginSetting.PluginId); pluginDef != nil { if pluginDef.Info.Version != pluginSetting.PluginVersion { - s.syncPluginDashboards(pluginDef, pluginSetting.OrgId) + s.syncPluginDashboards(context.Background(), pluginDef, pluginSetting.OrgId) } } } } -func (s *Service) syncPluginDashboards(pluginDef *plugins.Plugin, orgID int64) { +func (s *Service) syncPluginDashboards(ctx context.Context, pluginDef *plugins.Plugin, orgID int64) { s.logger.Info("Syncing plugin dashboards to DB", "pluginId", pluginDef.ID) // Get plugin dashboards @@ -88,7 +90,7 @@ func (s *Service) syncPluginDashboards(pluginDef *plugins.Plugin, orgID int64) { // update version in plugin_setting table to mark that we have processed the update query := models.GetPluginSettingByIdQuery{PluginId: pluginDef.ID, OrgId: orgID} - if err := bus.Dispatch(&query); err != nil { + if err := bus.DispatchCtx(ctx, &query); err != nil { s.logger.Error("Failed to read plugin setting by ID", "error", err) return } @@ -100,7 +102,7 @@ func (s *Service) syncPluginDashboards(pluginDef *plugins.Plugin, orgID int64) { PluginVersion: pluginDef.Info.Version, } - if err := bus.Dispatch(&cmd); err != nil { + if err := bus.DispatchCtx(ctx, &cmd); err != nil { s.logger.Error("Failed to update plugin setting version", "error", err) } } @@ -109,10 +111,10 @@ func (s *Service) handlePluginStateChanged(event *models.PluginStateChangedEvent s.logger.Info("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled) if event.Enabled { - s.syncPluginDashboards(s.pluginStore.Plugin(event.PluginId), event.OrgId) + s.syncPluginDashboards(context.TODO(), s.pluginStore.Plugin(event.PluginId), event.OrgId) } else { query := models.GetDashboardsByPluginIdQuery{PluginId: event.PluginId, OrgId: event.OrgId} - if err := bus.Dispatch(&query); err != nil { + if err := bus.DispatchCtx(context.TODO(), &query); err != nil { return err } diff --git a/pkg/services/live/liveplugin/plugin.go b/pkg/services/live/liveplugin/plugin.go index bbfdcb7cafb..04127fdb1c5 100644 --- a/pkg/services/live/liveplugin/plugin.go +++ b/pkg/services/live/liveplugin/plugin.go @@ -70,5 +70,5 @@ func NewContextGetter(pluginContextProvider *plugincontext.Provider) *ContextGet } func (g *ContextGetter) GetPluginContext(user *models.SignedInUser, pluginID string, datasourceUID string, skipCache bool) (backend.PluginContext, bool, error) { - return g.PluginContextProvider.Get(pluginID, datasourceUID, user, skipCache) + return g.PluginContextProvider.Get(context.TODO(), pluginID, datasourceUID, user, skipCache) } diff --git a/pkg/services/pluginsettings/service.go b/pkg/services/pluginsettings/service.go index 02113dad0f6..bb492edb043 100644 --- a/pkg/services/pluginsettings/service.go +++ b/pkg/services/pluginsettings/service.go @@ -43,15 +43,15 @@ func ProvideService(bus bus.Bus, store *sqlstore.SQLStore, encryptionService enc }, } - s.Bus.AddHandler(s.GetPluginSettingById) + s.Bus.AddHandlerCtx(s.GetPluginSettingById) s.Bus.AddHandlerCtx(s.UpdatePluginSetting) - s.Bus.AddHandler(s.UpdatePluginSettingVersion) + s.Bus.AddHandlerCtx(s.UpdatePluginSettingVersion) return s } -func (s *Service) GetPluginSettingById(query *models.GetPluginSettingByIdQuery) error { - return s.SQLStore.GetPluginSettingById(query) +func (s *Service) GetPluginSettingById(ctx context.Context, query *models.GetPluginSettingByIdQuery) error { + return s.SQLStore.GetPluginSettingById(ctx, query) } func (s *Service) UpdatePluginSetting(ctx context.Context, cmd *models.UpdatePluginSettingCmd) error { @@ -61,11 +61,11 @@ func (s *Service) UpdatePluginSetting(ctx context.Context, cmd *models.UpdatePlu return err } - return s.SQLStore.UpdatePluginSetting(cmd) + return s.SQLStore.UpdatePluginSetting(ctx, cmd) } -func (s *Service) UpdatePluginSettingVersion(cmd *models.UpdatePluginSettingVersionCmd) error { - return s.SQLStore.UpdatePluginSettingVersion(cmd) +func (s *Service) UpdatePluginSettingVersion(ctx context.Context, cmd *models.UpdatePluginSettingVersionCmd) error { + return s.SQLStore.UpdatePluginSettingVersion(ctx, cmd) } func (s *Service) DecryptedValues(ps *models.PluginSetting) map[string]string { diff --git a/pkg/services/sqlstore/plugin_setting.go b/pkg/services/sqlstore/plugin_setting.go index 09998a48973..a2581c9dceb 100644 --- a/pkg/services/sqlstore/plugin_setting.go +++ b/pkg/services/sqlstore/plugin_setting.go @@ -1,12 +1,13 @@ package sqlstore import ( + "context" "time" "github.com/grafana/grafana/pkg/models" ) -func (ss *SQLStore) GetPluginSettings(orgID int64) ([]*models.PluginSettingInfoDTO, error) { +func (ss *SQLStore) GetPluginSettings(ctx context.Context, orgID int64) ([]*models.PluginSettingInfoDTO, error) { sql := `SELECT org_id, plugin_id, enabled, pinned, plugin_version FROM plugin_setting ` params := make([]interface{}, 0) @@ -16,28 +17,33 @@ func (ss *SQLStore) GetPluginSettings(orgID int64) ([]*models.PluginSettingInfoD params = append(params, orgID) } - sess := x.SQL(sql, params...) var rslt []*models.PluginSettingInfoDTO - if err := sess.Find(&rslt); err != nil { + err := ss.WithDbSession(ctx, func(sess *DBSession) error { + return sess.SQL(sql, params...).Find(&rslt) + }) + if err != nil { return nil, err } + return rslt, nil } -func (ss *SQLStore) GetPluginSettingById(query *models.GetPluginSettingByIdQuery) error { - pluginSetting := models.PluginSetting{OrgId: query.OrgId, PluginId: query.PluginId} - has, err := x.Get(&pluginSetting) - if err != nil { - return err - } else if !has { - return models.ErrPluginSettingNotFound - } - query.Result = &pluginSetting - return nil +func (ss *SQLStore) GetPluginSettingById(ctx context.Context, query *models.GetPluginSettingByIdQuery) error { + return ss.WithDbSession(ctx, func(sess *DBSession) error { + pluginSetting := models.PluginSetting{OrgId: query.OrgId, PluginId: query.PluginId} + has, err := sess.Get(&pluginSetting) + if err != nil { + return err + } else if !has { + return models.ErrPluginSettingNotFound + } + query.Result = &pluginSetting + return nil + }) } -func (ss *SQLStore) UpdatePluginSetting(cmd *models.UpdatePluginSettingCmd) error { - return inTransaction(func(sess *DBSession) error { +func (ss *SQLStore) UpdatePluginSetting(ctx context.Context, cmd *models.UpdatePluginSettingCmd) error { + return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error { var pluginSetting models.PluginSetting exists, err := sess.Where("org_id=? and plugin_id=?", cmd.OrgId, cmd.PluginId).Get(&pluginSetting) @@ -94,8 +100,8 @@ func (ss *SQLStore) UpdatePluginSetting(cmd *models.UpdatePluginSettingCmd) erro }) } -func (ss *SQLStore) UpdatePluginSettingVersion(cmd *models.UpdatePluginSettingVersionCmd) error { - return inTransaction(func(sess *DBSession) error { +func (ss *SQLStore) UpdatePluginSettingVersion(ctx context.Context, cmd *models.UpdatePluginSettingVersionCmd) error { + return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error { _, err := sess.Exec("UPDATE plugin_setting SET plugin_version=? WHERE org_id=? AND plugin_id=?", cmd.PluginVersion, cmd.OrgId, cmd.PluginId) return err })