dashboards.go 3.2 KB

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