diff --git a/cmd/kured/main.go b/cmd/kured/main.go index da8eaa176..df37ca3b0 100644 --- a/cmd/kured/main.go +++ b/cmd/kured/main.go @@ -3,9 +3,11 @@ package main import ( "context" "encoding/json" + "errors" "fmt" "math/rand" "net/http" + "net/url" "os" "os/exec" "regexp" @@ -30,7 +32,6 @@ import ( "github.com/weaveworks/kured/pkg/alerts" "github.com/weaveworks/kured/pkg/daemonsetlock" "github.com/weaveworks/kured/pkg/delaytick" - "github.com/weaveworks/kured/pkg/notifications/slack" "github.com/weaveworks/kured/pkg/taints" "github.com/weaveworks/kured/pkg/timewindow" ) @@ -173,12 +174,22 @@ func main() { func flagCheck(cmd *cobra.Command, args []string) { if slackHookURL != "" && notifyURL != "" { log.Warnf("Cannot use both --notify-url and --slack-hook-url flags. Kured will use --notify-url flag only...") - slackHookURL = "" } - if slackChannel != "" || slackHookURL != "" { - log.Warnf("slack-* flag(s) are being deprecated. Please use --notify-url flag instead.") + if slackHookURL != "" { + log.Warnf("Deprecated flag(s). Please use --notify-url flag instead.") + if regexp.MustCompile(`https://hooks.slack.com/services/\w{5,15}\/\w{5,15}\/\w{5,20}[^\/]`).FindString(slackHookURL) == "" { + log.Fatalf("ERROR: %v\n", errors.New("slack-hook-url is not properly formatted...no notification will be sent")) + } + trataURL, err := url.Parse(slackHookURL) + if err != nil { + log.Fatalf("slack-hook-url is not properly formatted...no notification will be sent: %v\n", err) + } + if len(strings.Split(strings.Trim(trataURL.Path, "/services/"), "/")) != 3 { + log.Fatalf("slack-hook-url is not properly formatted...no notification will be sent: %v\n", err) + } else { + notifyURL = fmt.Sprintf("slack://%s", strings.Trim(trataURL.Path, "/services/")) + } } - } // newCommand creates a new Command with stdout/stderr wired to our standard logger @@ -353,11 +364,6 @@ func drain(client *kubernetes.Clientset, node *v1.Node) { log.Infof("Draining node %s", nodename) - if slackHookURL != "" { - if err := slack.NotifyDrain(slackHookURL, slackUsername, slackChannel, messageTemplateDrain, nodename); err != nil { - log.Warnf("Error notifying slack: %v", err) - } - } if notifyURL != "" { if err := shoutrrr.Send(notifyURL, fmt.Sprintf(messageTemplateDrain, nodename)); err != nil { log.Warnf("Error notifying: %v", err) @@ -411,12 +417,6 @@ func uncordon(client *kubernetes.Clientset, node *v1.Node) { func invokeReboot(nodeID string, rebootCommand []string) { log.Infof("Running command: %s for node: %s", rebootCommand, nodeID) - if slackHookURL != "" { - if err := slack.NotifyReboot(slackHookURL, slackUsername, slackChannel, messageTemplateReboot, nodeID); err != nil { - log.Warnf("Error notifying slack: %v", err) - } - } - if notifyURL != "" { if err := shoutrrr.Send(notifyURL, fmt.Sprintf(messageTemplateReboot, nodeID)); err != nil { log.Warnf("Error notifying: %v", err) diff --git a/cmd/kured/main_test.go b/cmd/kured/main_test.go index 78dab6546..24e8efb5b 100644 --- a/cmd/kured/main_test.go +++ b/cmd/kured/main_test.go @@ -5,6 +5,7 @@ import ( "testing" log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" "github.com/weaveworks/kured/pkg/alerts" assert "gotest.tools/v3/assert" @@ -22,6 +23,15 @@ func (fbc BlockingChecker) isBlocked() bool { var _ RebootBlocker = BlockingChecker{} // Verify that Type implements Interface. var _ RebootBlocker = (*BlockingChecker)(nil) // Verify that *Type implements Interface. +func Test_flagCheck(t *testing.T) { + var cmd *cobra.Command + var args []string + slackHookURL = "https://hooks.slack.com/services/BLABLABA12345/IAM931A0VERY/COMPLICATED711854TOKEN1SET" + flagCheck(cmd, args) + if notifyURL != "slack://BLABLABA12345/IAM931A0VERY/COMPLICATED711854TOKEN1SET" { + t.Errorf("Slack URL Parsing is wrong: expecting %s but got %s\n", "slack://BLABLABA12345/IAM931A0VERY/COMPLICATED711854TOKEN1SET", notifyURL) + } +} func Test_rebootBlocked(t *testing.T) { noCheckers := []RebootBlocker{} nonblockingChecker := BlockingChecker{blocking: false} diff --git a/pkg/notifications/slack/slack.go b/pkg/notifications/slack/slack.go deleted file mode 100644 index 4af05d93f..000000000 --- a/pkg/notifications/slack/slack.go +++ /dev/null @@ -1,54 +0,0 @@ -package slack - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "time" -) - -var ( - httpClient = &http.Client{Timeout: 5 * time.Second} -) - -type body struct { - Text string `json:"text,omitempty"` - Username string `json:"username,omitempty"` - Channel string `json:"channel,omitempty"` -} - -func notify(hookURL, username, channel, message string) error { - msg := body{ - Text: message, - Username: username, - Channel: channel, - } - - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(&msg); err != nil { - return err - } - - resp, err := httpClient.Post(hookURL, "application/json", &buf) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - return fmt.Errorf(resp.Status) - } - - return nil -} - -// NotifyDrain is the exposed way to notify of a drain event onto a slack chan -func NotifyDrain(hookURL, username, channel, messageTemplate, nodeID string) error { - return notify(hookURL, username, channel, fmt.Sprintf(messageTemplate, nodeID)) -} - -// NotifyReboot is the exposed way to notify of a reboot event onto a slack chan -func NotifyReboot(hookURL, username, channel, messageTemplate, nodeID string) error { - return notify(hookURL, username, channel, fmt.Sprintf(messageTemplate, nodeID)) -}