github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 (s *NetworkSuite) TestFilterBridgeAddresses(c *gc.C) {
   116  	lxcFakeNetConfig := filepath.Join(c.MkDir(), "lxc-net")
   117  	// We create an LXC bridge named "foobar", and then put 10.0.3.1,
   118  	// 10.0.3.4 and 10.0.3.5/24 on that bridge.
   119  	// We also put 10.0.4.1 and 10.0.5.1/24 onto whatever bridge LXD is
   120  	// configured to use.
   121  	netConf := []byte(`
   122    # comments ignored
   123  LXC_BR= ignored
   124  LXC_ADDR = "fooo"
   125   LXC_BRIDGE = " foobar " # detected, spaces stripped
   126  anything else ignored
   127  LXC_BRIDGE="ignored"`[1:])
   128  	err := ioutil.WriteFile(lxcFakeNetConfig, netConf, 0644)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	s.PatchValue(&network.InterfaceByNameAddrs, func(name string) ([]net.Addr, error) {
   131  		if name == "foobar" {
   132  			return []net.Addr{
   133  				&net.IPAddr{IP: net.IPv4(10, 0, 3, 1)},
   134  				&net.IPAddr{IP: net.IPv4(10, 0, 3, 4)},
   135  				// Try a CIDR 10.0.3.5/24 as well.
   136  				&net.IPNet{IP: net.IPv4(10, 0, 3, 5), Mask: net.IPv4Mask(255, 255, 255, 0)},
   137  			}, nil
   138  		} else if name == network.DefaultLXDBridge {
   139  			return []net.Addr{
   140  				&net.IPAddr{IP: net.IPv4(10, 0, 4, 1)},
   141  				// Try a CIDR 10.0.5.1/24 as well.
   142  				&net.IPNet{IP: net.IPv4(10, 0, 5, 1), Mask: net.IPv4Mask(255, 255, 255, 0)},
   143  			}, nil
   144  		}
   145  		c.Fatalf("unknown bridge name: %q", name)
   146  		return nil, nil
   147  	})
   148  	s.PatchValue(&network.LXCNetDefaultConfig, lxcFakeNetConfig)
   149  
   150  	inputAddresses := network.NewAddresses(
   151  		"127.0.0.1",
   152  		"2001:db8::1",
   153  		"10.0.0.1",
   154  		"10.0.3.1",  // filtered (directly as IP)
   155  		"10.0.3.3",  // filtered (by the 10.0.3.5/24 CIDR)
   156  		"10.0.3.5",  // filtered (directly)
   157  		"10.0.3.4",  // filtered (directly)
   158  		"10.0.4.1",  // filtered (directly from LXD bridge)
   159  		"10.0.5.10", // filtered (from LXD bridge, 10.0.5.1/24)
   160  		"10.0.6.10", // unfiltered
   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  		"10.0.6.10",
   168  		"192.168.123.42",
   169  	)
   170  	c.Assert(network.FilterBridgeAddresses(inputAddresses), jc.DeepEquals, filteredAddresses)
   171  }
   172  
   173  func (s *NetworkSuite) TestNoAddressError(c *gc.C) {
   174  	err := network.NoAddressError("fake")
   175  	c.Assert(err, gc.ErrorMatches, "no fake address")
   176  	c.Assert(network.IsNoAddressError(err), jc.IsTrue)
   177  	c.Assert(network.IsNoAddressError(errors.New("address found")), jc.IsFalse)
   178  }