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 }