github.com/vmware/govmomi@v0.51.0/cli/cluster/override/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 override 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "io" 12 "strings" 13 "text/tabwriter" 14 "time" 15 16 "github.com/vmware/govmomi/cli" 17 "github.com/vmware/govmomi/cli/flags" 18 "github.com/vmware/govmomi/object" 19 "github.com/vmware/govmomi/vim25/types" 20 ) 21 22 type info struct { 23 *flags.ClusterFlag 24 } 25 26 func init() { 27 cli.Register("cluster.override.info", &info{}) 28 } 29 30 func (cmd *info) Register(ctx context.Context, f *flag.FlagSet) { 31 cmd.ClusterFlag, ctx = flags.NewClusterFlag(ctx) 32 cmd.ClusterFlag.Register(ctx, f) 33 } 34 35 func (cmd *info) Description() string { 36 return `Cluster VM overrides info. 37 38 Examples: 39 govc cluster.override.info 40 govc cluster.override.info -json` 41 } 42 43 func (cmd *info) Process(ctx context.Context) error { 44 return cmd.ClusterFlag.Process(ctx) 45 } 46 47 type Override struct { 48 id types.ManagedObjectReference 49 Name string `json:"name"` 50 Host string `json:"host,omitempty"` 51 DRS *types.ClusterDrsVmConfigInfo `json:"drs,omitempty"` 52 DAS *types.ClusterDasVmConfigInfo `json:"das,omitempty"` 53 Orchestration *types.ClusterVmOrchestrationInfo `json:"orchestration,omitempty"` 54 } 55 56 type infoResult struct { 57 Overrides map[string]*Override `json:"overrides"` 58 } 59 60 func (r *infoResult) Write(w io.Writer) error { 61 tw := tabwriter.NewWriter(w, 2, 0, 2, ' ', 0) 62 63 for _, entry := range r.Overrides { 64 behavior := fmt.Sprintf("Default (%s)", types.DrsBehaviorFullyAutomated) 65 if entry.DRS != nil { 66 if *entry.DRS.Enabled { 67 behavior = string(entry.DRS.Behavior) 68 } 69 } 70 71 priority := fmt.Sprintf("Default (%s)", types.DasVmPriorityMedium) 72 if entry.DAS != nil { 73 priority = entry.DAS.DasSettings.RestartPriority 74 } 75 76 ready := "Default (Resources allocated)" 77 additionalDelay := 0 78 if entry.Orchestration != nil { 79 r := entry.Orchestration.VmReadiness 80 if r.ReadyCondition != string(types.ClusterVmReadinessReadyConditionUseClusterDefault) { 81 ready = strings.Title(r.ReadyCondition) 82 } 83 additionalDelay = int(r.PostReadyDelay) 84 } 85 86 fmt.Fprintf(tw, "Name:\t%s\n", entry.Name) 87 fmt.Fprintf(tw, " DRS Automation Level:\t%s\n", strings.Title(behavior)) 88 fmt.Fprintf(tw, " HA Restart Priority:\t%s\n", strings.Title(priority)) 89 fmt.Fprintf(tw, " HA Ready Condition:\t%s\n", strings.Title(ready)) 90 fmt.Fprintf(tw, " HA Additional Delay:\t%s\n", time.Duration(additionalDelay)*time.Second) 91 fmt.Fprintf(tw, " Host:\t%s\n", entry.Host) 92 } 93 94 return tw.Flush() 95 } 96 97 func (r *infoResult) entry(id types.ManagedObjectReference) *Override { 98 key := id.String() 99 vm, ok := r.Overrides[key] 100 if !ok { 101 r.Overrides[key] = &Override{id: id} 102 vm = r.Overrides[key] 103 } 104 return vm 105 } 106 107 func (cmd *info) Run(ctx context.Context, f *flag.FlagSet) error { 108 cluster, err := cmd.Cluster() 109 if err != nil { 110 return err 111 } 112 113 config, err := cluster.Configuration(ctx) 114 if err != nil { 115 return err 116 } 117 118 res := &infoResult{ 119 Overrides: make(map[string]*Override), 120 } 121 122 for i := range config.DasVmConfig { 123 vm := res.entry(config.DasVmConfig[i].Key) 124 125 vm.DAS = &config.DasVmConfig[i] 126 } 127 128 for i := range config.DrsVmConfig { 129 vm := res.entry(config.DrsVmConfig[i].Key) 130 131 vm.DRS = &config.DrsVmConfig[i] 132 } 133 134 for i := range config.VmOrchestration { 135 vm := res.entry(config.VmOrchestration[i].Vm) 136 137 vm.Orchestration = &config.VmOrchestration[i] 138 } 139 140 for _, o := range res.Overrides { 141 // TODO: can optimize to reduce round trips 142 vm := object.NewVirtualMachine(cluster.Client(), o.id) 143 o.Name, _ = vm.ObjectName(ctx) 144 if h, herr := vm.HostSystem(ctx); herr == nil { 145 o.Host, _ = h.ObjectName(ctx) 146 } 147 } 148 149 return cmd.WriteResult(res) 150 }