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 }