|
@@ -0,0 +1,70 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+package hostgw
|
|
|
+
|
|
|
+import (
|
|
|
+ "net"
|
|
|
+ "runtime"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/coreos/flannel/backend"
|
|
|
+ "github.com/coreos/flannel/pkg/ip"
|
|
|
+ "github.com/coreos/flannel/subnet"
|
|
|
+ "github.com/vishvananda/netlink"
|
|
|
+ "github.com/vishvananda/netns"
|
|
|
+)
|
|
|
+
|
|
|
+func TestRouteCache(t *testing.T) {
|
|
|
+ runtime.LockOSThread()
|
|
|
+ defer runtime.UnlockOSThread()
|
|
|
+ origns, _ := netns.Get()
|
|
|
+ defer origns.Close()
|
|
|
+ newns, _ := netns.New()
|
|
|
+ netns.Set(newns)
|
|
|
+ defer newns.Close()
|
|
|
+
|
|
|
+ lo, err := netlink.LinkByName("lo")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ if err := netlink.AddrAdd(lo, &netlink.Addr{IPNet: &net.IPNet{IP: net.ParseIP("127.0.0.1"), Mask: net.CIDRMask(32, 32)}}); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ if err := netlink.LinkSetUp(lo); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ nw := network{extIface: &backend.ExternalInterface{Iface: &net.Interface{Index: lo.Attrs().Index}}}
|
|
|
+ gw1, gw2 := ip.FromIP(net.ParseIP("127.0.0.1")), ip.FromIP(net.ParseIP("127.0.0.2"))
|
|
|
+ subnet1 := ip.IP4Net{IP: ip.FromIP(net.ParseIP("192.168.0.0")), PrefixLen: 24}
|
|
|
+ nw.handleSubnetEvents([]subnet.Event{
|
|
|
+ {Type: subnet.EventAdded, Lease: subnet.Lease{Subnet: subnet1, Attrs: subnet.LeaseAttrs{PublicIP: gw1, BackendType: "host-gw"}}},
|
|
|
+ })
|
|
|
+ if len(nw.rl) != 1 {
|
|
|
+ t.Fatal(nw.rl)
|
|
|
+ }
|
|
|
+ if !routeEqual(nw.rl[0], netlink.Route{Dst: subnet1.ToIPNet(), Gw: gw1.ToIP()}) {
|
|
|
+ t.Fatal(nw.rl[0])
|
|
|
+ }
|
|
|
+
|
|
|
+ nw.handleSubnetEvents([]subnet.Event{
|
|
|
+ {Type: subnet.EventAdded, Lease: subnet.Lease{
|
|
|
+ Subnet: subnet1, Attrs: subnet.LeaseAttrs{PublicIP: gw2, BackendType: "host-gw"}}}})
|
|
|
+ if len(nw.rl) != 1 {
|
|
|
+ t.Fatal(nw.rl)
|
|
|
+ }
|
|
|
+ if !routeEqual(nw.rl[0], netlink.Route{Dst: subnet1.ToIPNet(), Gw: gw2.ToIP()}) {
|
|
|
+ t.Fatal(nw.rl[0])
|
|
|
+ }
|
|
|
+}
|