github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/ec2/image_test.go (about) 1 // Copyright 2011, 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package ec2 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 "github.com/juju/utils" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/constraints" 12 "github.com/juju/juju/environs/imagemetadata" 13 "github.com/juju/juju/environs/instances" 14 "github.com/juju/juju/environs/simplestreams" 15 "github.com/juju/juju/testing" 16 ) 17 18 var _ = gc.Suite(&specSuite{}) 19 20 type specSuite struct { 21 testing.BaseSuite 22 } 23 24 func (s *specSuite) SetUpSuite(c *gc.C) { 25 s.BaseSuite.SetUpSuite(c) 26 UseTestImageData(TestImagesData) 27 UseTestInstanceTypeData(TestInstanceTypeCosts) 28 UseTestRegionData(TestRegions) 29 } 30 31 func (s *specSuite) TearDownSuite(c *gc.C) { 32 UseTestInstanceTypeData(nil) 33 UseTestImageData(nil) 34 UseTestRegionData(nil) 35 s.BaseSuite.TearDownSuite(c) 36 } 37 38 var findInstanceSpecTests = []struct { 39 series string 40 arches []string 41 cons string 42 itype string 43 image string 44 storage []string 45 }{ 46 { 47 series: testing.FakeDefaultSeries, 48 arches: both, 49 itype: "m1.small", 50 image: "ami-00000033", 51 }, { 52 series: "quantal", 53 arches: []string{"i386"}, 54 itype: "m1.small", 55 image: "ami-01000034", 56 }, { 57 series: testing.FakeDefaultSeries, 58 arches: both, 59 cons: "cpu-cores=4", 60 itype: "m1.xlarge", 61 image: "ami-00000033", 62 }, { 63 series: testing.FakeDefaultSeries, 64 arches: both, 65 cons: "cpu-cores=2 arch=i386", 66 itype: "c1.medium", 67 image: "ami-00000034", 68 }, { 69 series: testing.FakeDefaultSeries, 70 arches: both, 71 cons: "mem=10G", 72 itype: "m1.xlarge", 73 image: "ami-00000033", 74 }, { 75 series: testing.FakeDefaultSeries, 76 arches: both, 77 cons: "mem=", 78 itype: "m1.small", 79 image: "ami-00000033", 80 }, { 81 series: testing.FakeDefaultSeries, 82 arches: both, 83 cons: "cpu-power=", 84 itype: "m1.small", 85 image: "ami-00000033", 86 }, { 87 series: testing.FakeDefaultSeries, 88 arches: both, 89 cons: "cpu-power=800", 90 itype: "m1.xlarge", 91 image: "ami-00000033", 92 }, { 93 series: testing.FakeDefaultSeries, 94 arches: both, 95 cons: "cpu-power=500 arch=i386", 96 itype: "c1.medium", 97 image: "ami-00000034", 98 }, { 99 series: testing.FakeDefaultSeries, 100 arches: []string{"i386"}, 101 cons: "cpu-power=400", 102 itype: "c1.medium", 103 image: "ami-00000034", 104 }, { 105 series: "quantal", 106 arches: both, 107 cons: "arch=amd64", 108 itype: "cc2.8xlarge", 109 image: "ami-01000035", 110 }, { 111 series: "quantal", 112 arches: both, 113 cons: "instance-type=cc2.8xlarge", 114 itype: "cc2.8xlarge", 115 image: "ami-01000035", 116 }, { 117 series: testing.FakeDefaultSeries, 118 arches: []string{"i386"}, 119 cons: "instance-type=c1.medium", 120 itype: "c1.medium", 121 image: "ami-00000034", 122 }, { 123 series: testing.FakeDefaultSeries, 124 arches: both, 125 cons: "mem=4G root-disk=16384M", 126 itype: "m1.large", 127 image: "ami-00000033", 128 }, { 129 series: testing.FakeDefaultSeries, 130 arches: both, 131 cons: "mem=4G root-disk=16384M", 132 itype: "m1.large", 133 storage: []string{"ssd", "ebs"}, 134 image: "ami-00000033", 135 }, { 136 series: testing.FakeDefaultSeries, 137 arches: both, 138 cons: "mem=4G root-disk=16384M", 139 itype: "m1.large", 140 storage: []string{"ebs", "ssd"}, 141 image: "ami-00000039", 142 }, { 143 series: testing.FakeDefaultSeries, 144 arches: both, 145 cons: "mem=4G root-disk=16384M", 146 itype: "m1.large", 147 storage: []string{"ebs"}, 148 image: "ami-00000039", 149 }, 150 } 151 152 func (s *specSuite) TestFindInstanceSpec(c *gc.C) { 153 for i, test := range findInstanceSpecTests { 154 c.Logf("\ntest %d: %q; %q; %q; %v", i, test.series, test.arches, test.cons, test.storage) 155 stor := test.storage 156 if len(stor) == 0 { 157 stor = []string{ssdStorage, ebsStorage} 158 } 159 spec, err := findInstanceSpec( 160 []simplestreams.DataSource{ 161 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)}, 162 "released", 163 &instances.InstanceConstraint{ 164 Region: "test", 165 Series: test.series, 166 Arches: test.arches, 167 Constraints: constraints.MustParse(test.cons), 168 Storage: stor, 169 }) 170 c.Assert(err, jc.ErrorIsNil) 171 c.Check(spec.InstanceType.Name, gc.Equals, test.itype) 172 c.Check(spec.Image.Id, gc.Equals, test.image) 173 } 174 } 175 176 func (s *specSuite) TestFindInstanceSpecNotSetCpuPowerWhenInstanceTypeSet(c *gc.C) { 177 178 source := []simplestreams.DataSource{ 179 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames), 180 } 181 instanceConstraint := &instances.InstanceConstraint{ 182 Region: "test", 183 Series: testing.FakeDefaultSeries, 184 Constraints: constraints.MustParse("instance-type=t2.medium"), 185 } 186 187 c.Check(instanceConstraint.Constraints.CpuPower, gc.IsNil) 188 findInstanceSpec(source, "released", instanceConstraint) 189 190 c.Check(instanceConstraint.Constraints.CpuPower, gc.IsNil) 191 } 192 193 var findInstanceSpecErrorTests = []struct { 194 series string 195 arches []string 196 cons string 197 err string 198 }{ 199 { 200 series: "bad", 201 arches: both, 202 err: `unknown version for series: "bad"`, 203 }, { 204 series: testing.FakeDefaultSeries, 205 arches: []string{"arm"}, 206 err: `no "trusty" images in test with arches \[arm\]`, 207 }, { 208 series: "raring", 209 arches: both, 210 cons: "mem=4G", 211 err: `no "raring" images in test matching instance types \[m1.large m1.xlarge c1.xlarge cc2.8xlarge\]`, 212 }, 213 } 214 215 func (s *specSuite) TestFindInstanceSpecErrors(c *gc.C) { 216 for i, t := range findInstanceSpecErrorTests { 217 c.Logf("test %d", i) 218 _, err := findInstanceSpec( 219 []simplestreams.DataSource{ 220 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)}, 221 "released", 222 &instances.InstanceConstraint{ 223 Region: "test", 224 Series: t.series, 225 Arches: t.arches, 226 Constraints: constraints.MustParse(t.cons), 227 }) 228 c.Check(err, gc.ErrorMatches, t.err) 229 } 230 } 231 232 func (*specSuite) TestFilterImagesAcceptsNil(c *gc.C) { 233 c.Check(filterImages(nil, nil), gc.HasLen, 0) 234 } 235 236 func (*specSuite) TestFilterImagesReturnsSelectively(c *gc.C) { 237 good := imagemetadata.ImageMetadata{Id: "good", Storage: "ebs"} 238 bad := imagemetadata.ImageMetadata{Id: "bad", Storage: "ftp"} 239 input := []*imagemetadata.ImageMetadata{&good, &bad} 240 expectation := []*imagemetadata.ImageMetadata{&good} 241 242 ic := &instances.InstanceConstraint{Storage: []string{"ebs"}} 243 c.Check(filterImages(input, ic), gc.DeepEquals, expectation) 244 } 245 246 func (*specSuite) TestFilterImagesMaintainsOrdering(c *gc.C) { 247 input := []*imagemetadata.ImageMetadata{ 248 {Id: "one", Storage: "ebs"}, 249 {Id: "two", Storage: "ebs"}, 250 {Id: "three", Storage: "ebs"}, 251 } 252 ic := &instances.InstanceConstraint{Storage: []string{"ebs"}} 253 c.Check(filterImages(input, ic), gc.DeepEquals, input) 254 }