dashboards_updater.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package plugins
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. m "github.com/grafana/grafana/pkg/models"
  5. )
  6. func init() {
  7. bus.AddEventListener(handlePluginStateChanged)
  8. }
  9. func (pm *PluginManager) updateAppDashboards() {
  10. pm.log.Debug("Looking for App Dashboard Updates")
  11. query := m.GetPluginSettingsQuery{OrgId: 0}
  12. if err := bus.Dispatch(&query); err != nil {
  13. plog.Error("Failed to get all plugin settings", "error", err)
  14. return
  15. }
  16. for _, pluginSetting := range query.Result {
  17. // ignore disabled plugins
  18. if !pluginSetting.Enabled {
  19. continue
  20. }
  21. if pluginDef, exist := Plugins[pluginSetting.PluginId]; exist {
  22. if pluginDef.Info.Version != pluginSetting.PluginVersion {
  23. syncPluginDashboards(pluginDef, pluginSetting.OrgId)
  24. }
  25. }
  26. }
  27. }
  28. func autoUpdateAppDashboard(pluginDashInfo *PluginDashboardInfoDTO, orgId int64) error {
  29. dash, err := loadPluginDashboard(pluginDashInfo.PluginId, pluginDashInfo.Path)
  30. if err != nil {
  31. return err
  32. }
  33. plog.Info("Auto updating App dashboard", "dashboard", dash.Title, "newRev", pluginDashInfo.Revision, "oldRev", pluginDashInfo.ImportedRevision)
  34. updateCmd := ImportDashboardCommand{
  35. OrgId: orgId,
  36. PluginId: pluginDashInfo.PluginId,
  37. Overwrite: true,
  38. Dashboard: dash.Data,
  39. User: &m.SignedInUser{UserId: 0, OrgRole: m.ROLE_ADMIN},
  40. Path: pluginDashInfo.Path,
  41. }
  42. return bus.Dispatch(&updateCmd)
  43. }
  44. func syncPluginDashboards(pluginDef *PluginBase, orgId int64) {
  45. plog.Info("Syncing plugin dashboards to DB", "pluginId", pluginDef.Id)
  46. // Get plugin dashboards
  47. dashboards, err := GetPluginDashboards(orgId, pluginDef.Id)
  48. if err != nil {
  49. plog.Error("Failed to load app dashboards", "error", err)
  50. return
  51. }
  52. // Update dashboards with updated revisions
  53. for _, dash := range dashboards {
  54. // remove removed ones
  55. if dash.Removed {
  56. plog.Info("Deleting plugin dashboard", "pluginId", pluginDef.Id, "dashboard", dash.Slug)
  57. deleteCmd := m.DeleteDashboardCommand{OrgId: orgId, Id: dash.DashboardId}
  58. if err := bus.Dispatch(&deleteCmd); err != nil {
  59. plog.Error("Failed to auto update app dashboard", "pluginId", pluginDef.Id, "error", err)
  60. return
  61. }
  62. continue
  63. }
  64. // update updated ones
  65. if dash.ImportedRevision != dash.Revision {
  66. if err := autoUpdateAppDashboard(dash, orgId); err != nil {
  67. plog.Error("Failed to auto update app dashboard", "pluginId", pluginDef.Id, "error", err)
  68. return
  69. }
  70. }
  71. }
  72. // update version in plugin_setting table to mark that we have processed the update
  73. query := m.GetPluginSettingByIdQuery{PluginId: pluginDef.Id, OrgId: orgId}
  74. if err := bus.Dispatch(&query); err != nil {
  75. plog.Error("Failed to read plugin setting by id", "error", err)
  76. return
  77. }
  78. appSetting := query.Result
  79. cmd := m.UpdatePluginSettingVersionCmd{
  80. OrgId: appSetting.OrgId,
  81. PluginId: appSetting.PluginId,
  82. PluginVersion: pluginDef.Info.Version,
  83. }
  84. if err := bus.Dispatch(&cmd); err != nil {
  85. plog.Error("Failed to update plugin setting version", "error", err)
  86. }
  87. }
  88. func handlePluginStateChanged(event *m.PluginStateChangedEvent) error {
  89. plog.Info("Plugin state changed", "pluginId", event.PluginId, "enabled", event.Enabled)
  90. if event.Enabled {
  91. syncPluginDashboards(Plugins[event.PluginId], event.OrgId)
  92. } else {
  93. query := m.GetDashboardsByPluginIdQuery{PluginId: event.PluginId, OrgId: event.OrgId}
  94. if err := bus.Dispatch(&query); err != nil {
  95. return err
  96. }
  97. for _, dash := range query.Result {
  98. deleteCmd := m.DeleteDashboardCommand{OrgId: dash.OrgId, Id: dash.Id}
  99. plog.Info("Deleting plugin dashboard", "pluginId", event.PluginId, "dashboard", dash.Slug)
  100. if err := bus.Dispatch(&deleteCmd); err != nil {
  101. return err
  102. }
  103. }
  104. }
  105. return nil
  106. }