From dd4a33adff0d7c317c1aab2dbe3db650393c368b Mon Sep 17 00:00:00 2001 From: Vadim Stepanov Date: Tue, 10 Jun 2025 15:21:44 +0100 Subject: [PATCH] [release-11.5.6] Alerting: Provisioning API returns 403 on quota exceeded for rule group PUT (#106486) 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 cdbe810597b..85a8ebdfb0f 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -519,6 +519,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 6246e6e0e6f..decf0f8c80e 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -657,6 +657,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) {