1 package cli
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 "strings"
8
9 "github.com/peterbourgon/ff/v3/ffcli"
10
11 "edge-infra.dev/pkg/lib/gcp/monitoring/metrics"
12 "edge-infra.dev/pkg/lib/gcp/monitoring/monutil"
13 )
14
15 type deleteArgsT struct {
16 labels string
17 noPrompt bool
18 }
19
20 var filterLabels []string
21 var deleteArgs deleteArgsT
22 var deleteFlagSet = newDeleteFlagSet(&deleteArgs)
23
24 func newDeleteFlagSet(deleteArgs *deleteArgsT) *flag.FlagSet {
25 deletef := newFlagSet("delete")
26 deletef.BoolVar(&deleteArgs.noPrompt, "no-prompt", false, "Determines whether the user will be prompted to confirm each deletion.")
27 deletef.StringVar(&deleteArgs.labels, "with-labels", "", "Comma separated list of labels to filter the list of metric descriptors to delete. Only metric descriptors that contain this label will be deleted.")
28 return deletef
29 }
30
31 var deleteCmd = &ffcli.Command{
32 Name: "delete",
33 ShortUsage: "delete [flags]",
34 ShortHelp: "Used to delete metric descriptors.",
35 LongHelp: strings.TrimSpace(`
36 Deletes one or more metric descriptors from one or more projects, with an optional label filter.
37 `),
38 FlagSet: withGlobalFlags(deleteFlagSet),
39 Exec: runDelete,
40 }
41
42 func runDelete(ctx context.Context, args []string) error {
43 var err error
44
45 if len(args) > 0 {
46 Fatalf("too many non-flag arguments: %q", args)
47 }
48 if !checkDeleteFlags() {
49 _, _ = Println()
50 return flag.ErrHelp
51 }
52
53
54 projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
55 d, err := retrieveDescriptors(ctx, projects)
56 if err != nil {
57 return Errorf("failed to metricDescriptors for multiple projects: %w", err)
58 }
59
60
61 if filterForeman {
62 projects := strings.Split(strings.ReplaceAll(projectID, " ", ""), ",")
63 d, err = d.FilterProjects(projects)
64 if err != nil {
65 return err
66 }
67 }
68
69
70 if len(deleteArgs.labels) != 0 {
71 filterLabels = strings.Split(strings.ReplaceAll(deleteArgs.labels, " ", ""), ",")
72 d, err = d.FilterLabels(filterLabels)
73 if err != nil {
74 return err
75 }
76 }
77
78
79 var dR metrics.DeleteReport
80 for i := 0; i < len(d.Descriptor); i++ {
81 var err error
82 var confirmed = false
83 if !deleteArgs.noPrompt && !silent {
84 monutil.ClearTerminal()
85 _ = metrics.TmplDesc.Execute(Stdout, d.Descriptor[i])
86 confirmed = monutil.PromptYesNoCancel("Do you wish to delete this metric descriptor?")
87 }
88
89 if confirmed || silent || deleteArgs.noPrompt {
90 dR.Attempted++
91 err = deleteDescriptor(ctx, &d.Descriptor[i])
92 } else {
93 dR.Skipped = append(dR.Skipped, d.Descriptor[i].Name)
94 continue
95 }
96
97 if err != nil {
98 dR.Failed = append(dR.Failed, d.Descriptor[i].Name)
99 } else {
100 dR.Completed++
101 dR.Deleted = append(dR.Deleted, d.Descriptor[i].Name)
102 }
103 }
104
105 if silent {
106 _ = metrics.TmplJSON.Execute(Stdout, dR)
107 } else {
108 monutil.ClearTerminal()
109 _ = metrics.TmplDeleteReport.Execute(Stdout, dR)
110 fmt.Printf("\n\n%s", monutil.White(mmBroomTitle))
111 }
112 return nil
113 }
114
115
116 func checkDeleteFlags() bool {
117 return true
118 }
119
120
121 func deleteDescriptor(ctx context.Context, d *metrics.Descriptor) error {
122 pID := metrics.ParseProjectID(d.Name)
123 mName := metrics.ParseMetricName(d.Name)
124 prefix := metrics.ParsePrefix(d.Name)
125
126 dClient, err := metrics.New(ctx, pID)
127 if err != nil {
128 return err
129 }
130
131 return dClient.DeleteDescriptor(prefix, mName)
132 }
133
View as plain text