github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/provider/lxd/environ_policy_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // +build go1.3 5 6 package lxd_test 7 8 import ( 9 "strings" 10 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils/arch" 13 "github.com/juju/utils/series" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/constraints" 17 "github.com/juju/juju/provider/lxd" 18 ) 19 20 type environPolSuite struct { 21 lxd.BaseSuite 22 } 23 24 var _ = gc.Suite(&environPolSuite{}) 25 26 func (s *environPolSuite) TestPrecheckInstanceOkay(c *gc.C) { 27 cons := constraints.Value{} 28 placement := "" 29 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 30 31 c.Check(err, jc.ErrorIsNil) 32 } 33 34 func (s *environPolSuite) TestPrecheckInstanceAPI(c *gc.C) { 35 cons := constraints.Value{} 36 placement := "" 37 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 38 c.Assert(err, jc.ErrorIsNil) 39 40 s.CheckNoAPI(c) 41 } 42 43 func (s *environPolSuite) TestPrecheckInstanceHasInstanceType(c *gc.C) { 44 cons := constraints.MustParse("instance-type=some-instance-type") 45 placement := "" 46 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 47 48 c.Check(err, gc.ErrorMatches, `LXD does not support instance types.*`) 49 } 50 51 func (s *environPolSuite) TestPrecheckInstanceDiskSize(c *gc.C) { 52 cons := constraints.MustParse("root-disk=1G") 53 placement := "" 54 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 55 56 c.Check(err, jc.ErrorIsNil) 57 } 58 59 func (s *environPolSuite) TestPrecheckInstanceUnsupportedArch(c *gc.C) { 60 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 61 62 cons := constraints.MustParse("arch=i386") 63 placement := "" 64 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 65 66 c.Check(err, jc.ErrorIsNil) 67 } 68 69 func (s *environPolSuite) TestPrecheckInstanceAvailZone(c *gc.C) { 70 cons := constraints.Value{} 71 placement := "zone=a-zone" 72 err := s.Env.PrecheckInstance(series.LatestLts(), cons, placement) 73 74 c.Check(err, gc.ErrorMatches, `unknown placement directive: .*`) 75 } 76 77 func (s *environPolSuite) TestConstraintsValidatorOkay(c *gc.C) { 78 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 79 80 validator, err := s.Env.ConstraintsValidator() 81 c.Assert(err, jc.ErrorIsNil) 82 83 cons := constraints.MustParse("arch=amd64") 84 unsupported, err := validator.Validate(cons) 85 c.Assert(err, jc.ErrorIsNil) 86 87 c.Check(unsupported, gc.HasLen, 0) 88 } 89 90 func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) { 91 validator, err := s.Env.ConstraintsValidator() 92 c.Assert(err, jc.ErrorIsNil) 93 94 unsupported, err := validator.Validate(constraints.Value{}) 95 c.Assert(err, jc.ErrorIsNil) 96 97 c.Check(unsupported, gc.HasLen, 0) 98 } 99 100 func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) { 101 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 102 103 validator, err := s.Env.ConstraintsValidator() 104 c.Assert(err, jc.ErrorIsNil) 105 106 cons := constraints.MustParse(strings.Join([]string{ 107 "arch=amd64", 108 "tags=foo", 109 "mem=3", 110 "instance-type=some-type", 111 "cores=2", 112 "cpu-power=250", 113 "virt-type=kvm", 114 }, " ")) 115 unsupported, err := validator.Validate(cons) 116 c.Assert(err, jc.ErrorIsNil) 117 118 expected := []string{ 119 "tags", 120 "instance-type", 121 "cores", 122 "cpu-power", 123 "virt-type", 124 } 125 c.Check(unsupported, jc.SameContents, expected) 126 } 127 128 func (s *environPolSuite) TestConstraintsValidatorVocabArchKnown(c *gc.C) { 129 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 130 131 validator, err := s.Env.ConstraintsValidator() 132 c.Assert(err, jc.ErrorIsNil) 133 134 cons := constraints.MustParse("arch=amd64") 135 _, err = validator.Validate(cons) 136 137 c.Check(err, jc.ErrorIsNil) 138 } 139 140 func (s *environPolSuite) TestConstraintsValidatorVocabArchUnknown(c *gc.C) { 141 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 142 143 validator, err := s.Env.ConstraintsValidator() 144 c.Assert(err, jc.ErrorIsNil) 145 146 cons := constraints.MustParse("arch=ppc64el") 147 _, err = validator.Validate(cons) 148 149 c.Check(err, gc.ErrorMatches, "invalid constraint value: arch=ppc64el\nvalid values are: \\[amd64\\]") 150 } 151 152 func (s *environPolSuite) TestConstraintsValidatorVocabContainerUnknown(c *gc.C) { 153 c.Skip("this will fail until we add a container vocabulary") 154 validator, err := s.Env.ConstraintsValidator() 155 c.Assert(err, jc.ErrorIsNil) 156 157 cons := constraints.MustParse("container=lxd") 158 _, err = validator.Validate(cons) 159 160 c.Check(err, gc.ErrorMatches, "invalid constraint value: container=lxd\nvalid values are:.*") 161 } 162 163 func (s *environPolSuite) TestConstraintsValidatorConflicts(c *gc.C) { 164 s.PatchValue(&arch.HostArch, func() string { return arch.AMD64 }) 165 166 validator, err := s.Env.ConstraintsValidator() 167 c.Assert(err, jc.ErrorIsNil) 168 169 cons := constraints.MustParse("instance-type=n1-standard-1") 170 consFallback := constraints.MustParse("cores=2 cpu-power=1000 mem=10000 tags=bar") 171 merged, err := validator.Merge(consFallback, cons) 172 c.Assert(err, jc.ErrorIsNil) 173 174 // tags is not supported, but we're not validating here... 175 expected := constraints.MustParse("instance-type=n1-standard-1 tags=bar cores=2 cpu-power=1000 mem=10000") 176 c.Check(merged, jc.DeepEquals, expected) 177 } 178 179 func (s *environPolSuite) TestSupportNetworks(c *gc.C) { 180 isSupported := s.Env.SupportNetworks() 181 182 c.Check(isSupported, jc.IsFalse) 183 }