github.com/vmware/govmomi@v0.51.0/cli/disk/metadata/ls.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 metadata
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"io"
    12  	"os"
    13  	"text/tabwriter"
    14  
    15  	"github.com/vmware/govmomi/cli"
    16  	"github.com/vmware/govmomi/cli/flags"
    17  	"github.com/vmware/govmomi/vim25/types"
    18  	"github.com/vmware/govmomi/vslm"
    19  )
    20  
    21  type ls struct {
    22  	*flags.OutputFlag
    23  	*flags.ClientFlag
    24  
    25  	key      string
    26  	prefix   string
    27  	snapshot string
    28  }
    29  
    30  func init() {
    31  	cli.Register("disk.metadata.ls", &ls{})
    32  }
    33  
    34  func (cmd *ls) Register(ctx context.Context, f *flag.FlagSet) {
    35  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    36  	cmd.OutputFlag.Register(ctx, f)
    37  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    38  	cmd.ClientFlag.Register(ctx, f)
    39  
    40  	f.StringVar(&cmd.key, "K", "", "Get value for key only")
    41  	f.StringVar(&cmd.prefix, "p", "", "Key filter prefix")
    42  	f.StringVar(&cmd.snapshot, "s", "", "Snapshot ID")
    43  }
    44  
    45  func (cmd *ls) Process(ctx context.Context) error {
    46  	if err := cmd.OutputFlag.Process(ctx); err != nil {
    47  		return err
    48  	}
    49  	return cmd.ClientFlag.Process(ctx)
    50  }
    51  
    52  func (cmd *ls) Usage() string {
    53  	return "ID"
    54  }
    55  
    56  func (cmd *ls) Description() string {
    57  	return `List metadata for disk ID.
    58  
    59  Examples:
    60    govc disk.metadata.ls 9b06a8b-d047-4d3c-b15b-43ea9608b1a6`
    61  }
    62  
    63  type lsResult []types.KeyValue
    64  
    65  func (r lsResult) Write(w io.Writer) error {
    66  	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
    67  	for _, data := range r {
    68  		fmt.Fprintf(tw, "%s\t%s\n", data.Key, data.Value)
    69  	}
    70  	return tw.Flush()
    71  }
    72  
    73  func (r lsResult) Dump() any {
    74  	return []types.KeyValue(r)
    75  }
    76  
    77  func (cmd *ls) Run(ctx context.Context, f *flag.FlagSet) error {
    78  	if f.NArg() != 1 {
    79  		return flag.ErrHelp
    80  	}
    81  
    82  	c, err := cmd.Client()
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	vc, err := vslm.NewClient(ctx, c)
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	m := vslm.NewGlobalObjectManager(vc)
    93  
    94  	id := types.ID{Id: f.Arg(0)}
    95  	var data []types.KeyValue
    96  	var sid *types.ID
    97  	if cmd.snapshot != "" {
    98  		sid = &types.ID{Id: cmd.snapshot}
    99  	}
   100  
   101  	if cmd.key != "" {
   102  		val, err := m.RetrieveMetadataValue(ctx, id, sid, cmd.key)
   103  		if err != nil {
   104  			return err
   105  		}
   106  		data = []types.KeyValue{{Key: cmd.key, Value: val}}
   107  	} else {
   108  		data, err = m.RetrieveMetadata(ctx, id, sid, cmd.prefix)
   109  		if err != nil {
   110  			return err
   111  		}
   112  	}
   113  
   114  	return cmd.WriteResult(lsResult(data))
   115  }