github.com/vmware/govmomi@v0.51.0/cli/host/autostart/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 autostart
     6  
     7  import (
     8  	"context"
     9  	"encoding/json"
    10  	"flag"
    11  	"fmt"
    12  	"io"
    13  	"os"
    14  	"text/tabwriter"
    15  
    16  	"github.com/vmware/govmomi/cli"
    17  	"github.com/vmware/govmomi/cli/flags"
    18  	"github.com/vmware/govmomi/vim25"
    19  	"github.com/vmware/govmomi/vim25/mo"
    20  )
    21  
    22  type info struct {
    23  	cli.Command
    24  
    25  	*AutostartFlag
    26  	*flags.OutputFlag
    27  }
    28  
    29  func init() {
    30  	cli.Register("host.autostart.info", &info{})
    31  }
    32  
    33  func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) {
    34  	cmd.AutostartFlag, ctx = newAutostartFlag(ctx)
    35  	cmd.AutostartFlag.Register(ctx, f)
    36  	cmd.OutputFlag, ctx = flags.NewOutputFlag(ctx)
    37  	cmd.OutputFlag.Register(ctx, f)
    38  }
    39  
    40  func (cmd *info) Process(ctx context.Context) error {
    41  	if err := cmd.AutostartFlag.Process(ctx); err != nil {
    42  		return err
    43  	}
    44  	if err := cmd.OutputFlag.Process(ctx); err != nil {
    45  		return err
    46  	}
    47  	return nil
    48  }
    49  
    50  func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error {
    51  	client, err := cmd.Client()
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	mhas, err := cmd.HostAutoStartManager()
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	return cmd.WriteResult(&infoResult{client, mhas})
    62  }
    63  
    64  type infoResult struct {
    65  	client *vim25.Client
    66  	mhas   *mo.HostAutoStartManager
    67  }
    68  
    69  func (r *infoResult) MarshalJSON() ([]byte, error) {
    70  	return json.Marshal(r.mhas)
    71  }
    72  
    73  // vmPaths resolves the paths for the VMs in the result.
    74  func (r *infoResult) vmPaths() (map[string]string, error) {
    75  	ctx := context.TODO()
    76  	paths := make(map[string]string)
    77  	for _, info := range r.mhas.Config.PowerInfo {
    78  		mes, err := mo.Ancestors(ctx, r.client, r.client.ServiceContent.PropertyCollector, info.Key)
    79  		if err != nil {
    80  			return nil, err
    81  		}
    82  
    83  		path := ""
    84  		for _, me := range mes {
    85  			// Skip root entity in building inventory path.
    86  			if me.Parent == nil {
    87  				continue
    88  			}
    89  			path += "/" + me.Name
    90  		}
    91  
    92  		paths[info.Key.Value] = path
    93  	}
    94  
    95  	return paths, nil
    96  }
    97  
    98  func (r *infoResult) Write(w io.Writer) error {
    99  	paths, err := r.vmPaths()
   100  	if err != nil {
   101  		return err
   102  	}
   103  
   104  	tw := tabwriter.NewWriter(os.Stdout, 2, 0, 2, ' ', 0)
   105  
   106  	fmt.Fprintf(tw, "VM")
   107  	fmt.Fprintf(tw, "\tStartAction")
   108  	fmt.Fprintf(tw, "\tStartDelay")
   109  	fmt.Fprintf(tw, "\tStartOrder")
   110  	fmt.Fprintf(tw, "\tStopAction")
   111  	fmt.Fprintf(tw, "\tStopDelay")
   112  	fmt.Fprintf(tw, "\tWaitForHeartbeat")
   113  	fmt.Fprintf(tw, "\n")
   114  
   115  	for _, info := range r.mhas.Config.PowerInfo {
   116  		fmt.Fprintf(tw, "%s", paths[info.Key.Value])
   117  		fmt.Fprintf(tw, "\t%s", info.StartAction)
   118  		fmt.Fprintf(tw, "\t%d", info.StartDelay)
   119  		fmt.Fprintf(tw, "\t%d", info.StartOrder)
   120  		fmt.Fprintf(tw, "\t%s", info.StopAction)
   121  		fmt.Fprintf(tw, "\t%d", info.StopDelay)
   122  		fmt.Fprintf(tw, "\t%s", info.WaitForHeartbeat)
   123  		fmt.Fprintf(tw, "\n")
   124  	}
   125  
   126  	_ = tw.Flush()
   127  	return nil
   128  }