Alerting: Return merged extra configurations in the API (#109636)
This commit is contained in:
committed by
GitHub
parent
7d7721e30a
commit
e165a490b4
@@ -0,0 +1,109 @@
|
||||
package alerting
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
|
||||
"github.com/grafana/grafana/pkg/tests/testinfra"
|
||||
)
|
||||
|
||||
func TestIntegrationAlertmanagerExtraConfigMerging(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("skipping integration test in short mode")
|
||||
}
|
||||
|
||||
testinfra.SQLiteIntegrationTest(t)
|
||||
|
||||
dir, gpath := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
||||
DisableLegacyAlerting: true,
|
||||
EnableUnifiedAlerting: true,
|
||||
DisableAnonymous: true,
|
||||
AppModeProduction: true,
|
||||
EnableFeatureToggles: []string{
|
||||
"alertingImportAlertmanagerAPI",
|
||||
"alertingImportAlertmanagerUI",
|
||||
},
|
||||
})
|
||||
|
||||
grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, gpath)
|
||||
apiClient := newAlertingApiClient(grafanaListedAddr, "admin", "admin")
|
||||
|
||||
t.Run("retrieve merged configuration via extra config datasource", func(t *testing.T) {
|
||||
// first upload standard alertmanager configuration
|
||||
baseConfig := apimodels.PostableUserConfig{}
|
||||
baseConfigJSON := `{
|
||||
"alertmanager_config": {
|
||||
"route": {
|
||||
"receiver": "base-default"
|
||||
},
|
||||
"receivers": [{
|
||||
"name": "base-default",
|
||||
"grafana_managed_receiver_configs": [{
|
||||
"name": "base-email",
|
||||
"type": "email",
|
||||
"settings": {
|
||||
"addresses": "example@grafana.com"
|
||||
}
|
||||
}]
|
||||
}]
|
||||
},
|
||||
"template_files": {
|
||||
"base.tmpl": "{{ define \"base.template\" }}Base Template{{ end }}"
|
||||
}
|
||||
}`
|
||||
err := json.Unmarshal([]byte(baseConfigJSON), &baseConfig)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = env.Server.HTTPServer.AlertNG.MultiOrgAlertmanager.SaveAndApplyAlertmanagerConfiguration(context.Background(), 1, baseConfig)
|
||||
require.NoError(t, err)
|
||||
|
||||
//now add extra configuration
|
||||
extraHeaders := map[string]string{
|
||||
"Content-Type": "application/yaml",
|
||||
"X-Grafana-Alerting-Merge-Matchers": "imported=true",
|
||||
}
|
||||
|
||||
extraConfigYAML := `
|
||||
route:
|
||||
receiver: extra-webhook
|
||||
|
||||
receivers:
|
||||
- name: extra-webhook
|
||||
webhook_configs:
|
||||
- url: 'http://external.example.com/webhook'
|
||||
`
|
||||
|
||||
extraConfig := apimodels.AlertmanagerUserConfig{
|
||||
AlertmanagerConfig: extraConfigYAML,
|
||||
TemplateFiles: map[string]string{
|
||||
"extra.tmpl": `{{ define "extra.template" }}Extra Template{{ end }}`,
|
||||
},
|
||||
}
|
||||
|
||||
response := apiClient.ConvertPrometheusPostAlertmanagerConfig(t, extraConfig, extraHeaders)
|
||||
require.Equal(t, "success", response.Status)
|
||||
|
||||
// get the merged configuration and check it
|
||||
datasourceUID := "~grafana-with-extra-config"
|
||||
mergedConfig := apiClient.GetAlertmanagerConfigForDatasource(t, datasourceUID)
|
||||
|
||||
receiverNames := make(map[string]bool)
|
||||
for _, recv := range mergedConfig.AlertmanagerConfig.Receivers {
|
||||
receiverNames[recv.Name] = true
|
||||
}
|
||||
|
||||
require.True(t, receiverNames["base-default"])
|
||||
require.True(t, receiverNames["extra-webhook"])
|
||||
|
||||
require.Contains(t, mergedConfig.TemplateFiles, "base.tmpl", "Base template should be present")
|
||||
require.Equal(t, `{{ define "base.template" }}Base Template{{ end }}`, mergedConfig.TemplateFiles["base.tmpl"])
|
||||
require.Contains(t, mergedConfig.TemplateFiles, "extra.tmpl", "Extra template should be present")
|
||||
require.Equal(t, `{{ define "extra.template" }}Extra Template{{ end }}`, mergedConfig.TemplateFiles["extra.tmpl"])
|
||||
|
||||
require.NotNil(t, mergedConfig.AlertmanagerConfig.Route)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user