github.com/vmware/govmomi@v0.51.0/cli/datastore/cluster/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 cluster 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/object" 18 "github.com/vmware/govmomi/property" 19 "github.com/vmware/govmomi/vim25/mo" 20 "github.com/vmware/govmomi/vim25/types" 21 ) 22 23 type info struct { 24 *flags.DatacenterFlag 25 } 26 27 func init() { 28 cli.Register("datastore.cluster.info", &info{}) 29 } 30 31 func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) 33 cmd.DatacenterFlag.Register(ctx, f) 34 } 35 36 func (cmd *info) Usage() string { 37 return "[PATH]..." 38 } 39 40 func (cmd *info) Description() string { 41 return `Display datastore cluster info. 42 43 Examples: 44 govc datastore.cluster.info 45 govc datastore.cluster.info MyDatastoreCluster` 46 } 47 48 func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error { 49 c, err := cmd.Client() 50 if err != nil { 51 return err 52 } 53 54 finder, err := cmd.Finder() 55 if err != nil { 56 return err 57 } 58 59 args := f.Args() 60 if len(args) == 0 { 61 args = []string{"*"} 62 } 63 64 var res infoResult 65 var props []string 66 67 if cmd.OutputFlag.All() { 68 props = nil // Load everything 69 } else { 70 props = []string{"podStorageDrsEntry", "summary"} // Load summary 71 } 72 73 for _, arg := range args { 74 objects, err := finder.DatastoreClusterList(ctx, arg) 75 if err != nil { 76 return err 77 } 78 res.objects = append(res.objects, objects...) 79 } 80 81 if len(res.objects) != 0 { 82 refs := make([]types.ManagedObjectReference, 0, len(res.objects)) 83 for _, o := range res.objects { 84 refs = append(refs, o.Reference()) 85 } 86 87 pc := property.DefaultCollector(c) 88 err = pc.Retrieve(ctx, refs, props, &res.Clusters) 89 if err != nil { 90 return err 91 } 92 } 93 94 return cmd.WriteResult(&res) 95 } 96 97 type infoResult struct { 98 Clusters []mo.StoragePod `json:"clusters"` 99 objects []*object.StoragePod 100 } 101 102 func (r *infoResult) Write(w io.Writer) error { 103 // Maintain order via r.objects as Property collector does not always return results in order. 104 objects := make(map[types.ManagedObjectReference]mo.StoragePod, len(r.Clusters)) 105 for _, o := range r.Clusters { 106 objects[o.Reference()] = o 107 } 108 109 tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0) 110 111 for _, o := range r.objects { 112 ds := objects[o.Reference()] 113 s := ds.Summary 114 c := ds.PodStorageDrsEntry.StorageDrsConfig 115 fmt.Fprintf(tw, "Name:\t%s\n", s.Name) 116 fmt.Fprintf(tw, " Path:\t%s\n", o.InventoryPath) 117 fmt.Fprintf(tw, " Capacity:\t%.1f GB\n", float64(s.Capacity)/(1<<30)) 118 fmt.Fprintf(tw, " Free:\t%.1f GB\n", float64(s.FreeSpace)/(1<<30)) 119 fmt.Fprintf(tw, " SDRS Enabled:\t%t\n", c.PodConfig.Enabled) 120 fmt.Fprintf(tw, " SDRS Mode:\t%s\n", c.PodConfig.DefaultVmBehavior) 121 } 122 123 return tw.Flush() 124 }