github.com/vmware/govmomi@v0.51.0/cli/cluster/rule/create.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 rule
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  
    11  	"github.com/vmware/govmomi/cli"
    12  	"github.com/vmware/govmomi/vim25/types"
    13  )
    14  
    15  type create struct {
    16  	*SpecFlag
    17  	*InfoFlag
    18  
    19  	vmhost       bool
    20  	affinity     bool
    21  	antiaffinity bool
    22  	depends      bool
    23  }
    24  
    25  func init() {
    26  	cli.Register("cluster.rule.create", &create{})
    27  }
    28  
    29  func (cmd *create) Register(ctx context.Context, f *flag.FlagSet) {
    30  	cmd.SpecFlag = new(SpecFlag)
    31  	cmd.SpecFlag.Register(ctx, f)
    32  
    33  	cmd.InfoFlag, ctx = NewInfoFlag(ctx)
    34  	cmd.InfoFlag.Register(ctx, f)
    35  
    36  	f.BoolVar(&cmd.vmhost, "vm-host", false, "Virtual Machines to Hosts")
    37  	f.BoolVar(&cmd.affinity, "affinity", false, "Keep Virtual Machines Together")
    38  	f.BoolVar(&cmd.antiaffinity, "anti-affinity", false, "Separate Virtual Machines")
    39  	f.BoolVar(&cmd.depends, "depends", false, "Virtual Machines to Virtual Machines")
    40  }
    41  
    42  func (cmd *create) Process(ctx context.Context) error {
    43  	if cmd.name == "" {
    44  		return flag.ErrHelp
    45  	}
    46  	return cmd.InfoFlag.Process(ctx)
    47  }
    48  
    49  func (cmd *create) Usage() string {
    50  	return "NAME..."
    51  }
    52  
    53  func (cmd *create) Description() string {
    54  	return `Create cluster rule.
    55  
    56  Rules are not enabled by default, use the 'enable' flag to enable upon creation or cluster.rule.change after creation.
    57  
    58  One of '-affinity', '-anti-affinity', '-depends' or '-vm-host' must be provided to specify the rule type.
    59  
    60  With '-affinity' or '-anti-affinity', at least 2 vm NAME arguments must be specified.
    61  
    62  With '-depends', vm group NAME and vm group dependency NAME arguments must be specified.
    63  
    64  With '-vm-host', use the '-vm-group' flag combined with the '-host-affine-group' and/or '-host-anti-affine-group' flags.
    65  
    66  Examples:
    67    govc cluster.rule.create -name pod1 -enable -affinity vm_a vm_b vm_c
    68    govc cluster.rule.create -name pod2 -enable -anti-affinity vm_d vm_e vm_f
    69    govc cluster.rule.create -name pod3 -enable -mandatory -vm-host -vm-group my_vms -host-affine-group my_hosts
    70    govc cluster.rule.create -name pod4 -depends vm_group_app vm_group_db`
    71  }
    72  
    73  func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {
    74  	args := f.Args()
    75  	update := types.ArrayUpdateSpec{Operation: types.ArrayUpdateOperationAdd}
    76  	var rule types.BaseClusterRuleInfo
    77  	var err error
    78  
    79  	switch {
    80  	case cmd.vmhost:
    81  		rule = &cmd.ClusterVmHostRuleInfo
    82  	case cmd.affinity:
    83  		rule = &cmd.ClusterAffinityRuleSpec
    84  		if len(args) < 2 {
    85  			return flag.ErrHelp // can't create this rule without 2 or more hosts
    86  		}
    87  		cmd.ClusterAffinityRuleSpec.Vm, err = cmd.ObjectList(ctx, "VirtualMachine", args)
    88  		if err != nil {
    89  			return err
    90  		}
    91  	case cmd.antiaffinity:
    92  		rule = &cmd.ClusterAntiAffinityRuleSpec
    93  		if len(args) < 2 {
    94  			return flag.ErrHelp // can't create this rule without 2 or more hosts
    95  		}
    96  		cmd.ClusterAntiAffinityRuleSpec.Vm, err = cmd.ObjectList(ctx, "VirtualMachine", args)
    97  		if err != nil {
    98  			return err
    99  		}
   100  	case cmd.depends:
   101  		if len(args) != 2 {
   102  			return flag.ErrHelp
   103  		}
   104  		rule = &types.ClusterDependencyRuleInfo{
   105  			VmGroup:          args[0],
   106  			DependsOnVmGroup: args[1],
   107  		}
   108  	default:
   109  		return flag.ErrHelp
   110  	}
   111  
   112  	if cmd.Enabled == nil {
   113  		// ClusterDependencyRuleInfo throws InvalidArgument if Enabled == nil
   114  		cmd.Enabled = types.NewBool(false)
   115  	}
   116  
   117  	info := rule.GetClusterRuleInfo()
   118  	info.Name = cmd.name
   119  	info.Enabled = cmd.Enabled
   120  	info.Mandatory = cmd.Mandatory
   121  	info.UserCreated = types.NewBool(true)
   122  
   123  	return cmd.Apply(ctx, update, rule)
   124  }