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

     1  /*
     2  Copyright (c) 2015-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 cluster
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"strings"
    23  
    24  	"github.com/vmware/govmomi/govc/cli"
    25  	"github.com/vmware/govmomi/govc/flags"
    26  	"github.com/vmware/govmomi/vim25/types"
    27  )
    28  
    29  func DrsBehaviorUsage() string {
    30  	drsModes := []string{
    31  		string(types.DrsBehaviorManual),
    32  		string(types.DrsBehaviorPartiallyAutomated),
    33  		string(types.DrsBehaviorFullyAutomated),
    34  	}
    35  
    36  	return "DRS behavior for virtual machines: " + strings.Join(drsModes, ", ")
    37  }
    38  
    39  type change struct {
    40  	*flags.DatacenterFlag
    41  
    42  	types.ClusterConfigSpecEx
    43  }
    44  
    45  func init() {
    46  	cli.Register("cluster.change", &change{})
    47  }
    48  
    49  func (cmd *change) Register(ctx context.Context, f *flag.FlagSet) {
    50  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    51  	cmd.DatacenterFlag.Register(ctx, f)
    52  
    53  	cmd.DrsConfig = new(types.ClusterDrsConfigInfo)
    54  	cmd.DasConfig = new(types.ClusterDasConfigInfo)
    55  	cmd.VsanConfig = new(types.VsanClusterConfigInfo)
    56  	cmd.VsanConfig.DefaultConfig = new(types.VsanClusterConfigInfoHostDefaultInfo)
    57  
    58  	// DRS
    59  	f.Var(flags.NewOptionalBool(&cmd.DrsConfig.Enabled), "drs-enabled", "Enable DRS")
    60  
    61  	f.StringVar((*string)(&cmd.DrsConfig.DefaultVmBehavior), "drs-mode", "", DrsBehaviorUsage())
    62  
    63  	f.Var(flags.NewInt32(&cmd.DrsConfig.VmotionRate), "drs-vmotion-rate", "Aggressiveness of vMotions (1-5)")
    64  
    65  	// HA
    66  	f.Var(flags.NewOptionalBool(&cmd.DasConfig.Enabled), "ha-enabled", "Enable HA")
    67  	f.Var(flags.NewOptionalBool(&cmd.DasConfig.AdmissionControlEnabled), "ha-admission-control-enabled", "Enable HA admission control")
    68  
    69  	// vSAN
    70  	f.Var(flags.NewOptionalBool(&cmd.VsanConfig.Enabled), "vsan-enabled", "Enable vSAN")
    71  	f.Var(flags.NewOptionalBool(&cmd.VsanConfig.DefaultConfig.AutoClaimStorage), "vsan-autoclaim", "Autoclaim storage on cluster hosts")
    72  }
    73  
    74  func (cmd *change) Process(ctx context.Context) error {
    75  	if err := cmd.DatacenterFlag.Process(ctx); err != nil {
    76  		return err
    77  	}
    78  	return nil
    79  }
    80  
    81  func (cmd *change) Usage() string {
    82  	return "CLUSTER..."
    83  }
    84  
    85  func (cmd *change) Description() string {
    86  	return `Change configuration of the given clusters.
    87  
    88  Examples:
    89    govc cluster.change -drs-enabled -vsan-enabled -vsan-autoclaim ClusterA
    90    govc cluster.change -drs-enabled=false ClusterB
    91    govc cluster.change -drs-vmotion-rate=4 ClusterC`
    92  }
    93  
    94  func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error {
    95  	if f.NArg() == 0 {
    96  		return flag.ErrHelp
    97  	}
    98  
    99  	finder, err := cmd.Finder()
   100  	if err != nil {
   101  		return err
   102  	}
   103  
   104  	for _, path := range f.Args() {
   105  		clusters, err := finder.ClusterComputeResourceList(ctx, path)
   106  		if err != nil {
   107  			return err
   108  		}
   109  
   110  		for _, cluster := range clusters {
   111  			task, err := cluster.Reconfigure(ctx, &cmd.ClusterConfigSpecEx, true)
   112  			if err != nil {
   113  				return err
   114  			}
   115  
   116  			_, err = task.WaitForResult(ctx, nil)
   117  			if err != nil {
   118  				return err
   119  			}
   120  		}
   121  	}
   122  
   123  	return nil
   124  }