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