...
1 package cli
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 "strings"
8
9 "github.com/peterbourgon/ff/v3/ffcli"
10
11 metrics "edge-infra.dev/pkg/lib/gcp/monitoring/metrics"
12 "edge-infra.dev/pkg/lib/gcp/monitoring/monutil"
13 )
14
15 type compareArgsT struct {
16 byMetric bool
17 byProject bool
18 }
19
20 var compareArgs compareArgsT
21 var compareFlagSet = newCompareFlagSet(&compareArgs)
22
23 func newCompareFlagSet(compareArgs *compareArgsT) *flag.FlagSet {
24 comparef := newFlagSet("compare")
25 comparef.BoolVar(&compareArgs.byProject, "by-project", false, "Metric descriptor comparisons sorted by project ID. (cannot be used with --by-metric)")
26 comparef.BoolVar(&compareArgs.byMetric, "by-metric", false, "Metric descriptors comparisons sorted by metric. (cannot be used with --by-project)")
27 return comparef
28 }
29
30 var compareCmd = &ffcli.Command{
31 Name: "compare",
32 ShortUsage: "compare [flags]",
33 ShortHelp: "compare metric descriptor labels",
34 LongHelp: strings.TrimSpace(`
35 Compares metricDescriptor labels from two or more projects.
36 `),
37 FlagSet: withGlobalFlags(compareFlagSet),
38 Exec: runCompare,
39 }
40
41 func runCompare(ctx context.Context, args []string) error {
42 if len(args) > 0 {
43 Fatalf("too many non-flag arguments: %q", args)
44 }
45 if !checkCompareFlags() || !checkGlobalFlags() {
46 return flag.ErrHelp
47 }
48
49
50 projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
51 d, err := retrieveDescriptors(ctx, projects)
52 if err != nil {
53 return Errorf("failed to metricDescriptors for multiple projects: %w", err)
54 }
55
56
57 if filterForeman {
58 projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
59 d, err = d.FilterProjects(projects)
60 if err != nil {
61 return err
62 }
63 }
64
65 switch {
66 case compareArgs.byMetric && !jsonFormat:
67 _ = metrics.TmplMetricCompare.Execute(Stdout, d.CompareMetrics())
68
69 case compareArgs.byProject && !jsonFormat:
70 _ = metrics.TmplProjectCompare.Execute(Stdout, d.CompareProjects())
71
72 case compareArgs.byMetric && jsonFormat:
73 _ = metrics.TmplJSON.Execute(Stdout, d.CompareMetrics())
74
75 case compareArgs.byProject && jsonFormat:
76 _ = metrics.TmplJSON.Execute(Stdout, d.CompareProjects())
77
78 case !compareArgs.byMetric && !compareArgs.byProject && jsonFormat:
79 _ = metrics.TmplJSON.Execute(Stdout, d.Compare())
80
81 default:
82 _ = metrics.TmplDescCompare.Execute(Stdout, d.Compare())
83 }
84
85 if !silent {
86 fmt.Printf("\n%s", monutil.White(mmBroomTitle))
87 }
88 return nil
89 }
90
91
92 func checkCompareFlags() bool {
93 if compareArgs.byMetric && compareArgs.byProject {
94 fmt.Println("Error: 'by-metric' and 'by-project' were selected - only one sort method allowed")
95 return false
96 }
97
98 return true
99 }
100
View as plain text