Alerting: Support for Mimir configuration in Grafana Alertmanager (#106402)
This commit is contained in:
@@ -6,7 +6,9 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
alertingTemplates "github.com/grafana/alerting/templates"
|
||||
"github.com/prometheus/alertmanager/config"
|
||||
"github.com/prometheus/alertmanager/pkg/labels"
|
||||
"github.com/prometheus/common/model"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -215,3 +217,201 @@ func Test_RawMessageMarshaling(t *testing.T) {
|
||||
assert.Equal(t, RawMessage(`{"data":"test"}`), n.Field)
|
||||
})
|
||||
}
|
||||
|
||||
func TestPostableUserConfig_GetMergedAlertmanagerConfig(t *testing.T) {
|
||||
alertmanagerCfg := PostableApiAlertingConfig{
|
||||
Config: Config{
|
||||
Route: &Route{
|
||||
Receiver: "default",
|
||||
},
|
||||
},
|
||||
Receivers: []*PostableApiReceiver{
|
||||
{
|
||||
Receiver: config.Receiver{
|
||||
Name: "default",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
config PostableUserConfig
|
||||
expectedError string
|
||||
}{
|
||||
{
|
||||
name: "no extra configs",
|
||||
config: PostableUserConfig{
|
||||
AlertmanagerConfig: alertmanagerCfg,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "valid mimir config",
|
||||
config: PostableUserConfig{
|
||||
AlertmanagerConfig: alertmanagerCfg,
|
||||
ExtraConfigs: []ExtraConfiguration{
|
||||
{
|
||||
Identifier: "mimir-1",
|
||||
MergeMatchers: config.Matchers{
|
||||
{
|
||||
Type: labels.MatchEqual,
|
||||
Name: "cluster",
|
||||
Value: "prod",
|
||||
},
|
||||
},
|
||||
AlertmanagerConfig: PostableApiAlertingConfig{
|
||||
Config: Config{
|
||||
Route: &Route{
|
||||
Receiver: "mimir-receiver",
|
||||
},
|
||||
},
|
||||
Receivers: []*PostableApiReceiver{
|
||||
{
|
||||
Receiver: config.Receiver{
|
||||
Name: "mimir-receiver",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "empty identifier",
|
||||
config: PostableUserConfig{
|
||||
AlertmanagerConfig: alertmanagerCfg,
|
||||
ExtraConfigs: []ExtraConfiguration{
|
||||
{
|
||||
Identifier: "",
|
||||
MergeMatchers: config.Matchers{},
|
||||
AlertmanagerConfig: PostableApiAlertingConfig{
|
||||
Config: Config{
|
||||
Route: &Route{
|
||||
Receiver: "test",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: "invalid merge options",
|
||||
},
|
||||
{
|
||||
name: "bad matcher type",
|
||||
config: PostableUserConfig{
|
||||
AlertmanagerConfig: alertmanagerCfg,
|
||||
ExtraConfigs: []ExtraConfiguration{
|
||||
{
|
||||
Identifier: "test",
|
||||
MergeMatchers: config.Matchers{
|
||||
{
|
||||
Type: labels.MatchNotEqual,
|
||||
Name: "cluster",
|
||||
Value: "prod",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedError: "only equality matchers are allowed",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
result, err := tc.config.GetMergedAlertmanagerConfig()
|
||||
if tc.expectedError != "" {
|
||||
require.Error(t, err)
|
||||
require.ErrorContains(t, err, tc.expectedError)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, result.Config)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestPostableUserConfig_GetMergedTemplateDefinitions(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
config PostableUserConfig
|
||||
expectedTemplates int
|
||||
}{
|
||||
{
|
||||
name: "no templates",
|
||||
config: PostableUserConfig{
|
||||
TemplateFiles: map[string]string{},
|
||||
ExtraConfigs: []ExtraConfiguration{},
|
||||
},
|
||||
expectedTemplates: 0,
|
||||
},
|
||||
{
|
||||
name: "grafana templates only",
|
||||
config: PostableUserConfig{
|
||||
TemplateFiles: map[string]string{
|
||||
"grafana-template1": "{{ define \"test\" }}Hello{{ end }}",
|
||||
"grafana-template2": "{{ define \"test2\" }}World{{ end }}",
|
||||
},
|
||||
ExtraConfigs: []ExtraConfiguration{},
|
||||
},
|
||||
expectedTemplates: 2,
|
||||
},
|
||||
{
|
||||
name: "mimir templates only",
|
||||
config: PostableUserConfig{
|
||||
TemplateFiles: map[string]string{},
|
||||
ExtraConfigs: []ExtraConfiguration{
|
||||
{
|
||||
TemplateFiles: map[string]string{
|
||||
"mimir-template": "{{ define \"mimir\" }}Mimir{{ end }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedTemplates: 1,
|
||||
},
|
||||
{
|
||||
name: "mixed templates",
|
||||
config: PostableUserConfig{
|
||||
TemplateFiles: map[string]string{
|
||||
"grafana-template": "{{ define \"grafana\" }}Grafana{{ end }}",
|
||||
},
|
||||
ExtraConfigs: []ExtraConfiguration{
|
||||
{
|
||||
TemplateFiles: map[string]string{
|
||||
"mimir-template": "{{ define \"mimir\" }}Mimir{{ end }}",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedTemplates: 2,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
result := tc.config.GetMergedTemplateDefinitions()
|
||||
require.Len(t, result, tc.expectedTemplates)
|
||||
|
||||
templateMap := make(map[string]string)
|
||||
kindMap := make(map[string]alertingTemplates.Kind)
|
||||
for _, tmpl := range result {
|
||||
templateMap[tmpl.Name] = tmpl.Template
|
||||
kindMap[tmpl.Name] = tmpl.Kind
|
||||
}
|
||||
|
||||
for name, content := range tc.config.TemplateFiles {
|
||||
require.Equal(t, content, templateMap[name])
|
||||
require.Equal(t, alertingTemplates.GrafanaKind, kindMap[name])
|
||||
}
|
||||
|
||||
if len(tc.config.ExtraConfigs) > 0 {
|
||||
for name, content := range tc.config.ExtraConfigs[0].TemplateFiles {
|
||||
require.Equal(t, content, templateMap[name])
|
||||
require.Equal(t, alertingTemplates.MimirKind, kindMap[name])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user