github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/environs/simplestreams/testing/testing.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testing 5 6 // Provides a TestDataSuite which creates and provides http access to sample simplestreams metadata. 7 8 import ( 9 "fmt" 10 "net/http" 11 12 gc "launchpad.net/gocheck" 13 14 "launchpad.net/juju-core/environs/jujutest" 15 "launchpad.net/juju-core/environs/simplestreams" 16 "launchpad.net/juju-core/testing/testbase" 17 ) 18 19 var PrivateKeyPassphrase = "12345" 20 21 var SignedMetadataPrivateKey = ` 22 -----BEGIN PGP PRIVATE KEY BLOCK----- 23 Version: GnuPG v1.4.12 (GNU/Linux) 24 25 lQH+BFJCk2EBBAC4wo3+aJ0PSeE54sv+GYNYckqysjazcZfJSdPK1GCN+Teat7ey 26 9dwlLhUIS34H29V+0/RcXmmRV+dObSkXzCx5ltKPSnuDsxvqiDEP0CgWdyFxhDf0 27 TbQuKK5OXcZ9rOTSFmnMxGaAzaV7T1IyuqA9HqntTIfC2tL4Y+QN41gS+QARAQAB 28 /gMDAjYGIOoxe8CYYGwpat1V7NGuphvvZRpqeP0RrJ6h4vHV3hXu5NK3tn6LZF0n 29 Qp31LfTH4BHF091UTiebexuuF1/ixLVihtv45mEVejFG1U3G298+WkWUP6AYA/5c 30 QRzXGiuTXlsBUuFVTGn1mvxRmG3yVoLkDj0l5rN9Tq3Ir4BACIWyxjBv1n8fqw+x 31 ti4b7YoE35FpIXQqLOdfdcKTOqUJt+5c+bed4Yx82BsLiY2/huqG2dLnbwln80Dz 32 iYudtG8xLJ1AeHBBFB0nVdyO+mPzXgLNEbP3zle2W+rUfz+s6te7y+rlV0gad2VG 33 tBAvUy08T9rDk0DNQl7jMq/3cGfDI1Zi/nzf2BuuBu2ddgIRmsXgKYly+Fq6eIpa 34 nM+P1hd1Fa3rQwUSJc/zrl48tukf8sdPLDk/+nMhLHy86jp+NeXyXPLvsMAlF5kR 35 eFjxEjHOnJlo4uIUxvlUuePyEOEl0XkQfZs+VWAPo+l2tB5UZXN0IFVzZXIgPHRl 36 c3RAc29tZXdoZXJlLmNvbT6IuAQTAQIAIgUCUkKTYQIbAwYLCQgHAwIGFQgCCQoL 37 BBYCAwECHgECF4AACgkQuK3uqWB66vCVugP/eJFir6Qdcvl+y9/HuP4q2iECi8ny 38 z9tC3YC9DcJePyoBnt1LJO3HvaquZh1AIr6hgMFaujjx6cCb7YEgE0pJ4m74dvtS 39 Y03MUPQ+Ok4cYV66zaDZLk6zpYJXZhxP7ZhlBvwQRES/rudBEQMfBcU9PrduFU39 40 iI+2ojHI4lsnMQE= 41 =UUIf 42 -----END PGP PRIVATE KEY BLOCK----- 43 ` 44 45 var SignedMetadataPublicKey = ` 46 -----BEGIN PGP PUBLIC KEY BLOCK----- 47 Version: GnuPG v1.4.12 (GNU/Linux) 48 49 mI0EUkKTYQEEALjCjf5onQ9J4Tniy/4Zg1hySrKyNrNxl8lJ08rUYI35N5q3t7L1 50 3CUuFQhLfgfb1X7T9FxeaZFX505tKRfMLHmW0o9Ke4OzG+qIMQ/QKBZ3IXGEN/RN 51 tC4ork5dxn2s5NIWaczEZoDNpXtPUjK6oD0eqe1Mh8La0vhj5A3jWBL5ABEBAAG0 52 HlRlc3QgVXNlciA8dGVzdEBzb21ld2hlcmUuY29tPoi4BBMBAgAiBQJSQpNhAhsD 53 BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRC4re6pYHrq8JW6A/94kWKvpB1y 54 +X7L38e4/iraIQKLyfLP20LdgL0Nwl4/KgGe3Usk7ce9qq5mHUAivqGAwVq6OPHp 55 wJvtgSATSknibvh2+1JjTcxQ9D46ThxhXrrNoNkuTrOlgldmHE/tmGUG/BBERL+u 56 50ERAx8FxT0+t24VTf2Ij7aiMcjiWycxAQ== 57 =zBYH 58 -----END PGP PUBLIC KEY BLOCK-----` 59 60 var imageData = map[string]string{ 61 "/daily/streams/v1/index.json": ` 62 { 63 "index": { 64 "com.ubuntu.cloud:released:raring": { 65 "updated": "Wed, 01 May 2013 13:31:26 +0000", 66 "clouds": [ 67 { 68 "region": "us-east-1", 69 "endpoint": "https://ec2.us-east-1.amazonaws.com" 70 } 71 ], 72 "cloudname": "aws", 73 "datatype": "image-ids", 74 "format": "products:1.0", 75 "products": [ 76 "com.ubuntu.cloud:server:13.04:amd64" 77 ], 78 "path": "streams/v1/raring_metadata.json" 79 } 80 }, 81 "updated": "Wed, 01 May 2013 13:31:26 +0000", 82 "format": "index:1.0" 83 } 84 `, 85 "/streams/v1/index.json": ` 86 { 87 "index": { 88 "com.ubuntu.cloud:released:precise": { 89 "updated": "Wed, 01 May 2013 13:31:26 +0000", 90 "clouds": [ 91 { 92 "region": "us-east-1", 93 "endpoint": "https://ec2.us-east-1.amazonaws.com" 94 } 95 ], 96 "cloudname": "aws", 97 "datatype": "image-ids", 98 "format": "products:1.0", 99 "products": [ 100 "com.ubuntu.cloud:server:12.04:amd64", 101 "com.ubuntu.cloud:server:12.04:arm" 102 ], 103 "path": "streams/v1/image_metadata.json" 104 }, 105 "com.ubuntu.cloud:released:raring": { 106 "updated": "Wed, 01 May 2013 13:31:26 +0000", 107 "clouds": [ 108 { 109 "region": "us-east-1", 110 "endpoint": "https://ec2.us-east-1.amazonaws.com" 111 } 112 ], 113 "cloudname": "aws", 114 "datatype": "image-ids", 115 "format": "products:1.0", 116 "products": [ 117 "com.ubuntu.cloud:server:13.04:amd64" 118 ], 119 "path": "streams/v1/raring_metadata.json" 120 }, 121 "com.ubuntu.cloud:released:download": { 122 "datatype": "content-download", 123 "path": "streams/v1/com.ubuntu.cloud:released:download.json", 124 "updated": "Wed, 01 May 2013 13:30:37 +0000", 125 "products": [ 126 "com.ubuntu.cloud:server:12.10:amd64", 127 "com.ubuntu.cloud:server:13.04:amd64" 128 ], 129 "format": "products:1.0" 130 }, 131 "com.ubuntu.juju:released:tools": { 132 "updated": "Mon, 05 Aug 2013 11:07:04 +0000", 133 "datatype": "content-download", 134 "format": "products:1.0", 135 "products": [ 136 "com.ubuntu.juju:12.04:amd64", 137 "com.ubuntu.juju:12.04:arm", 138 "com.ubuntu.juju:13.04:amd64", 139 "com.ubuntu.juju:13.04:arm" 140 ], 141 "path": "streams/v1/tools_metadata.json" 142 } 143 }, 144 "updated": "Wed, 01 May 2013 13:31:26 +0000", 145 "format": "index:1.0" 146 } 147 `, 148 "/streams/v1/mirrors.json": ` 149 { 150 "mirrors": { 151 "com.ubuntu.juju:released:tools": [ 152 { 153 "datatype": "content-download", 154 "path": "streams/v1/tools_metadata:public-mirrors.json", 155 "clouds": [ 156 { 157 "region": "us-east-2", 158 "endpoint": "https://ec2.us-east-2.amazonaws.com" 159 }, 160 { 161 "region": "us-west-2", 162 "endpoint": "https://ec2.us-west-2.amazonaws.com" 163 } 164 ], 165 "updated": "Wed, 14 Aug 2013 13:46:17 +0000", 166 "format": "mirrors:1.0" 167 }, 168 { 169 "datatype": "content-download", 170 "path": "streams/v1/tools_metadata:more-mirrors.json", 171 "updated": "Wed, 14 Aug 2013 13:46:17 +0000", 172 "format": "mirrors:1.0" 173 } 174 ] 175 }, 176 "updated": "Wed, 01 May 2013 13:31:26 +0000", 177 "format": "index:1.0" 178 } 179 `, 180 "/streams/v1/tools_metadata.json": ` 181 { 182 "content_id": "com.ubuntu.juju:tools", 183 "datatype": "content-download", 184 "updated": "Tue, 04 Jun 2013 13:50:31 +0000", 185 "format": "products:1.0", 186 "products": { 187 "com.ubuntu.juju:12.04:amd64": { 188 "arch": "amd64", 189 "release": "precise", 190 "versions": { 191 "20130806": { 192 "items": { 193 "1130preciseamd64": { 194 "version": "1.13.0", 195 "size": 2973595, 196 "path": "tools/releases/20130806/juju-1.13.0-precise-amd64.tgz", 197 "ftype": "tar.gz", 198 "sha256": "447aeb6a934a5eaec4f703eda4ef2dde" 199 } 200 } 201 } 202 } 203 }, 204 "com.ubuntu.juju:13.04:amd64": { 205 "arch": "amd64", 206 "release": "raring", 207 "versions": { 208 "20130806": { 209 "items": { 210 "1130raringamd64": { 211 "version": "1.13.0", 212 "size": 2973173, 213 "path": "tools/releases/20130806/juju-1.13.0-raring-amd64.tgz", 214 "ftype": "tar.gz", 215 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 216 }, 217 "1140raringamd64": { 218 "version": "1.14.0", 219 "size": 2973173, 220 "path": "tools/releases/20130806/juju-1.14.0-raring-amd64.tgz", 221 "ftype": "tar.gz", 222 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 223 } 224 } 225 } 226 } 227 }, 228 "com.ubuntu.juju:12.04:arm": { 229 "arch": "arm", 230 "release": "precise", 231 "versions": { 232 "20130806": { 233 "items": { 234 "201precisearm": { 235 "version": "2.0.1", 236 "size": 1951096, 237 "path": "tools/releases/20130806/juju-2.0.1-precise-arm.tgz", 238 "ftype": "tar.gz", 239 "sha256": "f65a92b3b41311bdf398663ee1c5cd0c" 240 }, 241 "1114precisearm": { 242 "version": "1.11.4", 243 "size": 1951096, 244 "path": "tools/releases/20130806/juju-1.11.4-precise-arm.tgz", 245 "ftype": "tar.gz", 246 "sha256": "f65a92b3b41311bdf398663ee1c5cd0c" 247 } 248 } 249 }, 250 "20130803": { 251 "items": { 252 "1114precisearm": { 253 "version": "1.11.4", 254 "size": 2851541, 255 "path": "tools/releases/20130803/juju-1.11.4-precise-arm.tgz", 256 "ftype": "tar.gz", 257 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 258 }, 259 "1115precisearm": { 260 "version": "1.11.5", 261 "size": 2031281, 262 "path": "tools/releases/20130803/juju-1.11.5-precise-arm.tgz", 263 "ftype": "tar.gz", 264 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 265 } 266 } 267 } 268 } 269 }, 270 "com.ubuntu.juju:13.04:arm": { 271 "arch": "arm", 272 "release": "raring", 273 "versions": { 274 "20130806": { 275 "items": { 276 "1114raringarm": { 277 "version": "1.11.4", 278 "size": 1950327, 279 "path": "tools/releases/20130806/juju-1.11.4-raring-arm.tgz", 280 "ftype": "tar.gz", 281 "sha256": "6472014e3255e3fe7fbd3550ef3f0a11" 282 }, 283 "201raringarm": { 284 "version": "2.0.1", 285 "size": 1950327, 286 "path": "tools/releases/20130806/juju-2.0.1-raring-arm.tgz", 287 "ftype": "tar.gz", 288 "sha256": "6472014e3255e3fe7fbd3550ef3f0a11" 289 } 290 } 291 } 292 } 293 } 294 } 295 } 296 `, 297 "/streams/v1/mirrored-tools-metadata.json": ` 298 { 299 "content_id": "com.ubuntu.juju:tools", 300 "datatype": "content-download", 301 "updated": "Tue, 04 Jun 2013 13:50:31 +0000", 302 "format": "products:1.0", 303 "products": { 304 "com.ubuntu.juju:12.04:amd64": { 305 "arch": "amd64", 306 "release": "precise", 307 "versions": { 308 "20130806": { 309 "items": { 310 "1130preciseamd64": { 311 "version": "1.13.0", 312 "size": 2973595, 313 "path": "mirrored-path/juju-1.13.0-precise-amd64.tgz", 314 "ftype": "tar.gz", 315 "sha256": "447aeb6a934a5eaec4f703eda4ef2dde" 316 } 317 } 318 } 319 } 320 } 321 } 322 } 323 `, 324 "/streams/v1/tools_metadata:public-mirrors.json": ` 325 { 326 "mirrors": { 327 "com.ubuntu.juju:released:tools": [ 328 { 329 "mirror": "http://some-mirror/", 330 "path": "com.ubuntu.juju:download.json", 331 "format": "products:1.0", 332 "clouds": [ 333 { 334 "endpoint": "https://ec2.us-east-2.amazonaws.com", 335 "region": "us-east-2" 336 } 337 ] 338 }, 339 { 340 "mirror": "test:/", 341 "path": "streams/v1/mirrored-tools-metadata.json", 342 "format": "products:1.0", 343 "clouds": [ 344 { 345 "endpoint": "https://ec2.us-west-2.amazonaws.com", 346 "region": "us-west-2" 347 } 348 ] 349 }, 350 { 351 "mirror": "http://another-mirror/", 352 "path": "com.ubuntu.juju:download.json", 353 "format": "products:1.0", 354 "clouds": [ 355 { 356 "endpoint": "https://ec2.us-west-1.amazonaws.com", 357 "region": "us-west-1" 358 } 359 ] 360 } 361 ] 362 }, 363 "format": "mirrors:1.0", 364 "updated": "Mon, 05 Aug 2013 11:07:04 +0000" 365 } 366 `, 367 "/streams/v1/tools_metadata:more-mirrors.json": ` 368 { 369 "mirrors": { 370 "com.ubuntu.juju:released:tools": [ 371 { 372 "mirror": "http://big-mirror/", 373 "path": "big:download.json", 374 "clouds": [ 375 { 376 "endpoint": "https://some-endpoint.com", 377 "region": "some-region" 378 } 379 ] 380 } 381 ] 382 }, 383 "format": "mirrors:1.0", 384 "updated": "Mon, 05 Aug 2013 11:07:04 +0000" 385 } 386 `, 387 "/streams/v1/image_metadata.json": ` 388 { 389 "updated": "Wed, 01 May 2013 13:31:26 +0000", 390 "content_id": "com.ubuntu.cloud:released:aws", 391 "products": { 392 "com.ubuntu.cloud:server:12.04:amd64": { 393 "release": "precise", 394 "version": "12.04", 395 "arch": "amd64", 396 "region": "au-east-1", 397 "endpoint": "https://somewhere", 398 "versions": { 399 "20121218": { 400 "region": "au-east-2", 401 "endpoint": "https://somewhere-else", 402 "items": { 403 "usww1pe": { 404 "root_store": "ebs", 405 "virt": "pv", 406 "id": "ami-26745463" 407 }, 408 "usww2he": { 409 "root_store": "ebs", 410 "virt": "hvm", 411 "id": "ami-442ea674", 412 "region": "us-east-1", 413 "endpoint": "https://ec2.us-east-1.amazonaws.com" 414 }, 415 "usww3he": { 416 "root_store": "ebs", 417 "virt": "hvm", 418 "crsn": "uswest3", 419 "id": "ami-442ea675" 420 } 421 }, 422 "pubname": "ubuntu-precise-12.04-amd64-server-20121218", 423 "label": "release" 424 }, 425 "20111111": { 426 "items": { 427 "usww3pe": { 428 "root_store": "ebs", 429 "virt": "pv", 430 "id": "ami-26745464" 431 }, 432 "usww2pe": { 433 "root_store": "instance", 434 "virt": "pv", 435 "id": "ami-442ea684", 436 "region": "us-east-1", 437 "endpoint": "https://ec2.us-east-1.amazonaws.com" 438 } 439 }, 440 "pubname": "ubuntu-precise-12.04-amd64-server-20111111", 441 "label": "release" 442 } 443 } 444 }, 445 "com.ubuntu.cloud:server:12.04:arm": { 446 "release": "precise", 447 "version": "12.04", 448 "arch": "arm", 449 "region": "us-east-1", 450 "endpoint": "https://ec2.us-east-1.amazonaws.com", 451 "versions": { 452 "20121219": { 453 "items": { 454 "usww2he": { 455 "root_store": "ebs", 456 "virt": "pv", 457 "id": "ami-442ea699" 458 } 459 }, 460 "pubname": "ubuntu-precise-12.04-arm-server-20121219", 461 "label": "release" 462 } 463 } 464 } 465 }, 466 "_aliases": { 467 "crsn": { 468 "uswest3": { 469 "region": "us-west-3", 470 "endpoint": "https://ec2.us-west-3.amazonaws.com" 471 } 472 } 473 }, 474 "format": "products:1.0" 475 } 476 `, 477 } 478 479 var testRoundTripper *jujutest.ProxyRoundTripper 480 481 func init() { 482 testRoundTripper = &jujutest.ProxyRoundTripper{} 483 simplestreams.RegisterProtocol("test", testRoundTripper) 484 } 485 486 type TestDataSuite struct{} 487 488 func (s *TestDataSuite) SetUpSuite(c *gc.C) { 489 testRoundTripper.Sub = jujutest.NewCannedRoundTripper( 490 imageData, map[string]int{"test://unauth": http.StatusUnauthorized}) 491 } 492 493 func (s *TestDataSuite) TearDownSuite(c *gc.C) { 494 testRoundTripper.Sub = nil 495 } 496 497 func AssertExpectedSources(c *gc.C, obtained []simplestreams.DataSource, baseURLs []string) { 498 var obtainedURLs = make([]string, len(baseURLs)) 499 for i, source := range obtained { 500 url, err := source.URL("") 501 c.Assert(err, gc.IsNil) 502 obtainedURLs[i] = url 503 } 504 c.Assert(obtainedURLs, gc.DeepEquals, baseURLs) 505 } 506 507 type LocalLiveSimplestreamsSuite struct { 508 testbase.LoggingSuite 509 Source simplestreams.DataSource 510 RequireSigned bool 511 DataType string 512 ValidConstraint simplestreams.LookupConstraint 513 } 514 515 func (s *LocalLiveSimplestreamsSuite) SetUpSuite(c *gc.C) { 516 s.LoggingSuite.SetUpSuite(c) 517 } 518 519 func (s *LocalLiveSimplestreamsSuite) TearDownSuite(c *gc.C) { 520 s.LoggingSuite.TearDownSuite(c) 521 } 522 523 const ( 524 Index_v1 = "index:1.0" 525 Product_v1 = "products:1.0" 526 Mirror_v1 = "mirrors:1.0" 527 ) 528 529 type testConstraint struct { 530 simplestreams.LookupParams 531 } 532 533 func NewTestConstraint(params simplestreams.LookupParams) *testConstraint { 534 return &testConstraint{LookupParams: params} 535 } 536 537 func (tc *testConstraint) Ids() ([]string, error) { 538 version, err := simplestreams.SeriesVersion(tc.Series[0]) 539 if err != nil { 540 return nil, err 541 } 542 ids := make([]string, len(tc.Arches)) 543 for i, arch := range tc.Arches { 544 ids[i] = fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", version, arch) 545 } 546 return ids, nil 547 } 548 549 func init() { 550 // Ensure out test struct can have its tags extracted. 551 simplestreams.RegisterStructTags(TestItem{}) 552 } 553 554 type TestItem struct { 555 Id string `json:"id"` 556 Storage string `json:"root_store"` 557 VType string `json:"virt"` 558 Arch string `json:"arch"` 559 RegionAlias string `json:"crsn"` 560 RegionName string `json:"region"` 561 Endpoint string `json:"endpoint"` 562 } 563 564 func (s *LocalLiveSimplestreamsSuite) IndexPath() string { 565 if s.RequireSigned { 566 return simplestreams.DefaultIndexPath + ".sjson" 567 } 568 return simplestreams.UnsignedIndex 569 } 570 571 func (s *LocalLiveSimplestreamsSuite) TestGetIndex(c *gc.C) { 572 indexRef, err := s.GetIndexRef(Index_v1) 573 c.Assert(err, gc.IsNil) 574 c.Assert(indexRef.Format, gc.Equals, Index_v1) 575 c.Assert(indexRef.Source, gc.Equals, s.Source) 576 c.Assert(len(indexRef.Indexes) > 0, gc.Equals, true) 577 } 578 579 func (s *LocalLiveSimplestreamsSuite) GetIndexRef(format string) (*simplestreams.IndexReference, error) { 580 params := simplestreams.ValueParams{ 581 DataType: s.DataType, 582 ValueTemplate: TestItem{}, 583 } 584 return simplestreams.GetIndexWithFormat( 585 s.Source, s.IndexPath(), format, s.RequireSigned, s.ValidConstraint.Params().CloudSpec, params) 586 } 587 588 func (s *LocalLiveSimplestreamsSuite) TestGetIndexWrongFormat(c *gc.C) { 589 _, err := s.GetIndexRef("bad") 590 c.Assert(err, gc.NotNil) 591 } 592 593 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathExists(c *gc.C) { 594 indexRef, err := s.GetIndexRef(Index_v1) 595 c.Assert(err, gc.IsNil) 596 path, err := indexRef.GetProductsPath(s.ValidConstraint) 597 c.Assert(err, gc.IsNil) 598 c.Assert(path, gc.Not(gc.Equals), "") 599 } 600 601 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidCloudSpec(c *gc.C) { 602 indexRef, err := s.GetIndexRef(Index_v1) 603 c.Assert(err, gc.IsNil) 604 ic := NewTestConstraint(simplestreams.LookupParams{ 605 CloudSpec: simplestreams.CloudSpec{"bad", "spec"}, 606 Series: []string{"precise"}, 607 }) 608 _, err = indexRef.GetProductsPath(ic) 609 c.Assert(err, gc.NotNil) 610 } 611 612 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidProductSpec(c *gc.C) { 613 indexRef, err := s.GetIndexRef(Index_v1) 614 c.Assert(err, gc.IsNil) 615 ic := NewTestConstraint(simplestreams.LookupParams{ 616 CloudSpec: s.ValidConstraint.Params().CloudSpec, 617 Series: []string{"precise"}, 618 Arches: []string{"bad"}, 619 Stream: "spec", 620 }) 621 _, err = indexRef.GetProductsPath(ic) 622 c.Assert(err, gc.NotNil) 623 } 624 625 func (s *LocalLiveSimplestreamsSuite) AssertGetMetadata(c *gc.C) *simplestreams.CloudMetadata { 626 indexRef, err := s.GetIndexRef(Index_v1) 627 c.Assert(err, gc.IsNil) 628 metadata, err := indexRef.GetCloudMetadataWithFormat(s.ValidConstraint, Product_v1, s.RequireSigned) 629 c.Assert(err, gc.IsNil) 630 c.Assert(metadata.Format, gc.Equals, Product_v1) 631 c.Assert(len(metadata.Products) > 0, gc.Equals, true) 632 return metadata 633 } 634 635 func (s *LocalLiveSimplestreamsSuite) TestGetCloudMetadataWithFormat(c *gc.C) { 636 s.AssertGetMetadata(c) 637 } 638 639 func (s *LocalLiveSimplestreamsSuite) AssertGetItemCollections(c *gc.C, version string) *simplestreams.ItemCollection { 640 metadata := s.AssertGetMetadata(c) 641 metadataCatalog := metadata.Products["com.ubuntu.cloud:server:12.04:amd64"] 642 ic := metadataCatalog.Items[version] 643 return ic 644 }