dashboards.go 2.9 KB

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