github.com/vmware/govmomi@v0.51.0/cli/flags/network.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 flags
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"os"
    12  
    13  	"github.com/vmware/govmomi/object"
    14  	"github.com/vmware/govmomi/vim25/types"
    15  )
    16  
    17  type NetworkFlag struct {
    18  	common
    19  
    20  	*DatacenterFlag
    21  
    22  	name    string
    23  	net     object.NetworkReference
    24  	adapter string
    25  	address string
    26  	isset   bool
    27  	proto   string
    28  }
    29  
    30  var networkFlagKey = flagKey("network")
    31  
    32  func NewNetworkFlag(ctx context.Context) (*NetworkFlag, context.Context) {
    33  	if v := ctx.Value(networkFlagKey); v != nil {
    34  		return v.(*NetworkFlag), ctx
    35  	}
    36  
    37  	v := &NetworkFlag{}
    38  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    39  	ctx = context.WithValue(ctx, networkFlagKey, v)
    40  	return v, ctx
    41  }
    42  
    43  func (flag *NetworkFlag) Register(ctx context.Context, f *flag.FlagSet) {
    44  	flag.RegisterOnce(func() {
    45  		flag.DatacenterFlag.Register(ctx, f)
    46  
    47  		env := "GOVC_NETWORK"
    48  		value := os.Getenv(env)
    49  		flag.name = value
    50  		usage := fmt.Sprintf("Network [%s]", env)
    51  		f.Var(flag, "net", usage)
    52  		f.StringVar(&flag.adapter, "net.adapter", "e1000", "Network adapter type")
    53  		f.StringVar(&flag.address, "net.address", "", "Network hardware address")
    54  		f.StringVar(&flag.proto, "net.protocol", "", fmt.Sprintf("Network device protocol. Applicable to vmxnet3vrdma. Default to '%s'", string(types.VirtualVmxnet3VrdmaOptionDeviceProtocolsRocev2)))
    55  	})
    56  }
    57  
    58  func (flag *NetworkFlag) Process(ctx context.Context) error {
    59  	return flag.ProcessOnce(func() error {
    60  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    61  			return err
    62  		}
    63  		return nil
    64  	})
    65  }
    66  
    67  func (flag *NetworkFlag) String() string {
    68  	return flag.name
    69  }
    70  
    71  func (flag *NetworkFlag) Set(name string) error {
    72  	flag.name = name
    73  	flag.isset = true
    74  	return nil
    75  }
    76  
    77  func (flag *NetworkFlag) IsSet() bool {
    78  	return flag.isset
    79  }
    80  
    81  func (flag *NetworkFlag) Network() (object.NetworkReference, error) {
    82  	if flag.net != nil {
    83  		return flag.net, nil
    84  	}
    85  
    86  	finder, err := flag.Finder()
    87  	if err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	if flag.net, err = finder.NetworkOrDefault(context.TODO(), flag.name); err != nil {
    92  		return nil, err
    93  	}
    94  
    95  	return flag.net, nil
    96  }
    97  
    98  func (flag *NetworkFlag) Device() (types.BaseVirtualDevice, error) {
    99  	net, err := flag.Network()
   100  	if err != nil {
   101  		return nil, err
   102  	}
   103  
   104  	backing, err := net.EthernetCardBackingInfo(context.TODO())
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	device, err := object.EthernetCardTypes().CreateEthernetCard(flag.adapter, backing)
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  
   114  	if a, ok := device.(*types.VirtualVmxnet3Vrdma); ok {
   115  		if flag.proto != "" {
   116  			if flag.proto != string(types.VirtualVmxnet3VrdmaOptionDeviceProtocolsRocev2) &&
   117  				flag.proto != string(types.VirtualVmxnet3VrdmaOptionDeviceProtocolsRocev1) {
   118  				return nil, fmt.Errorf("invalid device protocol '%s'", flag.proto)
   119  			}
   120  			a.DeviceProtocol = flag.proto
   121  		}
   122  	} else if flag.proto != "" {
   123  		return nil, fmt.Errorf("device protocol is only supported for vmxnet3vrdma at the moment")
   124  	}
   125  
   126  	if flag.address == "-" {
   127  		card := device.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
   128  		card.AddressType = string(types.VirtualEthernetCardMacTypeGenerated)
   129  		card.MacAddress = ""
   130  	} else if flag.address != "" {
   131  		card := device.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
   132  		card.AddressType = string(types.VirtualEthernetCardMacTypeManual)
   133  		card.MacAddress = flag.address
   134  	}
   135  
   136  	return device, nil
   137  }
   138  
   139  // Change applies update backing and hardware address changes to the given network device.
   140  func (flag *NetworkFlag) Change(device types.BaseVirtualDevice, update types.BaseVirtualDevice) {
   141  	current := device.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
   142  	changed := update.(types.BaseVirtualEthernetCard).GetVirtualEthernetCard()
   143  
   144  	current.Backing = changed.Backing
   145  
   146  	if changed.MacAddress != "" {
   147  		current.MacAddress = changed.MacAddress
   148  	}
   149  
   150  	if changed.AddressType != "" {
   151  		current.AddressType = changed.AddressType
   152  	}
   153  }