github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/constraints" 12 "github.com/juju/juju/environs" 13 "github.com/juju/juju/instance" 14 "github.com/juju/juju/provider/gce" 15 "github.com/juju/juju/provider/gce/google" 16 ) 17 18 type environInstSuite struct { 19 gce.BaseSuite 20 } 21 22 var _ = gc.Suite(&environInstSuite{}) 23 24 func (s *environInstSuite) TestInstances(c *gc.C) { 25 spam := s.NewInstance(c, "spam") 26 ham := s.NewInstance(c, "ham") 27 eggs := s.NewInstance(c, "eggs") 28 s.FakeEnviron.Insts = []instance.Instance{spam, ham, eggs} 29 30 ids := []instance.Id{"spam", "eggs", "ham"} 31 insts, err := s.Env.Instances(ids) 32 c.Assert(err, jc.ErrorIsNil) 33 34 c.Check(insts, jc.DeepEquals, []instance.Instance{spam, eggs, ham}) 35 } 36 37 func (s *environInstSuite) TestInstancesEmptyArg(c *gc.C) { 38 _, err := s.Env.Instances(nil) 39 40 c.Check(err, gc.Equals, environs.ErrNoInstances) 41 } 42 43 func (s *environInstSuite) TestInstancesInstancesFailed(c *gc.C) { 44 failure := errors.New("<unknown>") 45 s.FakeEnviron.Err = failure 46 47 ids := []instance.Id{"spam"} 48 insts, err := s.Env.Instances(ids) 49 50 c.Check(insts, jc.DeepEquals, []instance.Instance{nil}) 51 c.Check(errors.Cause(err), gc.Equals, failure) 52 } 53 54 func (s *environInstSuite) TestInstancesPartialMatch(c *gc.C) { 55 s.FakeEnviron.Insts = []instance.Instance{s.Instance} 56 57 ids := []instance.Id{"spam", "eggs"} 58 insts, err := s.Env.Instances(ids) 59 60 c.Check(insts, jc.DeepEquals, []instance.Instance{s.Instance, nil}) 61 c.Check(errors.Cause(err), gc.Equals, environs.ErrPartialInstances) 62 } 63 64 func (s *environInstSuite) TestInstancesNoMatch(c *gc.C) { 65 s.FakeEnviron.Insts = []instance.Instance{s.Instance} 66 67 ids := []instance.Id{"eggs"} 68 insts, err := s.Env.Instances(ids) 69 70 c.Check(insts, jc.DeepEquals, []instance.Instance{nil}) 71 c.Check(errors.Cause(err), gc.Equals, environs.ErrNoInstances) 72 } 73 74 func (s *environInstSuite) TestBasicInstances(c *gc.C) { 75 spam := s.NewBaseInstance(c, "spam") 76 ham := s.NewBaseInstance(c, "ham") 77 eggs := s.NewBaseInstance(c, "eggs") 78 s.FakeConn.Insts = []google.Instance{*spam, *ham, *eggs} 79 80 insts, err := gce.GetInstances(s.Env) 81 c.Assert(err, jc.ErrorIsNil) 82 83 c.Check(insts, jc.DeepEquals, []instance.Instance{ 84 s.NewInstance(c, "spam"), 85 s.NewInstance(c, "ham"), 86 s.NewInstance(c, "eggs"), 87 }) 88 } 89 90 func (s *environInstSuite) TestBasicInstancesAPI(c *gc.C) { 91 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 92 93 _, err := gce.GetInstances(s.Env) 94 c.Assert(err, jc.ErrorIsNil) 95 96 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 97 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances") 98 c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix()) 99 c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning}) 100 } 101 102 func (s *environInstSuite) TestControllerInstances(c *gc.C) { 103 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 104 105 ids, err := s.Env.ControllerInstances(s.ControllerUUID) 106 c.Assert(err, jc.ErrorIsNil) 107 108 c.Check(ids, jc.DeepEquals, []instance.Id{"spam"}) 109 } 110 111 func (s *environInstSuite) TestControllerInstancesAPI(c *gc.C) { 112 s.FakeConn.Insts = []google.Instance{*s.BaseInstance} 113 114 _, err := s.Env.ControllerInstances(s.ControllerUUID) 115 c.Assert(err, jc.ErrorIsNil) 116 117 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 118 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Instances") 119 c.Check(s.FakeConn.Calls[0].Prefix, gc.Equals, s.Prefix()) 120 c.Check(s.FakeConn.Calls[0].Statuses, jc.DeepEquals, []string{google.StatusPending, google.StatusStaging, google.StatusRunning}) 121 } 122 123 func (s *environInstSuite) TestControllerInstancesNotBootstrapped(c *gc.C) { 124 _, err := s.Env.ControllerInstances(s.ControllerUUID) 125 126 c.Check(err, gc.Equals, environs.ErrNotBootstrapped) 127 } 128 129 func (s *environInstSuite) TestControllerInstancesMixed(c *gc.C) { 130 other := google.NewInstance(google.InstanceSummary{}, nil) 131 s.FakeConn.Insts = []google.Instance{*s.BaseInstance, *other} 132 133 ids, err := s.Env.ControllerInstances(s.ControllerUUID) 134 c.Assert(err, jc.ErrorIsNil) 135 136 c.Check(ids, jc.DeepEquals, []instance.Id{"spam"}) 137 } 138 139 func (s *environInstSuite) TestParsePlacement(c *gc.C) { 140 zone := google.NewZone("a-zone", google.StatusUp, "", "") 141 s.FakeConn.Zones = []google.AvailabilityZone{zone} 142 143 placement, err := gce.ParsePlacement(s.Env, "zone=a-zone") 144 c.Assert(err, jc.ErrorIsNil) 145 146 c.Check(placement.Zone, jc.DeepEquals, &zone) 147 } 148 149 func (s *environInstSuite) TestParsePlacementZoneFailure(c *gc.C) { 150 failure := errors.New("<unknown>") 151 s.FakeConn.Err = failure 152 153 _, err := gce.ParsePlacement(s.Env, "zone=a-zone") 154 155 c.Check(errors.Cause(err), gc.Equals, failure) 156 } 157 158 func (s *environInstSuite) TestParsePlacementMissingDirective(c *gc.C) { 159 _, err := gce.ParsePlacement(s.Env, "a-zone") 160 161 c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`) 162 } 163 164 func (s *environInstSuite) TestParsePlacementUnknownDirective(c *gc.C) { 165 _, err := gce.ParsePlacement(s.Env, "inst=spam") 166 167 c.Check(err, gc.ErrorMatches, `.*unknown placement directive: .*`) 168 } 169 170 func (s *environInstSuite) TestCheckInstanceType(c *gc.C) { 171 typ := "n1-standard-1" 172 cons := constraints.Value{ 173 InstanceType: &typ, 174 } 175 matched := gce.CheckInstanceType(cons) 176 177 c.Check(matched, jc.IsTrue) 178 } 179 180 func (s *environInstSuite) TestCheckInstanceTypeUnknown(c *gc.C) { 181 typ := "n1-standard-1.unknown" 182 cons := constraints.Value{ 183 InstanceType: &typ, 184 } 185 matched := gce.CheckInstanceType(cons) 186 187 c.Check(matched, jc.IsFalse) 188 }