X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fhs-test%2Fnetconfig.go;h=5c8613c70a8019bf9e3917a9217f69b5060ebd00;hb=ec5c40b83acae400a8cc1a18ad897b6365774559;hp=d94b32698895008beaf291ed5f0506760dc02581;hpb=7550dd268f80334cbb9127feefe35319b9c7e572;p=vpp.git diff --git a/extras/hs-test/netconfig.go b/extras/hs-test/netconfig.go index d94b3269889..5c8613c70a8 100644 --- a/extras/hs-test/netconfig.go +++ b/extras/hs-test/netconfig.go @@ -12,6 +12,7 @@ import ( ) type ( + Cmd = exec.Cmd MacAddress = ethernet_types.MacAddress AddressWithPrefix = ip_types.AddressWithPrefix IP4AddressWithPrefix = ip_types.IP4AddressWithPrefix @@ -29,34 +30,15 @@ type ( category string // what else to call this when `type` is reserved? } - NetInterface interface { - NetConfig - SetAddress(string) - AddressWithPrefix() AddressWithPrefix - IP4AddressWithPrefix() IP4AddressWithPrefix - IP4AddressString() string - SetIndex(InterfaceIndex) - Index() InterfaceIndex - HwAddress() MacAddress - } - - NetInterfaceBase struct { + NetInterface struct { NetConfigBase - addresser *Addresser - ip4address string // this will have form 10.10.10.1/24 - index InterfaceIndex - hwAddress MacAddress - } - - NetworkInterfaceVeth struct { - NetInterfaceBase - peerNetworkNamespace string - peerName string - peerIp4Address string - } - - NetworkInterfaceTap struct { - NetInterfaceBase + addresser *Addresser + ip4Address string // this will have form 10.10.10.1/24 + index InterfaceIndex + hwAddress MacAddress + networkNamespace string + networkNumber int + peer *NetInterface } NetworkNamespace struct { @@ -77,137 +59,193 @@ const ( Bridge string = "bridge" ) -func (b *NetConfigBase) Name() string { - return b.name -} +type InterfaceAdder func(n *NetInterface) *Cmd -func (b *NetConfigBase) Type() string { - return b.category -} +var ( + ipCommandMap = map[string]InterfaceAdder{ + Veth: func(n *NetInterface) *Cmd { + return exec.Command("ip", "link", "add", n.name, "type", "veth", "peer", "name", n.peer.name) + }, + Tap: func(n *NetInterface) *Cmd { + return exec.Command("ip", "tuntap", "add", n.name, "mode", "tap") + }, + } +) -func (b *NetInterfaceBase) SetAddress(address string) { - b.ip4address = address -} +func NewNetworkInterface(cfg NetDevConfig, a *Addresser) (*NetInterface, error) { + var newInterface *NetInterface = &NetInterface{} + var err error + newInterface.addresser = a + newInterface.name = cfg["name"].(string) + newInterface.networkNumber = defaultNetworkNumber -func (b *NetInterfaceBase) SetIndex(index InterfaceIndex) { - b.index = index -} + if interfaceType, ok := cfg["type"]; ok { + newInterface.category = interfaceType.(string) + } -func (b *NetInterfaceBase) Index() InterfaceIndex { - return b.index -} + if presetHwAddress, ok := cfg["preset-hw-address"]; ok { + newInterface.hwAddress, err = ethernet_types.ParseMacAddress(presetHwAddress.(string)) + if err != nil { + return &NetInterface{}, err + } + } -func (b *NetInterfaceBase) AddressWithPrefix() AddressWithPrefix { - address, _ := ip_types.ParseAddressWithPrefix(b.ip4address) - return address -} + if netns, ok := cfg["netns"]; ok { + newInterface.networkNamespace = netns.(string) + } -func (b *NetInterfaceBase) IP4AddressWithPrefix() IP4AddressWithPrefix { - IP4Prefix, _ := ip_types.ParseIP4Prefix(b.ip4address) - IP4AddressWithPrefix := ip_types.IP4AddressWithPrefix(IP4Prefix) - return IP4AddressWithPrefix -} + if ip, ok := cfg["ip4"]; ok { + if n, ok := ip.(NetDevConfig)["network"]; ok { + newInterface.networkNumber = n.(int) + } + newInterface.ip4Address, err = newInterface.addresser.NewIp4Address( + newInterface.networkNumber, + ) + if err != nil { + return &NetInterface{}, err + } + } -func (b *NetInterfaceBase) IP4AddressString() string { - return strings.Split(b.ip4address, "/")[0] -} + if _, ok := cfg["peer"]; !ok { + return newInterface, nil + } + + peer := cfg["peer"].(NetDevConfig) + + if newInterface.peer, err = NewNetworkInterface(peer, a); err != nil { + return &NetInterface{}, err + } -func (b *NetInterfaceBase) HwAddress() MacAddress { - return b.hwAddress + return newInterface, nil } -func (iface *NetworkInterfaceVeth) Configure() error { - err := AddVethPair(iface.name, iface.peerName) +func (n *NetInterface) ConfigureUpState() error { + err := SetDevUp(n.Name(), "") if err != nil { - return err + return fmt.Errorf("set link up failed: %v", err) } + return nil +} - if iface.peerNetworkNamespace != "" { - err := LinkSetNetns(iface.peerName, iface.peerNetworkNamespace) +func (n *NetInterface) ConfigureNetworkNamespace() error { + if n.networkNamespace != "" { + err := LinkSetNetns(n.name, n.networkNamespace) if err != nil { return err } } + return nil +} - if iface.peerIp4Address != "" { - err = AddAddress(iface.peerName, iface.peerIp4Address, iface.peerNetworkNamespace) - if err != nil { - return fmt.Errorf("failed to add configure address for %s: %v", iface.peerName, err) +func (n *NetInterface) ConfigureAddress() error { + if n.ip4Address != "" { + if err := AddAddress( + n.Name(), + n.ip4Address, + n.networkNamespace, + ); err != nil { + return err } + } return nil } -func NewVeth(cfg NetDevConfig, a *Addresser) (NetworkInterfaceVeth, error) { - var veth NetworkInterfaceVeth - var err error - veth.addresser = a - veth.name = cfg["name"].(string) - veth.category = "veth" - - if cfg["preset-hw-address"] != nil { - veth.hwAddress, err = ethernet_types.ParseMacAddress(cfg["preset-hw-address"].(string)) - if err != nil { - return NetworkInterfaceVeth{}, err - } +func (n *NetInterface) Configure() error { + cmd := ipCommandMap[n.Type()](n) + _, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("creating interface '%v' failed: %v", n.Name(), err) } - peer := cfg["peer"].(NetDevConfig) + if err := n.ConfigureUpState(); err != nil { + return err + } - veth.peerName = peer["name"].(string) + if err := n.ConfigureNetworkNamespace(); err != nil { + return err + } - if peer["netns"] != nil { - veth.peerNetworkNamespace = peer["netns"].(string) + if err := n.ConfigureAddress(); err != nil { + return err } - if peer["ip4"] != nil && peer["ip4"].(bool) == true { - veth.peerIp4Address, err = veth.addresser. - NewIp4AddressWithNamespace(veth.peerNetworkNamespace) - if err != nil { - return NetworkInterfaceVeth{}, err + if n.peer != nil && n.peer.name != "" { + if err := n.Peer().ConfigureUpState(); err != nil { + return err + } + + if err := n.Peer().ConfigureNetworkNamespace(); err != nil { + return err + } + + if err := n.Peer().ConfigureAddress(); err != nil { + return err } } - return veth, nil + return nil } -func (iface *NetworkInterfaceVeth) Unconfigure() { - DelLink(iface.name) +func (n *NetInterface) Unconfigure() { + DelLink(n.name) } -func (iface *NetworkInterfaceVeth) PeerIp4AddressString() string { - return strings.Split(iface.peerIp4Address, "/")[0] +func (n *NetInterface) Name() string { + return n.name } -func NewTap(cfg NetDevConfig, a *Addresser) (NetworkInterfaceTap, error) { - var tap NetworkInterfaceTap - tap.addresser = a - tap.name = cfg["name"].(string) - tap.category = "tap" - ip4Address, err := tap.addresser.NewIp4Address() - if err != nil { - return NetworkInterfaceTap{}, err - } - tap.SetAddress(ip4Address) - return tap, nil +func (n *NetInterface) Type() string { + return n.category } -func (iface *NetworkInterfaceTap) Configure() error { - err := AddTap(iface.name, iface.IP4AddressString()) - if err != nil { - return err - } - return nil +func (n *NetInterface) SetAddress(address string) { + n.ip4Address = address +} + +func (n *NetInterface) SetIndex(index InterfaceIndex) { + n.index = index } -func (iface *NetworkInterfaceTap) Unconfigure() { - DelLink(iface.name) +func (n *NetInterface) Index() InterfaceIndex { + return n.index +} + +func (n *NetInterface) AddressWithPrefix() AddressWithPrefix { + address, _ := ip_types.ParseAddressWithPrefix(n.ip4Address) + return address +} + +func (n *NetInterface) IP4AddressWithPrefix() IP4AddressWithPrefix { + ip4Prefix, _ := ip_types.ParseIP4Prefix(n.ip4Address) + ip4AddressWithPrefix := ip_types.IP4AddressWithPrefix(ip4Prefix) + return ip4AddressWithPrefix +} + +func (n *NetInterface) IP4AddressString() string { + return strings.Split(n.ip4Address, "/")[0] +} + +func (n *NetInterface) HwAddress() MacAddress { + return n.hwAddress +} + +func (n *NetInterface) Peer() *NetInterface { + return n.peer +} + +func (b *NetConfigBase) Name() string { + return b.name +} + +func (b *NetConfigBase) Type() string { + return b.category } func NewNetNamespace(cfg NetDevConfig) (NetworkNamespace, error) { var networkNamespace NetworkNamespace networkNamespace.name = cfg["name"].(string) - networkNamespace.category = "netns" + networkNamespace.category = NetNs return networkNamespace, nil } @@ -222,11 +260,15 @@ func (ns *NetworkNamespace) Unconfigure() { func NewBridge(cfg NetDevConfig) (NetworkBridge, error) { var bridge NetworkBridge bridge.name = cfg["name"].(string) - bridge.category = "bridge" + bridge.category = Bridge for _, v := range cfg["interfaces"].([]interface{}) { bridge.interfaces = append(bridge.interfaces, v.(string)) } - bridge.networkNamespace = cfg["netns"].(string) + + bridge.networkNamespace = "" + if netns, ok := cfg["netns"]; ok { + bridge.networkNamespace = netns.(string) + } return bridge, nil } @@ -240,7 +282,7 @@ func (b *NetworkBridge) Unconfigure() { func DelBridge(brName, ns string) error { err := SetDevDown(brName, ns) - if err != err { + if err != nil { return err } @@ -252,18 +294,6 @@ func DelBridge(brName, ns string) error { return nil } -func configureBridge(dev NetDevConfig) error { - var ifs []string - for _, v := range dev["interfaces"].([]interface{}) { - ifs = append(ifs, v.(string)) - } - return AddBridge(dev["name"].(string), ifs, dev["netns"].(string)) -} - -func configureTap(dev NetDevConfig) error { - return AddTap(dev["name"].(string), dev["ip4"].(string)) -} - func SetDevUp(dev, ns string) error { return setDevUpDown(dev, ns, true) } @@ -272,30 +302,6 @@ func SetDevDown(dev, ns string) error { return setDevUpDown(dev, ns, false) } -func AddTap(ifName, ifAddress string) error { - cmd := exec.Command("ip", "tuntap", "add", ifName, "mode", "tap") - o, err := cmd.CombinedOutput() - if err != nil { - s := fmt.Sprintf("error creating tap %s: %v: %s", ifName, err, string(o)) - return errors.New(s) - } - - cmd = exec.Command("ip", "addr", "add", ifAddress, "dev", ifName) - err = cmd.Run() - if err != nil { - DelLink(ifName) - s := fmt.Sprintf("error setting addr for tap %s: %v", ifName, err) - return errors.New(s) - } - - err = SetDevUp(ifName, "") - if err != nil { - DelLink(ifName) - return err - } - return nil -} - func DelLink(ifName string) { cmd := exec.Command("ip", "link", "del", ifName) cmd.Run() @@ -318,19 +324,6 @@ func setDevUpDown(dev, ns string, isUp bool) error { return nil } -func AddVethPair(ifName, peerName string) error { - cmd := exec.Command("ip", "link", "add", ifName, "type", "veth", "peer", "name", peerName) - err := cmd.Run() - if err != nil { - return fmt.Errorf("creating veth pair failed: %v", err) - } - err = SetDevUp(ifName, "") - if err != nil { - return fmt.Errorf("set link up failed: %v", err) - } - return nil -} - func addDelNetns(name string, isAdd bool) error { var op string if isAdd {