From f1ba7deff57f677faddf9ca032a1b1a858382301 Mon Sep 17 00:00:00 2001 From: William Wernert Date: Thu, 19 Sep 2024 17:27:37 -0400 Subject: [PATCH] Alerting: Also clear fields in model/store validation for recording rules (#93506) * Fix model validation * Remove validation from provisioning service --- pkg/services/ngalert/models/alert_rule.go | 11 +++++++++++ pkg/services/ngalert/store/alert_rule_test.go | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pkg/services/ngalert/models/alert_rule.go b/pkg/services/ngalert/models/alert_rule.go index 38be0c2dcd6..fe9be233d03 100644 --- a/pkg/services/ngalert/models/alert_rule.go +++ b/pkg/services/ngalert/models/alert_rule.go @@ -610,9 +610,20 @@ func validateRecordingRuleFields(rule *AlertRule) error { if !prommodels.IsValidMetricName(metricName) { return fmt.Errorf("%w: %s", ErrAlertRuleFailedValidation, "metric name for recording rule must be a valid Prometheus metric name") } + + clearRecordingRuleIgnoredFields(rule) + return nil } +func clearRecordingRuleIgnoredFields(rule *AlertRule) { + rule.NoDataState = "" + rule.ExecErrState = "" + rule.Condition = "" + rule.For = 0 + rule.NotificationSettings = nil +} + func (alertRule *AlertRule) ResourceType() string { return "alertRule" } diff --git a/pkg/services/ngalert/store/alert_rule_test.go b/pkg/services/ngalert/store/alert_rule_test.go index da24a442772..8300f0a213f 100644 --- a/pkg/services/ngalert/store/alert_rule_test.go +++ b/pkg/services/ngalert/store/alert_rule_test.go @@ -747,6 +747,24 @@ func TestIntegrationInsertAlertRules(t *testing.T) { }) }) + t.Run("clears fields that should not exist on recording rules", func(t *testing.T) { + rule := recordingRulesGen.Generate() + rules, err := store.InsertAlertRules(context.Background(), []models.AlertRule{rule}) + require.NoError(t, err) + require.Len(t, rules, 1) + ruleUID := rules[0].UID + savedRule, err := store.GetAlertRuleByUID(context.Background(), &models.GetAlertRuleByUIDQuery{ + OrgID: orgID, + UID: ruleUID, + }) + require.NoError(t, err) + require.Equal(t, "", savedRule.Condition) + require.Equal(t, models.NoDataState(""), savedRule.NoDataState) + require.Equal(t, models.ExecutionErrorState(""), savedRule.ExecErrState) + require.Zero(t, savedRule.For) + require.Nil(t, savedRule.NotificationSettings) + }) + t.Run("fail to insert rules with same ID", func(t *testing.T) { _, err = store.InsertAlertRules(context.Background(), []models.AlertRule{rules[0]}) require.ErrorIs(t, err, models.ErrAlertRuleConflictBase)