From 9ae611329a64f294fd24925ca280828aa3c9b7da Mon Sep 17 00:00:00 2001 From: Erki Esken Date: Wed, 7 Dec 2022 23:13:03 +0200 Subject: [PATCH] Add check for templated Opsgenie receiver config (#3060) * Add check for templated Opsgenie receiver config Solves #2887, where Opsgenie responder type can be templated according to docs, but configuration logic checked for specific list of values only. Signed-off-by: Erki Esken Co-authored-by: Simon Pasquier --- config/notifiers.go | 14 +++++++++++--- config/notifiers_test.go | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/config/notifiers.go b/config/notifiers.go index f344756102..8c87102ddd 100644 --- a/config/notifiers.go +++ b/config/notifiers.go @@ -18,6 +18,7 @@ import ( "net/textproto" "regexp" "strings" + "text/template" "time" "github.com/pkg/errors" @@ -541,9 +542,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 602cd1826f..a22b0169b9 100644 --- a/config/notifiers_test.go +++ b/config/notifiers_test.go @@ -743,6 +743,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, },