github.com/vmware/govmomi@v0.51.0/cli/dvs/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 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/vim25/types"
    15  )
    16  
    17  type create struct {
    18  	*flags.FolderFlag
    19  
    20  	types.DVSCreateSpec
    21  
    22  	configSpec *types.VMwareDVSConfigSpec
    23  
    24  	dProtocol string
    25  
    26  	numUplinkPorts uint
    27  }
    28  
    29  func init() {
    30  	cli.Register("dvs.create", &create{})
    31  }
    32  
    33  func (cmd *create) Register(ctx context.Context, f *flag.FlagSet) {
    34  	cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx)
    35  	cmd.FolderFlag.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  	f.UintVar(&cmd.numUplinkPorts, "num-uplinks", 0, "Number of Uplinks")
    46  }
    47  
    48  func (cmd *create) Usage() string {
    49  	return "DVS"
    50  }
    51  
    52  func (cmd *create) Description() string {
    53  	return `Create DVS (DistributedVirtualSwitch) in datacenter.
    54  
    55  The dvs is added to the folder specified by the 'folder' flag. If not given,
    56  this defaults to the network folder in the specified or default datacenter.
    57  
    58  Examples:
    59    govc dvs.create DSwitch
    60    govc dvs.create -product-version 5.5.0 DSwitch
    61    govc dvs.create -mtu 9000 DSwitch
    62    govc dvs.create -discovery-protocol [lldp|cdp] DSwitch`
    63  }
    64  
    65  func (cmd *create) Process(ctx context.Context) error {
    66  	if err := cmd.FolderFlag.Process(ctx); err != nil {
    67  		return err
    68  	}
    69  	return nil
    70  }
    71  
    72  func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {
    73  	if f.NArg() != 1 {
    74  		return flag.ErrHelp
    75  	}
    76  
    77  	name := f.Arg(0)
    78  
    79  	cmd.configSpec.Name = name
    80  
    81  	if cmd.dProtocol != "" {
    82  		cmd.configSpec.LinkDiscoveryProtocolConfig = &types.LinkDiscoveryProtocolConfig{
    83  			Protocol:  cmd.dProtocol,
    84  			Operation: "listen",
    85  		}
    86  	}
    87  
    88  	numUplinkPorts := int(cmd.numUplinkPorts)
    89  
    90  	if numUplinkPorts > 0 {
    91  		var policy types.DVSNameArrayUplinkPortPolicy
    92  		for i := 0; i < numUplinkPorts; i++ {
    93  			policy.UplinkPortName = append(policy.UplinkPortName, fmt.Sprintf("Uplink %d", i+1))
    94  		}
    95  		cmd.configSpec.UplinkPortPolicy = &policy
    96  	}
    97  
    98  	folder, err := cmd.FolderOrDefault("network")
    99  	if err != nil {
   100  		return err
   101  	}
   102  
   103  	task, err := folder.CreateDVS(ctx, cmd.DVSCreateSpec)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	logger := cmd.ProgressLogger(fmt.Sprintf("adding %s to folder %s... ", name, folder.InventoryPath))
   109  	defer logger.Wait()
   110  
   111  	_, err = task.WaitForResult(ctx, logger)
   112  	return err
   113  }