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  }