github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/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 var findInstanceSpecErrorTests = []struct { 177 series string 178 arches []string 179 cons string 180 err string 181 }{ 182 { 183 series: "bad", 184 arches: both, 185 err: `unknown version for series: "bad"`, 186 }, { 187 series: testing.FakeDefaultSeries, 188 arches: []string{"arm"}, 189 err: `no "trusty" images in test with arches \[arm\]`, 190 }, { 191 series: "raring", 192 arches: both, 193 cons: "mem=4G", 194 err: `no "raring" images in test matching instance types \[m1.large m1.xlarge c1.xlarge cc2.8xlarge\]`, 195 }, 196 } 197 198 func (s *specSuite) TestFindInstanceSpecErrors(c *gc.C) { 199 for i, t := range findInstanceSpecErrorTests { 200 c.Logf("test %d", i) 201 _, err := findInstanceSpec( 202 []simplestreams.DataSource{ 203 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)}, 204 "released", 205 &instances.InstanceConstraint{ 206 Region: "test", 207 Series: t.series, 208 Arches: t.arches, 209 Constraints: constraints.MustParse(t.cons), 210 }) 211 c.Check(err, gc.ErrorMatches, t.err) 212 } 213 } 214 215 func (*specSuite) TestFilterImagesAcceptsNil(c *gc.C) { 216 c.Check(filterImages(nil, nil), gc.HasLen, 0) 217 } 218 219 func (*specSuite) TestFilterImagesReturnsSelectively(c *gc.C) { 220 good := imagemetadata.ImageMetadata{Id: "good", Storage: "ebs"} 221 bad := imagemetadata.ImageMetadata{Id: "bad", Storage: "ftp"} 222 input := []*imagemetadata.ImageMetadata{&good, &bad} 223 expectation := []*imagemetadata.ImageMetadata{&good} 224 225 ic := &instances.InstanceConstraint{Storage: []string{"ebs"}} 226 c.Check(filterImages(input, ic), gc.DeepEquals, expectation) 227 } 228 229 func (*specSuite) TestFilterImagesMaintainsOrdering(c *gc.C) { 230 input := []*imagemetadata.ImageMetadata{ 231 {Id: "one", Storage: "ebs"}, 232 {Id: "two", Storage: "ebs"}, 233 {Id: "three", Storage: "ebs"}, 234 } 235 ic := &instances.InstanceConstraint{Storage: []string{"ebs"}} 236 c.Check(filterImages(input, ic), gc.DeepEquals, input) 237 }