github.com/vmware/govmomi@v0.37.2/govc/dvs/create.go (about)

     1  /*
     2  Copyright (c) 2015 VMware, Inc. All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package dvs
    18  
    19  import (
    20  	"context"
    21  	"flag"
    22  	"fmt"
    23  
    24  	"github.com/vmware/govmomi/govc/cli"
    25  	"github.com/vmware/govmomi/govc/flags"
    26  	"github.com/vmware/govmomi/vim25/types"
    27  )
    28  
    29  type create struct {
    30  	*flags.FolderFlag
    31  
    32  	types.DVSCreateSpec
    33  
    34  	configSpec *types.VMwareDVSConfigSpec
    35  
    36  	dProtocol string
    37  
    38  	numUplinkPorts uint
    39  }
    40  
    41  func init() {
    42  	cli.Register("dvs.create", &create{})
    43  }
    44  
    45  func (cmd *create) Register(ctx context.Context, f *flag.FlagSet) {
    46  	cmd.FolderFlag, ctx = flags.NewFolderFlag(ctx)
    47  	cmd.FolderFlag.Register(ctx, f)
    48  
    49  	cmd.configSpec = new(types.VMwareDVSConfigSpec)
    50  
    51  	cmd.DVSCreateSpec.ConfigSpec = cmd.configSpec
    52  	cmd.DVSCreateSpec.ProductInfo = new(types.DistributedVirtualSwitchProductSpec)
    53  
    54  	f.StringVar(&cmd.ProductInfo.Version, "product-version", "", "DVS product version")
    55  	f.Var(flags.NewInt32(&cmd.configSpec.MaxMtu), "mtu", "DVS Max MTU")
    56  	f.StringVar(&cmd.dProtocol, "discovery-protocol", "", "Link Discovery Protocol")
    57  	f.UintVar(&cmd.numUplinkPorts, "num-uplinks", 0, "Number of Uplinks")
    58  }
    59  
    60  func (cmd *create) Usage() string {
    61  	return "DVS"
    62  }
    63  
    64  func (cmd *create) Description() string {
    65  	return `Create DVS (DistributedVirtualSwitch) in datacenter.
    66  
    67  The dvs is added to the folder specified by the 'folder' flag. If not given,
    68  this defaults to the network folder in the specified or default datacenter.
    69  
    70  Examples:
    71    govc dvs.create DSwitch
    72    govc dvs.create -product-version 5.5.0 DSwitch
    73    govc dvs.create -mtu 9000 DSwitch
    74    govc dvs.create -discovery-protocol [lldp|cdp] DSwitch`
    75  }
    76  
    77  func (cmd *create) Process(ctx context.Context) error {
    78  	if err := cmd.FolderFlag.Process(ctx); err != nil {
    79  		return err
    80  	}
    81  	return nil
    82  }
    83  
    84  func (cmd *create) Run(ctx context.Context, f *flag.FlagSet) error {
    85  	if f.NArg() != 1 {
    86  		return flag.ErrHelp
    87  	}
    88  
    89  	name := f.Arg(0)
    90  
    91  	cmd.configSpec.Name = name
    92  
    93  	if cmd.dProtocol != "" {
    94  		cmd.configSpec.LinkDiscoveryProtocolConfig = &types.LinkDiscoveryProtocolConfig{
    95  			Protocol:  cmd.dProtocol,
    96  			Operation: "listen",
    97  		}
    98  	}
    99  
   100  	numUplinkPorts := int(cmd.numUplinkPorts)
   101  
   102  	if numUplinkPorts > 0 {
   103  		var policy types.DVSNameArrayUplinkPortPolicy
   104  		for i := 0; i < numUplinkPorts; i++ {
   105  			policy.UplinkPortName = append(policy.UplinkPortName, fmt.Sprintf("Uplink %d", i+1))
   106  		}
   107  		cmd.configSpec.UplinkPortPolicy = &policy
   108  	}
   109  
   110  	folder, err := cmd.FolderOrDefault("network")
   111  	if err != nil {
   112  		return err
   113  	}
   114  
   115  	task, err := folder.CreateDVS(ctx, cmd.DVSCreateSpec)
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	logger := cmd.ProgressLogger(fmt.Sprintf("adding %s to folder %s... ", name, folder.InventoryPath))
   121  	defer logger.Wait()
   122  
   123  	_, err = task.WaitForResult(ctx, logger)
   124  	return err
   125  }