package cli import ( "context" "flag" "github.com/peterbourgon/ff/v3/ffcli" alertmgr "edge-infra.dev/pkg/lib/gcp/monitoring/alertmanager" monutil "edge-infra.dev/pkg/lib/gcp/monitoring/monutil" ) type deleteArgsT struct { name string labels string deleteAll bool } var deleteArgs deleteArgsT var deleteFlagSet = newDeleteFlagSet(&deleteArgs) func newDeleteFlagSet(deleteArgs *deleteArgsT) *flag.FlagSet { deletef := newFlagSet("delete") deletef.StringVar(&deleteArgs.name, "name", "", "Name of alert policy to delete.") deletef.StringVar(&deleteArgs.labels, "labels", "", "Delete alert policies based on label(s). \n Specify multiple labels through colon and comma separation (representing key and value pairs). \n Label input supports keys, keys and values, and mixed input. \n ex. policy-owner:edge,severity:critical,type") deletef.BoolVar(&deleteArgs.deleteAll, "all", false, "Delete all alert policies that return from a name match. Must be specified if there is more than one match found.") return deletef } var deleteCmd = &ffcli.Command{ Name: "delete", ShortUsage: "delete [flags]", ShortHelp: "Delete an alert policy", FlagSet: withGlobalFlags(deleteFlagSet), Exec: runDelete, } func runDelete(_ context.Context, args []string) error { var alertNames []string if len(args) > 0 { Fatalf("too many non-flag arguments: %q", args) } if !checkDeleteFlags() { Println() return flag.ErrHelp } if len(deleteArgs.name) > 0 { var alertNames []string if alertmgr.IsLinkName(deleteArgs.name) { alertNames = append(alertNames, deleteArgs.name) return alertmgr.DeleteAlertPolicies(alertNames) } policy, err := alertmgr.GetAlertPolicies(projectID, deleteArgs.name, "") if err != nil || len(policy) == 0 { return Errorf("No mactch for AlertPolicy: %s", deleteArgs.name) } for _, value := range policy { alertNames = append(alertNames, value.Name) } if !deleteArgs.deleteAll && len(alertNames) > 1 { logger.Info("There was more than one alert policy found with this Display Name. Please use the [all] flag.") return flag.ErrHelp } return alertmgr.DeleteAlertPolicies(alertNames) } if len(deleteArgs.labels) > 0 { labelsMap := monutil.StringToMap(deleteArgs.labels) alertNames = alertmgr.GetNamesFromLabels(labelsMap, projectID) return alertmgr.DeleteAlertPolicies(alertNames) } return nil } func checkDeleteFlags() bool { if len(projectID) == 0 { logger.Info("Error: no value specified for [project] - a valid project-id is required") return false } if deleteArgs.deleteAll && len(deleteArgs.labels) > 0 { logger.Info("Error: value specified for [all] flag and [labels] - only provide a value for labels.") return false } if len(deleteArgs.name) == 0 && len(deleteArgs.labels) == 0 { logger.Info("Error: no value specified for [name] or for [labels] please provide a valid name for one of the delete action parameters") return false } if len(deleteArgs.name) > 0 && len(deleteArgs.labels) > 0 { logger.Info("Error: value specified for [name] and [labels] - please provide a value for only one of the delete action parameters") return false } return true }