...
1 package cli
2
3 import (
4 "context"
5 "flag"
6
7 "github.com/peterbourgon/ff/v3/ffcli"
8
9 alertmgr "edge-infra.dev/pkg/lib/gcp/monitoring/alertmanager"
10
11 monutil "edge-infra.dev/pkg/lib/gcp/monitoring/monutil"
12 )
13
14 type deleteArgsT struct {
15 name string
16 labels string
17 deleteAll bool
18 }
19
20 var deleteArgs deleteArgsT
21 var deleteFlagSet = newDeleteFlagSet(&deleteArgs)
22
23 func newDeleteFlagSet(deleteArgs *deleteArgsT) *flag.FlagSet {
24 deletef := newFlagSet("delete")
25 deletef.StringVar(&deleteArgs.name, "name", "", "Name of alert policy to delete.")
26 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")
27 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.")
28 return deletef
29 }
30
31 var deleteCmd = &ffcli.Command{
32 Name: "delete",
33 ShortUsage: "delete [flags]",
34 ShortHelp: "Delete an alert policy",
35 FlagSet: withGlobalFlags(deleteFlagSet),
36 Exec: runDelete,
37 }
38
39 func runDelete(_ context.Context, args []string) error {
40 var alertNames []string
41
42 if len(args) > 0 {
43 Fatalf("too many non-flag arguments: %q", args)
44 }
45
46 if !checkDeleteFlags() {
47 Println()
48 return flag.ErrHelp
49 }
50
51 if len(deleteArgs.name) > 0 {
52 var alertNames []string
53 if alertmgr.IsLinkName(deleteArgs.name) {
54 alertNames = append(alertNames, deleteArgs.name)
55 return alertmgr.DeleteAlertPolicies(alertNames)
56 }
57
58 policy, err := alertmgr.GetAlertPolicies(projectID, deleteArgs.name, "")
59 if err != nil || len(policy) == 0 {
60 return Errorf("No mactch for AlertPolicy: %s", deleteArgs.name)
61 }
62 for _, value := range policy {
63 alertNames = append(alertNames, value.Name)
64 }
65
66 if !deleteArgs.deleteAll && len(alertNames) > 1 {
67 logger.Info("There was more than one alert policy found with this Display Name. Please use the [all] flag.")
68 return flag.ErrHelp
69 }
70 return alertmgr.DeleteAlertPolicies(alertNames)
71 }
72
73 if len(deleteArgs.labels) > 0 {
74 labelsMap := monutil.StringToMap(deleteArgs.labels)
75 alertNames = alertmgr.GetNamesFromLabels(labelsMap, projectID)
76 return alertmgr.DeleteAlertPolicies(alertNames)
77 }
78 return nil
79 }
80
81 func checkDeleteFlags() bool {
82 if len(projectID) == 0 {
83 logger.Info("Error: no value specified for [project] - a valid project-id is required")
84 return false
85 }
86
87 if deleteArgs.deleteAll && len(deleteArgs.labels) > 0 {
88 logger.Info("Error: value specified for [all] flag and [labels] - only provide a value for labels.")
89 return false
90 }
91
92 if len(deleteArgs.name) == 0 && len(deleteArgs.labels) == 0 {
93 logger.Info("Error: no value specified for [name] or for [labels] please provide a valid name for one of the delete action parameters")
94 return false
95 }
96
97 if len(deleteArgs.name) > 0 && len(deleteArgs.labels) > 0 {
98 logger.Info("Error: value specified for [name] and [labels] - please provide a value for only one of the delete action parameters")
99 return false
100 }
101
102 return true
103 }
104
View as plain text