github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/network/network_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package network_test
     5  
     6  import (
     7  	"errors"
     8  	"io/ioutil"
     9  	"net"
    10  	"path/filepath"
    11  
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/network"
    16  	"github.com/juju/juju/testing"
    17  )
    18  
    19  type InterfaceInfoSuite struct {
    20  	info []network.InterfaceInfo
    21  }
    22  
    23  var _ = gc.Suite(&InterfaceInfoSuite{})
    24  
    25  func (s *InterfaceInfoSuite) SetUpTest(c *gc.C) {
    26  	s.info = []network.InterfaceInfo{
    27  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    28  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    29  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    30  		{ConfigType: network.ConfigDHCP, NoAutoStart: true},
    31  		{Address: network.NewAddress("0.1.2.3")},
    32  		{DNSServers: network.NewAddresses("1.1.1.1", "2.2.2.2")},
    33  		{GatewayAddress: network.NewAddress("4.3.2.1")},
    34  		{ExtraConfig: map[string]string{
    35  			"foo": "bar",
    36  			"baz": "nonsense",
    37  		}},
    38  		{AvailabilityZones: []string{"foo", "bar"}},
    39  	}
    40  }
    41  
    42  func (s *InterfaceInfoSuite) TestActualInterfaceName(c *gc.C) {
    43  	c.Check(s.info[0].ActualInterfaceName(), gc.Equals, "eth0.1")
    44  	c.Check(s.info[1].ActualInterfaceName(), gc.Equals, "eth1")
    45  	c.Check(s.info[2].ActualInterfaceName(), gc.Equals, "br2.42")
    46  }
    47  
    48  func (s *InterfaceInfoSuite) TestIsVirtual(c *gc.C) {
    49  	c.Check(s.info[0].IsVirtual(), jc.IsTrue)
    50  	c.Check(s.info[1].IsVirtual(), jc.IsFalse)
    51  	c.Check(s.info[2].IsVirtual(), jc.IsTrue)
    52  }
    53  
    54  func (s *InterfaceInfoSuite) TestIsVLAN(c *gc.C) {
    55  	c.Check(s.info[0].IsVLAN(), jc.IsTrue)
    56  	c.Check(s.info[1].IsVLAN(), jc.IsFalse)
    57  	c.Check(s.info[2].IsVLAN(), jc.IsTrue)
    58  }
    59  
    60  func (s *InterfaceInfoSuite) TestAdditionalFields(c *gc.C) {
    61  	c.Check(s.info[3].ConfigType, gc.Equals, network.ConfigDHCP)
    62  	c.Check(s.info[3].NoAutoStart, jc.IsTrue)
    63  	c.Check(s.info[4].Address, jc.DeepEquals, network.NewAddress("0.1.2.3"))
    64  	c.Check(s.info[5].DNSServers, jc.DeepEquals, network.NewAddresses("1.1.1.1", "2.2.2.2"))
    65  	c.Check(s.info[6].GatewayAddress, jc.DeepEquals, network.NewAddress("4.3.2.1"))
    66  	c.Check(s.info[7].ExtraConfig, jc.DeepEquals, map[string]string{
    67  		"foo": "bar",
    68  		"baz": "nonsense",
    69  	})
    70  	c.Check(s.info[8].AvailabilityZones, jc.DeepEquals, []string{"foo", "bar"})
    71  }
    72  
    73  func (s *InterfaceInfoSuite) TestSortInterfaceInfo(c *gc.C) {
    74  	info := []network.InterfaceInfo{
    75  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    76  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    77  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    78  	}
    79  	expectedInfo := []network.InterfaceInfo{
    80  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    81  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    82  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    83  	}
    84  	network.SortInterfaceInfo(info)
    85  	c.Assert(info, jc.DeepEquals, expectedInfo)
    86  }
    87  
    88  type NetworkSuite struct {
    89  	testing.BaseSuite
    90  }
    91  
    92  var _ = gc.Suite(&NetworkSuite{})
    93  
    94  func (*NetworkSuite) TestInitializeFromConfig(c *gc.C) {
    95  	c.Check(network.GetPreferIPv6(), jc.IsFalse)
    96  
    97  	envConfig := testing.CustomEnvironConfig(c, testing.Attrs{
    98  		"prefer-ipv6": true,
    99  	})
   100  	network.InitializeFromConfig(envConfig)
   101  	c.Check(network.GetPreferIPv6(), jc.IsTrue)
   102  
   103  	envConfig = testing.CustomEnvironConfig(c, testing.Attrs{
   104  		"prefer-ipv6": false,
   105  	})
   106  	network.InitializeFromConfig(envConfig)
   107  	c.Check(network.GetPreferIPv6(), jc.IsFalse)
   108  }
   109  
   110  func (s *NetworkSuite) TestFilterLXCAddresses(c *gc.C) {
   111  	lxcFakeNetConfig := filepath.Join(c.MkDir(), "lxc-net")
   112  	netConf := []byte(`
   113    # comments ignored
   114  LXC_BR= ignored
   115  LXC_ADDR = "fooo"
   116   LXC_BRIDGE = " foobar " # detected, spaces stripped
   117  anything else ignored
   118  LXC_BRIDGE="ignored"`[1:])
   119  	err := ioutil.WriteFile(lxcFakeNetConfig, netConf, 0644)
   120  	c.Assert(err, jc.ErrorIsNil)
   121  	s.PatchValue(&network.InterfaceByNameAddrs, func(name string) ([]net.Addr, error) {
   122  		c.Assert(name, gc.Equals, "foobar")
   123  		return []net.Addr{
   124  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 1)},
   125  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 4)},
   126  			// Try a CIDR 10.0.3.5/24 as well.
   127  			&net.IPNet{IP: net.IPv4(10, 0, 3, 5), Mask: net.IPv4Mask(255, 255, 255, 0)},
   128  		}, nil
   129  	})
   130  	s.PatchValue(&network.LXCNetDefaultConfig, lxcFakeNetConfig)
   131  
   132  	inputAddresses := network.NewAddresses(
   133  		"127.0.0.1",
   134  		"2001:db8::1",
   135  		"10.0.0.1",
   136  		"10.0.3.1", // filtered (directly as IP)
   137  		"10.0.3.3", // filtered (by the 10.0.3.5/24 CIDR)
   138  		"10.0.3.5", // filtered (directly)
   139  		"10.0.3.4", // filtered (directly)
   140  		"192.168.123.42",
   141  	)
   142  	filteredAddresses := network.NewAddresses(
   143  		"127.0.0.1",
   144  		"2001:db8::1",
   145  		"10.0.0.1",
   146  		"192.168.123.42",
   147  	)
   148  	c.Assert(network.FilterLXCAddresses(inputAddresses), jc.DeepEquals, filteredAddresses)
   149  }
   150  
   151  func (s *NetworkSuite) TestNoAddressError(c *gc.C) {
   152  	err := network.NoAddressf("boom")
   153  	c.Assert(err, gc.ErrorMatches, "boom no address")
   154  	c.Assert(network.IsNoAddress(err), jc.IsTrue)
   155  	c.Assert(network.IsNoAddress(errors.New("address found")), jc.IsFalse)
   156  }