github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "io/ioutil" 11 "net/http" 12 "strings" 13 14 "github.com/juju/os/series" 15 jc "github.com/juju/testing/checkers" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/environs/simplestreams" 19 "github.com/juju/juju/testing" 20 ) 21 22 var PrivateKeyPassphrase = "12345" 23 24 var SignedMetadataPrivateKey = ` 25 -----BEGIN PGP PRIVATE KEY BLOCK----- 26 Version: GnuPG v1.4.12 (GNU/Linux) 27 28 lQH+BFJCk2EBBAC4wo3+aJ0PSeE54sv+GYNYckqysjazcZfJSdPK1GCN+Teat7ey 29 9dwlLhUIS34H29V+0/RcXmmRV+dObSkXzCx5ltKPSnuDsxvqiDEP0CgWdyFxhDf0 30 TbQuKK5OXcZ9rOTSFmnMxGaAzaV7T1IyuqA9HqntTIfC2tL4Y+QN41gS+QARAQAB 31 /gMDAjYGIOoxe8CYYGwpat1V7NGuphvvZRpqeP0RrJ6h4vHV3hXu5NK3tn6LZF0n 32 Qp31LfTH4BHF091UTiebexuuF1/ixLVihtv45mEVejFG1U3G298+WkWUP6AYA/5c 33 QRzXGiuTXlsBUuFVTGn1mvxRmG3yVoLkDj0l5rN9Tq3Ir4BACIWyxjBv1n8fqw+x 34 ti4b7YoE35FpIXQqLOdfdcKTOqUJt+5c+bed4Yx82BsLiY2/huqG2dLnbwln80Dz 35 iYudtG8xLJ1AeHBBFB0nVdyO+mPzXgLNEbP3zle2W+rUfz+s6te7y+rlV0gad2VG 36 tBAvUy08T9rDk0DNQl7jMq/3cGfDI1Zi/nzf2BuuBu2ddgIRmsXgKYly+Fq6eIpa 37 nM+P1hd1Fa3rQwUSJc/zrl48tukf8sdPLDk/+nMhLHy86jp+NeXyXPLvsMAlF5kR 38 eFjxEjHOnJlo4uIUxvlUuePyEOEl0XkQfZs+VWAPo+l2tB5UZXN0IFVzZXIgPHRl 39 c3RAc29tZXdoZXJlLmNvbT6IuAQTAQIAIgUCUkKTYQIbAwYLCQgHAwIGFQgCCQoL 40 BBYCAwECHgECF4AACgkQuK3uqWB66vCVugP/eJFir6Qdcvl+y9/HuP4q2iECi8ny 41 z9tC3YC9DcJePyoBnt1LJO3HvaquZh1AIr6hgMFaujjx6cCb7YEgE0pJ4m74dvtS 42 Y03MUPQ+Ok4cYV66zaDZLk6zpYJXZhxP7ZhlBvwQRES/rudBEQMfBcU9PrduFU39 43 iI+2ojHI4lsnMQE= 44 =UUIf 45 -----END PGP PRIVATE KEY BLOCK----- 46 ` 47 48 var SignedMetadataPublicKey = ` 49 -----BEGIN PGP PUBLIC KEY BLOCK----- 50 Version: GnuPG v1.4.12 (GNU/Linux) 51 52 mI0EUkKTYQEEALjCjf5onQ9J4Tniy/4Zg1hySrKyNrNxl8lJ08rUYI35N5q3t7L1 53 3CUuFQhLfgfb1X7T9FxeaZFX505tKRfMLHmW0o9Ke4OzG+qIMQ/QKBZ3IXGEN/RN 54 tC4ork5dxn2s5NIWaczEZoDNpXtPUjK6oD0eqe1Mh8La0vhj5A3jWBL5ABEBAAG0 55 HlRlc3QgVXNlciA8dGVzdEBzb21ld2hlcmUuY29tPoi4BBMBAgAiBQJSQpNhAhsD 56 BgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRC4re6pYHrq8JW6A/94kWKvpB1y 57 +X7L38e4/iraIQKLyfLP20LdgL0Nwl4/KgGe3Usk7ce9qq5mHUAivqGAwVq6OPHp 58 wJvtgSATSknibvh2+1JjTcxQ9D46ThxhXrrNoNkuTrOlgldmHE/tmGUG/BBERL+u 59 50ERAx8FxT0+t24VTf2Ij7aiMcjiWycxAQ== 60 =zBYH 61 -----END PGP PUBLIC KEY BLOCK-----` 62 63 var imageData = map[string]string{ 64 "/daily/streams/v1/index.json": ` 65 { 66 "index": { 67 "com.ubuntu.cloud:released:raring": { 68 "updated": "Wed, 01 May 2013 13:31:26 +0000", 69 "clouds": [ 70 { 71 "region": "us-east-1", 72 "endpoint": "https://ec2.us-east-1.amazonaws.com" 73 } 74 ], 75 "cloudname": "aws", 76 "datatype": "image-ids", 77 "format": "products:1.0", 78 "products": [ 79 "com.ubuntu.cloud:server:13.04:amd64" 80 ], 81 "path": "streams/v1/raring_metadata.json" 82 } 83 }, 84 "updated": "Wed, 01 May 2013 13:31:26 +0000", 85 "format": "index:1.0" 86 } 87 `, 88 "/streams/v1/index.json": ` 89 { 90 "index": { 91 "com.ubuntu.cloud:released:precise": { 92 "updated": "Wed, 01 May 2013 13:31:26 +0000", 93 "clouds": [ 94 { 95 "region": "us-east-1", 96 "endpoint": "https://ec2.us-east-1.amazonaws.com" 97 } 98 ], 99 "cloudname": "aws", 100 "datatype": "image-ids", 101 "format": "products:1.0", 102 "products": [ 103 "com.ubuntu.cloud:server:12.04:amd64", 104 "com.ubuntu.cloud:server:12.10:amd64", 105 "com.ubuntu.cloud:server:13.04:amd64", 106 "com.ubuntu.cloud:server:14.04:amd64", 107 "com.ubuntu.cloud:server:14.10:amd64", 108 "com.ubuntu.cloud:server:12.04:arm" 109 ], 110 "path": "streams/v1/image_metadata.json" 111 }, 112 "com.ubuntu.cloud:released:raring": { 113 "updated": "Wed, 01 May 2013 13:31:26 +0000", 114 "clouds": [ 115 { 116 "region": "us-east-1", 117 "endpoint": "https://ec2.us-east-1.amazonaws.com" 118 } 119 ], 120 "cloudname": "aws", 121 "datatype": "image-ids", 122 "format": "products:1.0", 123 "products": [ 124 "com.ubuntu.cloud:server:13.04:amd64" 125 ], 126 "path": "streams/v1/raring_metadata.json" 127 }, 128 "com.ubuntu.cloud:released:download": { 129 "datatype": "content-download", 130 "path": "streams/v1/com.ubuntu.cloud:released:download.json", 131 "updated": "Wed, 01 May 2013 13:30:37 +0000", 132 "products": [ 133 "com.ubuntu.cloud:server:12.10:amd64", 134 "com.ubuntu.cloud:server:13.04:amd64" 135 ], 136 "format": "products:1.0" 137 }, 138 "com.ubuntu.juju:released:tools": { 139 "updated": "Mon, 05 Aug 2013 11:07:04 +0000", 140 "datatype": "content-download", 141 "format": "products:1.0", 142 "products": [ 143 "com.ubuntu.juju:12.04:amd64", 144 "com.ubuntu.juju:12.04:arm", 145 "com.ubuntu.juju:13.04:amd64", 146 "com.ubuntu.juju:13.04:arm" 147 ], 148 "path": "streams/v1/tools_metadata.json" 149 }, 150 "com.ubuntu.juju:testing:tools": { 151 "updated": "Mon, 05 Aug 2013 11:07:04 +0000", 152 "datatype": "content-download", 153 "format": "products:1.0", 154 "products": [ 155 "com.ubuntu.juju:14.04:amd64" 156 ], 157 "path": "streams/v1/testing_tools_metadata.json" 158 } 159 }, 160 "updated": "Wed, 01 May 2013 13:31:26 +0000", 161 "format": "index:1.0" 162 } 163 `, 164 "/streams/v1/mirrors.json": ` 165 { 166 "mirrors": { 167 "com.ubuntu.juju:released:tools": [ 168 { 169 "datatype": "content-download", 170 "path": "streams/v1/tools_metadata:public-mirrors.json", 171 "clouds": [ 172 { 173 "region": "us-east-2", 174 "endpoint": "https://ec2.us-east-2.amazonaws.com" 175 }, 176 { 177 "region": "us-west-2", 178 "endpoint": "https://ec2.us-west-2.amazonaws.com" 179 } 180 ], 181 "updated": "Wed, 14 Aug 2013 13:46:17 +0000", 182 "format": "mirrors:1.0" 183 }, 184 { 185 "datatype": "content-download", 186 "path": "streams/v1/tools_metadata:more-mirrors.json", 187 "updated": "Wed, 14 Aug 2013 13:46:17 +0000", 188 "format": "mirrors:1.0" 189 } 190 ] 191 }, 192 "updated": "Wed, 01 May 2013 13:31:26 +0000", 193 "format": "index:1.0" 194 } 195 `, 196 "/streams/v1/tools_metadata.json": ` 197 { 198 "content_id": "com.ubuntu.juju:tools", 199 "datatype": "content-download", 200 "updated": "Tue, 04 Jun 2013 13:50:31 +0000", 201 "format": "products:1.0", 202 "products": { 203 "com.ubuntu.juju:12.04:amd64": { 204 "arch": "amd64", 205 "release": "precise", 206 "versions": { 207 "20130806": { 208 "items": { 209 "1130preciseamd64": { 210 "version": "1.13.0", 211 "size": 2973595, 212 "path": "tools/released/20130806/juju-1.13.0-precise-amd64.tgz", 213 "ftype": "tar.gz", 214 "sha256": "447aeb6a934a5eaec4f703eda4ef2dde" 215 } 216 } 217 } 218 } 219 }, 220 "com.ubuntu.juju:13.04:amd64": { 221 "arch": "amd64", 222 "release": "raring", 223 "versions": { 224 "20130806": { 225 "items": { 226 "1130raringamd64": { 227 "version": "1.13.0", 228 "size": 2973173, 229 "path": "tools/released/20130806/juju-1.13.0-raring-amd64.tgz", 230 "ftype": "tar.gz", 231 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 232 }, 233 "1140raringamd64": { 234 "version": "1.14.0", 235 "size": 2973173, 236 "path": "tools/released/20130806/juju-1.14.0-raring-amd64.tgz", 237 "ftype": "tar.gz", 238 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 239 } 240 } 241 } 242 } 243 }, 244 "com.ubuntu.juju:12.04:arm": { 245 "arch": "arm", 246 "release": "precise", 247 "versions": { 248 "20130806": { 249 "items": { 250 "201precisearm": { 251 "version": "2.0.1", 252 "size": 1951096, 253 "path": "tools/released/20130806/juju-2.0.1-precise-arm.tgz", 254 "ftype": "tar.gz", 255 "sha256": "f65a92b3b41311bdf398663ee1c5cd0c" 256 }, 257 "1114precisearm": { 258 "version": "1.11.4", 259 "size": 1951096, 260 "path": "tools/released/20130806/juju-1.11.4-precise-arm.tgz", 261 "ftype": "tar.gz", 262 "sha256": "f65a92b3b41311bdf398663ee1c5cd0c" 263 } 264 } 265 }, 266 "20130803": { 267 "items": { 268 "1114precisearm": { 269 "version": "1.11.4", 270 "size": 2851541, 271 "path": "tools/released/20130803/juju-1.11.4-precise-arm.tgz", 272 "ftype": "tar.gz", 273 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 274 }, 275 "1115precisearm": { 276 "version": "1.11.5", 277 "size": 2031281, 278 "path": "tools/released/20130803/juju-1.11.5-precise-arm.tgz", 279 "ftype": "tar.gz", 280 "sha256": "df07ac5e1fb4232d4e9aa2effa57918a" 281 } 282 } 283 } 284 } 285 }, 286 "com.ubuntu.juju:13.04:arm": { 287 "arch": "arm", 288 "release": "raring", 289 "versions": { 290 "20130806": { 291 "items": { 292 "1114raringarm": { 293 "version": "1.11.4", 294 "size": 1950327, 295 "path": "tools/released/20130806/juju-1.11.4-raring-arm.tgz", 296 "ftype": "tar.gz", 297 "sha256": "6472014e3255e3fe7fbd3550ef3f0a11" 298 }, 299 "201raringarm": { 300 "version": "2.0.1", 301 "size": 1950327, 302 "path": "tools/released/20130806/juju-2.0.1-raring-arm.tgz", 303 "ftype": "tar.gz", 304 "sha256": "6472014e3255e3fe7fbd3550ef3f0a11" 305 } 306 } 307 } 308 } 309 } 310 } 311 } 312 `, 313 "/streams/v1/testing_tools_metadata.json": ` 314 { 315 "content_id": "com.ubuntu.juju:tools", 316 "datatype": "content-download", 317 "updated": "Tue, 04 Jun 2013 13:50:31 +0000", 318 "format": "products:1.0", 319 "products": { 320 "com.ubuntu.juju:14.04:amd64": { 321 "arch": "amd64", 322 "release": "trusty", 323 "versions": { 324 "20130806": { 325 "items": { 326 "1130preciseamd64": { 327 "version": "1.16.0", 328 "size": 2973512, 329 "path": "tools/testing/20130806/juju-1.16.0-trusty-amd64.tgz", 330 "ftype": "tar.gz", 331 "sha256": "447aeb6a934a5eaec4f703eda4ef2dac" 332 } 333 } 334 } 335 } 336 } 337 } 338 } 339 `, 340 "/streams/v1/mirrored-tools-metadata.json": ` 341 { 342 "content_id": "com.ubuntu.juju:tools", 343 "datatype": "content-download", 344 "updated": "Tue, 04 Jun 2013 13:50:31 +0000", 345 "format": "products:1.0", 346 "products": { 347 "com.ubuntu.juju:12.04:amd64": { 348 "arch": "amd64", 349 "release": "precise", 350 "versions": { 351 "20130806": { 352 "items": { 353 "1130preciseamd64": { 354 "version": "1.13.0", 355 "size": 2973595, 356 "path": "mirrored-path/juju-1.13.0-precise-amd64.tgz", 357 "ftype": "tar.gz", 358 "sha256": "447aeb6a934a5eaec4f703eda4ef2dde" 359 } 360 } 361 } 362 } 363 } 364 } 365 } 366 `, 367 "/streams/v1/tools_metadata:public-mirrors.json": ` 368 { 369 "mirrors": { 370 "com.ubuntu.juju:released:tools": [ 371 { 372 "mirror": "http://some-mirror/", 373 "path": "com.ubuntu.juju:download.json", 374 "format": "products:1.0", 375 "clouds": [ 376 { 377 "endpoint": "https://ec2.us-east-2.amazonaws.com", 378 "region": "us-east-2" 379 } 380 ] 381 }, 382 { 383 "mirror": "test:/", 384 "path": "streams/v1/mirrored-tools-metadata.json", 385 "format": "products:1.0", 386 "clouds": [ 387 { 388 "endpoint": "https://ec2.us-west-2.amazonaws.com", 389 "region": "us-west-2" 390 } 391 ] 392 }, 393 { 394 "mirror": "http://another-mirror/", 395 "path": "com.ubuntu.juju:download.json", 396 "format": "products:1.0", 397 "clouds": [ 398 { 399 "endpoint": "https://ec2.us-west-1.amazonaws.com", 400 "region": "us-west-1" 401 } 402 ] 403 } 404 ] 405 }, 406 "format": "mirrors:1.0", 407 "updated": "Mon, 05 Aug 2013 11:07:04 +0000" 408 } 409 `, 410 "/streams/v1/tools_metadata:more-mirrors.json": ` 411 { 412 "mirrors": { 413 "com.ubuntu.juju:released:tools": [ 414 { 415 "mirror": "http://big-mirror/", 416 "path": "big:download.json", 417 "clouds": [ 418 { 419 "endpoint": "https://some-endpoint.com", 420 "region": "some-region" 421 } 422 ] 423 } 424 ] 425 }, 426 "format": "mirrors:1.0", 427 "updated": "Mon, 05 Aug 2013 11:07:04 +0000" 428 } 429 `, 430 "/streams/v1/image_metadata.json": ` 431 { 432 "updated": "Wed, 01 May 2013 13:31:26 +0000", 433 "content_id": "com.ubuntu.cloud:released:aws", 434 "region": "nz-east-1", 435 "endpoint": "https://anywhere", 436 "root_store": "ebs", 437 "virt": "pv", 438 "products": { 439 "com.ubuntu.cloud:server:14.04:amd64": { 440 "release": "trusty", 441 "version": "14.04", 442 "arch": "amd64", 443 "versions": { 444 "20140118": { 445 "items": { 446 "nzww1pe": { 447 "root_store": "ssd", 448 "virt": "hvm", 449 "id": "ami-36745463" 450 } 451 }, 452 "pubname": "ubuntu-trusty-14.04-amd64-server-20140118", 453 "label": "release" 454 } 455 } 456 }, 457 "com.ubuntu.cloud:server:13.04:amd64": { 458 "release": "raring", 459 "version": "13.04", 460 "arch": "amd64", 461 "versions": { 462 "20160318": { 463 "items": { 464 "nzww1pe": { 465 "id": "ami-36745463" 466 } 467 }, 468 "pubname": "ubuntu-utopic-13.04-amd64-server-20160318", 469 "label": "release" 470 } 471 } 472 }, 473 "com.ubuntu.cloud:server:14.10:amd64": { 474 "release": "utopic", 475 "version": "14.10", 476 "arch": "amd64", 477 "root_store": "ebs", 478 "virt": "pv", 479 "versions": { 480 "20160218": { 481 "items": { 482 "nzww1pe": { 483 "id": "ami-36745463" 484 } 485 }, 486 "pubname": "ubuntu-utopic-14.10-amd64-server-20160218", 487 "label": "release" 488 } 489 } 490 }, 491 "com.ubuntu.cloud:server:12.10:amd64": { 492 "release": "quantal", 493 "version": "12.10", 494 "arch": "amd64", 495 "versions": { 496 "20160118": { 497 "items": { 498 "nzww1pe": { 499 "id": "ami-36745463" 500 } 501 }, 502 "root_store": "ebs", 503 "virt": "pv", 504 "pubname": "ubuntu-quantal-12.10-amd64-server-20160118", 505 "label": "release" 506 } 507 } 508 }, 509 "com.ubuntu.cloud:server:12.04:amd64": { 510 "release": "precise", 511 "version": "12.04", 512 "arch": "amd64", 513 "region": "au-east-1", 514 "endpoint": "https://somewhere", 515 "versions": { 516 "20121218": { 517 "region": "au-east-2", 518 "endpoint": "https://somewhere-else", 519 "items": { 520 "usww1pe": { 521 "root_store": "ebs", 522 "virt": "pv", 523 "id": "ami-26745463" 524 }, 525 "usww2he": { 526 "root_store": "ebs", 527 "virt": "hvm", 528 "id": "ami-442ea674", 529 "region": "us-east-1", 530 "endpoint": "https://ec2.us-east-1.amazonaws.com" 531 }, 532 "usww3he": { 533 "root_store": "ebs", 534 "virt": "hvm", 535 "crsn": "uswest3", 536 "id": "ami-442ea675" 537 } 538 }, 539 "pubname": "ubuntu-precise-12.04-amd64-server-20121218", 540 "label": "release" 541 }, 542 "20111111": { 543 "items": { 544 "usww3pe": { 545 "root_store": "ebs", 546 "virt": "pv", 547 "id": "ami-26745464" 548 }, 549 "usww2pe": { 550 "root_store": "instance", 551 "virt": "pv", 552 "id": "ami-442ea684", 553 "region": "us-east-1", 554 "endpoint": "https://ec2.us-east-1.amazonaws.com" 555 } 556 }, 557 "pubname": "ubuntu-precise-12.04-amd64-server-20111111", 558 "label": "release" 559 } 560 } 561 }, 562 "com.ubuntu.cloud:server:12.04:arm": { 563 "release": "precise", 564 "version": "12.04", 565 "arch": "arm", 566 "region": "us-east-1", 567 "endpoint": "https://ec2.us-east-1.amazonaws.com", 568 "versions": { 569 "20121219": { 570 "items": { 571 "usww2he": { 572 "root_store": "ebs", 573 "virt": "pv", 574 "id": "ami-442ea699" 575 } 576 }, 577 "pubname": "ubuntu-precise-12.04-arm-server-20121219", 578 "label": "release" 579 } 580 } 581 } 582 }, 583 "_aliases": { 584 "crsn": { 585 "uswest3": { 586 "region": "us-west-3", 587 "endpoint": "https://ec2.us-west-3.amazonaws.com" 588 } 589 } 590 }, 591 "format": "products:1.0" 592 } 593 `, 594 } 595 596 var TestRoundTripper = &testing.ProxyRoundTripper{} 597 598 func init() { 599 TestRoundTripper.RegisterForScheme("test") 600 TestRoundTripper.RegisterForScheme("signedtest") 601 } 602 603 type TestDataSuite struct{} 604 605 func (s *TestDataSuite) SetUpSuite(c *gc.C) { 606 TestRoundTripper.Sub = testing.NewCannedRoundTripper(imageData, map[string]int{"test://unauth": http.StatusUnauthorized}) 607 } 608 609 func (s *TestDataSuite) TearDownSuite(c *gc.C) { 610 TestRoundTripper.Sub = nil 611 } 612 613 const ( 614 UnsignedJsonSuffix = ".json" 615 SignedJsonSuffix = ".sjson" 616 ) 617 618 func SetRoundTripperFiles(files map[string]string, errorFiles map[string]int) { 619 TestRoundTripper.Sub = testing.NewCannedRoundTripper(files, errorFiles) 620 } 621 622 func AddSignedFiles(c *gc.C, files map[string]string) map[string]string { 623 all := make(map[string]string) 624 for name, content := range files { 625 all[name] = content 626 // Sign file content 627 r := strings.NewReader(content) 628 bytes, err := ioutil.ReadAll(r) 629 c.Assert(err, jc.ErrorIsNil) 630 signedName, signedContent, err := SignMetadata(name, bytes) 631 c.Assert(err, jc.ErrorIsNil) 632 all[signedName] = string(signedContent) 633 } 634 return all 635 } 636 637 func SignMetadata(fileName string, fileData []byte) (string, []byte, error) { 638 signString := func(unsigned string) string { 639 return strings.Replace(unsigned, UnsignedJsonSuffix, SignedJsonSuffix, -1) 640 } 641 642 // Make sure that contents point to signed files too. 643 signedFileData := signString(string(fileData)) 644 signedBytes, err := simplestreams.Encode(strings.NewReader(signedFileData), SignedMetadataPrivateKey, PrivateKeyPassphrase) 645 if err != nil { 646 return "", nil, err 647 } 648 649 return signString(fileName), signedBytes, nil 650 } 651 652 // SourceDetails stored some details that need to be checked about data source. 653 type SourceDetails struct { 654 URL string 655 Key string 656 } 657 658 func AssertExpectedSources(c *gc.C, obtained []simplestreams.DataSource, dsDetails []SourceDetails) { 659 // Some data sources do not require to contain signed data. 660 // However, they may still contain it. 661 // Since we will always try to read signed data first, 662 // we want to be able to try to read this signed data 663 // with a public key. Check keys are provided where needed. 664 // Bugs #1542127, #1542131 665 for i, source := range obtained { 666 url, err := source.URL("") 667 c.Assert(err, jc.ErrorIsNil) 668 expected := dsDetails[i] 669 c.Assert(url, gc.DeepEquals, expected.URL) 670 c.Assert(source.PublicSigningKey(), gc.DeepEquals, expected.Key) 671 } 672 c.Assert(obtained, gc.HasLen, len(dsDetails)) 673 } 674 675 type LocalLiveSimplestreamsSuite struct { 676 testing.BaseSuite 677 Source simplestreams.DataSource 678 RequireSigned bool 679 StreamsVersion string 680 DataType string 681 ValidConstraint simplestreams.LookupConstraint 682 } 683 684 func (s *LocalLiveSimplestreamsSuite) SetUpSuite(c *gc.C) { 685 s.BaseSuite.SetUpSuite(c) 686 } 687 688 func (s *LocalLiveSimplestreamsSuite) TearDownSuite(c *gc.C) { 689 s.BaseSuite.TearDownSuite(c) 690 } 691 692 const ( 693 Index_v1 = "index:1.0" 694 Product_v1 = "products:1.0" 695 Mirror_v1 = "mirrors:1.0" 696 ) 697 698 type testConstraint struct { 699 simplestreams.LookupParams 700 } 701 702 func NewTestConstraint(params simplestreams.LookupParams) *testConstraint { 703 return &testConstraint{LookupParams: params} 704 } 705 706 func (tc *testConstraint) IndexIds() []string { 707 return nil 708 } 709 710 func (tc *testConstraint) ProductIds() ([]string, error) { 711 version, err := series.SeriesVersion(tc.Series[0]) 712 if err != nil { 713 return nil, err 714 } 715 ids := make([]string, len(tc.Arches)) 716 for i, arch := range tc.Arches { 717 ids[i] = fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", version, arch) 718 } 719 return ids, nil 720 } 721 722 func init() { 723 // Ensure out test struct can have its tags extracted. 724 simplestreams.RegisterStructTags(TestItem{}) 725 } 726 727 type TestItem struct { 728 Id string `json:"id"` 729 Storage string `json:"root_store"` 730 VirtType string `json:"virt"` 731 Arch string `json:"arch"` 732 RegionAlias string `json:"crsn"` 733 RegionName string `json:"region"` 734 Endpoint string `json:"endpoint"` 735 } 736 737 func (s *LocalLiveSimplestreamsSuite) IndexPath() string { 738 if s.RequireSigned { 739 return fmt.Sprintf("streams/%s/index.sjson", s.StreamsVersion) 740 } 741 return fmt.Sprintf("streams/%s/index.json", s.StreamsVersion) 742 } 743 744 func (s *LocalLiveSimplestreamsSuite) TestGetIndex(c *gc.C) { 745 indexRef, err := s.GetIndexRef(Index_v1) 746 c.Assert(err, jc.ErrorIsNil) 747 c.Assert(indexRef.Format, gc.Equals, Index_v1) 748 c.Assert(indexRef.Source, gc.Equals, s.Source) 749 c.Assert(len(indexRef.Indexes) > 0, jc.IsTrue) 750 } 751 752 func (s *LocalLiveSimplestreamsSuite) GetIndexRef(format string) (*simplestreams.IndexReference, error) { 753 params := simplestreams.ValueParams{ 754 DataType: s.DataType, 755 ValueTemplate: TestItem{}, 756 } 757 return simplestreams.GetIndexWithFormat( 758 s.Source, s.IndexPath(), format, simplestreams.MirrorsPath(s.StreamsVersion), s.RequireSigned, 759 s.ValidConstraint.Params().CloudSpec, params) 760 } 761 762 func (s *LocalLiveSimplestreamsSuite) TestGetIndexWrongFormat(c *gc.C) { 763 _, err := s.GetIndexRef("bad") 764 c.Assert(err, gc.NotNil) 765 } 766 767 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathExists(c *gc.C) { 768 indexRef, err := s.GetIndexRef(Index_v1) 769 c.Assert(err, jc.ErrorIsNil) 770 path, err := indexRef.GetProductsPath(s.ValidConstraint) 771 c.Assert(err, jc.ErrorIsNil) 772 c.Assert(path, gc.Not(gc.Equals), "") 773 } 774 775 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidCloudSpec(c *gc.C) { 776 indexRef, err := s.GetIndexRef(Index_v1) 777 c.Assert(err, jc.ErrorIsNil) 778 ic := NewTestConstraint(simplestreams.LookupParams{ 779 CloudSpec: simplestreams.CloudSpec{"bad", "spec"}, 780 Series: []string{"precise"}, 781 }) 782 _, err = indexRef.GetProductsPath(ic) 783 c.Assert(err, gc.NotNil) 784 } 785 786 func (s *LocalLiveSimplestreamsSuite) TestGetProductsPathInvalidProductSpec(c *gc.C) { 787 indexRef, err := s.GetIndexRef(Index_v1) 788 c.Assert(err, jc.ErrorIsNil) 789 ic := NewTestConstraint(simplestreams.LookupParams{ 790 CloudSpec: s.ValidConstraint.Params().CloudSpec, 791 Series: []string{"precise"}, 792 Arches: []string{"bad"}, 793 Stream: "spec", 794 }) 795 _, err = indexRef.GetProductsPath(ic) 796 c.Assert(err, gc.NotNil) 797 } 798 799 func (s *LocalLiveSimplestreamsSuite) AssertGetMetadata(c *gc.C) *simplestreams.CloudMetadata { 800 indexRef, err := s.GetIndexRef(Index_v1) 801 c.Assert(err, jc.ErrorIsNil) 802 metadata, err := indexRef.GetCloudMetadataWithFormat(s.ValidConstraint, Product_v1, s.RequireSigned) 803 c.Assert(err, jc.ErrorIsNil) 804 c.Assert(metadata.Format, gc.Equals, Product_v1) 805 c.Assert(len(metadata.Products) > 0, jc.IsTrue) 806 return metadata 807 } 808 809 func (s *LocalLiveSimplestreamsSuite) TestGetCloudMetadataWithFormat(c *gc.C) { 810 s.AssertGetMetadata(c) 811 } 812 813 func (s *LocalLiveSimplestreamsSuite) AssertGetItemCollections(c *gc.C, version string) *simplestreams.ItemCollection { 814 metadata := s.AssertGetMetadata(c) 815 metadataCatalog := metadata.Products["com.ubuntu.cloud:server:12.04:amd64"] 816 ic := metadataCatalog.Items[version] 817 return ic 818 }