github.com/vmware/govmomi@v0.37.2/govc/datastore/cluster/info.go (about)

     1  /*
     2  Copyright (c) 2018-2023 VMware, Inc. All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package cluster
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"fmt"
    23  	"io"
    24  	"os"
    25  	"text/tabwriter"
    26  
    27  	"github.com/vmware/govmomi/govc/cli"
    28  	"github.com/vmware/govmomi/govc/flags"
    29  	"github.com/vmware/govmomi/object"
    30  	"github.com/vmware/govmomi/property"
    31  	"github.com/vmware/govmomi/vim25/mo"
    32  	"github.com/vmware/govmomi/vim25/types"
    33  )
    34  
    35  type info struct {
    36  	*flags.DatacenterFlag
    37  }
    38  
    39  func init() {
    40  	cli.Register("datastore.cluster.info", &info{})
    41  }
    42  
    43  func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) {
    44  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    45  	cmd.DatacenterFlag.Register(ctx, f)
    46  }
    47  
    48  func (cmd *info) Usage() string {
    49  	return "[PATH]..."
    50  }
    51  
    52  func (cmd *info) Description() string {
    53  	return `Display datastore cluster info.
    54  
    55  Examples:
    56    govc datastore.cluster.info
    57    govc datastore.cluster.info MyDatastoreCluster`
    58  }
    59  
    60  func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error {
    61  	c, err := cmd.Client()
    62  	if err != nil {
    63  		return err
    64  	}
    65  
    66  	finder, err := cmd.Finder()
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	args := f.Args()
    72  	if len(args) == 0 {
    73  		args = []string{"*"}
    74  	}
    75  
    76  	var res infoResult
    77  	var props []string
    78  
    79  	if cmd.OutputFlag.All() {
    80  		props = nil // Load everything
    81  	} else {
    82  		props = []string{"podStorageDrsEntry", "summary"} // Load summary
    83  	}
    84  
    85  	for _, arg := range args {
    86  		objects, err := finder.DatastoreClusterList(ctx, arg)
    87  		if err != nil {
    88  			return err
    89  		}
    90  		res.objects = append(res.objects, objects...)
    91  	}
    92  
    93  	if len(res.objects) != 0 {
    94  		refs := make([]types.ManagedObjectReference, 0, len(res.objects))
    95  		for _, o := range res.objects {
    96  			refs = append(refs, o.Reference())
    97  		}
    98  
    99  		pc := property.DefaultCollector(c)
   100  		err = pc.Retrieve(ctx, refs, props, &res.Clusters)
   101  		if err != nil {
   102  			return err
   103  		}
   104  	}
   105  
   106  	return cmd.WriteResult(&res)
   107  }
   108  
   109  type infoResult struct {
   110  	Clusters []mo.StoragePod `json:"clusters"`
   111  	objects  []*object.StoragePod
   112  }
   113  
   114  func (r *infoResult) Write(w io.Writer) error {
   115  	// Maintain order via r.objects as Property collector does not always return results in order.
   116  	objects := make(map[types.ManagedObjectReference]mo.StoragePod, len(r.Clusters))
   117  	for _, o := range r.Clusters {
   118  		objects[o.Reference()] = o
   119  	}
   120  
   121  	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
   122  
   123  	for _, o := range r.objects {
   124  		ds := objects[o.Reference()]
   125  		s := ds.Summary
   126  		c := ds.PodStorageDrsEntry.StorageDrsConfig
   127  		fmt.Fprintf(tw, "Name:\t%s\n", s.Name)
   128  		fmt.Fprintf(tw, "  Path:\t%s\n", o.InventoryPath)
   129  		fmt.Fprintf(tw, "  Capacity:\t%.1f GB\n", float64(s.Capacity)/(1<<30))
   130  		fmt.Fprintf(tw, "  Free:\t%.1f GB\n", float64(s.FreeSpace)/(1<<30))
   131  		fmt.Fprintf(tw, "  SDRS Enabled:\t%t\n", c.PodConfig.Enabled)
   132  		fmt.Fprintf(tw, "  SDRS Mode:\t%s\n", c.PodConfig.DefaultVmBehavior)
   133  	}
   134  
   135  	return tw.Flush()
   136  }