diff --git a/pkg/services/ngalert/api/api_provisioning.go b/pkg/services/ngalert/api/api_provisioning.go index 499b27a501b..2b3d5c6af92 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -515,6 +515,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 25ec96db4b6..f8a16731147 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -695,6 +695,20 @@ 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 := createTestAlertRuleGroup(1) + rc := createTestRequestCtx() + + response := sut.RoutePutAlertRuleGroup(&rc, group, "folder-uid", group.Title) + + require.Equal(t, 403, response.Status()) + }) + t.Run("are valid", func(t *testing.T) { t.Run("PUT returns 200", func(t *testing.T) { sut := createProvisioningSrvSut(t)