mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
move quota to dedicated service
This commit is contained in:
parent
c0ecdee375
commit
bbd6adabbf
@ -14,10 +14,10 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
"github.com/grafana/grafana/pkg/log"
|
"github.com/grafana/grafana/pkg/log"
|
||||||
"github.com/grafana/grafana/pkg/metrics"
|
"github.com/grafana/grafana/pkg/metrics"
|
||||||
"github.com/grafana/grafana/pkg/middleware"
|
|
||||||
m "github.com/grafana/grafana/pkg/models"
|
m "github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/plugins"
|
"github.com/grafana/grafana/pkg/plugins"
|
||||||
"github.com/grafana/grafana/pkg/services/guardian"
|
"github.com/grafana/grafana/pkg/services/guardian"
|
||||||
|
"github.com/grafana/grafana/pkg/services/quota"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
"github.com/grafana/grafana/pkg/util"
|
"github.com/grafana/grafana/pkg/util"
|
||||||
)
|
)
|
||||||
@ -202,7 +202,7 @@ func PostDashboard(c *m.ReqContext, cmd m.SaveDashboardCommand) Response {
|
|||||||
dash := cmd.GetDashboardModel()
|
dash := cmd.GetDashboardModel()
|
||||||
|
|
||||||
if dash.Id == 0 && dash.Uid == "" {
|
if dash.Id == 0 && dash.Uid == "" {
|
||||||
limitReached, err := middleware.QuotaReached(c, "dashboard")
|
limitReached, err := quota.QuotaReached(c, "dashboard")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ApiError(500, "failed to get quota", err)
|
return ApiError(500, "failed to get quota", err)
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,8 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/bus"
|
"github.com/grafana/grafana/pkg/bus"
|
||||||
"github.com/grafana/grafana/pkg/log"
|
"github.com/grafana/grafana/pkg/log"
|
||||||
"github.com/grafana/grafana/pkg/metrics"
|
"github.com/grafana/grafana/pkg/metrics"
|
||||||
"github.com/grafana/grafana/pkg/middleware"
|
|
||||||
m "github.com/grafana/grafana/pkg/models"
|
m "github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/quota"
|
||||||
"github.com/grafana/grafana/pkg/services/session"
|
"github.com/grafana/grafana/pkg/services/session"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
"github.com/grafana/grafana/pkg/social"
|
"github.com/grafana/grafana/pkg/social"
|
||||||
@ -168,7 +168,7 @@ func OAuthLogin(ctx *m.ReqContext) {
|
|||||||
redirectWithError(ctx, ErrSignUpNotAllowed)
|
redirectWithError(ctx, ErrSignUpNotAllowed)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
limitReached, err := middleware.QuotaReached(ctx, "user")
|
limitReached, err := quota.QuotaReached(ctx, "user")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Handle(500, "Failed to get user quota", err)
|
ctx.Handle(500, "Failed to get user quota", err)
|
||||||
return
|
return
|
||||||
|
@ -3,16 +3,15 @@ package middleware
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/bus"
|
|
||||||
m "github.com/grafana/grafana/pkg/models"
|
|
||||||
"github.com/grafana/grafana/pkg/services/session"
|
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
|
||||||
"gopkg.in/macaron.v1"
|
"gopkg.in/macaron.v1"
|
||||||
|
|
||||||
|
m "github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/quota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Quota(target string) macaron.Handler {
|
func Quota(target string) macaron.Handler {
|
||||||
return func(c *m.ReqContext) {
|
return func(c *m.ReqContext) {
|
||||||
limitReached, err := QuotaReached(c, target)
|
limitReached, err := quota.QuotaReached(c, target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JsonApiErr(500, "failed to get quota", err)
|
c.JsonApiErr(500, "failed to get quota", err)
|
||||||
return
|
return
|
||||||
@ -23,82 +22,3 @@ func Quota(target string) macaron.Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func QuotaReached(c *m.ReqContext, target string) (bool, error) {
|
|
||||||
if !setting.Quota.Enabled {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the list of scopes that this target is valid for. Org, User, Global
|
|
||||||
scopes, err := m.GetQuotaScopes(target)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, scope := range scopes {
|
|
||||||
c.Logger.Debug("Checking quota", "target", target, "scope", scope)
|
|
||||||
|
|
||||||
switch scope.Name {
|
|
||||||
case "global":
|
|
||||||
if scope.DefaultLimit < 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if scope.DefaultLimit == 0 {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
if target == "session" {
|
|
||||||
usedSessions := session.GetSessionCount()
|
|
||||||
if int64(usedSessions) > scope.DefaultLimit {
|
|
||||||
c.Logger.Debug("Sessions limit reached", "active", usedSessions, "limit", scope.DefaultLimit)
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
query := m.GetGlobalQuotaByTargetQuery{Target: scope.Target}
|
|
||||||
if err := bus.Dispatch(&query); err != nil {
|
|
||||||
return true, err
|
|
||||||
}
|
|
||||||
if query.Result.Used >= scope.DefaultLimit {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
case "org":
|
|
||||||
if !c.IsSignedIn {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
query := m.GetOrgQuotaByTargetQuery{OrgId: c.OrgId, Target: scope.Target, Default: scope.DefaultLimit}
|
|
||||||
if err := bus.Dispatch(&query); err != nil {
|
|
||||||
return true, err
|
|
||||||
}
|
|
||||||
if query.Result.Limit < 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if query.Result.Limit == 0 {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if query.Result.Used >= query.Result.Limit {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
case "user":
|
|
||||||
if !c.IsSignedIn || c.UserId == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
query := m.GetUserQuotaByTargetQuery{UserId: c.UserId, Target: scope.Target, Default: scope.DefaultLimit}
|
|
||||||
if err := bus.Dispatch(&query); err != nil {
|
|
||||||
return true, err
|
|
||||||
}
|
|
||||||
if query.Result.Limit < 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if query.Result.Limit == 0 {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if query.Result.Used >= query.Result.Limit {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
87
pkg/services/quota/quota.go
Normal file
87
pkg/services/quota/quota.go
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
package quota
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/grafana/grafana/pkg/bus"
|
||||||
|
m "github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/session"
|
||||||
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
|
)
|
||||||
|
|
||||||
|
func QuotaReached(c *m.ReqContext, target string) (bool, error) {
|
||||||
|
if !setting.Quota.Enabled {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the list of scopes that this target is valid for. Org, User, Global
|
||||||
|
scopes, err := m.GetQuotaScopes(target)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, scope := range scopes {
|
||||||
|
c.Logger.Debug("Checking quota", "target", target, "scope", scope)
|
||||||
|
|
||||||
|
switch scope.Name {
|
||||||
|
case "global":
|
||||||
|
if scope.DefaultLimit < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if scope.DefaultLimit == 0 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
if target == "session" {
|
||||||
|
usedSessions := session.GetSessionCount()
|
||||||
|
if int64(usedSessions) > scope.DefaultLimit {
|
||||||
|
c.Logger.Debug("Sessions limit reached", "active", usedSessions, "limit", scope.DefaultLimit)
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
query := m.GetGlobalQuotaByTargetQuery{Target: scope.Target}
|
||||||
|
if err := bus.Dispatch(&query); err != nil {
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
if query.Result.Used >= scope.DefaultLimit {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
case "org":
|
||||||
|
if !c.IsSignedIn {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
query := m.GetOrgQuotaByTargetQuery{OrgId: c.OrgId, Target: scope.Target, Default: scope.DefaultLimit}
|
||||||
|
if err := bus.Dispatch(&query); err != nil {
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
if query.Result.Limit < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if query.Result.Limit == 0 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if query.Result.Used >= query.Result.Limit {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
case "user":
|
||||||
|
if !c.IsSignedIn || c.UserId == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
query := m.GetUserQuotaByTargetQuery{UserId: c.UserId, Target: scope.Target, Default: scope.DefaultLimit}
|
||||||
|
if err := bus.Dispatch(&query); err != nil {
|
||||||
|
return true, err
|
||||||
|
}
|
||||||
|
if query.Result.Limit < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if query.Result.Limit == 0 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if query.Result.Used >= query.Result.Limit {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user