Implement MS Teams notifier

This commit is contained in:
stefanprodan
2019-07-06 17:14:21 +03:00
parent 61d0216c21
commit 8ca9cf24bb
3 changed files with 107 additions and 15 deletions

View File

@@ -22,6 +22,8 @@ func (f Factory) Notifier() (Interface, error) {
switch {
case strings.Contains(f.URL, "slack.com"):
return NewSlack(f.URL, f.Username, f.Channel)
case strings.Contains(f.URL, "office.com"):
return NewMSTeams(f.URL)
}
return nil, nil

94
pkg/notifier/teams.go Normal file
View File

@@ -0,0 +1,94 @@
package notifier
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
// MS Teams holds the incoming webhook URL
type MSTeams struct {
URL string
}
// MSTeamsPayload holds the message card data
type MSTeamsPayload struct {
Type string `json:"@type"`
Context string `json:"@context"`
ThemeColor string `json:"themeColor"`
Summary string `json:"summary"`
Sections []MSTeamsSection `json:"sections"`
}
// MSTeamsSection holds the canary analysis result
type MSTeamsSection struct {
ActivityTitle string `json:"activityTitle"`
ActivitySubtitle string `json:"activitySubtitle"`
Facts []MSTeamsField `json:"facts"`
}
type MSTeamsField struct {
Name string `json:"name"`
Value string `json:"value"`
}
// NewMSTeams validates the MS Teams URL and returns a MSTeams object
func NewMSTeams(hookURL string) (*MSTeams, error) {
_, err := url.ParseRequestURI(hookURL)
if err != nil {
return nil, fmt.Errorf("invalid MS Teams webhook URL %s", hookURL)
}
return &MSTeams{
URL: hookURL,
}, nil
}
// Post MS Teams message
func (s *MSTeams) Post(workload string, namespace string, message string, fields []Field, warn bool) error {
facts := make([]MSTeamsField, len(fields))
for _, f := range fields {
facts = append(facts, MSTeamsField{f.Name, f.Value})
}
payload := MSTeamsPayload{
Type: "MessageCard",
Context: "http://schema.org/extensions",
ThemeColor: "0076D7",
Summary: fmt.Sprintf("%s.%s", workload, namespace),
Sections: []MSTeamsSection{
{
ActivityTitle: message,
ActivitySubtitle: fmt.Sprintf("%s.%s", workload, namespace),
Facts: facts,
},
},
}
if warn {
payload.ThemeColor = "FF0000"
}
data, err := json.Marshal(payload)
if err != nil {
return fmt.Errorf("marshalling slack payload failed %v", err)
}
b := bytes.NewBuffer(data)
if res, err := http.Post(s.URL, "application/json", b); err != nil {
return fmt.Errorf("sending data to MS Teams failed %v", err)
} else {
defer res.Body.Close()
statusCode := res.StatusCode
if statusCode != 200 {
body, _ := ioutil.ReadAll(res.Body)
return fmt.Errorf("sending data to MS Teams failed %v", string(body))
}
}
return nil
}