Files
flagger/pkg/notifier/rocket.go
2020-03-08 11:53:03 +09:00

72 lines
1.4 KiB
Go

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 fmt.Errorf("postMessage failed: %w", err)
}
return nil
}