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