quota.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package quota
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. m "github.com/grafana/grafana/pkg/models"
  5. "github.com/grafana/grafana/pkg/services/session"
  6. "github.com/grafana/grafana/pkg/setting"
  7. )
  8. func QuotaReached(c *m.ReqContext, target string) (bool, error) {
  9. if !setting.Quota.Enabled {
  10. return false, nil
  11. }
  12. // get the list of scopes that this target is valid for. Org, User, Global
  13. scopes, err := m.GetQuotaScopes(target)
  14. if err != nil {
  15. return false, err
  16. }
  17. for _, scope := range scopes {
  18. c.Logger.Debug("Checking quota", "target", target, "scope", scope)
  19. switch scope.Name {
  20. case "global":
  21. if scope.DefaultLimit < 0 {
  22. continue
  23. }
  24. if scope.DefaultLimit == 0 {
  25. return true, nil
  26. }
  27. if target == "session" {
  28. usedSessions := session.GetSessionCount()
  29. if int64(usedSessions) > scope.DefaultLimit {
  30. c.Logger.Debug("Sessions limit reached", "active", usedSessions, "limit", scope.DefaultLimit)
  31. return true, nil
  32. }
  33. continue
  34. }
  35. query := m.GetGlobalQuotaByTargetQuery{Target: scope.Target}
  36. if err := bus.Dispatch(&query); err != nil {
  37. return true, err
  38. }
  39. if query.Result.Used >= scope.DefaultLimit {
  40. return true, nil
  41. }
  42. case "org":
  43. if !c.IsSignedIn {
  44. continue
  45. }
  46. query := m.GetOrgQuotaByTargetQuery{OrgId: c.OrgId, Target: scope.Target, Default: scope.DefaultLimit}
  47. if err := bus.Dispatch(&query); err != nil {
  48. return true, err
  49. }
  50. if query.Result.Limit < 0 {
  51. continue
  52. }
  53. if query.Result.Limit == 0 {
  54. return true, nil
  55. }
  56. if query.Result.Used >= query.Result.Limit {
  57. return true, nil
  58. }
  59. case "user":
  60. if !c.IsSignedIn || c.UserId == 0 {
  61. continue
  62. }
  63. query := m.GetUserQuotaByTargetQuery{UserId: c.UserId, Target: scope.Target, Default: scope.DefaultLimit}
  64. if err := bus.Dispatch(&query); err != nil {
  65. return true, err
  66. }
  67. if query.Result.Limit < 0 {
  68. continue
  69. }
  70. if query.Result.Limit == 0 {
  71. return true, nil
  72. }
  73. if query.Result.Used >= query.Result.Limit {
  74. return true, nil
  75. }
  76. }
  77. }
  78. return false, nil
  79. }