github.com/vmware/govmomi@v0.51.0/cli/vm/dataset/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 dataset
     6  
     7  import (
     8  	"context"
     9  	"errors"
    10  	"flag"
    11  	"fmt"
    12  	"io"
    13  	"text/tabwriter"
    14  
    15  	"github.com/vmware/govmomi/cli"
    16  	"github.com/vmware/govmomi/cli/flags"
    17  	"github.com/vmware/govmomi/vapi/vm/dataset"
    18  )
    19  
    20  type info struct {
    21  	*flags.VirtualMachineFlag
    22  	*flags.OutputFlag
    23  }
    24  
    25  func init() {
    26  	cli.Register("vm.dataset.info", &info{})
    27  }
    28  
    29  func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) {
    30  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    31  	cmd.OutputFlag.Register(ctx, f)
    32  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    33  	cmd.VirtualMachineFlag.Register(ctx, f)
    34  }
    35  
    36  func (cmd *info) Process(ctx context.Context) error {
    37  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    38  		return err
    39  	}
    40  	return cmd.OutputFlag.Process(ctx)
    41  }
    42  
    43  func (cmd *info) Usage() string {
    44  	return "NAME"
    45  }
    46  
    47  func (cmd *info) Description() string {
    48  	return `Display data set information.
    49  
    50  Examples:
    51    govc vm.dataset.info -vm $vm
    52    govc vm.dataset.info -vm $vm com.example.project2`
    53  }
    54  
    55  type infoResult []*dataset.Info
    56  
    57  func (r infoResult) Write(w io.Writer) error {
    58  	tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0)
    59  
    60  	for _, item := range r {
    61  		fmt.Fprintf(tw, "Name:\t%s\n", item.Name)
    62  		fmt.Fprintf(tw, "  Description:\t%s\n", item.Description)
    63  		fmt.Fprintf(tw, "  Host:\t%s\n", item.Host)
    64  		fmt.Fprintf(tw, "  Guest:\t%s\n", item.Guest)
    65  		fmt.Fprintf(tw, "  Used: \t%d\n", item.Used)
    66  		fmt.Fprintf(tw, "  OmitFromSnapshotAndClone: \t%t\n", item.OmitFromSnapshotAndClone)
    67  	}
    68  
    69  	return tw.Flush()
    70  }
    71  
    72  func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error {
    73  	if f.NArg() > 1 {
    74  		return errors.New("please specify at most one data set")
    75  	}
    76  
    77  	vm, err := cmd.VirtualMachineFlag.VirtualMachine()
    78  	if err != nil {
    79  		return err
    80  	}
    81  	if vm == nil {
    82  		return flag.ErrHelp
    83  	}
    84  	vmId := vm.Reference().Value
    85  
    86  	c, err := cmd.RestClient()
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	mgr := dataset.NewManager(c)
    92  
    93  	// Discover the relevant data set id(s)
    94  	var ids []string
    95  	if f.NArg() == 1 {
    96  		// single data set
    97  		id, err := FindDataSetId(ctx, mgr, vmId, f.Arg(0))
    98  		if err != nil {
    99  			return err
   100  		}
   101  		ids = []string{id}
   102  	} else {
   103  		// all data sets
   104  		l, err := mgr.ListDataSets(ctx, vmId)
   105  		if err != nil {
   106  			return err
   107  		}
   108  		for _, summary := range l {
   109  			ids = append(ids, summary.DataSet)
   110  		}
   111  	}
   112  
   113  	// Fetch the information for each data set id
   114  	var res []*dataset.Info
   115  	for _, id := range ids {
   116  		inf, err := mgr.GetDataSet(ctx, vmId, id)
   117  		if err != nil {
   118  			return err
   119  		}
   120  		res = append(res, inf)
   121  	}
   122  
   123  	return cmd.WriteResult(infoResult(res))
   124  }