github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 "github.com/juju/utils" 8 gc "launchpad.net/gocheck" 9 10 "github.com/juju/juju/constraints" 11 "github.com/juju/juju/environs/imagemetadata" 12 "github.com/juju/juju/environs/instances" 13 "github.com/juju/juju/environs/simplestreams" 14 "github.com/juju/juju/testing" 15 ) 16 17 var _ = gc.Suite(&specSuite{}) 18 19 type specSuite struct { 20 testing.BaseSuite 21 } 22 23 func (s *specSuite) SetUpSuite(c *gc.C) { 24 s.BaseSuite.SetUpSuite(c) 25 UseTestImageData(TestImagesData) 26 UseTestInstanceTypeData(TestInstanceTypeCosts) 27 UseTestRegionData(TestRegions) 28 } 29 30 func (s *specSuite) TearDownSuite(c *gc.C) { 31 UseTestInstanceTypeData(nil) 32 UseTestImageData(nil) 33 UseTestRegionData(nil) 34 s.BaseSuite.TearDownSuite(c) 35 } 36 37 var findInstanceSpecTests = []struct { 38 series string 39 arches []string 40 cons string 41 itype string 42 image string 43 }{ 44 { 45 series: "precise", 46 arches: both, 47 itype: "m1.small", 48 image: "ami-00000033", 49 }, { 50 series: "quantal", 51 arches: []string{"i386"}, 52 itype: "m1.small", 53 image: "ami-01000034", 54 }, { 55 series: "precise", 56 arches: both, 57 cons: "cpu-cores=4", 58 itype: "m1.xlarge", 59 image: "ami-00000033", 60 }, { 61 series: "precise", 62 arches: both, 63 cons: "cpu-cores=2 arch=i386", 64 itype: "c1.medium", 65 image: "ami-00000034", 66 }, { 67 series: "precise", 68 arches: both, 69 cons: "mem=10G", 70 itype: "m1.xlarge", 71 image: "ami-00000033", 72 }, { 73 series: "precise", 74 arches: both, 75 cons: "mem=", 76 itype: "m1.small", 77 image: "ami-00000033", 78 }, { 79 series: "precise", 80 arches: both, 81 cons: "cpu-power=", 82 itype: "m1.small", 83 image: "ami-00000033", 84 }, { 85 series: "precise", 86 arches: both, 87 cons: "cpu-power=800", 88 itype: "m1.xlarge", 89 image: "ami-00000033", 90 }, { 91 series: "precise", 92 arches: both, 93 cons: "cpu-power=500 arch=i386", 94 itype: "c1.medium", 95 image: "ami-00000034", 96 }, { 97 series: "precise", 98 arches: []string{"i386"}, 99 cons: "cpu-power=400", 100 itype: "c1.medium", 101 image: "ami-00000034", 102 }, { 103 series: "quantal", 104 arches: both, 105 cons: "arch=amd64", 106 itype: "cc2.8xlarge", 107 image: "ami-01000035", 108 }, { 109 series: "quantal", 110 arches: both, 111 cons: "instance-type=cc2.8xlarge", 112 itype: "cc2.8xlarge", 113 image: "ami-01000035", 114 }, { 115 series: "precise", 116 arches: []string{"i386"}, 117 cons: "instance-type=c1.medium", 118 itype: "c1.medium", 119 image: "ami-00000034", 120 }, { 121 series: "precise", 122 arches: both, 123 cons: "mem=4G root-disk=16384M", 124 itype: "m1.large", 125 image: "ami-00000033", 126 }, 127 } 128 129 func (s *specSuite) TestFindInstanceSpec(c *gc.C) { 130 for i, test := range findInstanceSpecTests { 131 c.Logf("\ntest %d: %q; %q; %q", i, test.series, test.arches, test.cons) 132 stor := ebsStorage 133 spec, err := findInstanceSpec( 134 []simplestreams.DataSource{ 135 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)}, 136 "released", 137 &instances.InstanceConstraint{ 138 Region: "test", 139 Series: test.series, 140 Arches: test.arches, 141 Constraints: constraints.MustParse(test.cons), 142 Storage: &stor, 143 }) 144 c.Assert(err, gc.IsNil) 145 c.Check(spec.InstanceType.Name, gc.Equals, test.itype) 146 c.Check(spec.Image.Id, gc.Equals, test.image) 147 } 148 } 149 150 var findInstanceSpecErrorTests = []struct { 151 series string 152 arches []string 153 cons string 154 err string 155 }{ 156 { 157 series: "bad", 158 arches: both, 159 err: `invalid series "bad"`, 160 }, { 161 series: "precise", 162 arches: []string{"arm"}, 163 err: `no "precise" images in test with arches \[arm\]`, 164 }, { 165 series: "raring", 166 arches: both, 167 cons: "mem=4G", 168 err: `no "raring" images in test matching instance types \[m1.large m1.xlarge c1.xlarge cc2.8xlarge\]`, 169 }, 170 } 171 172 func (s *specSuite) TestFindInstanceSpecErrors(c *gc.C) { 173 for i, t := range findInstanceSpecErrorTests { 174 c.Logf("test %d", i) 175 _, err := findInstanceSpec( 176 []simplestreams.DataSource{ 177 simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)}, 178 "released", 179 &instances.InstanceConstraint{ 180 Region: "test", 181 Series: t.series, 182 Arches: t.arches, 183 Constraints: constraints.MustParse(t.cons), 184 }) 185 c.Check(err, gc.ErrorMatches, t.err) 186 } 187 } 188 189 func (*specSuite) TestFilterImagesAcceptsNil(c *gc.C) { 190 c.Check(filterImages(nil), gc.HasLen, 0) 191 } 192 193 func (*specSuite) TestFilterImagesAcceptsImageWithEBSStorage(c *gc.C) { 194 input := []*imagemetadata.ImageMetadata{{Id: "yay", Storage: "ebs"}} 195 c.Check(filterImages(input), gc.DeepEquals, input) 196 } 197 198 func (*specSuite) TestFilterImagesRejectsImageWithoutEBSStorage(c *gc.C) { 199 input := []*imagemetadata.ImageMetadata{{Id: "boo", Storage: "ftp"}} 200 c.Check(filterImages(input), gc.HasLen, 0) 201 } 202 203 func (*specSuite) TestFilterImagesReturnsSelectively(c *gc.C) { 204 good := imagemetadata.ImageMetadata{Id: "good", Storage: "ebs"} 205 bad := imagemetadata.ImageMetadata{Id: "bad", Storage: "ftp"} 206 input := []*imagemetadata.ImageMetadata{&good, &bad} 207 expectation := []*imagemetadata.ImageMetadata{&good} 208 c.Check(filterImages(input), gc.DeepEquals, expectation) 209 } 210 211 func (*specSuite) TestFilterImagesMaintainsOrdering(c *gc.C) { 212 input := []*imagemetadata.ImageMetadata{ 213 {Id: "one", Storage: "ebs"}, 214 {Id: "two", Storage: "ebs"}, 215 {Id: "three", Storage: "ebs"}, 216 } 217 c.Check(filterImages(input), gc.DeepEquals, input) 218 }