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  }