github.com/vmware/govmomi@v0.51.0/cli/dvs/change.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 dvs
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  
    12  	"github.com/vmware/govmomi/cli"
    13  	"github.com/vmware/govmomi/cli/flags"
    14  	"github.com/vmware/govmomi/object"
    15  	"github.com/vmware/govmomi/vim25/mo"
    16  	"github.com/vmware/govmomi/vim25/types"
    17  )
    18  
    19  type change struct {
    20  	*flags.DatacenterFlag
    21  
    22  	types.DVSCreateSpec
    23  
    24  	configSpec *types.VMwareDVSConfigSpec
    25  
    26  	dProtocol string
    27  }
    28  
    29  func init() {
    30  	cli.Register("dvs.change", &change{})
    31  }
    32  
    33  func (cmd *change) Register(ctx context.Context, f *flag.FlagSet) {
    34  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    35  	cmd.DatacenterFlag.Register(ctx, f)
    36  
    37  	cmd.configSpec = new(types.VMwareDVSConfigSpec)
    38  
    39  	cmd.DVSCreateSpec.ConfigSpec = cmd.configSpec
    40  	cmd.DVSCreateSpec.ProductInfo = new(types.DistributedVirtualSwitchProductSpec)
    41  
    42  	f.StringVar(&cmd.ProductInfo.Version, "product-version", "", "DVS product version")
    43  	f.Var(flags.NewInt32(&cmd.configSpec.MaxMtu), "mtu", "DVS Max MTU")
    44  	f.StringVar(&cmd.dProtocol, "discovery-protocol", "", "Link Discovery Protocol")
    45  }
    46  
    47  func (cmd *change) Usage() string {
    48  	return "DVS"
    49  }
    50  
    51  func (cmd *change) Description() string {
    52  	return `Change DVS (DistributedVirtualSwitch) in datacenter.
    53  
    54  Examples:
    55    govc dvs.change -product-version 5.5.0 DSwitch
    56    govc dvs.change -mtu 9000 DSwitch
    57    govc dvs.change -discovery-protocol [lldp|cdp] DSwitch`
    58  }
    59  
    60  func (cmd *change) Process(ctx context.Context) error {
    61  	if err := cmd.DatacenterFlag.Process(ctx); err != nil {
    62  		return err
    63  	}
    64  	return nil
    65  }
    66  
    67  func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error {
    68  	if f.NArg() != 1 {
    69  		return flag.ErrHelp
    70  	}
    71  
    72  	name := f.Arg(0)
    73  
    74  	finder, err := cmd.Finder()
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	net, err := finder.Network(ctx, name)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	dvs, ok := net.(*object.DistributedVirtualSwitch)
    85  	if !ok {
    86  		return fmt.Errorf("%s (%s) is not a DVS", f.Arg(0), net.Reference().Type)
    87  	}
    88  	var s mo.DistributedVirtualSwitch
    89  	err = dvs.Properties(ctx, dvs.Reference(), []string{"config"}, &s)
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	cmd.configSpec.ConfigVersion = s.Config.GetDVSConfigInfo().ConfigVersion
    95  
    96  	if cmd.dProtocol != "" {
    97  		cmd.configSpec.LinkDiscoveryProtocolConfig = &types.LinkDiscoveryProtocolConfig{
    98  			Protocol:  cmd.dProtocol,
    99  			Operation: "listen",
   100  		}
   101  	}
   102  
   103  	task, err := dvs.Reconfigure(ctx, cmd.ConfigSpec)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	logger := cmd.ProgressLogger(fmt.Sprintf("updating DVS %s... ", name))
   109  	defer logger.Wait()
   110  
   111  	_, err = task.WaitForResult(ctx, logger)
   112  	if err != nil {
   113  		return err
   114  	}
   115  
   116  	return nil
   117  }