github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/core/network/gateway_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package network_test 5 6 import ( 7 "fmt" 8 "net" 9 "os/exec" 10 "runtime" 11 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/core/network" 15 ) 16 17 type GatewaySuite struct { 18 network.BaseSuite 19 } 20 21 var _ = gc.Suite(&GatewaySuite{}) 22 23 func (s *GatewaySuite) TestDefaultRouteOnMachine(c *gc.C) { 24 if runtime.GOOS != "linux" { 25 c.Skip("skipping default route on-machine test on non-linux") 26 } 27 28 // This just runs "ip" from /sbin directly, as IsolationSuite 29 // causes it not to be found in PATH. 30 s.PatchRunIPRouteShow(func() (string, error) { 31 output, err := exec.Command("/sbin/ip", "route", "show").CombinedOutput() 32 if err != nil { 33 return "", err 34 } 35 return string(output), nil 36 }) 37 38 _, _, err := network.GetDefaultRoute() 39 c.Check(err, gc.IsNil) 40 } 41 42 func (s *GatewaySuite) TestDefaultRouteLinuxSimple(c *gc.C) { 43 s.PatchGOOS("linux") 44 s.PatchRunIPRouteShow(func() (string, error) { 45 return "default via 10.0.0.1 dev wlp2s0 proto static\n" + 46 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n", nil 47 }) 48 ip, dev, err := network.GetDefaultRoute() 49 c.Assert(err, gc.IsNil) 50 c.Check(ip, gc.DeepEquals, net.ParseIP("10.0.0.1")) 51 c.Check(dev, gc.Equals, "wlp2s0") 52 } 53 54 func (s *GatewaySuite) TestDefaultRouteLinuxTwoRoutes(c *gc.C) { 55 s.PatchGOOS("linux") 56 s.PatchRunIPRouteShow(func() (string, error) { 57 return "default via 10.0.0.1 dev wlp2s0 proto static metric 800\n" + 58 "default via 10.100.1.10 dev lxdbr0 metric 700\n" + 59 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n" + 60 "10.100.1.0/24 dev lxdbr0 proto kernel scope link src 10.100.1.1\n", nil 61 }) 62 ip, dev, err := network.GetDefaultRoute() 63 c.Assert(err, gc.IsNil) 64 c.Check(ip, gc.DeepEquals, net.ParseIP("10.100.1.10")) 65 c.Check(dev, gc.Equals, "lxdbr0") 66 } 67 68 func (s *GatewaySuite) TestDefaultRouteLinuxNoMetric(c *gc.C) { 69 s.PatchGOOS("linux") 70 s.PatchRunIPRouteShow(func() (string, error) { 71 return "default via 10.0.0.1 dev wlp2s0 proto static metric 800\n" + 72 "default via 10.100.1.10 dev lxdbr0\n" + 73 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n" + 74 "10.100.1.0/24 dev lxdbr0 proto kernel scope link src 10.100.1.1\n", nil 75 }) 76 ip, dev, err := network.GetDefaultRoute() 77 c.Assert(err, gc.IsNil) 78 c.Check(ip, gc.DeepEquals, net.ParseIP("10.100.1.10")) 79 c.Check(dev, gc.Equals, "lxdbr0") 80 } 81 82 func (s *GatewaySuite) TestDefaultRouteLinuxNoGW(c *gc.C) { 83 s.PatchGOOS("linux") 84 s.PatchRunIPRouteShow(func() (string, error) { 85 return "default via 10.0.0.1 dev wlp2s0 proto static metric 800\n" + 86 "default dev lxdbr0\n" + 87 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n" + 88 "10.100.1.0/24 dev lxdbr0 proto kernel scope link src 10.100.1.1\n", nil 89 }) 90 ip, dev, err := network.GetDefaultRoute() 91 c.Assert(err, gc.IsNil) 92 c.Check(ip, gc.IsNil) 93 c.Check(dev, gc.Equals, "lxdbr0") 94 } 95 96 func (s *GatewaySuite) TestDefaultRouteLinuxNoDev(c *gc.C) { 97 s.PatchGOOS("linux") 98 s.PatchRunIPRouteShow(func() (string, error) { 99 return "default via 10.0.0.1 dev wlp2s0 proto static metric 800\n" + 100 "default via 10.100.1.10 metric 500\n" + 101 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n" + 102 "10.100.1.0/24 dev lxdbr0 proto kernel scope link src 10.100.1.1\n", nil 103 }) 104 ip, dev, err := network.GetDefaultRoute() 105 c.Assert(err, gc.IsNil) 106 c.Check(ip, gc.DeepEquals, net.ParseIP("10.100.1.10")) 107 c.Check(dev, gc.Equals, "") 108 } 109 110 func (s *GatewaySuite) TestDefaultRouteLinuxError(c *gc.C) { 111 s.PatchGOOS("linux") 112 s.PatchRunIPRouteShow(func() (string, error) { 113 return "", fmt.Errorf("no can do") 114 }) 115 ip, dev, err := network.GetDefaultRoute() 116 c.Check(ip, gc.IsNil) 117 c.Check(dev, gc.Equals, "") 118 c.Check(err, gc.ErrorMatches, "no can do") 119 } 120 121 func (s *GatewaySuite) TestDefaultRouteLinuxWrongOutput(c *gc.C) { 122 s.PatchGOOS("linux") 123 s.PatchRunIPRouteShow(func() (string, error) { 124 return "default via 10.0.0.1 dev wlp2s0 proto static metric chewbacca\n" + 125 "default dev lxdbr0\n" + 126 "10.0.0.0/24 dev wlp2s0 proto kernel scope link src 10.0.0.66 metric 600\n" + 127 "10.100.1.0/24 dev lxdbr0 proto kernel scope link src 10.100.1.1\n", nil 128 }) 129 ip, dev, err := network.GetDefaultRoute() 130 c.Check(ip, gc.IsNil) 131 c.Check(dev, gc.Equals, "") 132 c.Check(err, gc.ErrorMatches, ".*chewbacca.*") 133 }