mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
Implement Rocket chat notifier
This commit is contained in:
@@ -637,6 +637,7 @@ spec:
|
||||
- slack
|
||||
- msteams
|
||||
- discord
|
||||
- rocket
|
||||
address:
|
||||
description: Hook URL address of this provider
|
||||
type: string
|
||||
|
||||
@@ -638,6 +638,7 @@ spec:
|
||||
- slack
|
||||
- msteams
|
||||
- discord
|
||||
- rocket
|
||||
address:
|
||||
description: Hook URL address of this provider
|
||||
type: string
|
||||
|
||||
@@ -637,6 +637,7 @@ spec:
|
||||
- slack
|
||||
- msteams
|
||||
- discord
|
||||
- rocket
|
||||
address:
|
||||
description: Hook URL address of this provider
|
||||
type: string
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user