github.com/vmware/govmomi@v0.51.0/cli/tags/info.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package tags
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"io"
    12  	"text/tabwriter"
    13  
    14  	"github.com/vmware/govmomi/cli"
    15  	"github.com/vmware/govmomi/cli/flags"
    16  	"github.com/vmware/govmomi/vapi/tags"
    17  )
    18  
    19  type info struct {
    20  	*flags.ClientFlag
    21  	*flags.OutputFlag
    22  	c string
    23  	C bool
    24  }
    25  
    26  func init() {
    27  	cli.Register("tags.info", &info{})
    28  }
    29  
    30  func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) {
    31  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    32  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    33  	cmd.ClientFlag.Register(ctx, f)
    34  	cmd.OutputFlag.Register(ctx, f)
    35  	f.StringVar(&cmd.c, "c", "", "Category name")
    36  	f.BoolVar(&cmd.C, "C", true, "Display category name instead of ID")
    37  }
    38  
    39  func (cmd *info) Process(ctx context.Context) error {
    40  	if err := cmd.ClientFlag.Process(ctx); err != nil {
    41  		return err
    42  	}
    43  	return cmd.OutputFlag.Process(ctx)
    44  }
    45  
    46  func (cmd *info) Usage() string {
    47  	return "NAME"
    48  }
    49  
    50  func (cmd *info) Description() string {
    51  	return `Display tags info.
    52  
    53  If NAME is provided, display info for only that tag.  Otherwise display info for all tags.
    54  
    55  Examples:
    56    govc tags.info
    57    govc tags.info k8s-zone-us-ca1
    58    govc tags.info -c k8s-zone`
    59  }
    60  
    61  type infoResult []tags.Tag
    62  
    63  func (t infoResult) Write(w io.Writer) error {
    64  	tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0)
    65  
    66  	for _, item := range t {
    67  		fmt.Fprintf(tw, "Name:\t%s\n", item.Name)
    68  		fmt.Fprintf(tw, "  ID:\t%s\n", item.ID)
    69  		fmt.Fprintf(tw, "  Description:\t%s\n", item.Description)
    70  		fmt.Fprintf(tw, "  Category:\t%s\n", item.CategoryID)
    71  		fmt.Fprintf(tw, "  UsedBy: %s\n", item.UsedBy)
    72  	}
    73  
    74  	return tw.Flush()
    75  }
    76  
    77  func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error {
    78  	c, err := cmd.RestClient()
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	m := tags.NewManager(c)
    84  	var res lsResult
    85  
    86  	if cmd.c == "" {
    87  		res, err = m.GetTags(ctx)
    88  	} else {
    89  		res, err = m.GetTagsForCategory(ctx, cmd.c)
    90  	}
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	if f.NArg() == 1 {
    96  		arg := f.Arg(0)
    97  		src := res
    98  		res = nil
    99  		for i := range src {
   100  			if src[i].Name == arg || src[i].ID == arg {
   101  				res = append(res, src[i])
   102  			}
   103  		}
   104  		if len(res) == 0 {
   105  			return fmt.Errorf("tag %q not found", arg)
   106  		}
   107  	}
   108  
   109  	if cmd.C {
   110  		categories, err := m.GetCategories(ctx)
   111  		if err != nil {
   112  			return err
   113  		}
   114  		m := make(map[string]tags.Category)
   115  		for _, category := range categories {
   116  			m[category.ID] = category
   117  		}
   118  		for i := range res {
   119  			res[i].CategoryID = m[res[i].CategoryID].Name
   120  		}
   121  	}
   122  
   123  	return cmd.WriteResult(infoResult(res))
   124  }