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 }