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  }