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  }