github.com/vmware/govmomi@v0.37.2/govc/cluster/override/change.go (about)

     1  /*
     2  Copyright (c) 2017 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 := []string{
    56  		string(types.ClusterDasVmSettingsRestartPriorityDisabled),
    57  		string(types.ClusterDasVmSettingsRestartPriorityLowest),
    58  		string(types.ClusterDasVmSettingsRestartPriorityLow),
    59  		string(types.ClusterDasVmSettingsRestartPriorityMedium),
    60  		string(types.ClusterDasVmSettingsRestartPriorityHigh),
    61  		string(types.ClusterDasVmSettingsRestartPriorityHighest),
    62  	}
    63  	cmd.das.DasSettings = new(types.ClusterDasVmSettings)
    64  
    65  	f.StringVar((*string)(&cmd.das.DasSettings.RestartPriority), "ha-restart-priority", "", "HA restart priority: "+strings.Join(rp, ", "))
    66  
    67  	f.Var(flags.NewInt32(&cmd.orc.VmReadiness.PostReadyDelay), "ha-additional-delay", "HA Additional Delay")
    68  
    69  	rc := []string{
    70  		string(types.ClusterVmReadinessReadyConditionPoweredOn),
    71  		string(types.ClusterVmReadinessReadyConditionGuestHbStatusGreen),
    72  		string(types.ClusterVmReadinessReadyConditionAppHbStatusGreen),
    73  		string(types.ClusterVmReadinessReadyConditionUseClusterDefault),
    74  	}
    75  	f.StringVar((*string)(&cmd.orc.VmReadiness.ReadyCondition), "ha-ready-condition", "", "HA VM Ready Condition (Start next priority VMs when): "+strings.Join(rc, ", "))
    76  }
    77  
    78  func (cmd *change) Description() string {
    79  	return `Change cluster VM overrides.
    80  
    81  Examples:
    82    govc cluster.override.change -cluster cluster_1 -vm vm_1 -drs-enabled=false
    83    govc cluster.override.change -cluster cluster_1 -vm vm_2 -drs-enabled -drs-mode fullyAutomated
    84    govc cluster.override.change -cluster cluster_1 -vm vm_3 -ha-restart-priority high
    85    govc cluster.override.change -cluster cluster_1 -vm vm_4 -ha-additional-delay 30
    86    govc cluster.override.change -cluster cluster_1 -vm vm_5 -ha-ready-condition poweredOn`
    87  }
    88  
    89  func (cmd *change) Process(ctx context.Context) error {
    90  	if err := cmd.ClusterFlag.Process(ctx); err != nil {
    91  		return err
    92  	}
    93  	return cmd.VirtualMachineFlag.Process(ctx)
    94  }
    95  
    96  func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error {
    97  	vm, err := cmd.VirtualMachine()
    98  	if err != nil {
    99  		return err
   100  	}
   101  
   102  	if vm == nil {
   103  		return flag.ErrHelp
   104  	}
   105  
   106  	cluster, err := cmd.Cluster()
   107  	if err != nil {
   108  		return err
   109  	}
   110  
   111  	config, err := cluster.Configuration(ctx)
   112  	if err != nil {
   113  		return err
   114  	}
   115  
   116  	spec := &types.ClusterConfigSpecEx{}
   117  	cmd.drs.Key = vm.Reference()
   118  	cmd.das.Key = vm.Reference()
   119  	cmd.orc.Vm = vm.Reference()
   120  
   121  	if cmd.drs.Behavior != "" || cmd.drs.Enabled != nil {
   122  		op := types.ArrayUpdateOperationAdd
   123  		for _, c := range config.DrsVmConfig {
   124  			if c.Key == cmd.drs.Key {
   125  				op = types.ArrayUpdateOperationEdit
   126  				break
   127  			}
   128  		}
   129  
   130  		spec.DrsVmConfigSpec = []types.ClusterDrsVmConfigSpec{
   131  			{
   132  				ArrayUpdateSpec: types.ArrayUpdateSpec{
   133  					Operation: op,
   134  				},
   135  				Info: &cmd.drs,
   136  			},
   137  		}
   138  	}
   139  
   140  	if cmd.das.DasSettings.RestartPriority != "" {
   141  		op := types.ArrayUpdateOperationAdd
   142  		for _, c := range config.DasVmConfig {
   143  			if c.Key == cmd.das.Key {
   144  				op = types.ArrayUpdateOperationEdit
   145  				break
   146  			}
   147  		}
   148  
   149  		spec.DasVmConfigSpec = []types.ClusterDasVmConfigSpec{
   150  			{
   151  				ArrayUpdateSpec: types.ArrayUpdateSpec{
   152  					Operation: op,
   153  				},
   154  				Info: &cmd.das,
   155  			},
   156  		}
   157  	}
   158  
   159  	if cmd.orc.VmReadiness.PostReadyDelay > 0 || cmd.orc.VmReadiness.ReadyCondition != "" {
   160  		op := types.ArrayUpdateOperationAdd
   161  		for _, c := range config.VmOrchestration {
   162  			if c.Vm == cmd.orc.Vm {
   163  				op = types.ArrayUpdateOperationEdit
   164  				break
   165  			}
   166  		}
   167  		spec.VmOrchestrationSpec = []types.ClusterVmOrchestrationSpec{
   168  			{
   169  				ArrayUpdateSpec: types.ArrayUpdateSpec{
   170  					Operation: op,
   171  				},
   172  				Info: &cmd.orc,
   173  			},
   174  		}
   175  	}
   176  
   177  	if spec.DrsVmConfigSpec == nil && spec.DasVmConfigSpec == nil && spec.VmOrchestrationSpec == nil {
   178  		return flag.ErrHelp
   179  	}
   180  
   181  	return cmd.Reconfigure(ctx, spec)
   182  }