...

Source file src/edge-infra.dev/cmd/edge/monitoring/metermaid/cli/delete.go

Documentation: edge-infra.dev/cmd/edge/monitoring/metermaid/cli

     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  	// retrieve list of metric descriptors for all projectIDs specified
    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  	// necessary when specifying multiple projects as foreman is a multi-project source
    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  	// filter by labels
    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  	// parse through descriptors list to delete
    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 { // output report to json
   106  		_ = metrics.TmplJSON.Execute(Stdout, dR)
   107  	} else { // output visual layout of align report
   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  // checkGetFlags validates the required get subcommand flags have been provided.
   116  func checkDeleteFlags() bool {
   117  	return true
   118  }
   119  
   120  // create client and delete request
   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