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  }