github.com/elfadel/cilium@v1.6.12/pkg/datapath/linux/route/route_linux_test.go (about) 1 // Copyright 2018-2019 Authors of Cilium 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // +build privileged_tests 16 17 package route 18 19 import ( 20 "net" 21 "testing" 22 "time" 23 24 "github.com/cilium/cilium/pkg/testutils" 25 26 "github.com/vishvananda/netlink" 27 . "gopkg.in/check.v1" 28 ) 29 30 // Hook up gocheck into the "go test" runner. 31 func Test(t *testing.T) { TestingT(t) } 32 33 type RouteSuitePrivileged struct{} 34 35 var _ = Suite(&RouteSuitePrivileged{}) 36 37 func parseIP(ip string) *net.IP { 38 result := net.ParseIP(ip) 39 return &result 40 } 41 42 func testReplaceNexthopRoute(c *C, link netlink.Link, routerNet *net.IPNet) { 43 route := Route{ 44 Table: 10, 45 } 46 // delete route in case it exists from a previous failed run 47 deleteNexthopRoute(route, link, routerNet) 48 49 // defer cleanup in case of failure 50 defer deleteNexthopRoute(route, link, routerNet) 51 52 replaced, err := replaceNexthopRoute(route, link, routerNet) 53 c.Assert(err, IsNil) 54 c.Assert(replaced, Equals, true) 55 56 // We expect routes to always be replaced 57 replaced, err = replaceNexthopRoute(route, link, routerNet) 58 c.Assert(err, IsNil) 59 c.Assert(replaced, Equals, true) 60 61 err = deleteNexthopRoute(route, link, routerNet) 62 c.Assert(err, IsNil) 63 } 64 65 func (p *RouteSuitePrivileged) TestReplaceNexthopRoute(c *C) { 66 link, err := netlink.LinkByName("lo") 67 c.Assert(err, IsNil) 68 69 _, routerNet, err := net.ParseCIDR("1.2.3.4/32") 70 c.Assert(err, IsNil) 71 testReplaceNexthopRoute(c, link, routerNet) 72 73 _, routerNet, err = net.ParseCIDR("f00d::a02:100:0:815b/128") 74 c.Assert(err, IsNil) 75 testReplaceNexthopRoute(c, link, routerNet) 76 } 77 78 func testReplaceRoute(c *C, prefixStr, nexthopStr string, lookupTest bool) { 79 _, prefix, err := net.ParseCIDR(prefixStr) 80 c.Assert(err, IsNil) 81 c.Assert(prefix, Not(IsNil)) 82 83 nexthop := net.ParseIP(nexthopStr) 84 c.Assert(nexthop, Not(IsNil)) 85 86 rt := Route{ 87 Device: "lo", 88 Prefix: *prefix, 89 Nexthop: &nexthop, 90 } 91 92 // delete route in case it exists from a previous failed run 93 Delete(rt) 94 95 // Defer deletion of route and nexthop route to cleanup in case of failure 96 defer Delete(rt) 97 defer Delete(Route{ 98 Device: "lo", 99 Prefix: *rt.getNexthopAsIPNet(), 100 Scope: netlink.SCOPE_LINK, 101 }) 102 103 _, err = Upsert(rt) 104 c.Assert(err, IsNil) 105 106 if lookupTest { 107 // Account for minimal kernel race condition where route is not 108 // yet available 109 c.Assert(testutils.WaitUntil(func() bool { 110 installedRoute, err := Lookup(rt) 111 c.Assert(err, IsNil) 112 return installedRoute != nil 113 }, 5*time.Second), IsNil) 114 } 115 116 err = Delete(rt) 117 c.Assert(err, IsNil) 118 } 119 120 func (p *RouteSuitePrivileged) TestReplaceRoute(c *C) { 121 testReplaceRoute(c, "2.2.0.0/16", "1.2.3.4", true) 122 // lookup test broken for IPv6 as long as use lo as device 123 testReplaceRoute(c, "f00d::a02:200:0:0/96", "f00d::a02:100:0:815b", false) 124 } 125 126 func testReplaceRule(c *C, mark int, from, to *net.IPNet, table int) { 127 rule := Rule{Mark: mark, From: from, To: to, Table: table} 128 129 // delete rule in case it exists from a previous failed run 130 DeleteRule(rule) 131 132 rule.Priority = 1 133 err := ReplaceRule(rule) 134 c.Assert(err, IsNil) 135 136 exists, err := lookupRule(rule, netlink.FAMILY_V4) 137 c.Assert(err, IsNil) 138 c.Assert(exists, Equals, true) 139 140 err = DeleteRule(rule) 141 c.Assert(err, IsNil) 142 143 exists, err = lookupRule(rule, netlink.FAMILY_V4) 144 c.Assert(err, IsNil) 145 c.Assert(exists, Equals, false) 146 } 147 148 func testReplaceRuleIPv6(c *C, mark int, from, to *net.IPNet, table int) { 149 rule := Rule{Mark: mark, From: from, To: to, Table: table} 150 151 // delete rule in case it exists from a previous failed run 152 DeleteRuleIPv6(rule) 153 154 rule.Priority = 1 155 err := ReplaceRuleIPv6(rule) 156 c.Assert(err, IsNil) 157 158 exists, err := lookupRule(rule, netlink.FAMILY_V6) 159 c.Assert(err, IsNil) 160 c.Assert(exists, Equals, true) 161 162 err = DeleteRuleIPv6(rule) 163 c.Assert(err, IsNil) 164 165 exists, err = lookupRule(rule, netlink.FAMILY_V6) 166 c.Assert(err, IsNil) 167 c.Assert(exists, Equals, false) 168 } 169 170 func (p *RouteSuitePrivileged) TestReplaceRule(c *C) { 171 _, cidr1, err := net.ParseCIDR("10.10.0.0/16") 172 c.Assert(err, IsNil) 173 testReplaceRule(c, 0xf00, nil, nil, 123) 174 testReplaceRule(c, 0xf00, cidr1, nil, 124) 175 testReplaceRule(c, 0, nil, cidr1, 125) 176 testReplaceRule(c, 0, cidr1, cidr1, 126) 177 } 178 179 func (p *RouteSuitePrivileged) TestReplaceRule6(c *C) { 180 _, cidr1, err := net.ParseCIDR("beef::/48") 181 c.Assert(err, IsNil) 182 testReplaceRuleIPv6(c, 0xf00, nil, nil, 123) 183 testReplaceRuleIPv6(c, 0xf00, cidr1, nil, 124) 184 testReplaceRuleIPv6(c, 0, nil, cidr1, 125) 185 testReplaceRuleIPv6(c, 0, cidr1, cidr1, 126) 186 }