dashboards.go 2.6 KB

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