github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/api/networker/networker_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package networker_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 "github.com/juju/utils" 9 gc "launchpad.net/gocheck" 10 11 "github.com/juju/juju/environs/network" 12 "github.com/juju/juju/instance" 13 "github.com/juju/juju/juju/testing" 14 "github.com/juju/juju/state" 15 "github.com/juju/juju/state/api" 16 "github.com/juju/juju/state/api/networker" 17 "github.com/juju/juju/state/api/params" 18 ) 19 20 type networkerSuite struct { 21 testing.JujuConnSuite 22 23 networks []state.NetworkInfo 24 25 machine *state.Machine 26 container *state.Machine 27 nestedContainer *state.Machine 28 29 machineIfaces []state.NetworkInterfaceInfo 30 containerIfaces []state.NetworkInterfaceInfo 31 nestedContainerIfaces []state.NetworkInterfaceInfo 32 33 st *api.State 34 networker *networker.State 35 } 36 37 var _ = gc.Suite(&networkerSuite{}) 38 39 // Create several networks. 40 func (s *networkerSuite) setUpNetworks(c *gc.C) { 41 s.networks = []state.NetworkInfo{{ 42 Name: "net1", 43 ProviderId: "net1", 44 CIDR: "0.1.2.0/24", 45 VLANTag: 0, 46 }, { 47 Name: "vlan42", 48 ProviderId: "vlan42", 49 CIDR: "0.2.2.0/24", 50 VLANTag: 42, 51 }, { 52 Name: "vlan69", 53 ProviderId: "vlan69", 54 CIDR: "0.3.2.0/24", 55 VLANTag: 69, 56 }, { 57 Name: "vlan123", 58 ProviderId: "vlan123", 59 CIDR: "0.4.2.0/24", 60 VLANTag: 123, 61 }, { 62 Name: "net2", 63 ProviderId: "net2", 64 CIDR: "0.5.2.0/24", 65 VLANTag: 0, 66 }} 67 } 68 69 // Create a machine and login to it. 70 func (s *networkerSuite) setUpMachine(c *gc.C) { 71 var err error 72 s.machine, err = s.State.AddMachine("quantal", state.JobHostUnits) 73 c.Assert(err, gc.IsNil) 74 password, err := utils.RandomPassword() 75 c.Assert(err, gc.IsNil) 76 err = s.machine.SetPassword(password) 77 c.Assert(err, gc.IsNil) 78 hwChars := instance.MustParseHardware("cpu-cores=123", "mem=4G") 79 s.machineIfaces = []state.NetworkInterfaceInfo{{ 80 MACAddress: "aa:bb:cc:dd:ee:f0", 81 InterfaceName: "eth0", 82 NetworkName: "net1", 83 IsVirtual: false, 84 }, { 85 MACAddress: "aa:bb:cc:dd:ee:f1", 86 InterfaceName: "eth1", 87 NetworkName: "net1", 88 IsVirtual: false, 89 }, { 90 MACAddress: "aa:bb:cc:dd:ee:f1", 91 InterfaceName: "eth1.42", 92 NetworkName: "vlan42", 93 IsVirtual: true, 94 }, { 95 MACAddress: "aa:bb:cc:dd:ee:f0", 96 InterfaceName: "eth0.69", 97 NetworkName: "vlan69", 98 IsVirtual: true, 99 }, { 100 MACAddress: "aa:bb:cc:dd:ee:f2", 101 InterfaceName: "eth2", 102 NetworkName: "net2", 103 IsVirtual: false, 104 }} 105 err = s.machine.SetInstanceInfo("i-am", "fake_nonce", &hwChars, s.networks, s.machineIfaces) 106 c.Assert(err, gc.IsNil) 107 s.st = s.OpenAPIAsMachine(c, s.machine.Tag(), password, "fake_nonce") 108 c.Assert(s.st, gc.NotNil) 109 } 110 111 // Create and provision a container and a nested container. 112 func (s *networkerSuite) setUpContainers(c *gc.C) { 113 template := state.MachineTemplate{ 114 Series: "quantal", 115 Jobs: []state.MachineJob{state.JobHostUnits}, 116 } 117 var err error 118 s.container, err = s.State.AddMachineInsideMachine(template, s.machine.Id(), instance.LXC) 119 c.Assert(err, gc.IsNil) 120 s.containerIfaces = []state.NetworkInterfaceInfo{{ 121 MACAddress: "aa:bb:cc:dd:ee:e0", 122 InterfaceName: "eth0", 123 NetworkName: "net1", 124 IsVirtual: false, 125 }, { 126 MACAddress: "aa:bb:cc:dd:ee:e1", 127 InterfaceName: "eth1", 128 NetworkName: "net1", 129 IsVirtual: false, 130 }, { 131 MACAddress: "aa:bb:cc:dd:ee:e1", 132 InterfaceName: "eth1.42", 133 NetworkName: "vlan42", 134 IsVirtual: true, 135 }} 136 hwChars := instance.MustParseHardware("arch=i386", "mem=4G") 137 err = s.container.SetInstanceInfo("i-container", "fake_nonce", &hwChars, s.networks[:2], 138 s.containerIfaces) 139 c.Assert(err, gc.IsNil) 140 141 s.nestedContainer, err = s.State.AddMachineInsideMachine(template, s.container.Id(), instance.LXC) 142 c.Assert(err, gc.IsNil) 143 s.nestedContainerIfaces = []state.NetworkInterfaceInfo{{ 144 MACAddress: "aa:bb:cc:dd:ee:d0", 145 InterfaceName: "eth0", 146 NetworkName: "net1", 147 IsVirtual: false, 148 }} 149 err = s.nestedContainer.SetInstanceInfo("i-too", "fake_nonce", &hwChars, s.networks[:1], 150 s.nestedContainerIfaces) 151 c.Assert(err, gc.IsNil) 152 } 153 154 func (s *networkerSuite) SetUpTest(c *gc.C) { 155 s.JujuConnSuite.SetUpTest(c) 156 157 s.setUpNetworks(c) 158 s.setUpMachine(c) 159 s.setUpContainers(c) 160 161 // Create the networker API facade. 162 s.networker = s.st.Networker() 163 c.Assert(s.networker, gc.NotNil) 164 } 165 166 func (s *networkerSuite) TestMachineNetworkInfoPermissionDenied(c *gc.C) { 167 tags := []string{"foo-42", "unit-mysql-0", "service-mysql", "user-foo", "machine-1"} 168 for _, tag := range tags { 169 info, err := s.networker.MachineNetworkInfo(tag) 170 c.Assert(err, gc.ErrorMatches, "permission denied") 171 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 172 c.Assert(info, gc.IsNil) 173 } 174 } 175 176 func (s *networkerSuite) TestMachineNetworkInfo(c *gc.C) { 177 // Expected results of MachineNetworkInfo for a machine and containers 178 expectedMachineInfo := []network.Info{{ 179 MACAddress: "aa:bb:cc:dd:ee:f0", 180 CIDR: "0.1.2.0/24", 181 NetworkName: "net1", 182 ProviderId: "net1", 183 VLANTag: 0, 184 InterfaceName: "eth0", 185 IsVirtual: false, 186 }, { 187 MACAddress: "aa:bb:cc:dd:ee:f1", 188 CIDR: "0.1.2.0/24", 189 NetworkName: "net1", 190 ProviderId: "net1", 191 VLANTag: 0, 192 InterfaceName: "eth1", 193 IsVirtual: false, 194 }, { 195 MACAddress: "aa:bb:cc:dd:ee:f1", 196 CIDR: "0.2.2.0/24", 197 NetworkName: "vlan42", 198 ProviderId: "vlan42", 199 VLANTag: 42, 200 InterfaceName: "eth1", 201 IsVirtual: true, 202 }, { 203 MACAddress: "aa:bb:cc:dd:ee:f0", 204 CIDR: "0.3.2.0/24", 205 NetworkName: "vlan69", 206 ProviderId: "vlan69", 207 VLANTag: 69, 208 InterfaceName: "eth0", 209 IsVirtual: true, 210 }, { 211 MACAddress: "aa:bb:cc:dd:ee:f2", 212 CIDR: "0.5.2.0/24", 213 NetworkName: "net2", 214 ProviderId: "net2", 215 VLANTag: 0, 216 InterfaceName: "eth2", 217 IsVirtual: false, 218 }} 219 expectedContainerInfo := []network.Info{{ 220 MACAddress: "aa:bb:cc:dd:ee:e0", 221 CIDR: "0.1.2.0/24", 222 NetworkName: "net1", 223 ProviderId: "net1", 224 VLANTag: 0, 225 InterfaceName: "eth0", 226 IsVirtual: false, 227 }, { 228 MACAddress: "aa:bb:cc:dd:ee:e1", 229 CIDR: "0.1.2.0/24", 230 NetworkName: "net1", 231 ProviderId: "net1", 232 VLANTag: 0, 233 InterfaceName: "eth1", 234 IsVirtual: false, 235 }, { 236 MACAddress: "aa:bb:cc:dd:ee:e1", 237 CIDR: "0.2.2.0/24", 238 NetworkName: "vlan42", 239 ProviderId: "vlan42", 240 VLANTag: 42, 241 InterfaceName: "eth1", 242 IsVirtual: true, 243 }} 244 expectedNestedContainerInfo := []network.Info{{ 245 MACAddress: "aa:bb:cc:dd:ee:d0", 246 CIDR: "0.1.2.0/24", 247 NetworkName: "net1", 248 ProviderId: "net1", 249 VLANTag: 0, 250 InterfaceName: "eth0", 251 IsVirtual: false, 252 }} 253 254 results, err := s.networker.MachineNetworkInfo("machine-0") 255 c.Assert(err, gc.IsNil) 256 c.Assert(results, gc.DeepEquals, expectedMachineInfo) 257 258 results, err = s.networker.MachineNetworkInfo("machine-0-lxc-0") 259 c.Assert(err, gc.IsNil) 260 c.Assert(results, gc.DeepEquals, expectedContainerInfo) 261 262 results, err = s.networker.MachineNetworkInfo("machine-0-lxc-0-lxc-0") 263 c.Assert(err, gc.IsNil) 264 c.Assert(results, gc.DeepEquals, expectedNestedContainerInfo) 265 }