github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/vsphere/environ_availzones_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package vsphere_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 "github.com/vmware/govmomi/vim25/mo" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/core/instance" 12 "github.com/juju/juju/environs" 13 "github.com/juju/juju/environs/context" 14 "github.com/juju/juju/provider/common" 15 ) 16 17 type environAvailzonesSuite struct { 18 EnvironFixture 19 } 20 21 var _ = gc.Suite(&environAvailzonesSuite{}) 22 23 func (s *environAvailzonesSuite) TestAvailabilityZones(c *gc.C) { 24 s.client.computeResources = []*mo.ComputeResource{ 25 newComputeResource("z1"), 26 newComputeResource("z2"), 27 } 28 29 c.Assert(s.env, gc.Implements, new(common.ZonedEnviron)) 30 zonedEnviron := s.env.(common.ZonedEnviron) 31 zones, err := zonedEnviron.AvailabilityZones(s.callCtx) 32 c.Assert(err, jc.ErrorIsNil) 33 c.Assert(len(zones), gc.Equals, 2) 34 c.Assert(zones[0].Name(), gc.Equals, "z1") 35 c.Assert(zones[1].Name(), gc.Equals, "z2") 36 } 37 38 func (s *environAvailzonesSuite) TestInstanceAvailabilityZoneNames(c *gc.C) { 39 z1 := newComputeResource("z1") 40 z2 := newComputeResource("z2") 41 s.client.computeResources = []*mo.ComputeResource{z1, z2} 42 43 s.client.virtualMachines = []*mo.VirtualMachine{ 44 buildVM("inst-0").resourcePool(z2.ResourcePool).vm(), 45 buildVM("inst-1").resourcePool(z1.ResourcePool).vm(), 46 buildVM("inst-2").vm(), 47 } 48 ids := []instance.Id{"inst-0", "inst-1", "inst-2", "inst-3"} 49 50 zonedEnviron := s.env.(common.ZonedEnviron) 51 zones, err := zonedEnviron.InstanceAvailabilityZoneNames(s.callCtx, ids) 52 c.Assert(err, gc.Equals, environs.ErrPartialInstances) 53 c.Assert(zones, jc.DeepEquals, []string{"z2", "z1", "", ""}) 54 } 55 56 func (s *environAvailzonesSuite) TestInstanceAvailabilityZoneNamesNoInstances(c *gc.C) { 57 zonedEnviron := s.env.(common.ZonedEnviron) 58 _, err := zonedEnviron.InstanceAvailabilityZoneNames(s.callCtx, []instance.Id{"inst-0"}) 59 c.Assert(err, gc.Equals, environs.ErrNoInstances) 60 } 61 62 func (s *environAvailzonesSuite) TestDeriveAvailabilityZones(c *gc.C) { 63 s.client.computeResources = []*mo.ComputeResource{ 64 newComputeResource("test-available"), 65 } 66 67 c.Assert(s.env, gc.Implements, new(common.ZonedEnviron)) 68 zonedEnviron := s.env.(common.ZonedEnviron) 69 70 zones, err := zonedEnviron.DeriveAvailabilityZones( 71 s.callCtx, 72 environs.StartInstanceParams{Placement: "zone=test-available"}) 73 c.Assert(err, jc.ErrorIsNil) 74 c.Assert(zones, gc.DeepEquals, []string{"test-available"}) 75 } 76 77 func (s *environAvailzonesSuite) TestDeriveAvailabilityZonesUnknown(c *gc.C) { 78 c.Assert(s.env, gc.Implements, new(common.ZonedEnviron)) 79 zonedEnviron := s.env.(common.ZonedEnviron) 80 81 zones, err := zonedEnviron.DeriveAvailabilityZones( 82 s.callCtx, 83 environs.StartInstanceParams{Placement: "zone=test-unknown"}) 84 c.Assert(err, gc.ErrorMatches, `availability zone "test-unknown" not found`) 85 c.Assert(zones, gc.HasLen, 0) 86 } 87 88 func (s *environAvailzonesSuite) TestDeriveAvailabilityZonesInvalidPlacement(c *gc.C) { 89 c.Assert(s.env, gc.Implements, new(common.ZonedEnviron)) 90 zonedEnviron := s.env.(common.ZonedEnviron) 91 92 zones, err := zonedEnviron.DeriveAvailabilityZones( 93 s.callCtx, 94 environs.StartInstanceParams{ 95 Placement: "invalid-placement", 96 }) 97 c.Assert(err, gc.ErrorMatches, `unknown placement directive: invalid-placement`) 98 c.Assert(zones, gc.HasLen, 0) 99 } 100 101 func (s *environAvailzonesSuite) TestAvailabilityZonesPermissionError(c *gc.C) { 102 AssertInvalidatesCredential(c, s.client, func(ctx context.ProviderCallContext) error { 103 zonedEnv := s.env.(common.ZonedEnviron) 104 _, err := zonedEnv.AvailabilityZones(ctx) 105 return err 106 }) 107 }