github.com/vmware/govmomi@v0.51.0/cli/vsan/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 vsan
     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/vsan"
    18  	"github.com/vmware/govmomi/vsan/types"
    19  )
    20  
    21  type info struct {
    22  	*flags.DatacenterFlag
    23  }
    24  
    25  func init() {
    26  	cli.Register("vsan.info", &info{})
    27  }
    28  
    29  func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) {
    30  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    31  	cmd.DatacenterFlag.Register(ctx, f)
    32  }
    33  
    34  func (cmd *info) Usage() string {
    35  	return "CLUSTER..."
    36  }
    37  
    38  func (cmd *info) Description() string {
    39  	return `Display vSAN configuration.
    40  
    41  Examples:
    42    govc vsan.info
    43    govc vsan.info ClusterA
    44    govc vsan.info -json`
    45  }
    46  
    47  func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error {
    48  	vc, err := cmd.Client()
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	c, err := vsan.NewClient(ctx, vc)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	finder, err := cmd.Finder()
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	args := f.Args()
    64  	if len(args) == 0 {
    65  		args = []string{"*"}
    66  	}
    67  
    68  	var res []Cluster
    69  
    70  	for _, arg := range args {
    71  		clusters, err := finder.ClusterComputeResourceList(ctx, arg)
    72  		if err != nil {
    73  			return err
    74  		}
    75  
    76  		for _, cluster := range clusters {
    77  			info, err := c.VsanClusterGetConfig(ctx, cluster.Reference())
    78  			if err != nil {
    79  				return err
    80  			}
    81  			res = append(res, Cluster{cluster.InventoryPath, info})
    82  		}
    83  	}
    84  
    85  	return cmd.WriteResult(&infoResult{res})
    86  }
    87  
    88  type Cluster struct {
    89  	Path string                  `json:"path"`
    90  	Info *types.VsanConfigInfoEx `json:"info"`
    91  }
    92  
    93  type infoResult struct {
    94  	Clusters []Cluster `json:"clusters"`
    95  }
    96  
    97  func (r *infoResult) Write(w io.Writer) error {
    98  	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
    99  
   100  	for _, cluster := range r.Clusters {
   101  		fmt.Fprintf(tw, "Path:\t%s\n", cluster.Path)
   102  		fmt.Fprintf(tw, "  Enabled:\t%t\n", *cluster.Info.Enabled)
   103  		if unmap := cluster.Info.UnmapConfig; unmap != nil {
   104  			fmt.Fprintf(tw, "  Unmap Enabled:\t%t\n", unmap.Enable)
   105  		}
   106  		if fs := cluster.Info.FileServiceConfig; fs != nil {
   107  			fmt.Fprintf(tw, "  FileService Enabled:\t%t\n", fs.Enabled)
   108  		}
   109  	}
   110  
   111  	return tw.Flush()
   112  }