launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/ec2/export_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package ec2 5 6 import ( 7 "io" 8 9 "launchpad.net/goamz/aws" 10 "launchpad.net/goamz/ec2" 11 "launchpad.net/goamz/s3" 12 13 "launchpad.net/juju-core/environs" 14 "launchpad.net/juju-core/environs/imagemetadata" 15 "launchpad.net/juju-core/environs/jujutest" 16 "launchpad.net/juju-core/environs/storage" 17 "launchpad.net/juju-core/instance" 18 ) 19 20 func ControlBucketName(e environs.Environ) string { 21 return e.(*environ).ecfg().controlBucket() 22 } 23 24 func JujuGroupName(e environs.Environ) string { 25 return e.(*environ).jujuGroupName() 26 } 27 28 func MachineGroupName(e environs.Environ, machineId string) string { 29 return e.(*environ).machineGroupName(machineId) 30 } 31 32 func EnvironEC2(e environs.Environ) *ec2.EC2 { 33 return e.(*environ).ec2() 34 } 35 36 func EnvironS3(e environs.Environ) *s3.S3 { 37 return e.(*environ).s3() 38 } 39 40 func InstanceEC2(inst instance.Instance) *ec2.Instance { 41 return inst.(*ec2Instance).Instance 42 } 43 44 // BucketStorage returns a storage instance addressing 45 // an arbitrary s3 bucket. 46 func BucketStorage(b *s3.Bucket) storage.Storage { 47 return &ec2storage{ 48 bucket: b, 49 } 50 } 51 52 // DeleteBucket deletes the s3 bucket used by the storage instance. 53 func DeleteBucket(s storage.Storage) error { 54 return deleteBucket(s.(*ec2storage)) 55 } 56 57 var testRoundTripper = &jujutest.ProxyRoundTripper{} 58 59 func init() { 60 // Prepare mock http transport for overriding metadata and images output in tests. 61 testRoundTripper.RegisterForScheme("test") 62 } 63 64 // TODO: Apart from overriding different hardcoded hosts, these two test helpers are identical. Let's share. 65 66 var origImagesUrl = imagemetadata.DefaultBaseURL 67 68 // UseTestImageData causes the given content to be served 69 // when the ec2 client asks for image data. 70 func UseTestImageData(files map[string]string) { 71 if files != nil { 72 testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil) 73 imagemetadata.DefaultBaseURL = "test:" 74 signedImageDataOnly = false 75 } else { 76 signedImageDataOnly = true 77 testRoundTripper.Sub = nil 78 imagemetadata.DefaultBaseURL = origImagesUrl 79 } 80 } 81 82 func UseTestRegionData(content map[string]aws.Region) { 83 if content != nil { 84 allRegions = content 85 } else { 86 allRegions = aws.Regions 87 } 88 89 } 90 91 // UseTestInstanceTypeData causes the given instance type 92 // cost data to be served for the "test" region. 93 func UseTestInstanceTypeData(content instanceTypeCost) { 94 if content != nil { 95 allRegionCosts["test"] = content 96 } else { 97 delete(allRegionCosts, "test") 98 } 99 } 100 101 var origMetadataHost = metadataHost 102 103 func UseTestMetadata(files map[string]string) { 104 if files != nil { 105 testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil) 106 metadataHost = "test:" 107 } else { 108 testRoundTripper.Sub = nil 109 metadataHost = origMetadataHost 110 } 111 } 112 113 var ( 114 ShortAttempt = &shortAttempt 115 StorageAttempt = &storageAttempt 116 ) 117 118 func EC2ErrCode(err error) string { 119 return ec2ErrCode(err) 120 } 121 122 // FabricateInstance creates a new fictitious instance 123 // given an existing instance and a new id. 124 func FabricateInstance(inst instance.Instance, newId string) instance.Instance { 125 oldi := inst.(*ec2Instance) 126 newi := &ec2Instance{ 127 e: oldi.e, 128 Instance: &ec2.Instance{}, 129 } 130 *newi.Instance = *oldi.Instance 131 newi.InstanceId = newId 132 return newi 133 } 134 135 // Access non exported methods on ec2.storage 136 type Storage interface { 137 Put(file string, r io.Reader, length int64) error 138 ResetMadeBucket() 139 } 140 141 func (s *ec2storage) ResetMadeBucket() { 142 s.Lock() 143 defer s.Unlock() 144 s.madeBucket = false 145 } 146 147 var TestImagesData = map[string]string{ 148 "/streams/v1/index.json": ` 149 { 150 "index": { 151 "com.ubuntu.cloud:released": { 152 "updated": "Wed, 01 May 2013 13:31:26 +0000", 153 "clouds": [ 154 { 155 "region": "test", 156 "endpoint": "https://ec2.endpoint.com" 157 } 158 ], 159 "cloudname": "aws", 160 "datatype": "image-ids", 161 "format": "products:1.0", 162 "products": [ 163 "com.ubuntu.cloud:server:12.04:amd64", 164 "com.ubuntu.cloud:server:12.04:i386", 165 "com.ubuntu.cloud:server:12.04:amd64", 166 "com.ubuntu.cloud:server:12.10:amd64", 167 "com.ubuntu.cloud:server:13.04:i386" 168 ], 169 "path": "streams/v1/com.ubuntu.cloud:released:aws.js" 170 } 171 }, 172 "updated": "Wed, 01 May 2013 13:31:26 +0000", 173 "format": "index:1.0" 174 } 175 `, 176 "/streams/v1/com.ubuntu.cloud:released:aws.js": ` 177 { 178 "content_id": "com.ubuntu.cloud:released:aws", 179 "products": { 180 "com.ubuntu.cloud:server:12.04:amd64": { 181 "release": "precise", 182 "version": "12.04", 183 "arch": "amd64", 184 "versions": { 185 "20121218": { 186 "items": { 187 "usee1pi": { 188 "root_store": "instance", 189 "virt": "pv", 190 "region": "us-east-1", 191 "id": "ami-00000011" 192 }, 193 "usww1pe": { 194 "root_store": "ebs", 195 "virt": "pv", 196 "region": "eu-west-1", 197 "id": "ami-00000016" 198 }, 199 "apne1pe": { 200 "root_store": "ebs", 201 "virt": "pv", 202 "region": "ap-northeast-1", 203 "id": "ami-00000026" 204 }, 205 "apne1he": { 206 "root_store": "ebs", 207 "virt": "hvm", 208 "region": "ap-northeast-1", 209 "id": "ami-00000087" 210 }, 211 "test1pe": { 212 "root_store": "ebs", 213 "virt": "pv", 214 "region": "test", 215 "id": "ami-00000033" 216 }, 217 "test1he": { 218 "root_store": "ebs", 219 "virt": "hvm", 220 "region": "test", 221 "id": "ami-00000035" 222 } 223 }, 224 "pubname": "ubuntu-precise-12.04-amd64-server-20121218", 225 "label": "release" 226 } 227 } 228 }, 229 "com.ubuntu.cloud:server:12.04:i386": { 230 "release": "precise", 231 "version": "12.04", 232 "arch": "i386", 233 "versions": { 234 "20121218": { 235 "items": { 236 "test1pe": { 237 "root_store": "ebs", 238 "virt": "pv", 239 "region": "test", 240 "id": "ami-00000034" 241 }, 242 "apne1pe": { 243 "root_store": "ebs", 244 "virt": "pv", 245 "region": "ap-northeast-1", 246 "id": "ami-00000023" 247 } 248 }, 249 "pubname": "ubuntu-precise-12.04-i386-server-20121218", 250 "label": "release" 251 } 252 } 253 }, 254 "com.ubuntu.cloud:server:12.10:amd64": { 255 "release": "quantal", 256 "version": "12.10", 257 "arch": "amd64", 258 "versions": { 259 "20121218": { 260 "items": { 261 "usee1pi": { 262 "root_store": "instance", 263 "virt": "pv", 264 "region": "us-east-1", 265 "id": "ami-00000011" 266 }, 267 "usww1pe": { 268 "root_store": "ebs", 269 "virt": "pv", 270 "region": "eu-west-1", 271 "id": "ami-01000016" 272 }, 273 "apne1pe": { 274 "root_store": "ebs", 275 "virt": "pv", 276 "region": "ap-northeast-1", 277 "id": "ami-01000026" 278 }, 279 "apne1he": { 280 "root_store": "ebs", 281 "virt": "hvm", 282 "region": "ap-northeast-1", 283 "id": "ami-01000087" 284 }, 285 "test1he": { 286 "root_store": "ebs", 287 "virt": "hvm", 288 "region": "test", 289 "id": "ami-01000035" 290 } 291 }, 292 "pubname": "ubuntu-quantal-12.10-amd64-server-20121218", 293 "label": "release" 294 } 295 } 296 }, 297 "com.ubuntu.cloud:server:12.10:i386": { 298 "release": "quantal", 299 "version": "12.10", 300 "arch": "i386", 301 "versions": { 302 "20121218": { 303 "items": { 304 "test1pe": { 305 "root_store": "ebs", 306 "virt": "pv", 307 "region": "test", 308 "id": "ami-01000034" 309 }, 310 "apne1pe": { 311 "root_store": "ebs", 312 "virt": "pv", 313 "region": "ap-northeast-1", 314 "id": "ami-01000023" 315 } 316 }, 317 "pubname": "ubuntu-quantal-12.10-i386-server-20121218", 318 "label": "release" 319 } 320 } 321 }, 322 "com.ubuntu.cloud:server:13.04:i386": { 323 "release": "raring", 324 "version": "13.04", 325 "arch": "i386", 326 "versions": { 327 "20121218": { 328 "items": { 329 "test1pe": { 330 "root_store": "ebs", 331 "virt": "pv", 332 "region": "test", 333 "id": "ami-02000034" 334 } 335 }, 336 "pubname": "ubuntu-raring-13.04-i386-server-20121218", 337 "label": "release" 338 } 339 } 340 } 341 }, 342 "format": "products:1.0" 343 } 344 `, 345 } 346 347 var TestInstanceTypeCosts = instanceTypeCost{ 348 "m1.small": 60, 349 "m1.medium": 120, 350 "m1.large": 240, 351 "m1.xlarge": 480, 352 "t1.micro": 20, 353 "c1.medium": 145, 354 "c1.xlarge": 580, 355 "cc1.4xlarge": 1300, 356 "cc2.8xlarge": 2400, 357 } 358 359 var TestRegions = map[string]aws.Region{ 360 "test": { 361 Name: "test", 362 EC2Endpoint: "https://ec2.endpoint.com", 363 }, 364 }