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  }