From 69346f7a1b45480dd834f86788315f725516ae47 Mon Sep 17 00:00:00 2001 From: pauhull Date: Tue, 19 Dec 2023 10:08:19 +0100 Subject: [PATCH] fix: allow multiple --type flags for metrics commands (#649) Closes #642 --- internal/cmd/loadbalancer/metrics.go | 24 ++++++++++++++++++++---- internal/cmd/server/metrics.go | 23 +++++++++++++++++++---- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/internal/cmd/loadbalancer/metrics.go b/internal/cmd/loadbalancer/metrics.go index 99c7f0fc..52225fd4 100644 --- a/internal/cmd/loadbalancer/metrics.go +++ b/internal/cmd/loadbalancer/metrics.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "slices" "sort" "strconv" "time" @@ -20,6 +21,13 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud" ) +var metricTypeStrings = []string{ + string(hcloud.LoadBalancerMetricOpenConnections), + string(hcloud.LoadBalancerMetricConnectionsPerSecond), + string(hcloud.LoadBalancerMetricRequestsPerSecond), + string(hcloud.LoadBalancerMetricBandwidth), +} + var MetricsCmd = base.Cmd{ BaseCobraCommand: func(client hcapi2.Client) *cobra.Command { cmd := &cobra.Command{ @@ -31,9 +39,9 @@ var MetricsCmd = base.Cmd{ DisableFlagsInUseLine: true, } - cmd.Flags().String("type", "", "Type of metrics you want to show") + cmd.Flags().StringSlice("type", nil, "Types of metrics you want to show") cmd.MarkFlagRequired("type") - cmd.RegisterFlagCompletionFunc("type", cmpl.SuggestCandidates("open_connections", "connections_per_second", "requests_per_second", "bandwidth")) + cmd.RegisterFlagCompletionFunc("type", cmpl.SuggestCandidates(metricTypeStrings...)) cmd.Flags().String("start", "", "ISO 8601 timestamp") cmd.Flags().String("end", "", "ISO 8601 timestamp") @@ -53,7 +61,15 @@ var MetricsCmd = base.Cmd{ return fmt.Errorf("LoadBalancer not found: %s", idOrName) } - metricType, _ := cmd.Flags().GetString("type") + metricTypesStr, _ := cmd.Flags().GetStringSlice("type") + var metricTypes []hcloud.LoadBalancerMetricType + for _, t := range metricTypesStr { + if slices.Contains(metricTypeStrings, t) { + metricTypes = append(metricTypes, hcloud.LoadBalancerMetricType(t)) + } else { + return fmt.Errorf("invalid metric type: %s", t) + } + } start, _ := cmd.Flags().GetString("start") startTime := time.Now().Add(-30 * time.Minute) @@ -74,7 +90,7 @@ var MetricsCmd = base.Cmd{ } m, resp, err := client.LoadBalancer().GetMetrics(ctx, LoadBalancer, hcloud.LoadBalancerGetMetricsOpts{ - Types: []hcloud.LoadBalancerMetricType{hcloud.LoadBalancerMetricType(metricType)}, + Types: metricTypes, Start: startTime, End: endTime, }) diff --git a/internal/cmd/server/metrics.go b/internal/cmd/server/metrics.go index 4e9c52e7..e9e7678c 100644 --- a/internal/cmd/server/metrics.go +++ b/internal/cmd/server/metrics.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "slices" "sort" "strconv" "time" @@ -20,6 +21,12 @@ import ( "github.com/hetznercloud/hcloud-go/v2/hcloud" ) +var metricTypeStrings = []string{ + string(hcloud.ServerMetricCPU), + string(hcloud.ServerMetricDisk), + string(hcloud.ServerMetricNetwork), +} + var MetricsCmd = base.Cmd{ BaseCobraCommand: func(client hcapi2.Client) *cobra.Command { cmd := &cobra.Command{ @@ -31,9 +38,9 @@ var MetricsCmd = base.Cmd{ DisableFlagsInUseLine: true, } - cmd.Flags().String("type", "", "Type of metrics you want to show") + cmd.Flags().StringSlice("type", nil, "Types of metrics you want to show") cmd.MarkFlagRequired("type") - cmd.RegisterFlagCompletionFunc("type", cmpl.SuggestCandidates("cpu", "disk", "network")) + cmd.RegisterFlagCompletionFunc("type", cmpl.SuggestCandidates(metricTypeStrings...)) cmd.Flags().String("start", "", "ISO 8601 timestamp") cmd.Flags().String("end", "", "ISO 8601 timestamp") @@ -53,7 +60,15 @@ var MetricsCmd = base.Cmd{ return fmt.Errorf("server not found: %s", idOrName) } - metricType, _ := cmd.Flags().GetString("type") + metricTypesStr, _ := cmd.Flags().GetStringSlice("type") + var metricTypes []hcloud.ServerMetricType + for _, t := range metricTypesStr { + if slices.Contains(metricTypeStrings, t) { + metricTypes = append(metricTypes, hcloud.ServerMetricType(t)) + } else { + return fmt.Errorf("invalid metric type: %s", t) + } + } start, _ := cmd.Flags().GetString("start") startTime := time.Now().Add(-30 * time.Minute) @@ -74,7 +89,7 @@ var MetricsCmd = base.Cmd{ } m, resp, err := client.Server().GetMetrics(ctx, server, hcloud.ServerGetMetricsOpts{ - Types: []hcloud.ServerMetricType{hcloud.ServerMetricType(metricType)}, + Types: metricTypes, Start: startTime, End: endTime, })