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 }