github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 "strings" 8 stdtesting "testing" 9 "time" 10 11 "github.com/juju/errors" 12 gitjujutesting "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/cloud" 17 "github.com/juju/juju/environs" 18 "github.com/juju/juju/environs/bootstrap" 19 "github.com/juju/juju/environs/jujutest" 20 sstesting "github.com/juju/juju/environs/simplestreams/testing" 21 envtesting "github.com/juju/juju/environs/testing" 22 "github.com/juju/juju/instance" 23 "github.com/juju/juju/juju/keys" 24 jujutesting "github.com/juju/juju/juju/testing" 25 "github.com/juju/juju/network" 26 "github.com/juju/juju/provider/dummy" 27 "github.com/juju/juju/testing" 28 jujuversion "github.com/juju/juju/version" 29 ) 30 31 const AdminSecret = "admin-secret" 32 33 func TestPackage(t *stdtesting.T) { 34 testing.MgoTestPackage(t) 35 } 36 37 func init() { 38 gc.Suite(&liveSuite{ 39 LiveTests: jujutest.LiveTests{ 40 TestConfig: dummy.SampleConfig(), 41 CanOpenState: true, 42 HasProvisioner: false, 43 }, 44 }) 45 gc.Suite(&suite{ 46 Tests: jujutest.Tests{ 47 TestConfig: dummy.SampleConfig(), 48 }, 49 }) 50 } 51 52 type liveSuite struct { 53 testing.BaseSuite 54 gitjujutesting.MgoSuite 55 jujutest.LiveTests 56 } 57 58 func (s *liveSuite) SetUpSuite(c *gc.C) { 59 s.BaseSuite.SetUpSuite(c) 60 s.MgoSuite.SetUpSuite(c) 61 s.LiveTests.SetUpSuite(c) 62 s.BaseSuite.PatchValue(&keys.JujuPublicKey, sstesting.SignedMetadataPublicKey) 63 } 64 65 func (s *liveSuite) TearDownSuite(c *gc.C) { 66 s.LiveTests.TearDownSuite(c) 67 s.MgoSuite.TearDownSuite(c) 68 s.BaseSuite.TearDownSuite(c) 69 } 70 71 func (s *liveSuite) SetUpTest(c *gc.C) { 72 s.BaseSuite.SetUpTest(c) 73 s.MgoSuite.SetUpTest(c) 74 s.LiveTests.SetUpTest(c) 75 s.BaseSuite.PatchValue(&dummy.LogDir, c.MkDir()) 76 } 77 78 func (s *liveSuite) TearDownTest(c *gc.C) { 79 s.Destroy(c) 80 s.LiveTests.TearDownTest(c) 81 s.MgoSuite.TearDownTest(c) 82 s.BaseSuite.TearDownTest(c) 83 } 84 85 type suite struct { 86 testing.BaseSuite 87 gitjujutesting.MgoSuite 88 jujutest.Tests 89 } 90 91 func (s *suite) SetUpSuite(c *gc.C) { 92 s.BaseSuite.SetUpSuite(c) 93 s.MgoSuite.SetUpSuite(c) 94 } 95 96 func (s *suite) TearDownSuite(c *gc.C) { 97 s.MgoSuite.TearDownSuite(c) 98 s.BaseSuite.TearDownSuite(c) 99 } 100 101 func (s *suite) SetUpTest(c *gc.C) { 102 s.BaseSuite.SetUpTest(c) 103 s.PatchValue(&jujuversion.Current, testing.FakeVersionNumber) 104 s.MgoSuite.SetUpTest(c) 105 s.Tests.SetUpTest(c) 106 s.PatchValue(&dummy.LogDir, c.MkDir()) 107 } 108 109 func (s *suite) TearDownTest(c *gc.C) { 110 s.Tests.TearDownTest(c) 111 s.MgoSuite.TearDownTest(c) 112 dummy.Reset(c) 113 s.BaseSuite.TearDownTest(c) 114 } 115 116 func (s *suite) bootstrapTestEnviron(c *gc.C) environs.NetworkingEnviron { 117 env, err := bootstrap.Prepare( 118 envtesting.BootstrapContext(c), 119 s.ControllerStore, 120 bootstrap.PrepareParams{ 121 ControllerConfig: testing.FakeControllerConfig(), 122 ModelConfig: s.TestConfig, 123 ControllerName: s.TestConfig["name"].(string), 124 Cloud: dummy.SampleCloudSpec(), 125 AdminSecret: AdminSecret, 126 }, 127 ) 128 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", s.TestConfig)) 129 c.Assert(env, gc.NotNil) 130 netenv, supported := environs.SupportsNetworking(env) 131 c.Assert(supported, jc.IsTrue) 132 133 err = bootstrap.Bootstrap(envtesting.BootstrapContext(c), netenv, bootstrap.BootstrapParams{ 134 ControllerConfig: testing.FakeControllerConfig(), 135 CloudName: "dummy", 136 Cloud: cloud.Cloud{ 137 Type: "dummy", 138 AuthTypes: []cloud.AuthType{cloud.EmptyAuthType}, 139 }, 140 AdminSecret: AdminSecret, 141 CAPrivateKey: testing.CAKey, 142 }) 143 c.Assert(err, jc.ErrorIsNil) 144 return netenv 145 } 146 147 func (s *suite) TestAvailabilityZone(c *gc.C) { 148 e := s.bootstrapTestEnviron(c) 149 defer func() { 150 err := e.Destroy() 151 c.Assert(err, jc.ErrorIsNil) 152 }() 153 154 inst, hwc := jujutesting.AssertStartInstance(c, e, s.ControllerUUID, "0") 155 c.Assert(inst, gc.NotNil) 156 c.Check(hwc.AvailabilityZone, gc.IsNil) 157 } 158 159 func (s *suite) TestSupportsSpaces(c *gc.C) { 160 e := s.bootstrapTestEnviron(c) 161 defer func() { 162 err := e.Destroy() 163 c.Assert(err, jc.ErrorIsNil) 164 }() 165 166 // Without change spaces are supported. 167 ok, err := e.SupportsSpaces() 168 c.Assert(ok, jc.IsTrue) 169 c.Assert(err, jc.ErrorIsNil) 170 171 // Now turn it off. 172 isEnabled := dummy.SetSupportsSpaces(false) 173 c.Assert(isEnabled, jc.IsTrue) 174 ok, err = e.SupportsSpaces() 175 c.Assert(ok, jc.IsFalse) 176 c.Assert(err, jc.Satisfies, errors.IsNotSupported) 177 178 // And finally turn it on again. 179 isEnabled = dummy.SetSupportsSpaces(true) 180 c.Assert(isEnabled, jc.IsFalse) 181 ok, err = e.SupportsSpaces() 182 c.Assert(ok, jc.IsTrue) 183 c.Assert(err, jc.ErrorIsNil) 184 } 185 186 func (s *suite) TestSupportsSpaceDiscovery(c *gc.C) { 187 e := s.bootstrapTestEnviron(c) 188 defer func() { 189 err := e.Destroy() 190 c.Assert(err, jc.ErrorIsNil) 191 }() 192 193 // Without change space discovery is not supported. 194 ok, err := e.SupportsSpaceDiscovery() 195 c.Assert(ok, jc.IsFalse) 196 c.Assert(err, jc.ErrorIsNil) 197 198 // Now turn it on. 199 isEnabled := dummy.SetSupportsSpaceDiscovery(true) 200 c.Assert(isEnabled, jc.IsFalse) 201 ok, err = e.SupportsSpaceDiscovery() 202 c.Assert(ok, jc.IsTrue) 203 c.Assert(err, jc.ErrorIsNil) 204 205 // And finally turn it off again. 206 isEnabled = dummy.SetSupportsSpaceDiscovery(false) 207 c.Assert(isEnabled, jc.IsTrue) 208 ok, err = e.SupportsSpaceDiscovery() 209 c.Assert(ok, jc.IsFalse) 210 c.Assert(err, jc.ErrorIsNil) 211 } 212 213 func (s *suite) breakMethods(c *gc.C, e environs.NetworkingEnviron, names ...string) { 214 cfg := e.Config() 215 brokenCfg, err := cfg.Apply(map[string]interface{}{ 216 "broken": strings.Join(names, " "), 217 }) 218 c.Assert(err, jc.ErrorIsNil) 219 err = e.SetConfig(brokenCfg) 220 c.Assert(err, jc.ErrorIsNil) 221 } 222 223 func (s *suite) TestNetworkInterfaces(c *gc.C) { 224 e := s.bootstrapTestEnviron(c) 225 defer func() { 226 err := e.Destroy() 227 c.Assert(err, jc.ErrorIsNil) 228 }() 229 230 opc := make(chan dummy.Operation, 200) 231 dummy.Listen(opc) 232 233 expectInfo := []network.InterfaceInfo{{ 234 ProviderId: "dummy-eth0", 235 ProviderSubnetId: "dummy-private", 236 CIDR: "0.10.0.0/24", 237 DeviceIndex: 0, 238 InterfaceName: "eth0", 239 InterfaceType: "ethernet", 240 VLANTag: 0, 241 MACAddress: "aa:bb:cc:dd:ee:f0", 242 Disabled: false, 243 NoAutoStart: false, 244 ConfigType: network.ConfigDHCP, 245 Address: network.NewAddress("0.10.0.2"), 246 DNSServers: network.NewAddresses("ns1.dummy", "ns2.dummy"), 247 GatewayAddress: network.NewAddress("0.10.0.1"), 248 }, { 249 ProviderId: "dummy-eth1", 250 ProviderSubnetId: "dummy-public", 251 CIDR: "0.20.0.0/24", 252 DeviceIndex: 1, 253 InterfaceName: "eth1", 254 InterfaceType: "ethernet", 255 VLANTag: 1, 256 MACAddress: "aa:bb:cc:dd:ee:f1", 257 Disabled: false, 258 NoAutoStart: true, 259 ConfigType: network.ConfigDHCP, 260 Address: network.NewAddress("0.20.0.2"), 261 DNSServers: network.NewAddresses("ns1.dummy", "ns2.dummy"), 262 GatewayAddress: network.NewAddress("0.20.0.1"), 263 }, { 264 ProviderId: "dummy-eth2", 265 ProviderSubnetId: "dummy-disabled", 266 CIDR: "0.30.0.0/24", 267 DeviceIndex: 2, 268 InterfaceName: "eth2", 269 InterfaceType: "ethernet", 270 VLANTag: 2, 271 MACAddress: "aa:bb:cc:dd:ee:f2", 272 Disabled: true, 273 NoAutoStart: false, 274 ConfigType: network.ConfigDHCP, 275 Address: network.NewAddress("0.30.0.2"), 276 DNSServers: network.NewAddresses("ns1.dummy", "ns2.dummy"), 277 GatewayAddress: network.NewAddress("0.30.0.1"), 278 }} 279 info, err := e.NetworkInterfaces("i-42") 280 c.Assert(err, jc.ErrorIsNil) 281 c.Assert(info, jc.DeepEquals, expectInfo) 282 assertInterfaces(c, e, opc, "i-42", expectInfo) 283 284 // Test we can induce errors. 285 s.breakMethods(c, e, "NetworkInterfaces") 286 info, err = e.NetworkInterfaces("i-any") 287 c.Assert(err, gc.ErrorMatches, `dummy\.NetworkInterfaces is broken`) 288 c.Assert(info, gc.HasLen, 0) 289 } 290 291 func (s *suite) TestSubnets(c *gc.C) { 292 e := s.bootstrapTestEnviron(c) 293 defer func() { 294 err := e.Destroy() 295 c.Assert(err, jc.ErrorIsNil) 296 }() 297 298 opc := make(chan dummy.Operation, 200) 299 dummy.Listen(opc) 300 301 expectInfo := []network.SubnetInfo{{ 302 CIDR: "0.10.0.0/24", 303 ProviderId: "dummy-private", 304 AvailabilityZones: []string{"zone1", "zone2"}, 305 }, { 306 CIDR: "0.20.0.0/24", 307 ProviderId: "dummy-public", 308 }} 309 310 ids := []network.Id{"dummy-private", "dummy-public", "foo-bar"} 311 netInfo, err := e.Subnets("i-foo", ids) 312 c.Assert(err, jc.ErrorIsNil) 313 c.Assert(netInfo, jc.DeepEquals, expectInfo) 314 assertSubnets(c, e, opc, "i-foo", ids, expectInfo) 315 316 // Test filtering by id(s). 317 netInfo, err = e.Subnets("i-foo", nil) 318 c.Assert(err, jc.ErrorIsNil) 319 c.Assert(netInfo, jc.DeepEquals, expectInfo) 320 assertSubnets(c, e, opc, "i-foo", nil, expectInfo) 321 netInfo, err = e.Subnets("i-foo", ids[0:1]) 322 c.Assert(err, jc.ErrorIsNil) 323 c.Assert(netInfo, jc.DeepEquals, expectInfo[0:1]) 324 assertSubnets(c, e, opc, "i-foo", ids[0:1], expectInfo[0:1]) 325 netInfo, err = e.Subnets("i-foo", ids[1:]) 326 c.Assert(err, jc.ErrorIsNil) 327 c.Assert(netInfo, jc.DeepEquals, expectInfo[1:]) 328 assertSubnets(c, e, opc, "i-foo", ids[1:], expectInfo[1:]) 329 330 // Test we can induce errors. 331 s.breakMethods(c, e, "Subnets") 332 netInfo, err = e.Subnets("i-any", nil) 333 c.Assert(err, gc.ErrorMatches, `dummy\.Subnets is broken`) 334 c.Assert(netInfo, gc.HasLen, 0) 335 } 336 337 func assertInterfaces(c *gc.C, e environs.Environ, opc chan dummy.Operation, expectInstId instance.Id, expectInfo []network.InterfaceInfo) { 338 select { 339 case op := <-opc: 340 netOp, ok := op.(dummy.OpNetworkInterfaces) 341 if !ok { 342 c.Fatalf("unexpected op: %#v", op) 343 } 344 c.Check(netOp.Env, gc.Equals, e.Config().Name()) 345 c.Check(netOp.InstanceId, gc.Equals, expectInstId) 346 c.Check(netOp.Info, jc.DeepEquals, expectInfo) 347 return 348 case <-time.After(testing.ShortWait): 349 c.Fatalf("time out wating for operation") 350 } 351 } 352 353 func assertSubnets( 354 c *gc.C, 355 e environs.Environ, 356 opc chan dummy.Operation, 357 instId instance.Id, 358 subnetIds []network.Id, 359 expectInfo []network.SubnetInfo, 360 ) { 361 select { 362 case op := <-opc: 363 netOp, ok := op.(dummy.OpSubnets) 364 if !ok { 365 c.Fatalf("unexpected op: %#v", op) 366 } 367 c.Check(netOp.InstanceId, gc.Equals, instId) 368 c.Check(netOp.SubnetIds, jc.DeepEquals, subnetIds) 369 c.Check(netOp.Info, jc.DeepEquals, expectInfo) 370 return 371 case <-time.After(testing.ShortWait): 372 c.Fatalf("time out wating for operation") 373 } 374 }