github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/gce/environ_instance_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 "github.com/juju/version" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/core/constraints" 13 "github.com/juju/juju/core/instance" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/instances" 16 "github.com/juju/juju/environs/tags" 17 "github.com/juju/juju/provider/gce" 18 "github.com/juju/juju/provider/gce/google" 19 ) 20 21 type environInstSuite struct { 22 gce.BaseSuite 23 } 24 25 var _ = gc.Suite(&environInstSuite{}) 26 27 func (s *environInstSuite) TestInstances(c *gc.C) { 28 spam := s.NewInstance(c, "spam") 29 ham := s.NewInstance(c, "ham") 30 eggs := s.NewInstance(c, "eggs") 31 s.FakeEnviron.Insts = []instances.Instance{spam, ham, eggs} 32 33 ids := []instance.Id{"spam", "eggs", "ham"} 34 insts, err := s.Env.Instances(s.CallCtx, ids) 35 c.Assert(err, jc.ErrorIsNil) 36 37 c.Check(insts, jc.DeepEquals, []instances.Instance{spam, eggs, ham}) 38 } 39 40 func (s *environInstSuite) TestInstancesEmptyArg(c *gc.C) { 41 _, err := s.Env.Instances(s.CallCtx, nil) 42 43 c.Check(err, gc.Equals, environs.ErrNoInstances) 44 } 45 46 func (s *environInstSuite) TestInstancesInstancesFailed(c *gc.C) { 47 failure := errors.New("<unknown>") 48 s.FakeEnviron.Err = failure 49 50 ids := []instance.Id{"spam"} 51 insts, err := s.Env.Instances(s.CallCtx, ids) 52 53 c.Check(insts, jc.DeepEquals, []instances.Instance{nil}) 54 c.Check(errors.Cause(err), gc.Equals, failure) 55 } 56 57 func (s *environInstSuite) TestInstancesPartialMatch(c *gc.C) { 58 s.FakeEnviron.Insts = []instances.Instance{s.Instance} 59 60 ids := []instance.Id{"spam", "eggs"} 61 insts, err := s.Env.Instances(s.CallCtx, ids) 62 63 c.Check(insts, jc.DeepEquals, []instances.Instance{s.Instance, nil}) 64 c.Check(errors.Cause(err), gc.Equals, environs.ErrPartialInstances) 65 } 66 67 func (s *environInstSuite) TestInstancesNoMatch(c *gc.C) { 68 s.FakeEnviron.Insts = []instances.Instance{s.Instance} 69 70 ids := []instance.Id{"eggs"} 71 insts, err := s.Env.Instances(s.CallCtx, ids) 72 73 c.Check(insts, jc.DeepEquals, []instances.Instance{nil}) 74 c.Check(errors.Cause(err), gc.Equals, environs.ErrNoInstances) 75 } 76 77 func (s *environInstSuite) TestBasicInstances(c *gc.C) { 78 spam := s.NewBaseInstance(c, "spam") 79 ham := s.NewBaseInstance(c, "ham") 80 eggs := s.NewBaseInstance(c, "eggs") 81 s.FakeConn.Insts = []google.Instance{*spam, *ham, *eggs} 82 83 insts, err := gce.GetInstances(s.Env, s.CallCtx) 84 c.Assert(err, jc.ErrorIsNil) 85 86 c.Check(insts, jc.DeepEquals, []instances.Instance{ 87 s.NewInstance(c, "spam"), 88 s.NewInstance(c, "ham"), 89 s.NewInstance(c, "eggs"), 90 }) 91 } 92 93 func (s *environInstSuite) TestBasicInstancesAPI(c *gc.C) { 94 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 95 96 _, err := gce.GetInstances(s.Env, s.CallCtx) 97 c.Assert(err, jc.ErrorIsNil) 98 99 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 100 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances") 101 c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix()) 102 c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning}) 103 } 104 105 func (s *environInstSuite) TestControllerInstances(c *gc.C) { 106 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 107 108 ids, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID) 109 c.Assert(err, jc.ErrorIsNil) 110 111 c.Check(ids, jc.DeepEquals, []instance.Id{"spam"}) 112 } 113 114 func (s *environInstSuite) TestControllerInstancesAPI(c *gc.C) { 115 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 116 117 _, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID) 118 c.Assert(err, jc.ErrorIsNil) 119 120 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 121 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances") 122 c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix()) 123 c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning}) 124 } 125 126 func (s *environInstSuite) TestControllerInstancesNotBootstrapped(c *gc.C) { 127 _, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID) 128 129 c.Check(err, gc.Equals, environs.ErrNotBootstrapped) 130 } 131 132 func (s *environInstSuite) TestControllerInstancesMixed(c *gc.C) { 133 other := google.NewInstance(google.InstanceSummary{}, nil) 134 s.FakeConn.Insts = []google.Instance{*s.BaseInstance, *other} 135 136 ids, err := s.Env.ControllerInstances(s.CallCtx, s.ControllerUUID) 137 c.Assert(err, jc.ErrorIsNil) 138 139 c.Check(ids, jc.DeepEquals, []instance.Id{"spam"}) 140 } 141 142 func (s *environInstSuite) TestParsePlacement(c *gc.C) { 143 zone := google.NewZone("a-zone", google.StatusUp, "", "") 144 s.FakeConn.Zones = []google.AvailabilityZone{zone} 145 146 placement, err := gce.ParsePlacement(s.Env, s.CallCtx, "zone=a-zone") 147 c.Assert(err, jc.ErrorIsNil) 148 149 c.Check(placement.Zone, jc.DeepEquals, &zone) 150 } 151 152 func (s *environInstSuite) TestParsePlacementZoneFailure(c *gc.C) { 153 failure := errors.New("<unknown>") 154 s.FakeConn.Err = failure 155 156 _, err := gce.ParsePlacement(s.Env, s.CallCtx, "zone=a-zone") 157 158 c.Check(errors.Cause(err), gc.Equals, failure) 159 } 160 161 func (s *environInstSuite) TestParsePlacementMissingDirective(c *gc.C) { 162 _, err := gce.ParsePlacement(s.Env, s.CallCtx, "a-zone") 163 164 c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`) 165 } 166 167 func (s *environInstSuite) TestParsePlacementUnknownDirective(c *gc.C) { 168 _, err := gce.ParsePlacement(s.Env, s.CallCtx, "inst=spam") 169 170 c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`) 171 } 172 173 func (s *environInstSuite) TestCheckInstanceType(c *gc.C) { 174 typ := "n1-standard-1" 175 cons := constraints.Value{ 176 InstanceType: &typ, 177 } 178 matched := gce.CheckInstanceType(cons) 179 180 c.Check(matched, jc.IsTrue) 181 } 182 183 func (s *environInstSuite) TestCheckInstanceTypeUnknown(c *gc.C) { 184 typ := "n1-standard-1.unknown" 185 cons := constraints.Value{ 186 InstanceType: &typ, 187 } 188 matched := gce.CheckInstanceType(cons) 189 190 c.Check(matched, jc.IsFalse) 191 } 192 193 func (s *environInstSuite) TestPrecheckInstanceInvalidCredentialError(c *gc.C) { 194 zone := google.NewZone("a-zone", google.StatusUp, "", "") 195 s.FakeConn.Zones = []google.AvailabilityZone{zone} 196 mem := uint64(1025) 197 s.FakeConn.Err = gce.InvalidCredentialError 198 199 c.Assert(s.InvalidatedCredentials, jc.IsFalse) 200 _, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{Mem: &mem}) 201 c.Check(err, gc.NotNil) 202 c.Assert(s.InvalidatedCredentials, jc.IsTrue) 203 } 204 205 func (s *environInstSuite) TestListMachineTypes(c *gc.C) { 206 _, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{}) 207 c.Assert(err, gc.ErrorMatches, "no instance types in matching constraints \"\"") 208 209 zone := google.NewZone("a-zone", google.StatusUp, "", "") 210 s.FakeConn.Zones = []google.AvailabilityZone{zone} 211 212 mem := uint64(1025) 213 types, err := s.Env.InstanceTypes(s.CallCtx, constraints.Value{Mem: &mem}) 214 c.Assert(err, jc.ErrorIsNil) 215 c.Assert(types.InstanceTypes, gc.HasLen, 1) 216 217 } 218 219 func (s *environInstSuite) TestAdoptResources(c *gc.C) { 220 john := s.NewInstance(c, "john") 221 misty := s.NewInstance(c, "misty") 222 s.FakeEnviron.Insts = []instances.Instance{john, misty} 223 224 err := s.Env.AdoptResources(s.CallCtx, "other-uuid", version.MustParse("1.2.3")) 225 c.Assert(err, jc.ErrorIsNil) 226 c.Assert(s.FakeConn.Calls, gc.HasLen, 1) 227 call := s.FakeConn.Calls[0] 228 c.Check(call.FuncName, gc.Equals, "UpdateMetadata") 229 c.Check(call.IDs, gc.DeepEquals, []string{"john", "misty"}) 230 c.Check(call.Key, gc.Equals, tags.JujuController) 231 c.Check(call.Value, gc.Equals, "other-uuid") 232 } 233 234 func (s *environInstSuite) TestAdoptResourcesInvalidCredentialError(c *gc.C) { 235 s.FakeConn.Err = gce.InvalidCredentialError 236 c.Assert(s.InvalidatedCredentials, jc.IsFalse) 237 john := s.NewInstance(c, "john") 238 misty := s.NewInstance(c, "misty") 239 s.FakeEnviron.Insts = []instances.Instance{john, misty} 240 241 err := s.Env.AdoptResources(s.CallCtx, "other-uuid", version.MustParse("1.2.3")) 242 c.Check(err, gc.NotNil) 243 c.Assert(s.InvalidatedCredentials, jc.IsTrue) 244 }