github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/dummy/environs_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package dummy_test 5 6 import ( 7 stdtesting "testing" 8 "time" 9 10 gitjujutesting "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/bootstrap" 16 "github.com/juju/juju/environs/config" 17 "github.com/juju/juju/environs/jujutest" 18 envtesting "github.com/juju/juju/environs/testing" 19 "github.com/juju/juju/instance" 20 jujutesting "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/network" 22 "github.com/juju/juju/provider/dummy" 23 "github.com/juju/juju/testing" 24 ) 25 26 func TestPackage(t *stdtesting.T) { 27 testing.MgoTestPackage(t) 28 } 29 30 func init() { 31 gc.Suite(&liveSuite{ 32 LiveTests: jujutest.LiveTests{ 33 TestConfig: dummy.SampleConfig(), 34 CanOpenState: true, 35 HasProvisioner: false, 36 }, 37 }) 38 gc.Suite(&suite{ 39 Tests: jujutest.Tests{ 40 TestConfig: dummy.SampleConfig(), 41 }, 42 }) 43 } 44 45 type liveSuite struct { 46 testing.BaseSuite 47 gitjujutesting.MgoSuite 48 jujutest.LiveTests 49 } 50 51 func (s *liveSuite) SetUpSuite(c *gc.C) { 52 s.BaseSuite.SetUpSuite(c) 53 s.MgoSuite.SetUpSuite(c) 54 s.LiveTests.SetUpSuite(c) 55 } 56 57 func (s *liveSuite) TearDownSuite(c *gc.C) { 58 s.LiveTests.TearDownSuite(c) 59 s.MgoSuite.TearDownSuite(c) 60 s.BaseSuite.TearDownSuite(c) 61 } 62 63 func (s *liveSuite) SetUpTest(c *gc.C) { 64 s.BaseSuite.SetUpTest(c) 65 s.MgoSuite.SetUpTest(c) 66 s.LiveTests.SetUpTest(c) 67 } 68 69 func (s *liveSuite) TearDownTest(c *gc.C) { 70 s.Destroy(c) 71 s.LiveTests.TearDownTest(c) 72 s.MgoSuite.TearDownTest(c) 73 s.BaseSuite.TearDownTest(c) 74 } 75 76 type suite struct { 77 testing.BaseSuite 78 gitjujutesting.MgoSuite 79 jujutest.Tests 80 } 81 82 func (s *suite) SetUpSuite(c *gc.C) { 83 s.BaseSuite.SetUpSuite(c) 84 s.MgoSuite.SetUpSuite(c) 85 } 86 87 func (s *suite) TearDownSuite(c *gc.C) { 88 s.MgoSuite.TearDownSuite(c) 89 s.BaseSuite.TearDownSuite(c) 90 } 91 92 func (s *suite) SetUpTest(c *gc.C) { 93 s.BaseSuite.SetUpTest(c) 94 s.MgoSuite.SetUpTest(c) 95 s.Tests.SetUpTest(c) 96 } 97 98 func (s *suite) TearDownTest(c *gc.C) { 99 s.Tests.TearDownTest(c) 100 s.MgoSuite.TearDownTest(c) 101 dummy.Reset() 102 s.BaseSuite.TearDownTest(c) 103 } 104 105 func (s *suite) bootstrapTestEnviron(c *gc.C, preferIPv6 bool) environs.NetworkingEnviron { 106 s.TestConfig["prefer-ipv6"] = preferIPv6 107 cfg, err := config.New(config.NoDefaults, s.TestConfig) 108 c.Assert(err, jc.ErrorIsNil) 109 env, err := environs.Prepare(cfg, envtesting.BootstrapContext(c), s.ConfigStore) 110 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", s.TestConfig)) 111 c.Assert(env, gc.NotNil) 112 netenv, supported := environs.SupportsNetworking(env) 113 c.Assert(supported, jc.IsTrue) 114 115 err = bootstrap.EnsureNotBootstrapped(netenv) 116 c.Assert(err, jc.ErrorIsNil) 117 err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), netenv, bootstrap.BootstrapParams{}) 118 c.Assert(err, jc.ErrorIsNil) 119 return netenv 120 } 121 122 func (s *suite) TestAvailabilityZone(c *gc.C) { 123 e := s.bootstrapTestEnviron(c, true) 124 defer func() { 125 err := e.Destroy() 126 c.Assert(err, jc.ErrorIsNil) 127 }() 128 129 inst, hwc := jujutesting.AssertStartInstance(c, e, "0") 130 c.Assert(inst, gc.NotNil) 131 c.Check(hwc.AvailabilityZone, gc.IsNil) 132 } 133 134 func (s *suite) TestAllocateAddress(c *gc.C) { 135 e := s.bootstrapTestEnviron(c, false) 136 defer func() { 137 err := e.Destroy() 138 c.Assert(err, jc.ErrorIsNil) 139 }() 140 141 inst, _ := jujutesting.AssertStartInstance(c, e, "0") 142 c.Assert(inst, gc.NotNil) 143 subnetId := network.Id("net1") 144 145 opc := make(chan dummy.Operation, 200) 146 dummy.Listen(opc) 147 148 newAddress := network.NewAddress("0.1.2.1", network.ScopeCloudLocal) 149 err := e.AllocateAddress(inst.Id(), subnetId, newAddress) 150 c.Assert(err, jc.ErrorIsNil) 151 152 assertAllocateAddress(c, e, opc, inst.Id(), subnetId, newAddress) 153 154 newAddress = network.NewAddress("0.1.2.2", network.ScopeCloudLocal) 155 err = e.AllocateAddress(inst.Id(), subnetId, newAddress) 156 c.Assert(err, jc.ErrorIsNil) 157 assertAllocateAddress(c, e, opc, inst.Id(), subnetId, newAddress) 158 } 159 160 func (s *suite) TestReleaseAddress(c *gc.C) { 161 e := s.bootstrapTestEnviron(c, false) 162 defer func() { 163 err := e.Destroy() 164 c.Assert(err, jc.ErrorIsNil) 165 }() 166 167 inst, _ := jujutesting.AssertStartInstance(c, e, "0") 168 c.Assert(inst, gc.NotNil) 169 subnetId := network.Id("net1") 170 171 opc := make(chan dummy.Operation, 200) 172 dummy.Listen(opc) 173 174 address := network.NewAddress("0.1.2.1", network.ScopeCloudLocal) 175 err := e.ReleaseAddress(inst.Id(), subnetId, address) 176 c.Assert(err, jc.ErrorIsNil) 177 178 assertReleaseAddress(c, e, opc, inst.Id(), subnetId, address) 179 180 address = network.NewAddress("0.1.2.2", network.ScopeCloudLocal) 181 err = e.ReleaseAddress(inst.Id(), subnetId, address) 182 c.Assert(err, jc.ErrorIsNil) 183 assertReleaseAddress(c, e, opc, inst.Id(), subnetId, address) 184 } 185 186 func (s *suite) TestNetworkInterfaces(c *gc.C) { 187 e := s.bootstrapTestEnviron(c, false) 188 defer func() { 189 err := e.Destroy() 190 c.Assert(err, jc.ErrorIsNil) 191 }() 192 193 opc := make(chan dummy.Operation, 200) 194 dummy.Listen(opc) 195 196 expectInfo := []network.InterfaceInfo{{ 197 ProviderId: "dummy-private", 198 NetworkName: "juju-private", 199 CIDR: "0.1.2.0/24", 200 InterfaceName: "eth0", 201 VLANTag: 0, 202 MACAddress: "aa:bb:cc:dd:ee:f0", 203 Disabled: false, 204 NoAutoStart: false, 205 ConfigType: network.ConfigDHCP, 206 Address: network.NewAddress("0.1.2.1", network.ScopeUnknown), 207 DNSServers: network.NewAddresses("ns1.dummy", "ns2.dummy"), 208 GatewayAddress: network.NewAddress("0.1.2.1", network.ScopeUnknown), 209 ExtraConfig: nil, 210 }, { 211 ProviderId: "dummy-public", 212 NetworkName: "juju-public", 213 CIDR: "0.2.2.0/24", 214 InterfaceName: "eth1", 215 VLANTag: 1, 216 MACAddress: "aa:bb:cc:dd:ee:f1", 217 Disabled: true, 218 NoAutoStart: true, 219 ConfigType: network.ConfigDHCP, 220 Address: network.NewAddress("0.2.2.1", network.ScopeUnknown), 221 DNSServers: network.NewAddresses("ns1.dummy", "ns2.dummy"), 222 GatewayAddress: network.NewAddress("0.2.2.1", network.ScopeUnknown), 223 ExtraConfig: nil, 224 }} 225 info, err := e.NetworkInterfaces(instance.Id("i-42")) 226 c.Assert(err, jc.ErrorIsNil) 227 c.Assert(info, jc.DeepEquals, expectInfo) 228 assertInterfaces(c, e, opc, instance.Id("i-42"), expectInfo) 229 } 230 231 func (s *suite) TestSubnets(c *gc.C) { 232 e := s.bootstrapTestEnviron(c, false) 233 defer func() { 234 err := e.Destroy() 235 c.Assert(err, jc.ErrorIsNil) 236 }() 237 238 opc := make(chan dummy.Operation, 200) 239 dummy.Listen(opc) 240 241 expectInfo := []network.SubnetInfo{ 242 {CIDR: "0.10.0.0/8", ProviderId: "dummy-private"}, 243 {CIDR: "0.20.0.0/24", ProviderId: "dummy-public"}, 244 } 245 netInfo, err := e.Subnets("", []network.Id{"dummy-private", "dummy-public"}) 246 c.Assert(err, jc.ErrorIsNil) 247 c.Assert(netInfo, jc.DeepEquals, expectInfo) 248 assertSubnets(c, e, opc, expectInfo) 249 } 250 251 func (s *suite) TestPreferIPv6On(c *gc.C) { 252 e := s.bootstrapTestEnviron(c, true) 253 defer func() { 254 err := e.Destroy() 255 c.Assert(err, jc.ErrorIsNil) 256 }() 257 258 inst, _ := jujutesting.AssertStartInstance(c, e, "0") 259 c.Assert(inst, gc.NotNil) 260 addrs, err := inst.Addresses() 261 c.Assert(err, jc.ErrorIsNil) 262 c.Assert(addrs, jc.DeepEquals, network.NewAddresses("only-0.dns", "127.0.0.1", "fc00::1")) 263 } 264 265 func (s *suite) TestPreferIPv6Off(c *gc.C) { 266 e := s.bootstrapTestEnviron(c, false) 267 defer func() { 268 err := e.Destroy() 269 c.Assert(err, jc.ErrorIsNil) 270 }() 271 272 inst, _ := jujutesting.AssertStartInstance(c, e, "0") 273 c.Assert(inst, gc.NotNil) 274 addrs, err := inst.Addresses() 275 c.Assert(err, jc.ErrorIsNil) 276 c.Assert(addrs, jc.DeepEquals, network.NewAddresses("only-0.dns", "127.0.0.1")) 277 } 278 279 func assertAllocateAddress(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectSubnetId network.Id, expectAddress network.Address) { 280 select { 281 case op := <-opc: 282 addrOp, ok := op.(dummy.OpAllocateAddress) 283 if !ok { 284 c.Fatalf("unexpected op: %#v", op) 285 } 286 c.Check(addrOp.SubnetId, gc.Equals, expectSubnetId) 287 c.Check(addrOp.InstanceId, gc.Equals, expectInstId) 288 c.Check(addrOp.Address, gc.Equals, expectAddress) 289 return 290 case <-time.After(testing.ShortWait): 291 c.Fatalf("time out wating for operation") 292 } 293 } 294 295 func assertReleaseAddress(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectSubnetId network.Id, expectAddress network.Address) { 296 select { 297 case op := <-opc: 298 addrOp, ok := op.(dummy.OpReleaseAddress) 299 if !ok { 300 c.Fatalf("unexpected op: %#v", op) 301 } 302 c.Check(addrOp.SubnetId, gc.Equals, expectSubnetId) 303 c.Check(addrOp.InstanceId, gc.Equals, expectInstId) 304 c.Check(addrOp.Address, gc.Equals, expectAddress) 305 return 306 case <-time.After(testing.ShortWait): 307 c.Fatalf("time out wating for operation") 308 } 309 } 310 311 func assertInterfaces(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectInfo []network.InterfaceInfo) { 312 select { 313 case op := <-opc: 314 netOp, ok := op.(dummy.OpNetworkInterfaces) 315 if !ok { 316 c.Fatalf("unexpected op: %#v", op) 317 } 318 c.Check(netOp.Env, gc.Equals, e.Config().Name()) 319 c.Check(netOp.InstanceId, gc.Equals, expectInstId) 320 c.Check(netOp.Info, jc.DeepEquals, expectInfo) 321 return 322 case <-time.After(testing.ShortWait): 323 c.Fatalf("time out wating for operation") 324 } 325 } 326 327 func assertSubnets(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInfo []network.SubnetInfo) { 328 select { 329 case op := <-opc: 330 netOp, ok := op.(dummy.OpListNetworks) 331 if !ok { 332 c.Fatalf("unexpected op: %#v", op) 333 } 334 c.Check(netOp.Info, jc.DeepEquals, expectInfo) 335 return 336 case <-time.After(testing.ShortWait): 337 c.Fatalf("time out wating for operation") 338 } 339 }