package channels import ( "io/ioutil" "os" "testing" "github.com/prometheus/alertmanager/template" "github.com/stretchr/testify/require" ) var DefaultTemplateString = ` {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }} {{ define "__text_alert_list" }}{{ range . }} Value: {{ or .ValueString "" }} Labels: {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }}Annotations: {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} {{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} {{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} {{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} {{ end }}{{ end }}{{ end }} {{ define "default.title" }}{{ template "__subject" . }}{{ end }} {{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** {{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} {{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** {{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} {{ define "__teams_text_alert_list" }}{{ range . }} Value: {{ or .ValueString "" }} Labels: {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }} Annotations: {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }} {{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} {{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} {{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} {{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} {{ end }} {{ end }}{{ end }} {{ define "teams.default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** {{ template "__teams_text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} {{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** {{ template "__teams_text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} ` // TemplateForTestsString is the template used for unit tests and integration tests. // We have it separate from above default template because any tiny change in the template // will require updating almost all channel tests (15+ files) and it's very time consuming. const TemplateForTestsString = ` {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }} {{ define "__text_alert_list" }}{{ range . }} Value: {{ or .ValueString "" }} Labels: {{ range .Labels.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }}Annotations: {{ range .Annotations.SortedPairs }} - {{ .Name }} = {{ .Value }} {{ end }}{{ if gt (len .GeneratorURL) 0 }}Source: {{ .GeneratorURL }} {{ end }}{{ if gt (len .SilenceURL) 0 }}Silence: {{ .SilenceURL }} {{ end }}{{ if gt (len .DashboardURL) 0 }}Dashboard: {{ .DashboardURL }} {{ end }}{{ if gt (len .PanelURL) 0 }}Panel: {{ .PanelURL }} {{ end }}{{ end }}{{ end }} {{ define "default.title" }}{{ template "__subject" . }}{{ end }} {{ define "default.message" }}{{ if gt (len .Alerts.Firing) 0 }}**Firing** {{ template "__text_alert_list" .Alerts.Firing }}{{ if gt (len .Alerts.Resolved) 0 }} {{ end }}{{ end }}{{ if gt (len .Alerts.Resolved) 0 }}**Resolved** {{ template "__text_alert_list" .Alerts.Resolved }}{{ end }}{{ end }} {{ define "teams.default.message" }}{{ template "default.message" . }}{{ end }} ` func templateForTests(t *testing.T) *template.Template { f, err := ioutil.TempFile("/tmp", "template") require.NoError(t, err) defer func(f *os.File) { _ = f.Close() }(f) t.Cleanup(func() { require.NoError(t, os.RemoveAll(f.Name())) }) _, err = f.WriteString(TemplateForTestsString) require.NoError(t, err) tmpl, err := template.FromGlobs(f.Name()) require.NoError(t, err) return tmpl }