github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/constraints" 16 "github.com/juju/juju/provider/lxd" 17 "github.com/juju/juju/testing" 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(testing.FakeDefaultSeries, 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(testing.FakeDefaultSeries, 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(testing.FakeDefaultSeries, 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(testing.FakeDefaultSeries, cons, placement) 55 56 c.Check(err, jc.ErrorIsNil) 57 } 58 59 func (s *environPolSuite) TestPrecheckInstanceUnsupportedArch(c *gc.C) { 60 s.Policy.Arches = []string{arch.AMD64} 61 62 cons := constraints.MustParse("arch=i386") 63 placement := "" 64 err := s.Env.PrecheckInstance(testing.FakeDefaultSeries, 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(testing.FakeDefaultSeries, cons, placement) 73 74 c.Check(err, gc.ErrorMatches, `unknown placement directive: .*`) 75 } 76 77 func (s *environPolSuite) TestSupportedArchitecturesOkay(c *gc.C) { 78 s.Policy.Arches = []string{arch.AMD64} 79 80 archList, err := s.Env.SupportedArchitectures() 81 c.Assert(err, jc.ErrorIsNil) 82 83 c.Check(archList, jc.SameContents, []string{arch.AMD64}) 84 } 85 86 func (s *environPolSuite) TestConstraintsValidatorOkay(c *gc.C) { 87 s.Policy.Arches = []string{arch.AMD64} 88 89 validator, err := s.Env.ConstraintsValidator() 90 c.Assert(err, jc.ErrorIsNil) 91 92 cons := constraints.MustParse("arch=amd64") 93 unsupported, err := validator.Validate(cons) 94 c.Assert(err, jc.ErrorIsNil) 95 96 c.Check(unsupported, gc.HasLen, 0) 97 } 98 99 func (s *environPolSuite) TestConstraintsValidatorEmpty(c *gc.C) { 100 validator, err := s.Env.ConstraintsValidator() 101 c.Assert(err, jc.ErrorIsNil) 102 103 unsupported, err := validator.Validate(constraints.Value{}) 104 c.Assert(err, jc.ErrorIsNil) 105 106 c.Check(unsupported, gc.HasLen, 0) 107 } 108 109 func (s *environPolSuite) TestConstraintsValidatorUnsupported(c *gc.C) { 110 s.Policy.Arches = []string{arch.AMD64} 111 112 validator, err := s.Env.ConstraintsValidator() 113 c.Assert(err, jc.ErrorIsNil) 114 115 cons := constraints.MustParse(strings.Join([]string{ 116 "arch=amd64", 117 "tags=foo", 118 "mem=3", 119 "instance-type=some-type", 120 "cpu-cores=2", 121 "cpu-power=250", 122 "virt-type=kvm", 123 }, " ")) 124 unsupported, err := validator.Validate(cons) 125 c.Assert(err, jc.ErrorIsNil) 126 127 expected := []string{ 128 "tags", 129 "instance-type", 130 "cpu-cores", 131 "cpu-power", 132 "virt-type", 133 } 134 c.Check(unsupported, jc.SameContents, expected) 135 } 136 137 func (s *environPolSuite) TestConstraintsValidatorVocabArchKnown(c *gc.C) { 138 s.Policy.Arches = []string{arch.AMD64} 139 140 validator, err := s.Env.ConstraintsValidator() 141 c.Assert(err, jc.ErrorIsNil) 142 143 cons := constraints.MustParse("arch=amd64") 144 _, err = validator.Validate(cons) 145 146 c.Check(err, jc.ErrorIsNil) 147 } 148 149 func (s *environPolSuite) TestConstraintsValidatorVocabArchUnknown(c *gc.C) { 150 s.Policy.Arches = []string{arch.AMD64} 151 152 validator, err := s.Env.ConstraintsValidator() 153 c.Assert(err, jc.ErrorIsNil) 154 155 cons := constraints.MustParse("arch=ppc64el") 156 _, err = validator.Validate(cons) 157 158 c.Check(err, gc.ErrorMatches, "invalid constraint value: arch=ppc64el\nvalid values are:.*") 159 } 160 161 func (s *environPolSuite) TestConstraintsValidatorVocabContainerUnknown(c *gc.C) { 162 c.Skip("this will fail until we add a container vocabulary") 163 validator, err := s.Env.ConstraintsValidator() 164 c.Assert(err, jc.ErrorIsNil) 165 166 cons := constraints.MustParse("container=lxc") 167 _, err = validator.Validate(cons) 168 169 c.Check(err, gc.ErrorMatches, "invalid constraint value: container=lxc\nvalid values are:.*") 170 } 171 172 func (s *environPolSuite) TestConstraintsValidatorConflicts(c *gc.C) { 173 s.Policy.Arches = []string{arch.AMD64} 174 175 validator, err := s.Env.ConstraintsValidator() 176 c.Assert(err, jc.ErrorIsNil) 177 178 cons := constraints.MustParse("instance-type=n1-standard-1") 179 consFallback := constraints.MustParse("cpu-cores=2 cpu-power=1000 mem=10000 tags=bar") 180 merged, err := validator.Merge(consFallback, cons) 181 c.Assert(err, jc.ErrorIsNil) 182 183 // tags is not supported, but we're not validating here... 184 expected := constraints.MustParse("instance-type=n1-standard-1 tags=bar cpu-cores=2 cpu-power=1000 mem=10000") 185 c.Check(merged, jc.DeepEquals, expected) 186 } 187 188 func (s *environPolSuite) TestSupportNetworks(c *gc.C) { 189 isSupported := s.Env.SupportNetworks() 190 191 c.Check(isSupported, jc.IsFalse) 192 } 193 194 func (s *environPolSuite) TestSupportAddressAllocation(c *gc.C) { 195 isSupported, err := s.Env.SupportAddressAllocation("some-network") 196 c.Assert(err, jc.ErrorIsNil) 197 198 c.Check(isSupported, jc.IsFalse) 199 } 200 201 func (s *environPolSuite) TestSupportAddressAllocationEmpty(c *gc.C) { 202 isSupported, err := s.Env.SupportAddressAllocation("") 203 c.Assert(err, jc.ErrorIsNil) 204 205 c.Check(isSupported, jc.IsFalse) 206 }