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 }