Implement Rocket chat notifier

This commit is contained in:
stefanprodan
2020-02-10 18:23:34 +02:00
parent e257d48262
commit fd85a3426a
7 changed files with 125 additions and 4 deletions
+1
View File
@@ -637,6 +637,7 @@ spec:
- slack
- msteams
- discord
- rocket
address:
description: Hook URL address of this provider
type: string
+1
View File
@@ -638,6 +638,7 @@ spec:
- slack
- msteams
- discord
- rocket
address:
description: Hook URL address of this provider
type: string
+1
View File
@@ -637,6 +637,7 @@ spec:
- slack
- msteams
- discord
- rocket
address:
description: Hook URL address of this provider
type: string
+2
View File
@@ -22,6 +22,8 @@ func (f Factory) Notifier(provider string) (Interface, error) {
return NewSlack(f.URL, f.Username, f.Channel)
case provider == "discord":
return NewDiscord(f.URL, f.Username, f.Channel)
case provider == "rocket":
return NewRocket(f.URL, f.Username, f.Channel)
case provider == "msteams":
return NewMSTeams(f.URL)
}
+72
View File
@@ -0,0 +1,72 @@
package notifier
import (
"errors"
"fmt"
"net/url"
)
// Rocket holds the hook URL
type Rocket struct {
URL string
Username string
Channel string
}
// NewRocket validates the Rocket URL and returns a Rocket object
func NewRocket(hookURL string, username string, channel string) (*Rocket, error) {
_, err := url.ParseRequestURI(hookURL)
if err != nil {
return nil, fmt.Errorf("invalid Rocket hook URL %s", hookURL)
}
if username == "" {
return nil, errors.New("empty Rocket username")
}
if channel == "" {
return nil, errors.New("empty Rocket channel")
}
return &Rocket{
Channel: channel,
URL: hookURL,
Username: username,
}, nil
}
// Post Rocket message
func (s *Rocket) Post(workload string, namespace string, message string, fields []Field, severity string) error {
payload := SlackPayload{
Channel: s.Channel,
Username: s.Username,
IconEmoji: ":rocket:",
}
color := "#0076D7"
if severity == "error" {
color = "#FF0000"
}
sfields := make([]SlackField, 0, len(fields))
for _, f := range fields {
sfields = append(sfields, SlackField{f.Name, f.Value, false})
}
a := SlackAttachment{
Color: color,
AuthorName: fmt.Sprintf("%s.%s", workload, namespace),
Text: message,
MrkdwnIn: []string{"text"},
Fields: sfields,
}
payload.Attachments = []SlackAttachment{a}
err := postMessage(s.URL, payload)
if err != nil {
return err
}
return nil
}
+44
View File
@@ -0,0 +1,44 @@
package notifier
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func TestSlack_Post(t *testing.T) {
fields := []Field{
{Name: "name1", Value: "value1"},
{Name: "name2", Value: "value2"},
}
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body)
if err != nil {
t.Fatal(err)
}
var payload = SlackPayload{}
err = json.Unmarshal(b, &payload)
if payload.Attachments[0].AuthorName != "podinfo.test" {
t.Fatal("wrong author name")
}
if len(payload.Attachments[0].Fields) != len(fields) {
t.Fatal("wrong facts")
}
}))
defer ts.Close()
slack, err := NewSlack(ts.URL, "test", "test")
if err != nil {
t.Fatal(err)
}
err = slack.Post("podinfo", "test", "test", fields, "error")
if err != nil {
t.Fatal(err)
}
}
+4 -4
View File
@@ -8,7 +8,7 @@ import (
"testing"
)
func TestSlack_Post(t *testing.T) {
func TestRocket_Post(t *testing.T) {
fields := []Field{
{Name: "name1", Value: "value1"},
{Name: "name2", Value: "value2"},
@@ -27,17 +27,17 @@ func TestSlack_Post(t *testing.T) {
}
if len(payload.Attachments[0].Fields) != len(fields) {
t.Fatal("wrong facts")
t.Fatal("wrong field")
}
}))
defer ts.Close()
slack, err := NewSlack(ts.URL, "test", "test")
rocket, err := NewRocket(ts.URL, "test", "test")
if err != nil {
t.Fatal(err)
}
err = slack.Post("podinfo", "test", "test", fields, "error")
err = rocket.Post("podinfo", "test", "test", fields, "error")
if err != nil {
t.Fatal(err)
}