github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/gce/environ_availzones_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/core/instance"
    11  	"github.com/juju/juju/environs/instances"
    12  	"github.com/juju/juju/provider/gce"
    13  	"github.com/juju/juju/provider/gce/google"
    14  	"github.com/juju/juju/storage"
    15  )
    16  
    17  type environAZSuite struct {
    18  	gce.BaseSuite
    19  }
    20  
    21  var _ = gc.Suite(&environAZSuite{})
    22  
    23  func (s *environAZSuite) TestAvailabilityZonesInvalidCredentialError(c *gc.C) {
    24  	s.FakeConn.Err = gce.InvalidCredentialError
    25  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
    26  	_, err := s.Env.AvailabilityZones(s.CallCtx)
    27  	c.Check(err, gc.NotNil)
    28  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
    29  }
    30  
    31  func (s *environAZSuite) TestAvailabilityZones(c *gc.C) {
    32  	s.FakeConn.Zones = []google.AvailabilityZone{
    33  		google.NewZone("a-zone", google.StatusUp, "", ""),
    34  		google.NewZone("b-zone", google.StatusUp, "", ""),
    35  	}
    36  
    37  	zones, err := s.Env.AvailabilityZones(s.CallCtx)
    38  	c.Assert(err, jc.ErrorIsNil)
    39  
    40  	c.Check(zones, gc.HasLen, 2)
    41  	c.Check(zones[0].Name(), gc.Equals, "a-zone")
    42  	c.Check(zones[0].Available(), jc.IsTrue)
    43  	c.Check(zones[1].Name(), gc.Equals, "b-zone")
    44  	c.Check(zones[1].Available(), jc.IsTrue)
    45  }
    46  
    47  func (s *environAZSuite) TestAvailabilityZonesDeprecated(c *gc.C) {
    48  	zone := google.NewZone("a-zone", google.StatusUp, "DEPRECATED", "b-zone")
    49  
    50  	c.Check(zone.Deprecated(), jc.IsTrue)
    51  }
    52  
    53  func (s *environAZSuite) TestAvailabilityZonesAPI(c *gc.C) {
    54  	s.FakeConn.Zones = []google.AvailabilityZone{}
    55  
    56  	_, err := s.Env.AvailabilityZones(s.CallCtx)
    57  	c.Assert(err, jc.ErrorIsNil)
    58  
    59  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
    60  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones")
    61  	c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "us-east1")
    62  }
    63  
    64  func (s *environAZSuite) TestInstanceAvailabilityZoneNames(c *gc.C) {
    65  	s.FakeEnviron.Insts = []instances.Instance{s.Instance}
    66  
    67  	ids := []instance.Id{instance.Id("spam")}
    68  	zones, err := s.Env.InstanceAvailabilityZoneNames(s.CallCtx, ids)
    69  	c.Assert(err, jc.ErrorIsNil)
    70  
    71  	c.Check(zones, jc.DeepEquals, []string{"home-zone"})
    72  }
    73  
    74  func (s *environAZSuite) TestInstanceAvailabilityZoneNamesAPIs(c *gc.C) {
    75  	s.FakeEnviron.Insts = []instances.Instance{s.Instance}
    76  
    77  	ids := []instance.Id{instance.Id("spam")}
    78  	_, err := s.Env.InstanceAvailabilityZoneNames(s.CallCtx, ids)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	s.FakeEnviron.CheckCalls(c, []gce.FakeCall{{
    82  		FuncName: "GetInstances", Args: gce.FakeCallArgs{"switch": s.Env},
    83  	}})
    84  }
    85  
    86  func (s *environAZSuite) TestDeriveAvailabilityZonesInvalidCredentialError(c *gc.C) {
    87  	s.StartInstArgs.Placement = "zone=test-available"
    88  	s.FakeConn.Err = gce.InvalidCredentialError
    89  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
    90  	_, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
    91  	c.Check(err, gc.NotNil)
    92  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
    93  }
    94  
    95  func (s *environAZSuite) TestDeriveAvailabilityZones(c *gc.C) {
    96  	s.StartInstArgs.Placement = "zone=test-available"
    97  	s.FakeConn.Zones = []google.AvailabilityZone{
    98  		google.NewZone("test-available", google.StatusUp, "", ""),
    99  	}
   100  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	c.Assert(zones, gc.DeepEquals, []string{"test-available"})
   103  }
   104  
   105  func (s *environAZSuite) TestDeriveAvailabilityZonesVolumeNoPlacement(c *gc.C) {
   106  	s.FakeConn.Zones = []google.AvailabilityZone{
   107  		google.NewZone("az1", google.StatusDown, "", ""),
   108  		google.NewZone("az2", google.StatusUp, "", ""),
   109  	}
   110  	s.StartInstArgs.VolumeAttachments = []storage.VolumeAttachmentParams{{
   111  		VolumeId: "az2--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   112  	}}
   113  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	c.Assert(zones, gc.DeepEquals, []string{"az2"})
   116  }
   117  
   118  func (s *environAZSuite) TestDeriveAvailabilityZonesUnavailable(c *gc.C) {
   119  	s.StartInstArgs.Placement = "zone=test-unavailable"
   120  	s.FakeConn.Zones = []google.AvailabilityZone{
   121  		google.NewZone("test-unavailable", google.StatusDown, "", ""),
   122  	}
   123  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   124  	c.Check(err, gc.ErrorMatches, `.*availability zone "test-unavailable" is DOWN`)
   125  	c.Assert(zones, gc.HasLen, 0)
   126  }
   127  
   128  func (s *environAZSuite) TestDeriveAvailabilityZonesUnknown(c *gc.C) {
   129  	s.StartInstArgs.Placement = "zone=test-unknown"
   130  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   131  	c.Assert(err, gc.ErrorMatches, `invalid availability zone "test-unknown" not found`)
   132  	c.Assert(zones, gc.HasLen, 0)
   133  }
   134  
   135  func (s *environAZSuite) TestDeriveAvailabilityZonesConflictsVolume(c *gc.C) {
   136  	s.FakeConn.Zones = []google.AvailabilityZone{
   137  		google.NewZone("az1", google.StatusUp, "", ""),
   138  		google.NewZone("az2", google.StatusUp, "", ""),
   139  	}
   140  	s.StartInstArgs.Placement = "zone=az1"
   141  	s.StartInstArgs.VolumeAttachments = []storage.VolumeAttachmentParams{{
   142  		VolumeId: "az2--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   143  	}}
   144  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   145  	c.Assert(err, gc.ErrorMatches, `cannot create instance with placement "zone=az1": cannot create instance in zone "az1", as this will prevent attaching the requested disks in zone "az2"`)
   146  	c.Assert(zones, gc.HasLen, 0)
   147  }
   148  
   149  func (s *environAZSuite) TestDeriveAvailabilityZonesVolumeAttachments(c *gc.C) {
   150  	s.StartInstArgs.VolumeAttachments = []storage.VolumeAttachmentParams{{
   151  		VolumeId: "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   152  	}}
   153  
   154  	zones, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(zones, gc.DeepEquals, []string{"home-zone"})
   157  }
   158  
   159  func (s *environAZSuite) TestDeriveAvailabilityZonesVolumeAttachmentsDifferentZones(c *gc.C) {
   160  	s.StartInstArgs.VolumeAttachments = []storage.VolumeAttachmentParams{{
   161  		VolumeId: "home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   162  	}, {
   163  		VolumeId: "away-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4",
   164  	}}
   165  
   166  	_, err := s.Env.DeriveAvailabilityZones(s.CallCtx, s.StartInstArgs)
   167  	c.Assert(err, gc.ErrorMatches, `cannot attach volumes from multiple availability zones: home-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4 is in home-zone, away-zone--c930380d-8337-4bf5-b07a-9dbb5ae771e4 is in away-zone`)
   168  }