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

     1  /*
     2  Copyright (c) 2015-2017 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/object"
    27  	"github.com/vmware/govmomi/vim25/mo"
    28  	"github.com/vmware/govmomi/vim25/types"
    29  )
    30  
    31  type change struct {
    32  	*flags.DatacenterFlag
    33  
    34  	types.DVSCreateSpec
    35  
    36  	configSpec *types.VMwareDVSConfigSpec
    37  
    38  	dProtocol string
    39  }
    40  
    41  func init() {
    42  	cli.Register("dvs.change", &change{})
    43  }
    44  
    45  func (cmd *change) Register(ctx context.Context, f *flag.FlagSet) {
    46  	cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx)
    47  	cmd.DatacenterFlag.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  }
    58  
    59  func (cmd *change) Usage() string {
    60  	return "DVS"
    61  }
    62  
    63  func (cmd *change) Description() string {
    64  	return `Change DVS (DistributedVirtualSwitch) in datacenter.
    65  
    66  Examples:
    67    govc dvs.change -product-version 5.5.0 DSwitch
    68    govc dvs.change -mtu 9000 DSwitch
    69    govc dvs.change -discovery-protocol [lldp|cdp] DSwitch`
    70  }
    71  
    72  func (cmd *change) Process(ctx context.Context) error {
    73  	if err := cmd.DatacenterFlag.Process(ctx); err != nil {
    74  		return err
    75  	}
    76  	return nil
    77  }
    78  
    79  func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error {
    80  	if f.NArg() != 1 {
    81  		return flag.ErrHelp
    82  	}
    83  
    84  	name := f.Arg(0)
    85  
    86  	finder, err := cmd.Finder()
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	net, err := finder.Network(ctx, name)
    92  	if err != nil {
    93  		return err
    94  	}
    95  
    96  	dvs, ok := net.(*object.DistributedVirtualSwitch)
    97  	if !ok {
    98  		return fmt.Errorf("%s (%s) is not a DVS", f.Arg(0), net.Reference().Type)
    99  	}
   100  	var s mo.DistributedVirtualSwitch
   101  	err = dvs.Properties(ctx, dvs.Reference(), []string{"config"}, &s)
   102  	if err != nil {
   103  		return err
   104  	}
   105  
   106  	cmd.configSpec.ConfigVersion = s.Config.GetDVSConfigInfo().ConfigVersion
   107  
   108  	if cmd.dProtocol != "" {
   109  		cmd.configSpec.LinkDiscoveryProtocolConfig = &types.LinkDiscoveryProtocolConfig{
   110  			Protocol:  cmd.dProtocol,
   111  			Operation: "listen",
   112  		}
   113  	}
   114  
   115  	task, err := dvs.Reconfigure(ctx, cmd.ConfigSpec)
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	logger := cmd.ProgressLogger(fmt.Sprintf("updating DVS %s... ", name))
   121  	defer logger.Wait()
   122  
   123  	_, err = task.WaitForResult(ctx, logger)
   124  	if err != nil {
   125  		return err
   126  	}
   127  
   128  	return nil
   129  }