package cli import ( "context" "flag" "strings" "github.com/peterbourgon/ff/v3/ffcli" dashmgr "edge-infra.dev/pkg/lib/gcp/monitoring/dashboardmanager" ) type deleteArgsT struct { labels string name string } var deleteArgs deleteArgsT var deleteFlagSet = newDeleteFlagSet(&deleteArgs) func newDeleteFlagSet(deleteArgs *deleteArgsT) *flag.FlagSet { deletef := newFlagSet("delete") deletef.StringVar(&deleteArgs.labels, "labels", "", "Deletes all dashboards that match the specified label(s). Multiple labels can be specified using a comma between each value.") deletef.StringVar(&deleteArgs.name, "name", "", "Dashboard Name or Display Name to delete.\nNOTE: If a Display Name is used and multiple dashboards exist with the same name, all will be deleted.") return deletef } var deleteCmd = &ffcli.Command{ Name: "delete", ShortUsage: "delete [flags]", ShortHelp: "Delete dashboard(s) from project", LongHelp: strings.TrimSpace(` Deletes dashboards in the project using either the specified dashboard name, display name, labels. `), FlagSet: withGlobalFlags(deleteFlagSet), Exec: runDelete, } func runDelete(ctx context.Context, args []string) error { if len(args) > 0 { Fatalf("too many non-flag arguments: %q", args) } if !checkDeleteFlags() { Println() return flag.ErrHelp } client, err := dashmgr.New(ctx, projectID) if err != nil { return err } // Delete dashboards matching labels if len(deleteArgs.labels) > 0 { labels := strArray(deleteArgs.labels) for i := 0; i < len(labels); i++ { err = client.DeleteDashboardsByLabel(labels[i]) if err != nil { return err } } return nil } // Delete dashboards that match specified name if len(deleteArgs.name) > 0 { return client.DeleteDashboard(deleteArgs.name) } return nil } // validates the required delete subcommand flags have been provided func checkDeleteFlags() bool { if len(projectID) == 0 { Println("Error: no value specified for [project] - a valid project-id is required") return false } if len(deleteArgs.name) == 0 && len(deleteArgs.labels) == 0 { Println("Error: no value specified for [name] or [labels] - please provide a value for one of the delete action parameters") return false } if len(deleteArgs.name) > 0 && len(deleteArgs.labels) > 0 { Println("Error: values provided for both [name] and [labels] - please specify dashboard [name] or [labels] to perform a delete action on, not both") } return true }