mirror of
https://github.com/grafana/grafana.git
synced 2025-09-21 09:52:48 +08:00

This commit enables Unified Alerting for open source and enterprise unless disabled in configuration.
156 lines
4.2 KiB
Go
156 lines
4.2 KiB
Go
package ualert
|
||
|
||
import (
|
||
"encoding/base64"
|
||
"encoding/json"
|
||
"fmt"
|
||
"sort"
|
||
"testing"
|
||
|
||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||
"github.com/grafana/grafana/pkg/util"
|
||
"github.com/prometheus/alertmanager/pkg/labels"
|
||
"github.com/stretchr/testify/require"
|
||
)
|
||
|
||
var MigTitle = migTitle
|
||
var RmMigTitle = rmMigTitle
|
||
var ClearMigrationEntryTitle = clearMigrationEntryTitle
|
||
|
||
type RmMigration = rmMigration
|
||
|
||
func (m *Matchers) UnmarshalJSON(data []byte) error {
|
||
var lines []string
|
||
if err := json.Unmarshal(data, &lines); err != nil {
|
||
return err
|
||
}
|
||
for _, line := range lines {
|
||
pm, err := labels.ParseMatchers(line)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
*m = append(*m, pm...)
|
||
}
|
||
sort.Sort(labels.Matchers(*m))
|
||
return nil
|
||
}
|
||
|
||
func Test_validateAlertmanagerConfig(t *testing.T) {
|
||
tc := []struct {
|
||
name string
|
||
receivers []*PostableGrafanaReceiver
|
||
err error
|
||
}{
|
||
{
|
||
name: "when a slack receiver does not have a valid URL - it should error",
|
||
receivers: []*PostableGrafanaReceiver{
|
||
{
|
||
UID: util.GenerateShortUID(),
|
||
Name: "SlackWithBadURL",
|
||
Type: "slack",
|
||
Settings: simplejson.NewFromAny(map[string]interface{}{}),
|
||
SecureSettings: map[string]string{"url": invalidUri},
|
||
},
|
||
},
|
||
err: fmt.Errorf("failed to validate receiver \"SlackWithBadURL\" of type \"slack\": invalid URL %q", invalidUri),
|
||
},
|
||
{
|
||
name: "when a slack receiver has an invalid recipient - it should not error",
|
||
receivers: []*PostableGrafanaReceiver{
|
||
{
|
||
UID: util.GenerateShortUID(),
|
||
Name: "SlackWithBadRecipient",
|
||
Type: "slack",
|
||
Settings: simplejson.NewFromAny(map[string]interface{}{"recipient": "this passes"}),
|
||
SecureSettings: map[string]string{"url": "http://webhook.slack.com/myuser"},
|
||
},
|
||
},
|
||
},
|
||
{
|
||
name: "when the configuration is valid - it should not error",
|
||
receivers: []*PostableGrafanaReceiver{
|
||
{
|
||
UID: util.GenerateShortUID(),
|
||
Name: "SlackWithBadURL",
|
||
Type: "slack",
|
||
Settings: simplejson.NewFromAny(map[string]interface{}{"recipient": "#a-good-channel"}),
|
||
SecureSettings: map[string]string{"url": "http://webhook.slack.com/myuser"},
|
||
},
|
||
},
|
||
},
|
||
}
|
||
|
||
for _, tt := range tc {
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
mg := newTestMigration(t)
|
||
orgID := int64(1)
|
||
|
||
config := configFromReceivers(t, tt.receivers)
|
||
require.NoError(t, config.EncryptSecureSettings()) // make sure we encrypt the settings
|
||
err := mg.validateAlertmanagerConfig(orgID, config)
|
||
if tt.err != nil {
|
||
require.Error(t, err)
|
||
require.EqualError(t, err, tt.err.Error())
|
||
} else {
|
||
require.NoError(t, err)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func configFromReceivers(t *testing.T, receivers []*PostableGrafanaReceiver) *PostableUserConfig {
|
||
t.Helper()
|
||
|
||
return &PostableUserConfig{
|
||
AlertmanagerConfig: PostableApiAlertingConfig{
|
||
Receivers: []*PostableApiReceiver{
|
||
{GrafanaManagedReceivers: receivers},
|
||
},
|
||
},
|
||
}
|
||
}
|
||
|
||
func (c *PostableUserConfig) EncryptSecureSettings() error {
|
||
for _, r := range c.AlertmanagerConfig.Receivers {
|
||
for _, gr := range r.GrafanaManagedReceivers {
|
||
encryptedData := GetEncryptedJsonData(gr.SecureSettings)
|
||
for k, v := range encryptedData {
|
||
gr.SecureSettings[k] = base64.StdEncoding.EncodeToString(v)
|
||
}
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
const invalidUri = "<22>6<EFBFBD>M<EFBFBD><4D>)uk譹1(<28>h`$<24>o<EFBFBD>N>mĕ<6D><C495><EFBFBD><EFBFBD>cS2<53>dh![ę<> <09><><EFBFBD>`csB<73>!<21><>OSxP<78>{<7B>"
|
||
|
||
func Test_getAlertFolderNameFromDashboard(t *testing.T) {
|
||
t.Run("should include full title", func(t *testing.T) {
|
||
dash := &dashboard{
|
||
Uid: util.GenerateShortUID(),
|
||
Title: "TEST",
|
||
}
|
||
folder := getAlertFolderNameFromDashboard(dash)
|
||
require.Contains(t, folder, dash.Title)
|
||
require.Contains(t, folder, dash.Uid)
|
||
})
|
||
t.Run("should cut title to the length", func(t *testing.T) {
|
||
title := ""
|
||
for {
|
||
title += util.GenerateShortUID()
|
||
if len(title) > MaxFolderName {
|
||
title = title[:MaxFolderName]
|
||
break
|
||
}
|
||
}
|
||
|
||
dash := &dashboard{
|
||
Uid: util.GenerateShortUID(),
|
||
Title: title,
|
||
}
|
||
folder := getAlertFolderNameFromDashboard(dash)
|
||
require.Len(t, folder, MaxFolderName)
|
||
require.Contains(t, folder, dash.Uid)
|
||
})
|
||
}
|