netlink/link_test.go

273 lines
5.2 KiB
Go
Raw Normal View History

2014-09-01 03:27:34 +00:00
package netlink
import (
"github.com/vishvananda/netns"
"testing"
)
2014-09-24 05:21:11 +00:00
func testLinkAddDel(t *testing.T, link Link) {
2014-09-01 03:27:34 +00:00
links, err := LinkList()
if err != nil {
t.Fatal(err)
}
num := len(links)
if err := LinkAdd(link); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
base := link.Attrs()
2014-09-01 03:27:34 +00:00
2014-09-24 05:21:11 +00:00
result, err := LinkByName(base.Name)
2014-09-01 03:27:34 +00:00
if err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
rBase := result.Attrs()
2014-09-01 03:27:34 +00:00
2014-09-24 05:21:11 +00:00
if vlan, ok := link.(*Vlan); ok {
other, ok := result.(*Vlan)
if !ok {
t.Fatal("Result of create is not a vlan")
}
if vlan.VlanId != other.VlanId {
t.Fatal("Link.VlanId id doesn't match")
}
2014-09-01 03:27:34 +00:00
}
2014-09-24 05:21:11 +00:00
if rBase.ParentIndex == 0 && base.ParentIndex != 0 {
2014-09-01 03:27:34 +00:00
t.Fatal("Created link doesn't have a Parent but it should")
2014-09-24 05:21:11 +00:00
} else if rBase.ParentIndex != 0 && base.ParentIndex == 0 {
2014-09-01 03:27:34 +00:00
t.Fatal("Created link has a Parent but it shouldn't")
2014-09-24 05:21:11 +00:00
} else if rBase.ParentIndex != 0 && base.ParentIndex != 0 {
if rBase.ParentIndex != base.ParentIndex {
t.Fatal("Link.ParentIndex doesn't match")
2014-09-01 03:27:34 +00:00
}
}
2014-09-24 05:21:11 +00:00
if veth, ok := link.(*Veth); ok {
if veth.PeerName != "" {
other, err := LinkByName(veth.PeerName)
if err != nil {
t.Fatal("Peer %s not created", veth.PeerName)
}
if _, ok = other.(*Veth); !ok {
t.Fatal("Peer %s is incorrect type", veth.PeerName)
}
2014-09-01 03:27:34 +00:00
}
}
if err = LinkDel(link); err != nil {
t.Fatal(err)
}
links, err = LinkList()
if err != nil {
t.Fatal(err)
}
if len(links) != num {
t.Fatal("Link not removed properly")
}
}
func TestLinkAddDelDummy(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Dummy{LinkAttrs{Name: "foo"}})
2014-09-01 03:27:34 +00:00
}
func TestLinkAddDelBridge(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Bridge{LinkAttrs{Name: "foo"}})
2014-09-01 03:27:34 +00:00
}
func TestLinkAddDelVlan(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
parent := &Dummy{LinkAttrs{Name: "foo"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(parent); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Vlan{LinkAttrs{Name: "bar", ParentIndex: parent.Attrs().Index}, 900})
2014-09-01 03:27:34 +00:00
if err := LinkDel(parent); err != nil {
t.Fatal(err)
}
}
func TestLinkAddDelMacvlan(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
parent := &Dummy{LinkAttrs{Name: "foo"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(parent); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Macvlan{LinkAttrs{Name: "bar", ParentIndex: parent.Attrs().Index}})
2014-09-01 03:27:34 +00:00
if err := LinkDel(parent); err != nil {
t.Fatal(err)
}
}
func TestLinkAddDelVeth(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Veth{LinkAttrs{Name: "foo"}, "bar"})
2014-09-01 03:27:34 +00:00
}
func TestLinkAddDelBridgeMaster(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
master := &Bridge{LinkAttrs{Name: "foo"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(master); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
testLinkAddDel(t, &Dummy{LinkAttrs{Name: "bar", MasterIndex: master.Attrs().Index}})
2014-09-01 03:27:34 +00:00
if err := LinkDel(master); err != nil {
t.Fatal(err)
}
}
func TestLinkSetUnsetResetMaster(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
2014-09-24 05:21:11 +00:00
master := &Bridge{LinkAttrs{Name: "foo"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(master); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
newmaster := &Bridge{LinkAttrs{Name: "bar"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(newmaster); err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
slave := &Dummy{LinkAttrs{Name: "baz"}}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(slave); err != nil {
t.Fatal(err)
}
if err := LinkSetMaster(slave, master); err != nil {
t.Fatal(err)
}
link, err := LinkByName("baz")
if err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
if link.Attrs().MasterIndex != master.Attrs().Index {
2014-09-01 03:27:34 +00:00
t.Fatal("Master not set properly")
}
if err := LinkSetMaster(slave, newmaster); err != nil {
t.Fatal(err)
}
link, err = LinkByName("baz")
if err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
if link.Attrs().MasterIndex != newmaster.Attrs().Index {
2014-09-01 03:27:34 +00:00
t.Fatal("Master not reset properly")
}
if err := LinkSetMaster(slave, nil); err != nil {
t.Fatal(err)
}
link, err = LinkByName("baz")
if err != nil {
t.Fatal(err)
}
2014-09-24 05:21:11 +00:00
if link.Attrs().MasterIndex != 0 {
2014-09-01 03:27:34 +00:00
t.Fatal("Master not unset properly")
}
if err := LinkDel(slave); err != nil {
t.Fatal(err)
}
if err := LinkDel(newmaster); err != nil {
t.Fatal(err)
}
if err := LinkDel(master); err != nil {
t.Fatal(err)
}
}
func TestLinkSetNs(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
basens, err := netns.Get()
if err != nil {
t.Fatal("Failed to get basens")
}
defer basens.Close()
newns, err := netns.New()
if err != nil {
t.Fatal("Failed to create newns")
}
defer newns.Close()
2014-09-24 05:21:11 +00:00
link := &Veth{LinkAttrs{Name: "foo"}, "bar"}
2014-09-01 03:27:34 +00:00
if err := LinkAdd(link); err != nil {
t.Fatal(err)
}
peer, err := LinkByName("bar")
if err != nil {
t.Fatal(err)
}
LinkSetNsFd(peer, int(basens))
if err != nil {
t.Fatal("Failed to set newns for link")
}
_, err = LinkByName("bar")
if err == nil {
t.Fatal("Link bar is still in newns")
}
err = netns.Set(basens)
if err != nil {
t.Fatal("Failed to set basens")
}
peer, err = LinkByName("bar")
if err != nil {
t.Fatal("Link is not in basens")
}
if err := LinkDel(peer); err != nil {
t.Fatal(err)
}
err = netns.Set(newns)
if err != nil {
t.Fatal("Failed to set newns")
}
_, err = LinkByName("foo")
if err == nil {
t.Fatal("Other half of veth pair not deleted")
}
}