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 }