github.com/vmware/govmomi@v0.51.0/cli/cluster/override/change.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 "strings" 11 12 "github.com/vmware/govmomi/cli" 13 "github.com/vmware/govmomi/cli/cluster" 14 "github.com/vmware/govmomi/cli/flags" 15 "github.com/vmware/govmomi/vim25/types" 16 ) 17 18 type change struct { 19 *flags.ClusterFlag 20 *flags.VirtualMachineFlag 21 22 drs types.ClusterDrsVmConfigInfo 23 das types.ClusterDasVmConfigInfo 24 orc types.ClusterVmOrchestrationInfo 25 } 26 27 func init() { 28 cli.Register("cluster.override.change", &change{}) 29 } 30 31 func (cmd *change) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.ClusterFlag, ctx = flags.NewClusterFlag(ctx) 33 cmd.ClusterFlag.Register(ctx, f) 34 cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) 35 cmd.VirtualMachineFlag.Register(ctx, f) 36 37 // DRS 38 f.Var(flags.NewOptionalBool(&cmd.drs.Enabled), "drs-enabled", "Enable DRS") 39 40 f.StringVar((*string)(&cmd.drs.Behavior), "drs-mode", "", cluster.DrsBehaviorUsage()) 41 42 // HA 43 rp := types.ClusterDasVmSettingsRestartPriority("").Strings() 44 cmd.das.DasSettings = new(types.ClusterDasVmSettings) 45 46 f.StringVar((*string)(&cmd.das.DasSettings.RestartPriority), "ha-restart-priority", "", "HA restart priority: "+strings.Join(rp, ", ")) 47 48 f.Var(flags.NewInt32(&cmd.orc.VmReadiness.PostReadyDelay), "ha-additional-delay", "HA Additional Delay") 49 50 rc := types.ClusterVmReadinessReadyCondition("").Strings() 51 f.StringVar((*string)(&cmd.orc.VmReadiness.ReadyCondition), "ha-ready-condition", "", "HA VM Ready Condition (Start next priority VMs when): "+strings.Join(rc, ", ")) 52 } 53 54 func (cmd *change) Description() string { 55 return `Change cluster VM overrides. 56 57 Examples: 58 govc cluster.override.change -cluster cluster_1 -vm vm_1 -drs-enabled=false 59 govc cluster.override.change -cluster cluster_1 -vm vm_2 -drs-enabled -drs-mode fullyAutomated 60 govc cluster.override.change -cluster cluster_1 -vm vm_3 -ha-restart-priority high 61 govc cluster.override.change -cluster cluster_1 -vm vm_4 -ha-additional-delay 30 62 govc cluster.override.change -cluster cluster_1 -vm vm_5 -ha-ready-condition poweredOn` 63 } 64 65 func (cmd *change) Process(ctx context.Context) error { 66 if err := cmd.ClusterFlag.Process(ctx); err != nil { 67 return err 68 } 69 return cmd.VirtualMachineFlag.Process(ctx) 70 } 71 72 func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error { 73 vm, err := cmd.VirtualMachine() 74 if err != nil { 75 return err 76 } 77 78 if vm == nil { 79 return flag.ErrHelp 80 } 81 82 cluster, err := cmd.Cluster() 83 if err != nil { 84 return err 85 } 86 87 config, err := cluster.Configuration(ctx) 88 if err != nil { 89 return err 90 } 91 92 spec := &types.ClusterConfigSpecEx{} 93 cmd.drs.Key = vm.Reference() 94 cmd.das.Key = vm.Reference() 95 cmd.orc.Vm = vm.Reference() 96 97 if cmd.drs.Behavior != "" || cmd.drs.Enabled != nil { 98 op := types.ArrayUpdateOperationAdd 99 for _, c := range config.DrsVmConfig { 100 if c.Key == cmd.drs.Key { 101 op = types.ArrayUpdateOperationEdit 102 break 103 } 104 } 105 106 spec.DrsVmConfigSpec = []types.ClusterDrsVmConfigSpec{ 107 { 108 ArrayUpdateSpec: types.ArrayUpdateSpec{ 109 Operation: op, 110 }, 111 Info: &cmd.drs, 112 }, 113 } 114 } 115 116 if cmd.das.DasSettings.RestartPriority != "" { 117 op := types.ArrayUpdateOperationAdd 118 for _, c := range config.DasVmConfig { 119 if c.Key == cmd.das.Key { 120 op = types.ArrayUpdateOperationEdit 121 break 122 } 123 } 124 125 spec.DasVmConfigSpec = []types.ClusterDasVmConfigSpec{ 126 { 127 ArrayUpdateSpec: types.ArrayUpdateSpec{ 128 Operation: op, 129 }, 130 Info: &cmd.das, 131 }, 132 } 133 } 134 135 if cmd.orc.VmReadiness.PostReadyDelay > 0 || cmd.orc.VmReadiness.ReadyCondition != "" { 136 op := types.ArrayUpdateOperationAdd 137 for _, c := range config.VmOrchestration { 138 if c.Vm == cmd.orc.Vm { 139 op = types.ArrayUpdateOperationEdit 140 break 141 } 142 } 143 spec.VmOrchestrationSpec = []types.ClusterVmOrchestrationSpec{ 144 { 145 ArrayUpdateSpec: types.ArrayUpdateSpec{ 146 Operation: op, 147 }, 148 Info: &cmd.orc, 149 }, 150 } 151 } 152 153 if spec.DrsVmConfigSpec == nil && spec.DasVmConfigSpec == nil && spec.VmOrchestrationSpec == nil { 154 return flag.ErrHelp 155 } 156 157 return cmd.Reconfigure(ctx, spec) 158 }