1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
//go:build integration
// +build integration
package driver
import (
"testing"
"github.com/jsimonetti/rtnetlink/v2"
"github.com/jsimonetti/rtnetlink/v2/internal/testutils"
"github.com/mdlayher/netlink"
)
func TestVeth(t *testing.T) {
conn, err := rtnetlink.Dial(nil)
if err != nil {
t.Fatalf("failed to establish netlink socket: %v", err)
}
defer conn.Close()
ns := testutils.NetNS(t)
connNS, err := rtnetlink.Dial(&netlink.Config{NetNS: ns})
if err != nil {
t.Fatalf("failed to establish netlink socket to netns: %v", err)
}
defer connNS.Close()
const (
ifIndex = 1021
ifPeerIndex = 1022
)
tests := []struct {
name string
linkName string
pconn *rtnetlink.Conn
driver *Veth
}{
{
name: "with empty names both in default ns",
pconn: conn,
driver: &Veth{
PeerInfo: &rtnetlink.LinkMessage{
Index: ifPeerIndex,
},
},
},
{
name: "with names both in default ns",
linkName: "vtp",
pconn: conn,
driver: &Veth{
PeerInfo: &rtnetlink.LinkMessage{
Index: ifPeerIndex,
Attributes: &rtnetlink.LinkAttributes{
Name: "vte",
},
},
},
},
{
name: "with names one in other ns",
linkName: "vtp",
pconn: connNS,
driver: &Veth{
PeerInfo: &rtnetlink.LinkMessage{
Index: ifPeerIndex,
Attributes: &rtnetlink.LinkAttributes{
Name: "vte",
NetNS: rtnetlink.NetNSForFD(uint32(ns)),
},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := setupInterface(conn, tt.linkName, ifIndex, 0, tt.driver); err != nil {
t.Fatalf("failed to setup veth interface: %v", err)
}
defer conn.Link.Delete(ifIndex)
_, err = getInterface(conn, ifIndex)
if err != nil {
t.Fatalf("failed to get primary veth interface: %v", err)
}
_, err = getInterface(tt.pconn, ifPeerIndex)
if err != nil {
t.Fatalf("failed to get peer veth interface: %v", err)
}
})
}
}
|