github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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  	"github.com/juju/utils/set"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/network"
    17  	"github.com/juju/juju/testing"
    18  )
    19  
    20  type InterfaceInfoSuite struct {
    21  	info []network.InterfaceInfo
    22  }
    23  
    24  var _ = gc.Suite(&InterfaceInfoSuite{})
    25  
    26  func (s *InterfaceInfoSuite) SetUpTest(c *gc.C) {
    27  	s.info = []network.InterfaceInfo{
    28  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    29  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    30  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    31  		{ConfigType: network.ConfigDHCP, NoAutoStart: true},
    32  		{Address: network.NewAddress("0.1.2.3")},
    33  		{DNSServers: network.NewAddresses("1.1.1.1", "2.2.2.2")},
    34  		{GatewayAddress: network.NewAddress("4.3.2.1")},
    35  		{AvailabilityZones: []string{"foo", "bar"}},
    36  	}
    37  }
    38  
    39  func (s *InterfaceInfoSuite) TestActualInterfaceName(c *gc.C) {
    40  	c.Check(s.info[0].ActualInterfaceName(), gc.Equals, "eth0.1")
    41  	c.Check(s.info[1].ActualInterfaceName(), gc.Equals, "eth1")
    42  	c.Check(s.info[2].ActualInterfaceName(), gc.Equals, "br2.42")
    43  }
    44  
    45  func (s *InterfaceInfoSuite) TestIsVirtual(c *gc.C) {
    46  	c.Check(s.info[0].IsVirtual(), jc.IsTrue)
    47  	c.Check(s.info[1].IsVirtual(), jc.IsFalse)
    48  	c.Check(s.info[2].IsVirtual(), jc.IsTrue)
    49  }
    50  
    51  func (s *InterfaceInfoSuite) TestIsVLAN(c *gc.C) {
    52  	c.Check(s.info[0].IsVLAN(), jc.IsTrue)
    53  	c.Check(s.info[1].IsVLAN(), jc.IsFalse)
    54  	c.Check(s.info[2].IsVLAN(), jc.IsTrue)
    55  }
    56  
    57  func (s *InterfaceInfoSuite) TestAdditionalFields(c *gc.C) {
    58  	c.Check(s.info[3].ConfigType, gc.Equals, network.ConfigDHCP)
    59  	c.Check(s.info[3].NoAutoStart, jc.IsTrue)
    60  	c.Check(s.info[4].Address, jc.DeepEquals, network.NewAddress("0.1.2.3"))
    61  	c.Check(s.info[5].DNSServers, jc.DeepEquals, network.NewAddresses("1.1.1.1", "2.2.2.2"))
    62  	c.Check(s.info[6].GatewayAddress, jc.DeepEquals, network.NewAddress("4.3.2.1"))
    63  	c.Check(s.info[7].AvailabilityZones, jc.DeepEquals, []string{"foo", "bar"})
    64  }
    65  
    66  func (s *InterfaceInfoSuite) TestSortInterfaceInfo(c *gc.C) {
    67  	info := []network.InterfaceInfo{
    68  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    69  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    70  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    71  	}
    72  	expectedInfo := []network.InterfaceInfo{
    73  		{VLANTag: 1, DeviceIndex: 0, InterfaceName: "eth0"},
    74  		{VLANTag: 0, DeviceIndex: 1, InterfaceName: "eth1"},
    75  		{VLANTag: 42, DeviceIndex: 2, InterfaceName: "br2"},
    76  	}
    77  	network.SortInterfaceInfo(info)
    78  	c.Assert(info, jc.DeepEquals, expectedInfo)
    79  }
    80  
    81  type NetworkSuite struct {
    82  	testing.BaseSuite
    83  }
    84  
    85  var _ = gc.Suite(&NetworkSuite{})
    86  
    87  func (s *NetworkSuite) TestConvertSpaceName(c *gc.C) {
    88  	empty := set.Strings{}
    89  	nameTests := []struct {
    90  		name     string
    91  		existing set.Strings
    92  		expected string
    93  	}{
    94  		{"foo", empty, "foo"},
    95  		{"foo1", empty, "foo1"},
    96  		{"Foo Thing", empty, "foo-thing"},
    97  		{"foo^9*//++!!!!", empty, "foo9"},
    98  		{"--Foo", empty, "foo"},
    99  		{"---^^&*()!", empty, "empty"},
   100  		{" ", empty, "empty"},
   101  		{"", empty, "empty"},
   102  		{"foo\u2318", empty, "foo"},
   103  		{"foo--", empty, "foo"},
   104  		{"-foo--foo----bar-", empty, "foo-foo-bar"},
   105  		{"foo-", set.NewStrings("foo", "bar", "baz"), "foo-2"},
   106  		{"foo", set.NewStrings("foo", "foo-2"), "foo-3"},
   107  		{"---", set.NewStrings("empty"), "empty-2"},
   108  	}
   109  	for _, test := range nameTests {
   110  		result := network.ConvertSpaceName(test.name, test.existing)
   111  		c.Check(result, gc.Equals, test.expected)
   112  	}
   113  }
   114  
   115  func (*NetworkSuite) TestInitializeFromConfig(c *gc.C) {
   116  	c.Check(network.PreferIPv6(), jc.IsFalse)
   117  
   118  	envConfig := testing.CustomModelConfig(c, testing.Attrs{
   119  		"prefer-ipv6": true,
   120  	})
   121  	network.SetPreferIPv6(envConfig.PreferIPv6())
   122  	c.Check(network.PreferIPv6(), jc.IsTrue)
   123  
   124  	envConfig = testing.CustomModelConfig(c, testing.Attrs{
   125  		"prefer-ipv6": false,
   126  	})
   127  	network.SetPreferIPv6(envConfig.PreferIPv6())
   128  	c.Check(network.PreferIPv6(), jc.IsFalse)
   129  }
   130  
   131  func (s *NetworkSuite) TestFilterLXCAddresses(c *gc.C) {
   132  	lxcFakeNetConfig := filepath.Join(c.MkDir(), "lxc-net")
   133  	netConf := []byte(`
   134    # comments ignored
   135  LXC_BR= ignored
   136  LXC_ADDR = "fooo"
   137   LXC_BRIDGE = " foobar " # detected, spaces stripped
   138  anything else ignored
   139  LXC_BRIDGE="ignored"`[1:])
   140  	err := ioutil.WriteFile(lxcFakeNetConfig, netConf, 0644)
   141  	c.Assert(err, jc.ErrorIsNil)
   142  	s.PatchValue(&network.InterfaceByNameAddrs, func(name string) ([]net.Addr, error) {
   143  		c.Assert(name, gc.Equals, "foobar")
   144  		return []net.Addr{
   145  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 1)},
   146  			&net.IPAddr{IP: net.IPv4(10, 0, 3, 4)},
   147  			// Try a CIDR 10.0.3.5/24 as well.
   148  			&net.IPNet{IP: net.IPv4(10, 0, 3, 5), Mask: net.IPv4Mask(255, 255, 255, 0)},
   149  		}, nil
   150  	})
   151  	s.PatchValue(&network.LXCNetDefaultConfig, lxcFakeNetConfig)
   152  
   153  	inputAddresses := network.NewAddresses(
   154  		"127.0.0.1",
   155  		"2001:db8::1",
   156  		"10.0.0.1",
   157  		"10.0.3.1", // filtered (directly as IP)
   158  		"10.0.3.3", // filtered (by the 10.0.3.5/24 CIDR)
   159  		"10.0.3.5", // filtered (directly)
   160  		"10.0.3.4", // filtered (directly)
   161  		"192.168.123.42",
   162  	)
   163  	filteredAddresses := network.NewAddresses(
   164  		"127.0.0.1",
   165  		"2001:db8::1",
   166  		"10.0.0.1",
   167  		"192.168.123.42",
   168  	)
   169  	c.Assert(network.FilterLXCAddresses(inputAddresses), jc.DeepEquals, filteredAddresses)
   170  }
   171  
   172  func (s *NetworkSuite) TestNoAddressError(c *gc.C) {
   173  	err := network.NoAddressf("boom")
   174  	c.Assert(err, gc.ErrorMatches, "boom no address")
   175  	c.Assert(network.IsNoAddress(err), jc.IsTrue)
   176  	c.Assert(network.IsNoAddress(errors.New("address found")), jc.IsFalse)
   177  }