github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/instance" 12 "github.com/juju/juju/provider/common" 13 "github.com/juju/juju/provider/gce" 14 "github.com/juju/juju/provider/gce/google" 15 ) 16 17 type environAZSuite struct { 18 gce.BaseSuite 19 } 20 21 var _ = gc.Suite(&environAZSuite{}) 22 23 func (s *environAZSuite) TestAvailabilityZones(c *gc.C) { 24 s.FakeConn.Zones = []google.AvailabilityZone{ 25 google.NewZone("a-zone", google.StatusUp, "", ""), 26 google.NewZone("b-zone", google.StatusUp, "", ""), 27 } 28 29 zones, err := s.Env.AvailabilityZones() 30 c.Assert(err, jc.ErrorIsNil) 31 32 c.Check(zones, gc.HasLen, 2) 33 c.Check(zones[0].Name(), gc.Equals, "a-zone") 34 c.Check(zones[0].Available(), jc.IsTrue) 35 c.Check(zones[1].Name(), gc.Equals, "b-zone") 36 c.Check(zones[1].Available(), jc.IsTrue) 37 38 } 39 40 func (s *environAZSuite) TestAvailabilityZonesDeprecated(c *gc.C) { 41 zone := google.NewZone("a-zone", google.StatusUp, "DEPRECATED", "b-zone") 42 43 c.Check(zone.Deprecated(), jc.IsTrue) 44 } 45 46 func (s *environAZSuite) TestAvailabilityZonesAPI(c *gc.C) { 47 s.FakeConn.Zones = []google.AvailabilityZone{} 48 49 _, err := s.Env.AvailabilityZones() 50 c.Assert(err, jc.ErrorIsNil) 51 52 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 53 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones") 54 c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "home") 55 } 56 57 func (s *environAZSuite) TestInstanceAvailabilityZoneNames(c *gc.C) { 58 s.FakeEnviron.Insts = []instance.Instance{s.Instance} 59 60 ids := []instance.Id{instance.Id("spam")} 61 zones, err := s.Env.InstanceAvailabilityZoneNames(ids) 62 c.Assert(err, jc.ErrorIsNil) 63 64 c.Check(zones, jc.DeepEquals, []string{"home-zone"}) 65 } 66 67 func (s *environAZSuite) TestInstanceAvailabilityZoneNamesAPIs(c *gc.C) { 68 s.FakeEnviron.Insts = []instance.Instance{s.Instance} 69 70 ids := []instance.Id{instance.Id("spam")} 71 _, err := s.Env.InstanceAvailabilityZoneNames(ids) 72 c.Assert(err, jc.ErrorIsNil) 73 74 s.FakeEnviron.CheckCalls(c, []gce.FakeCall{{ 75 FuncName: "GetInstances", Args: gce.FakeCallArgs{"switch": s.Env}, 76 }}) 77 } 78 79 func (s *environAZSuite) TestParseAvailabilityZones(c *gc.C) { 80 s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{ 81 ZoneName: "home-zone", 82 Instances: []instance.Id{s.Instance.Id()}, 83 }} 84 85 zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 86 c.Assert(err, jc.ErrorIsNil) 87 88 c.Check(zones, jc.DeepEquals, []string{"home-zone"}) 89 } 90 91 func (s *environAZSuite) TestParseAvailabilityZonesAPI(c *gc.C) { 92 ids := []instance.Id{s.Instance.Id()} 93 s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{ 94 ZoneName: "home-zone", 95 Instances: ids, 96 }} 97 s.StartInstArgs.DistributionGroup = func() ([]instance.Id, error) { 98 return ids, nil 99 } 100 101 _, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 102 c.Assert(err, jc.ErrorIsNil) 103 104 c.Check(s.FakeConn.Calls, gc.HasLen, 0) 105 s.FakeEnviron.CheckCalls(c, []gce.FakeCall{}) 106 s.FakeCommon.CheckCalls(c, []gce.FakeCall{{ 107 FuncName: "AvailabilityZoneAllocations", 108 Args: gce.FakeCallArgs{ 109 "switch": s.Env, 110 "group": ids, 111 }, 112 }}) 113 } 114 115 func (s *environAZSuite) TestParseAvailabilityZonesPlacement(c *gc.C) { 116 s.StartInstArgs.Placement = "zone=a-zone" 117 s.FakeConn.Zones = []google.AvailabilityZone{ 118 google.NewZone("a-zone", google.StatusUp, "", ""), 119 } 120 121 zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 122 c.Assert(err, jc.ErrorIsNil) 123 124 c.Check(zones, jc.DeepEquals, []string{"a-zone"}) 125 } 126 127 func (s *environAZSuite) TestParseAvailabilityZonesPlacementAPI(c *gc.C) { 128 s.StartInstArgs.Placement = "zone=a-zone" 129 s.FakeConn.Zones = []google.AvailabilityZone{ 130 google.NewZone("a-zone", google.StatusUp, "", ""), 131 } 132 133 _, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 134 c.Assert(err, jc.ErrorIsNil) 135 136 s.FakeEnviron.CheckCalls(c, []gce.FakeCall{}) 137 s.FakeCommon.CheckCalls(c, []gce.FakeCall{}) 138 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 139 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones") 140 c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "home") 141 } 142 143 func (s *environAZSuite) TestParseAvailabilityZonesPlacementUnavailable(c *gc.C) { 144 s.StartInstArgs.Placement = "zone=a-zone" 145 s.FakeConn.Zones = []google.AvailabilityZone{ 146 google.NewZone("a-zone", google.StatusDown, "", ""), 147 } 148 149 _, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 150 151 c.Check(err, gc.ErrorMatches, `.*availability zone "a-zone" is DOWN`) 152 } 153 154 func (s *environAZSuite) TestParseAvailabilityZonesDistGroup(c *gc.C) { 155 s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{ 156 ZoneName: "home-zone", 157 Instances: []instance.Id{s.Instance.Id()}, 158 }} 159 s.StartInstArgs.DistributionGroup = func() ([]instance.Id, error) { 160 return []instance.Id{s.Instance.Id()}, nil 161 } 162 163 zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 164 c.Assert(err, jc.ErrorIsNil) 165 166 c.Check(zones, jc.DeepEquals, []string{"home-zone"}) 167 } 168 169 func (s *environAZSuite) TestParseAvailabilityZonesNoneFound(c *gc.C) { 170 _, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs) 171 172 c.Check(err, jc.Satisfies, errors.IsNotFound) 173 }