From d1a8adcf3f8d6ebf96befed8ba1ee09654e6b222 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 17 May 2024 22:59:24 +0800 Subject: [PATCH] Create a formatter for config test routes (fixes #3741) --- cli/format/format.go | 1 + cli/format/format_extended.go | 14 ++++++++++++++ cli/format/format_json.go | 5 +++++ cli/format/format_simple.go | 6 ++++++ cli/test_routing.go | 13 +++++++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cli/format/format.go b/cli/format/format.go index 7bab337808..70d0c3b3cb 100644 --- a/cli/format/format.go +++ b/cli/format/format.go @@ -39,6 +39,7 @@ type Formatter interface { FormatAlerts([]*models.GettableAlert) error FormatConfig(*models.AlertmanagerStatus) error FormatClusterStatus(status *models.ClusterStatus) error + FormatAlertReceivers([]string) error } // Formatters is a map of cli argument names to formatter interface object. diff --git a/cli/format/format_extended.go b/cli/format/format_extended.go index 3870cc7db9..1c7fb3ecc2 100644 --- a/cli/format/format_extended.go +++ b/cli/format/format_extended.go @@ -112,6 +112,20 @@ func (formatter *ExtendedFormatter) FormatClusterStatus(status *models.ClusterSt return w.Flush() } +func (formatter *ExtendedFormatter) FormatAlertReceivers(receivers []string) error { + w := tabwriter.NewWriter(formatter.writer, 0, 0, 2, ' ', 0) + sort.Strings(receivers) + fmt.Fprintln(w, "Receiver\t") + for _, receiver := range receivers { + fmt.Fprintf( + w, + "%s\t\n", + receiver, + ) + } + return w.Flush() +} + func extendedFormatLabels(labels models.LabelSet) string { output := []string{} for name, value := range labels { diff --git a/cli/format/format_json.go b/cli/format/format_json.go index b6a12a60eb..b96000e4bb 100644 --- a/cli/format/format_json.go +++ b/cli/format/format_json.go @@ -52,3 +52,8 @@ func (formatter *JSONFormatter) FormatClusterStatus(status *models.ClusterStatus enc := json.NewEncoder(formatter.writer) return enc.Encode(status) } + +func (formatter *JSONFormatter) FormatAlertReceivers(receivers []string) error { + enc := json.NewEncoder(formatter.writer) + return enc.Encode(receivers) +} diff --git a/cli/format/format_simple.go b/cli/format/format_simple.go index 6e7b0a1777..195b596bdc 100644 --- a/cli/format/format_simple.go +++ b/cli/format/format_simple.go @@ -86,6 +86,12 @@ func (formatter *SimpleFormatter) FormatClusterStatus(status *models.ClusterStat return w.Flush() } +func (formatter *SimpleFormatter) FormatAlertReceivers(receivers []string) error { + receiversSlug := strings.Join(receivers, ",") + fmt.Fprintf(formatter.writer, "%s\n", receiversSlug) + return nil +} + func simpleFormatMatchers(matchers models.Matchers) string { output := []string{} for _, matcher := range matchers { diff --git a/cli/test_routing.go b/cli/test_routing.go index 589a2e8cf8..2c56246292 100644 --- a/cli/test_routing.go +++ b/cli/test_routing.go @@ -23,6 +23,7 @@ import ( "github.com/xlab/treeprint" "github.com/prometheus/alertmanager/api/v2/models" + "github.com/prometheus/alertmanager/cli/format" "github.com/prometheus/alertmanager/dispatch" "github.com/prometheus/alertmanager/matchers/compat" "github.com/prometheus/alertmanager/pkg/labels" @@ -79,6 +80,11 @@ func (c *routingShow) routingTestAction(ctx context.Context, _ *kingpin.ParseCon return err } + formatter, found := format.Formatters[output] + if !found { + return fmt.Errorf("unknown output formatter: %q", output) + } + mainRoute := dispatch.NewRoute(cfg.Route, nil) // Parse labels to LabelSet. @@ -99,9 +105,12 @@ func (c *routingShow) routingTestAction(ctx context.Context, _ *kingpin.ParseCon } receivers, err := resolveAlertReceivers(mainRoute, &ls) - receiversSlug := strings.Join(receivers, ",") - fmt.Printf("%s\n", receiversSlug) + if err := formatter.FormatAlertReceivers(receivers); err != nil { + kingpin.Fatalf("failed to format receivers: %v", err) + return err + } + receiversSlug := strings.Join(receivers, ",") if c.expectedReceivers != "" && c.expectedReceivers != receiversSlug { fmt.Printf("WARNING: Expected receivers did not match resolved receivers.\n") os.Exit(1)