grafana/pkg/services/ngalert/models/instance_test.go
Alex Moreno 531b439cf1
Alerting: Add alert pausing feature (#60734)
* Add field in alert_rule model, add state to alert_instance model, and state to eval

* Remove paused state from eval package

* Skip paused alert rules in scheduler

* Add migration to add is_paused field to alert_rule table

* Convert to postable alerts only if not normal, pernding, or paused

* Handle paused eval results in state manager

* Add Paused state to eval package

* Add paused alerts logic in scheduler

* Skip alert on scheduler

* Remove paused status from eval package

* Apply suggestions from code review

Co-authored-by: George Robinson <george.robinson@grafana.com>

* Remove state

* Rethink schedule and manager for paused alerts

* Change return to continue

* Remove unused var

* Rethink alert pausing

* Paused alerts storing annotations

* Only add one state transition

* Revert boolean method renaming refactor

* Revert take image refactor

* Make registry errors public

* Revert method extraction for getting a folder title

* Revert variable renaming refactor

* Undo unnecessary changes

* Revert changes in test

* Remove IsPause check in PatchPartiLAlertRule function

* Use SetNormal to set state

* Fix text by returning to old behaviour on alert rule deletion

* Add test in schedule_unit_test.go to test ticks with paused alerts

* Add coment to clarify usage of context.Background()

* Add comment to clarify resetStateByRuleUID method usage

* Move rule get to a more limited scope

* Update pkg/services/ngalert/schedule/schedule.go

Co-authored-by: George Robinson <george.robinson@grafana.com>

* rum gofmt on pkg/services/ngalert/schedule/schedule.go

* Remove defer cancel for context

* Update pkg/services/ngalert/models/instance_test.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* Update pkg/services/ngalert/models/testing.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* Update pkg/services/ngalert/schedule/schedule_unit_test.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* Update pkg/services/ngalert/schedule/schedule_unit_test.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* Update pkg/services/ngalert/models/instance_test.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* skip scheduler rule state clean up on paused alert rule

* Update pkg/services/ngalert/schedule/schedule.go

Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>

* Fix mock in test

* Add (hopefully) final suggestions

* Use error channel from recordAnnotationsSync to cancel context

* Run make gen-cue

* Place pause alert check in channel update after version check

* Reduce branching un update channel select

* Add if for error and move code inside if in state manager ResetStateByRuleUID

* Add reason to logs

* Update pkg/services/ngalert/schedule/schedule.go

Co-authored-by: George Robinson <george.robinson@grafana.com>

* Do not delete alert rule routine, just exit on eval if is paused

* Reduce branching and create-close a channel to avoid deadlocks

* Separate state deletion and state reset (includes history saving)

* Add current pause state in rule route in scheduler

* Split clearState and bring errCh closer to RecordStatesAsync call

* Change rule to ruleMeta in RecordStatesAsync

* copy state to be able to modify it

* Add timeout to context creation

* Shorten the timeout

* Use resetState is rule is paused and deleteState if rule is not paused

* Remove Empty state reason

* Save every rule change in historian

* Add tests for DeleteStateByRuleUID and ResetStateByRuleUID

* Remove useless line

* Remove outdated comment

Co-authored-by: George Robinson <george.robinson@grafana.com>
Co-authored-by: Santiago <santiagohernandez.1997@gmail.com>
Co-authored-by: Armand Grillet <2117580+armandgrillet@users.noreply.github.com>
2023-01-26 18:29:10 +01:00

106 lines
2.6 KiB
Go

package models
import (
"errors"
"fmt"
"testing"
"github.com/stretchr/testify/require"
)
func TestInstanceStateType_IsValid(t *testing.T) {
testCases := []struct {
instanceType InstanceStateType
expectedValidity bool
}{
{
instanceType: InstanceStateFiring,
expectedValidity: true,
},
{
instanceType: InstanceStateNormal,
expectedValidity: true,
},
{
instanceType: InstanceStatePending,
expectedValidity: true,
},
{
instanceType: InstanceStateNoData,
expectedValidity: true,
},
{
instanceType: InstanceStateError,
expectedValidity: true,
},
{
instanceType: InstanceStateType("notAValidInstanceStateType"),
expectedValidity: false,
},
}
for _, tc := range testCases {
t.Run(buildTestInstanceStateTypeIsValidName(tc.instanceType, tc.expectedValidity), func(t *testing.T) {
require.Equal(t, tc.expectedValidity, tc.instanceType.IsValid())
})
}
}
func buildTestInstanceStateTypeIsValidName(instanceType InstanceStateType, expectedValidity bool) string {
if expectedValidity {
return fmt.Sprintf("%q should be valid", instanceType)
}
return fmt.Sprintf("%q should not be valid", instanceType)
}
func TestValidateAlertInstance(t *testing.T) {
testCases := []struct {
name string
orgId int64
uid string
currentState InstanceStateType
err error
}{
{
name: "fails if orgID is empty",
orgId: 0,
uid: "validUid",
currentState: InstanceStateNormal,
err: errors.New("alert instance is invalid due to missing alert rule organisation"),
},
{
name: "fails if uid is empty",
orgId: 1,
uid: "",
currentState: InstanceStateNormal,
err: errors.New("alert instance is invalid due to missing alert rule uid"),
},
{
name: "fails if current state is not valid",
orgId: 1,
uid: "validUid",
currentState: InstanceStateType("notAValidType"),
err: errors.New("alert instance is invalid because the state 'notAValidType' is invalid"),
},
{
name: "ok if validated fields are correct",
orgId: 1,
uid: "validUid",
currentState: InstanceStateNormal,
err: nil,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
instance := AlertInstanceGen(func(instance *AlertInstance) {
instance.AlertInstanceKey.RuleOrgID = tc.orgId
instance.AlertInstanceKey.RuleUID = tc.uid
instance.CurrentState = tc.currentState
})
require.Equal(t, tc.err, ValidateAlertInstance(*instance))
})
}
}