mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Provisioning API respects global rule quota (#52180)
* Inject interface for quota service and create mock * Check quota and return 403 if limit exceeded * Implement tests for quota being exceeded
This commit is contained in:
@@ -15,26 +15,29 @@ import (
|
||||
|
||||
func TestAlertRuleService(t *testing.T) {
|
||||
ruleService := createAlertRuleService(t)
|
||||
|
||||
t.Run("alert rule creation should return the created id", func(t *testing.T) {
|
||||
var orgID int64 = 1
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), dummyRule("test#1", orgID), models.ProvenanceNone)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), dummyRule("test#1", orgID), models.ProvenanceNone, 0)
|
||||
require.NoError(t, err)
|
||||
require.NotEqual(t, 0, rule.ID, "expected to get the created id and not the zero value")
|
||||
})
|
||||
|
||||
t.Run("alert rule creation should set the right provenance", func(t *testing.T) {
|
||||
var orgID int64 = 1
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), dummyRule("test#2", orgID), models.ProvenanceAPI)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), dummyRule("test#2", orgID), models.ProvenanceAPI, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, provenance, err := ruleService.GetAlertRule(context.Background(), orgID, rule.UID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, models.ProvenanceAPI, provenance)
|
||||
})
|
||||
|
||||
t.Run("alert rule group should be updated correctly", func(t *testing.T) {
|
||||
var orgID int64 = 1
|
||||
rule := dummyRule("test#3", orgID)
|
||||
rule.RuleGroup = "a"
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone, 0)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(60), rule.IntervalSeconds)
|
||||
|
||||
@@ -46,11 +49,12 @@ func TestAlertRuleService(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, interval, rule.IntervalSeconds)
|
||||
})
|
||||
|
||||
t.Run("alert rule should get interval from existing rule group", func(t *testing.T) {
|
||||
var orgID int64 = 1
|
||||
rule := dummyRule("test#4", orgID)
|
||||
rule.RuleGroup = "b"
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
var interval int64 = 120
|
||||
@@ -59,10 +63,11 @@ func TestAlertRuleService(t *testing.T) {
|
||||
|
||||
rule = dummyRule("test#4-1", orgID)
|
||||
rule.RuleGroup = "b"
|
||||
rule, err = ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone)
|
||||
rule, err = ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone, 0)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, interval, rule.IntervalSeconds)
|
||||
})
|
||||
|
||||
t.Run("updating a rule group should bump the version number", func(t *testing.T) {
|
||||
const (
|
||||
orgID = 123
|
||||
@@ -75,7 +80,7 @@ func TestAlertRuleService(t *testing.T) {
|
||||
rule.UID = ruleUID
|
||||
rule.RuleGroup = ruleGroup
|
||||
rule.NamespaceUID = namespaceUID
|
||||
_, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone)
|
||||
_, err := ruleService.CreateAlertRule(context.Background(), rule, models.ProvenanceNone, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
rule, _, err = ruleService.GetAlertRule(context.Background(), orgID, ruleUID)
|
||||
@@ -91,6 +96,7 @@ func TestAlertRuleService(t *testing.T) {
|
||||
require.Equal(t, int64(2), rule.Version)
|
||||
require.Equal(t, newInterval, rule.IntervalSeconds)
|
||||
})
|
||||
|
||||
t.Run("alert rule provenace should be correctly checked", func(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -139,7 +145,7 @@ func TestAlertRuleService(t *testing.T) {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
var orgID int64 = 1
|
||||
rule := dummyRule(t.Name(), orgID)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, test.from)
|
||||
rule, err := ruleService.CreateAlertRule(context.Background(), rule, test.from, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = ruleService.UpdateAlertRule(context.Background(), rule, test.to)
|
||||
@@ -151,6 +157,17 @@ func TestAlertRuleService(t *testing.T) {
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("quota met causes create to be rejected", func(t *testing.T) {
|
||||
ruleService := createAlertRuleService(t)
|
||||
checker := &MockQuotaChecker{}
|
||||
checker.EXPECT().LimitExceeded()
|
||||
ruleService.quotas = checker
|
||||
|
||||
_, err := ruleService.CreateAlertRule(context.Background(), dummyRule("test#1", 1), models.ProvenanceNone, 0)
|
||||
|
||||
require.ErrorIs(t, err, models.ErrQuotaReached)
|
||||
})
|
||||
}
|
||||
|
||||
func createAlertRuleService(t *testing.T) AlertRuleService {
|
||||
@@ -160,9 +177,12 @@ func createAlertRuleService(t *testing.T) AlertRuleService {
|
||||
SQLStore: sqlStore,
|
||||
BaseInterval: time.Second * 10,
|
||||
}
|
||||
quotas := MockQuotaChecker{}
|
||||
quotas.EXPECT().LimitOK()
|
||||
return AlertRuleService{
|
||||
ruleStore: store,
|
||||
provenanceStore: store,
|
||||
quotas: "as,
|
||||
xact: sqlStore,
|
||||
log: log.New("testing"),
|
||||
baseIntervalSeconds: 10,
|
||||
|
||||
Reference in New Issue
Block a user