diff --git a/config/notifiers.go b/config/notifiers.go index 95df28db43..d0446a6834 100644 --- a/config/notifiers.go +++ b/config/notifiers.go @@ -17,6 +17,7 @@ import ( "fmt" "regexp" "strings" + "text/template" "time" "github.com/pkg/errors" @@ -504,9 +505,16 @@ func (c *OpsGenieConfig) UnmarshalYAML(unmarshal func(interface{}) error) error return errors.Errorf("opsGenieConfig responder %v has to have at least one of id, username or name specified", r) } - r.Type = strings.ToLower(r.Type) - if !opsgenieTypeMatcher.MatchString(r.Type) { - return errors.Errorf("opsGenieConfig responder %v type does not match valid options %s", r, opsgenieValidTypesRe) + if strings.Contains(r.Type, "{{") { + _, err := template.New("").Parse(r.Type) + if err != nil { + return errors.Errorf("opsGenieConfig responder %v type is not a valid template: %v", r, err) + } + } else { + r.Type = strings.ToLower(r.Type) + if !opsgenieTypeMatcher.MatchString(r.Type) { + return errors.Errorf("opsGenieConfig responder %v type does not match valid options %s", r, opsgenieValidTypesRe) + } } } diff --git a/config/notifiers_test.go b/config/notifiers_test.go index 889abab627..6b0611f3ec 100644 --- a/config/notifiers_test.go +++ b/config/notifiers_test.go @@ -634,6 +634,25 @@ api_url: http://example.com responders: - type: schedule api_url: http://example.com +`, + err: true, + }, + { + name: "valid responder type template", + in: `api_key: xyz +responders: +- id: foo + type: "{{/* valid comment */}}team" +api_url: http://example.com +`, + }, + { + name: "invalid responder type template", + in: `api_key: xyz +responders: +- id: foo + type: "{{/* invalid comment }}team" +api_url: http://example.com `, err: true, },