dashboards.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package dashboards
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/alerting"
  7. )
  8. type Repository interface {
  9. SaveDashboard(*SaveDashboardDTO) (*models.Dashboard, error)
  10. SaveProvisionedDashboard(dto *SaveDashboardDTO, provisioning *models.DashboardProvisioning) (*models.Dashboard, error)
  11. GetProvisionedDashboardData(name string) ([]*models.DashboardProvisioning, error)
  12. }
  13. var repositoryInstance Repository
  14. func GetRepository() Repository {
  15. return repositoryInstance
  16. }
  17. func SetRepository(rep Repository) {
  18. repositoryInstance = rep
  19. }
  20. type SaveDashboardDTO struct {
  21. OrgId int64
  22. UpdatedAt time.Time
  23. UserId int64
  24. Message string
  25. Overwrite bool
  26. Dashboard *models.Dashboard
  27. }
  28. type DashboardRepository struct{}
  29. func (dr *DashboardRepository) GetProvisionedDashboardData(name string) ([]*models.DashboardProvisioning, error) {
  30. cmd := &models.GetProvisionedDashboardDataQuery{Name: name}
  31. err := bus.Dispatch(cmd)
  32. if err != nil {
  33. return nil, err
  34. }
  35. return cmd.Result, nil
  36. }
  37. func (dr *DashboardRepository) buildSaveDashboardCommand(dto *SaveDashboardDTO) (*models.SaveDashboardCommand, error) {
  38. dashboard := dto.Dashboard
  39. if dashboard.Title == "" {
  40. return nil, models.ErrDashboardTitleEmpty
  41. }
  42. validateAlertsCmd := alerting.ValidateDashboardAlertsCommand{
  43. OrgId: dto.OrgId,
  44. Dashboard: dashboard,
  45. }
  46. if err := bus.Dispatch(&validateAlertsCmd); err != nil {
  47. return nil, models.ErrDashboardContainsInvalidAlertData
  48. }
  49. cmd := &models.SaveDashboardCommand{
  50. Dashboard: dashboard.Data,
  51. Message: dto.Message,
  52. OrgId: dto.OrgId,
  53. Overwrite: dto.Overwrite,
  54. UserId: dto.UserId,
  55. FolderId: dashboard.FolderId,
  56. IsFolder: dashboard.IsFolder,
  57. }
  58. if !dto.UpdatedAt.IsZero() {
  59. cmd.UpdatedAt = dto.UpdatedAt
  60. }
  61. return cmd, nil
  62. }
  63. func (dr *DashboardRepository) updateAlerting(cmd *models.SaveDashboardCommand, dto *SaveDashboardDTO) error {
  64. alertCmd := alerting.UpdateDashboardAlertsCommand{
  65. OrgId: dto.OrgId,
  66. UserId: dto.UserId,
  67. Dashboard: cmd.Result,
  68. }
  69. if err := bus.Dispatch(&alertCmd); err != nil {
  70. return models.ErrDashboardFailedToUpdateAlertData
  71. }
  72. return nil
  73. }
  74. func (dr *DashboardRepository) SaveProvisionedDashboard(dto *SaveDashboardDTO, provisioning *models.DashboardProvisioning) (*models.Dashboard, error) {
  75. cmd, err := dr.buildSaveDashboardCommand(dto)
  76. if err != nil {
  77. return nil, err
  78. }
  79. saveCmd := &models.SaveProvisionedDashboardCommand{
  80. DashboardCmd: cmd,
  81. DashboardProvisioning: provisioning,
  82. }
  83. // dashboard
  84. err = bus.Dispatch(saveCmd)
  85. if err != nil {
  86. return nil, err
  87. }
  88. //alerts
  89. err = dr.updateAlerting(cmd, dto)
  90. if err != nil {
  91. return nil, err
  92. }
  93. return cmd.Result, nil
  94. }
  95. func (dr *DashboardRepository) SaveDashboard(dto *SaveDashboardDTO) (*models.Dashboard, error) {
  96. cmd, err := dr.buildSaveDashboardCommand(dto)
  97. if err != nil {
  98. return nil, err
  99. }
  100. err = bus.Dispatch(cmd)
  101. if err != nil {
  102. return nil, err
  103. }
  104. err = dr.updateAlerting(cmd, dto)
  105. if err != nil {
  106. return nil, err
  107. }
  108. return cmd.Result, nil
  109. }