From f20d4895407a1b705f5ca6a69e1e0386eac2dc24 Mon Sep 17 00:00:00 2001 From: Vadim Stepanov Date: Tue, 10 Jun 2025 15:21:46 +0100 Subject: [PATCH] [release-11.6.3] Alerting: Provisioning API returns 403 on quota exceeded for rule group PUT (#106487) Alerting: Provisioning API returns 403 on quota exceeded for rule group PUT (#106409) (cherry picked from commit 1df888c51778ad3c02497d98d521435d990516ea) --- pkg/services/ngalert/api/api_provisioning.go | 3 +++ .../ngalert/api/api_provisioning_test.go | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/pkg/services/ngalert/api/api_provisioning.go b/pkg/services/ngalert/api/api_provisioning.go index b5c7f5ab1c2..acfe4d53121 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -522,6 +522,9 @@ func (srv *ProvisioningSrv) RoutePutAlertRuleGroup(c *contextmodel.ReqContext, a if errors.Is(err, store.ErrOptimisticLock) { return ErrResp(http.StatusConflict, err, "") } + if errors.Is(err, alerting_models.ErrQuotaReached) { + return ErrResp(http.StatusForbidden, err, "") + } if err != nil { return response.ErrOrFallback(http.StatusInternalServerError, "", err) } diff --git a/pkg/services/ngalert/api/api_provisioning_test.go b/pkg/services/ngalert/api/api_provisioning_test.go index 14e1e571f12..b5fca81b779 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -659,6 +659,26 @@ func TestProvisioningApi(t *testing.T) { }) }) + t.Run("have reached the rule quota, PUT returns 403", func(t *testing.T) { + env := createTestEnv(t, testConfig) + quotas := provisioning.MockQuotaChecker{} + quotas.EXPECT().LimitExceeded() + env.quotas = "as + sut := createProvisioningSrvSutFromEnv(t, &env) + group := definitions.AlertRuleGroup{ + Title: "test rule group", + Interval: 60, + Rules: []definitions.ProvisionedAlertRule{ + createTestAlertRule("test-alert-rule", 1), + }, + } + rc := createTestRequestCtx() + + response := sut.RoutePutAlertRuleGroup(&rc, group, "folder-uid", group.Title) + + require.Equal(t, 403, response.Status()) + }) + t.Run("exports", func(t *testing.T) { t.Run("alert rule group", func(t *testing.T) { t.Run("are present, GET returns 200", func(t *testing.T) {