mirror of https://github.com/grafana/grafana
Merge pull request #11161 from DanCech/quota-refactor
move quota to dedicated servicepull/11164/head
commit
5153d8e535
@ -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