package cli import ( "context" "flag" "fmt" "strings" "github.com/peterbourgon/ff/v3/ffcli" metrics "edge-infra.dev/pkg/lib/gcp/monitoring/metrics" "edge-infra.dev/pkg/lib/gcp/monitoring/monutil" ) type compareArgsT struct { byMetric bool byProject bool } var compareArgs compareArgsT var compareFlagSet = newCompareFlagSet(&compareArgs) func newCompareFlagSet(compareArgs *compareArgsT) *flag.FlagSet { comparef := newFlagSet("compare") comparef.BoolVar(&compareArgs.byProject, "by-project", false, "Metric descriptor comparisons sorted by project ID. (cannot be used with --by-metric)") comparef.BoolVar(&compareArgs.byMetric, "by-metric", false, "Metric descriptors comparisons sorted by metric. (cannot be used with --by-project)") return comparef } var compareCmd = &ffcli.Command{ Name: "compare", ShortUsage: "compare [flags]", ShortHelp: "compare metric descriptor labels", LongHelp: strings.TrimSpace(` Compares metricDescriptor labels from two or more projects. `), FlagSet: withGlobalFlags(compareFlagSet), Exec: runCompare, } func runCompare(ctx context.Context, args []string) error { if len(args) > 0 { Fatalf("too many non-flag arguments: %q", args) } if !checkCompareFlags() || !checkGlobalFlags() { return flag.ErrHelp } // retrieve metric descriptors as list projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",") d, err := retrieveDescriptors(ctx, projects) if err != nil { return Errorf("failed to metricDescriptors for multiple projects: %w", err) } // necessary when specifying multiple projects as foreman is a multi-project source if filterForeman { projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",") d, err = d.FilterProjects(projects) if err != nil { return err } } switch { case compareArgs.byMetric && !jsonFormat: _ = metrics.TmplMetricCompare.Execute(Stdout, d.CompareMetrics()) case compareArgs.byProject && !jsonFormat: _ = metrics.TmplProjectCompare.Execute(Stdout, d.CompareProjects()) case compareArgs.byMetric && jsonFormat: _ = metrics.TmplJSON.Execute(Stdout, d.CompareMetrics()) case compareArgs.byProject && jsonFormat: _ = metrics.TmplJSON.Execute(Stdout, d.CompareProjects()) case !compareArgs.byMetric && !compareArgs.byProject && jsonFormat: _ = metrics.TmplJSON.Execute(Stdout, d.Compare()) default: _ = metrics.TmplDescCompare.Execute(Stdout, d.Compare()) } if !silent { fmt.Printf("\n%s", monutil.White(mmBroomTitle)) } return nil } // checkCompareFlags validates the required Compare subcommand flags have been provided. func checkCompareFlags() bool { if compareArgs.byMetric && compareArgs.byProject { fmt.Println("Error: 'by-metric' and 'by-project' were selected - only one sort method allowed") return false } return true }