github.com/vmware/govmomi@v0.51.0/cli/option/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 option 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "strconv" 12 13 "github.com/vmware/govmomi/cli" 14 "github.com/vmware/govmomi/cli/flags" 15 "github.com/vmware/govmomi/fault" 16 "github.com/vmware/govmomi/object" 17 "github.com/vmware/govmomi/vim25/types" 18 ) 19 20 type Set struct { 21 *flags.ClientFlag 22 } 23 24 func init() { 25 cli.Register("option.set", &Set{}) 26 } 27 28 func (cmd *Set) Register(ctx context.Context, f *flag.FlagSet) { 29 cmd.ClientFlag, ctx = flags.NewClientFlag(ctx) 30 cmd.ClientFlag.Register(ctx, f) 31 } 32 33 func (cmd *Set) Process(ctx context.Context) error { 34 if err := cmd.ClientFlag.Process(ctx); err != nil { 35 return err 36 } 37 return nil 38 } 39 40 func (cmd *Set) Usage() string { 41 return "NAME VALUE" 42 } 43 44 var SetDescription = `Set option NAME to VALUE.` 45 46 func (cmd *Set) Description() string { 47 return SetDescription + ` 48 49 Examples: 50 # Change log levels 51 govc option.set log.level info 52 govc option.set logger.Vsan verbose 53 # Increase vCenter session timeout to 90 minutes 54 govc option.set config.vmacore.soap.sessionTimeout 90` 55 } 56 57 func (cmd *Set) Update(ctx context.Context, f *flag.FlagSet, m *object.OptionManager) error { 58 if f.NArg() != 2 { 59 return flag.ErrHelp 60 } 61 62 name := f.Arg(0) 63 val := f.Arg(1) 64 65 opts, err := m.Query(ctx, name) 66 if err != nil { 67 if fault.Is(err, &types.InvalidName{}) { 68 // If the option doesn't exist, creating one can only have a string Value. 69 // The Key prefix is limited in this case too, it seems to the config.* namespace. 70 return m.Update(ctx, []types.BaseOptionValue{&types.OptionValue{ 71 Key: name, 72 Value: val, 73 }}) 74 } 75 return err 76 } 77 78 if len(opts) != 1 { 79 return flag.ErrHelp 80 } 81 82 var set types.AnyType 83 84 switch x := opts[0].GetOptionValue().Value.(type) { 85 case string: 86 set = val 87 case bool: 88 set, err = strconv.ParseBool(val) 89 if err != nil { 90 return err 91 } 92 case int32: 93 s, err := strconv.ParseInt(val, 10, 32) 94 if err != nil { 95 return err 96 } 97 set = int32(s) 98 case int64: 99 set, err = strconv.ParseInt(val, 10, 64) 100 if err != nil { 101 return err 102 } 103 default: 104 return fmt.Errorf("type %T conversion not supported", x) 105 } 106 107 opts[0].GetOptionValue().Value = set 108 109 return m.Update(ctx, opts) 110 } 111 112 func (cmd *Set) Run(ctx context.Context, f *flag.FlagSet) error { 113 c, err := cmd.Client() 114 if err != nil { 115 return err 116 } 117 118 m := object.NewOptionManager(c, *c.ServiceContent.Setting) 119 120 return cmd.Update(ctx, f, m) 121 }