github.com/vmware/govmomi@v0.51.0/cli/fields/set.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 fields 6 7 import ( 8 "context" 9 "flag" 10 "strings" 11 12 "github.com/vmware/govmomi/cli" 13 "github.com/vmware/govmomi/cli/flags" 14 "github.com/vmware/govmomi/object" 15 ) 16 17 type set struct { 18 *flags.DatacenterFlag 19 add bool 20 kind string 21 } 22 23 func init() { 24 cli.Register("fields.set", &set{}) 25 } 26 27 func (cmd *set) Register(ctx context.Context, f *flag.FlagSet) { 28 cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) 29 cmd.DatacenterFlag.Register(ctx, f) 30 31 f.StringVar(&cmd.kind, "type", "", "Managed object type on which to add "+ 32 "the field if it does not exist. This flag is ignored unless -add=true") 33 f.BoolVar(&cmd.add, "add", false, "Adds the field if it does not exist. "+ 34 "Use the -type flag to specify the managed object type to which the "+ 35 "field is added. Using -add and omitting -kind causes a new, global "+ 36 "field to be created if a field with the provided name does not "+ 37 "already exist.") 38 } 39 40 func (cmd *set) Usage() string { 41 return "KEY VALUE PATH..." 42 } 43 44 func (cmd *set) Description() string { 45 return `Set custom field values for PATH. 46 47 Examples: 48 govc fields.set my-field-name field-value vm/my-vm 49 govc fields.set -add my-new-global-field-name field-value vm/my-vm 50 govc fields.set -add -type VirtualMachine my-new-vm-field-name field-value vm/my-vm` 51 } 52 53 func (cmd *set) Run(ctx context.Context, f *flag.FlagSet) error { 54 if f.NArg() < 3 { 55 return flag.ErrHelp 56 } 57 58 c, err := cmd.Client() 59 if err != nil { 60 return err 61 } 62 63 m, err := object.GetCustomFieldsManager(c) 64 if err != nil { 65 return err 66 } 67 68 args := f.Args() 69 70 key, err := m.FindKey(ctx, args[0]) 71 if err != nil { 72 if !(cmd.add && strings.Contains(err.Error(), "key name not found")) { 73 return err 74 } 75 // Add the missing field. 76 def, err := m.Add(ctx, args[0], cmd.kind, nil, nil) 77 if err != nil { 78 return err 79 } 80 // Assign the new field's key to the "key" var used below when 81 // setting the key/value pair on the provided list of objects. 82 key = def.Key 83 } 84 85 val := args[1] 86 87 objs, err := cmd.ManagedObjects(ctx, args[2:]) 88 if err != nil { 89 return err 90 } 91 92 for _, ref := range objs { 93 err := m.Set(ctx, ref, key, val) 94 if err != nil { 95 return err 96 } 97 } 98 99 return nil 100 }