github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/gce/environ_policy_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/utils/series" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/constraints" 13 "github.com/juju/juju/provider/gce" 14 "github.com/juju/juju/provider/gce/google" 15 ) 16 17 type environPolSuite struct { 18 gce.BaseSuite 19 } 20 21 var _ = gc.Suite(&environPolSuite{}) 22 23 func (s *environPolSuite) TestPrecheckInstance(c *gc.C) { 24 cons := constraints.Value{} 25 placement := "" 26 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 27 28 c.Check(err, jc.ErrorIsNil) 29 } 30 31 func (s *environPolSuite) TestPrecheckInstanceAPI(c *gc.C) { 32 s.FakeConn.Zones = []google.AvailabilityZone{ 33 google.NewZone("a-zone", google.StatusUp, "", ""), 34 } 35 36 cons := constraints.Value{} 37 placement := "" 38 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 39 c.Assert(err, jc.ErrorIsNil) 40 41 c.Check(s.FakeConn.Calls, gc.HasLen, 0) 42 } 43 44 func (s *environPolSuite) TestPrecheckInstanceFullAPI(c *gc.C) { 45 s.FakeConn.Zones = []google.AvailabilityZone{ 46 google.NewZone("home-zone", google.StatusUp, "", ""), 47 } 48 49 cons := constraints.MustParse("instance-type=n1-standard-1 arch=amd64 root-disk=1G") 50 placement := "zone=home-zone" 51 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 52 c.Assert(err, jc.ErrorIsNil) 53 54 c.Check(s.FakeConn.Calls, gc.HasLen, 1) 55 c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones") 56 c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "us-east1") 57 } 58 59 func (s *environPolSuite) TestPrecheckInstanceValidInstanceType(c *gc.C) { 60 cons := constraints.MustParse("instance-type=n1-standard-1") 61 placement := "" 62 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 63 64 c.Check(err, jc.ErrorIsNil) 65 } 66 67 func (s *environPolSuite) TestPrecheckInstanceInvalidInstanceType(c *gc.C) { 68 cons := constraints.MustParse("instance-type=n1-standard-1.invalid") 69 placement := "" 70 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 71 72 c.Check(err, gc.ErrorMatches, `.*invalid GCE instance type.*`) 73 } 74 75 func (s *environPolSuite) TestPrecheckInstanceDiskSize(c *gc.C) { 76 cons := constraints.MustParse("instance-type=n1-standard-1 root-disk=1G") 77 placement := "" 78 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 79 80 c.Check(err, jc.ErrorIsNil) 81 } 82 83 func (s *environPolSuite) TestPrecheckInstanceUnsupportedArch(c *gc.C) { 84 cons := constraints.MustParse("instance-type=n1-standard-1 arch=i386") 85 placement := "" 86 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 87 88 c.Check(err, jc.ErrorIsNil) 89 } 90 91 func (s *environPolSuite) TestPrecheckInstanceAvailZone(c *gc.C) { 92 s.FakeConn.Zones = []google.AvailabilityZone{ 93 google.NewZone("a-zone", google.StatusUp, "", ""), 94 } 95 96 cons := constraints.Value{} 97 placement := "zone=a-zone" 98 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 99 100 c.Check(err, jc.ErrorIsNil) 101 } 102 103 func (s *environPolSuite) TestPrecheckInstanceAvailZoneUnavailable(c *gc.C) { 104 s.FakeConn.Zones = []google.AvailabilityZone{ 105 google.NewZone("a-zone", google.StatusDown, "", ""), 106 } 107 108 cons := constraints.Value{} 109 placement := "zone=a-zone" 110 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 111 112 c.Check(err, gc.ErrorMatches, `.*availability zone "a-zone" is DOWN`) 113 } 114 115 func (s *environPolSuite) TestPrecheckInstanceAvailZoneUnknown(c *gc.C) { 116 s.FakeConn.Zones = []google.AvailabilityZone{ 117 google.NewZone("home-zone", google.StatusUp, "", ""), 118 } 119 120 cons := constraints.Value{} 121 placement := "zone=a-zone" 122 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 123 124 c.Check(err, jc.Satisfies, errors.IsNotFound) 125 } 126 127 func (s *environPolSuite) TestConstraintsValidator(c *gc.C) { 128 validator, err := s.Env.ConstraintsValidator() 129 c.Assert(err, jc.ErrorIsNil) 130 131 cons := constraints.MustParse("arch=amd64") 132 unsupported, err := validator.Validate(cons) 133 c.Assert(err, jc.ErrorIsNil) 134 c.Check(unsupported, gc.HasLen, 0) 135 } 136 137 func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) { 138 validator, err := s.Env.ConstraintsValidator() 139 c.Assert(err, jc.ErrorIsNil) 140 141 unsupported, err := validator.Validate(constraints.Value{}) 142 c.Assert(err, jc.ErrorIsNil) 143 144 c.Check(unsupported, gc.HasLen, 0) 145 } 146 147 func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) { 148 validator, err := s.Env.ConstraintsValidator() 149 c.Assert(err, jc.ErrorIsNil) 150 151 cons := constraints.MustParse("arch=amd64 tags=foo virt-type=kvm") 152 unsupported, err := validator.Validate(cons) 153 c.Assert(err, jc.ErrorIsNil) 154 155 c.Check(unsupported, jc.SameContents, []string{"tags", "virt-type"}) 156 } 157 158 func (s *environPolSuite) TestConstraintsValidatorVocabInstType(c *gc.C) { 159 validator, err := s.Env.ConstraintsValidator() 160 c.Assert(err, jc.ErrorIsNil) 161 162 cons := constraints.MustParse("instance-type=foo") 163 _, err = validator.Validate(cons) 164 165 c.Check(err, gc.ErrorMatches, "invalid constraint value: instance-type=foo\nvalid values are:.*") 166 } 167 168 func (s *environPolSuite) TestConstraintsValidatorVocabContainer(c *gc.C) { 169 validator, err := s.Env.ConstraintsValidator() 170 c.Assert(err, jc.ErrorIsNil) 171 172 cons := constraints.MustParse("container=lxd") 173 _, err = validator.Validate(cons) 174 175 c.Check(err, gc.ErrorMatches, "invalid constraint value: container=lxd\nvalid values are:.*") 176 } 177 178 func (s *environPolSuite) TestConstraintsValidatorConflicts(c *gc.C) { 179 validator, err := s.Env.ConstraintsValidator() 180 c.Assert(err, jc.ErrorIsNil) 181 182 cons := constraints.MustParse("instance-type=n1-standard-1") 183 // We do not check arch or container since there is only one valid 184 // value for each and will always match. 185 consFallback := constraints.MustParse("cores=2 cpu-power=1000 mem=10000 tags=bar") 186 merged, err := validator.Merge(consFallback, cons) 187 c.Assert(err, jc.ErrorIsNil) 188 189 // tags is not supported, but we're not validating here... 190 expected := constraints.MustParse("instance-type=n1-standard-1 tags=bar") 191 c.Check(merged, jc.DeepEquals, expected) 192 } 193 194 func (s *environPolSuite) TestSupportNetworks(c *gc.C) { 195 isSupported := s.Env.SupportNetworks() 196 197 c.Check(isSupported, jc.IsFalse) 198 }