github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/apiserver/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 gc "launchpad.net/gocheck" 8 9 "github.com/juju/juju/environs/network" 10 "github.com/juju/juju/instance" 11 "github.com/juju/juju/juju/testing" 12 "github.com/juju/juju/state" 13 "github.com/juju/juju/state/api/params" 14 "github.com/juju/juju/state/apiserver/common" 15 "github.com/juju/juju/state/apiserver/networker" 16 apiservertesting "github.com/juju/juju/state/apiserver/testing" 17 ) 18 19 type networkerSuite struct { 20 testing.JujuConnSuite 21 22 networks []state.NetworkInfo 23 24 machine *state.Machine 25 container *state.Machine 26 nestedContainer *state.Machine 27 28 machineIfaces []state.NetworkInterfaceInfo 29 containerIfaces []state.NetworkInterfaceInfo 30 nestedContainerIfaces []state.NetworkInterfaceInfo 31 32 authorizer apiservertesting.FakeAuthorizer 33 resources *common.Resources 34 networker *networker.NetworkerAPI 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 to use. 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 hwChars := instance.MustParseHardware("arch=i386", "mem=4G") 75 s.machineIfaces = []state.NetworkInterfaceInfo{{ 76 MACAddress: "aa:bb:cc:dd:ee:f0", 77 InterfaceName: "eth0", 78 NetworkName: "net1", 79 IsVirtual: false, 80 }, { 81 MACAddress: "aa:bb:cc:dd:ee:f1", 82 InterfaceName: "eth1", 83 NetworkName: "net1", 84 IsVirtual: false, 85 }, { 86 MACAddress: "aa:bb:cc:dd:ee:f1", 87 InterfaceName: "eth1.42", 88 NetworkName: "vlan42", 89 IsVirtual: true, 90 }, { 91 MACAddress: "aa:bb:cc:dd:ee:f0", 92 InterfaceName: "eth0.69", 93 NetworkName: "vlan69", 94 IsVirtual: true, 95 }, { 96 MACAddress: "aa:bb:cc:dd:ee:f2", 97 InterfaceName: "eth2", 98 NetworkName: "net2", 99 IsVirtual: false, 100 }} 101 err = s.machine.SetInstanceInfo("i-am", "fake_nonce", &hwChars, s.networks, s.machineIfaces) 102 c.Assert(err, gc.IsNil) 103 } 104 105 // Create and provision a container and a nested container. 106 func (s *networkerSuite) setUpContainers(c *gc.C) { 107 template := state.MachineTemplate{ 108 Series: "quantal", 109 Jobs: []state.MachineJob{state.JobHostUnits}, 110 } 111 var err error 112 s.container, err = s.State.AddMachineInsideMachine(template, s.machine.Id(), instance.LXC) 113 c.Assert(err, gc.IsNil) 114 s.containerIfaces = []state.NetworkInterfaceInfo{{ 115 MACAddress: "aa:bb:cc:dd:ee:e0", 116 InterfaceName: "eth0", 117 NetworkName: "net1", 118 IsVirtual: false, 119 }, { 120 MACAddress: "aa:bb:cc:dd:ee:e1", 121 InterfaceName: "eth1", 122 NetworkName: "net1", 123 IsVirtual: false, 124 }, { 125 MACAddress: "aa:bb:cc:dd:ee:e1", 126 InterfaceName: "eth1.42", 127 NetworkName: "vlan42", 128 IsVirtual: true, 129 }} 130 hwChars := instance.MustParseHardware("arch=i386", "mem=4G") 131 err = s.container.SetInstanceInfo("i-container", "fake_nonce", &hwChars, s.networks[:2], 132 s.containerIfaces) 133 c.Assert(err, gc.IsNil) 134 135 s.nestedContainer, err = s.State.AddMachineInsideMachine(template, s.container.Id(), instance.LXC) 136 c.Assert(err, gc.IsNil) 137 s.nestedContainerIfaces = []state.NetworkInterfaceInfo{{ 138 MACAddress: "aa:bb:cc:dd:ee:d0", 139 InterfaceName: "eth0", 140 NetworkName: "net1", 141 IsVirtual: false, 142 }} 143 err = s.nestedContainer.SetInstanceInfo("i-too", "fake_nonce", &hwChars, s.networks[:1], 144 s.nestedContainerIfaces) 145 c.Assert(err, gc.IsNil) 146 } 147 148 func (s *networkerSuite) SetUpTest(c *gc.C) { 149 s.JujuConnSuite.SetUpTest(c) 150 151 s.setUpNetworks(c) 152 s.setUpMachine(c) 153 s.setUpContainers(c) 154 155 // Create a FakeAuthorizer so we can check permissions, 156 // set up assuming we logged in as a machine agent. 157 s.authorizer = apiservertesting.FakeAuthorizer{ 158 LoggedIn: true, 159 MachineAgent: true, 160 Tag: s.machine.Tag(), 161 } 162 163 // Create a networker API for the machine. 164 var err error 165 s.networker, err = networker.NewNetworkerAPI( 166 s.State, 167 nil, 168 s.authorizer, 169 ) 170 c.Assert(err, gc.IsNil) 171 } 172 173 func (s *networkerSuite) TestNetworkerNonMachineAgent(c *gc.C) { 174 // Fails with not a machine agent 175 anAuthorizer := s.authorizer 176 anAuthorizer.MachineAgent = false 177 aNetworker, err := networker.NewNetworkerAPI(s.State, s.resources, anAuthorizer) 178 c.Assert(err, gc.ErrorMatches, "permission denied") 179 c.Assert(aNetworker, gc.IsNil) 180 } 181 182 func (s *networkerSuite) TestMachineNetworkInfoPermissions(c *gc.C) { 183 args := params.Entities{Entities: []params.Entity{ 184 {Tag: "service-bar"}, 185 {Tag: "foo-42"}, 186 {Tag: "unit-mysql-0"}, 187 {Tag: "service-mysql"}, 188 {Tag: "user-foo"}, 189 {Tag: "machine-1"}, 190 {Tag: "machine-0-lxc-42"}, 191 }} 192 results, err := s.networker.MachineNetworkInfo(args) 193 c.Assert(err, gc.IsNil) 194 c.Assert(results, gc.DeepEquals, params.MachineNetworkInfoResults{ 195 Results: []params.MachineNetworkInfoResult{ 196 {Error: apiservertesting.ErrUnauthorized}, 197 {Error: apiservertesting.ErrUnauthorized}, 198 {Error: apiservertesting.ErrUnauthorized}, 199 {Error: apiservertesting.ErrUnauthorized}, 200 {Error: apiservertesting.ErrUnauthorized}, 201 {Error: apiservertesting.ErrUnauthorized}, 202 {Error: apiservertesting.NotFoundError("machine 0/lxc/42")}, 203 }, 204 }) 205 } 206 207 func (s *networkerSuite) TestMachineNetworkInfo(c *gc.C) { 208 // Expected results of MachineNetworkInfo for a machine and containers 209 expectedMachineInfo := []network.Info{{ 210 MACAddress: "aa:bb:cc:dd:ee:f0", 211 CIDR: "0.1.2.0/24", 212 NetworkName: "net1", 213 ProviderId: "net1", 214 VLANTag: 0, 215 InterfaceName: "eth0", 216 IsVirtual: false, 217 }, { 218 MACAddress: "aa:bb:cc:dd:ee:f1", 219 CIDR: "0.1.2.0/24", 220 NetworkName: "net1", 221 ProviderId: "net1", 222 VLANTag: 0, 223 InterfaceName: "eth1", 224 IsVirtual: false, 225 }, { 226 MACAddress: "aa:bb:cc:dd:ee:f1", 227 CIDR: "0.2.2.0/24", 228 NetworkName: "vlan42", 229 ProviderId: "vlan42", 230 VLANTag: 42, 231 InterfaceName: "eth1", 232 IsVirtual: true, 233 }, { 234 MACAddress: "aa:bb:cc:dd:ee:f0", 235 CIDR: "0.3.2.0/24", 236 NetworkName: "vlan69", 237 ProviderId: "vlan69", 238 VLANTag: 69, 239 InterfaceName: "eth0", 240 IsVirtual: true, 241 }, { 242 MACAddress: "aa:bb:cc:dd:ee:f2", 243 CIDR: "0.5.2.0/24", 244 NetworkName: "net2", 245 ProviderId: "net2", 246 VLANTag: 0, 247 InterfaceName: "eth2", 248 IsVirtual: false, 249 }} 250 expectedContainerInfo := []network.Info{{ 251 MACAddress: "aa:bb:cc:dd:ee:e0", 252 CIDR: "0.1.2.0/24", 253 NetworkName: "net1", 254 ProviderId: "net1", 255 VLANTag: 0, 256 InterfaceName: "eth0", 257 IsVirtual: false, 258 }, { 259 MACAddress: "aa:bb:cc:dd:ee:e1", 260 CIDR: "0.1.2.0/24", 261 NetworkName: "net1", 262 ProviderId: "net1", 263 VLANTag: 0, 264 InterfaceName: "eth1", 265 IsVirtual: false, 266 }, { 267 MACAddress: "aa:bb:cc:dd:ee:e1", 268 CIDR: "0.2.2.0/24", 269 NetworkName: "vlan42", 270 ProviderId: "vlan42", 271 VLANTag: 42, 272 InterfaceName: "eth1", 273 IsVirtual: true, 274 }} 275 expectedNestedContainerInfo := []network.Info{{ 276 MACAddress: "aa:bb:cc:dd:ee:d0", 277 CIDR: "0.1.2.0/24", 278 NetworkName: "net1", 279 ProviderId: "net1", 280 VLANTag: 0, 281 InterfaceName: "eth0", 282 IsVirtual: false, 283 }} 284 285 args := params.Entities{Entities: []params.Entity{ 286 {Tag: "machine-0"}, 287 {Tag: "machine-0-lxc-0"}, 288 {Tag: "machine-0-lxc-0-lxc-0"}, 289 }} 290 results, err := s.networker.MachineNetworkInfo(args) 291 c.Assert(err, gc.IsNil) 292 c.Assert(results, gc.DeepEquals, params.MachineNetworkInfoResults{ 293 Results: []params.MachineNetworkInfoResult{ 294 {Error: nil, Info: expectedMachineInfo}, 295 {Error: nil, Info: expectedContainerInfo}, 296 {Error: nil, Info: expectedNestedContainerInfo}, 297 }, 298 }) 299 }