dashboards.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package plugins
  2. import (
  3. "os"
  4. "path/filepath"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. m "github.com/grafana/grafana/pkg/models"
  8. )
  9. type PluginDashboardInfoDTO struct {
  10. PluginId string `json:"pluginId"`
  11. Title string `json:"title"`
  12. Imported bool `json:"imported"`
  13. ImportedUri string `json:"importedUri"`
  14. Slug string `json:"slug"`
  15. DashboardId int64 `json:"dashboardId"`
  16. ImportedRevision int64 `json:"importedRevision"`
  17. Revision int64 `json:"revision"`
  18. Description string `json:"description"`
  19. Path string `json:"path"`
  20. Removed bool `json:"removed"`
  21. }
  22. func GetPluginDashboards(orgId int64, pluginId string) ([]*PluginDashboardInfoDTO, error) {
  23. plugin, exists := Plugins[pluginId]
  24. if !exists {
  25. return nil, PluginNotFoundError{pluginId}
  26. }
  27. result := make([]*PluginDashboardInfoDTO, 0)
  28. // load current dashboards
  29. query := m.GetDashboardsByPluginIdQuery{OrgId: orgId, PluginId: pluginId}
  30. if err := bus.Dispatch(&query); err != nil {
  31. return nil, err
  32. }
  33. existingMatches := make(map[int64]bool)
  34. for _, include := range plugin.Includes {
  35. if include.Type != PluginTypeDashboard {
  36. continue
  37. }
  38. res := &PluginDashboardInfoDTO{}
  39. var dashboard *m.Dashboard
  40. var err error
  41. if dashboard, err = loadPluginDashboard(plugin.Id, include.Path); err != nil {
  42. return nil, err
  43. }
  44. res.Path = include.Path
  45. res.PluginId = plugin.Id
  46. res.Title = dashboard.Title
  47. res.Revision = dashboard.Data.Get("revision").MustInt64(1)
  48. // find existing dashboard
  49. for _, existingDash := range query.Result {
  50. if existingDash.Slug == dashboard.Slug {
  51. res.DashboardId = existingDash.Id
  52. res.Imported = true
  53. res.ImportedUri = "db/" + existingDash.Slug
  54. res.ImportedRevision = existingDash.Data.Get("revision").MustInt64(1)
  55. existingMatches[existingDash.Id] = true
  56. }
  57. }
  58. result = append(result, res)
  59. }
  60. // find deleted dashboards
  61. for _, dash := range query.Result {
  62. if _, exists := existingMatches[dash.Id]; !exists {
  63. result = append(result, &PluginDashboardInfoDTO{
  64. Slug: dash.Slug,
  65. DashboardId: dash.Id,
  66. Removed: true,
  67. })
  68. }
  69. }
  70. return result, nil
  71. }
  72. func loadPluginDashboard(pluginId, path string) (*m.Dashboard, error) {
  73. plugin, exists := Plugins[pluginId]
  74. if !exists {
  75. return nil, PluginNotFoundError{pluginId}
  76. }
  77. dashboardFilePath := filepath.Join(plugin.PluginDir, path)
  78. reader, err := os.Open(dashboardFilePath)
  79. if err != nil {
  80. return nil, err
  81. }
  82. defer reader.Close()
  83. data, err := simplejson.NewFromReader(reader)
  84. if err != nil {
  85. return nil, err
  86. }
  87. return m.NewDashboardFromJson(data), nil
  88. }