github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/integration/isolated/manifest_inheritance_test.go (about) 1 package isolated 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "path/filepath" 7 "strings" 8 "time" 9 10 "code.cloudfoundry.org/cli/integration/helpers" 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 . "github.com/onsi/gomega/gbytes" 14 . "github.com/onsi/gomega/gexec" 15 ) 16 17 // pushes app with multiple manifests, children being passed in first in the 18 // array 19 func pushHelloWorldAppWithManifests(manifests []string) { 20 helpers.WithHelloWorldApp(func(appDir string) { 21 pushPath := filepath.Join(appDir, "manifest-0.yml") 22 for i, manifest := range manifests { 23 manifestPath := filepath.Join(appDir, fmt.Sprintf("manifest-%d.yml", i)) 24 manifest = strings.Replace(manifest, "inherit: {some-parent}", fmt.Sprintf("inherit: manifest-%d.yml", i+1), 1) 25 manifest = strings.Replace(manifest, "path: {some-dir}", fmt.Sprintf("path: %s", appDir), -1) 26 err := ioutil.WriteFile(manifestPath, []byte(manifest), 0666) 27 Expect(err).ToNot(HaveOccurred()) 28 } 29 Eventually(helpers.CF("push", "-f", pushPath)).Should(Exit(0)) 30 }) 31 } 32 33 // CASE 1: child manifest (no inheritance) 34 // 35 // APPLICATION params: 36 // values (memory, disk), list (routes), map (env vars) 37 // 38 // GLOBAL params: 39 // value, list, map types 40 // 41 // APPLICATION and GLOBAL params: 42 // value: application values override global values 43 // list: application lists append to global lists 44 // map: application maps merge & override global maps 45 // 46 // 47 // CASE 2: child + parent manifests (1 level inheritance) 48 // 49 // Parent Application & Child Application 50 // Parent Global & Child Application 51 // Parent Application & Child Global 52 // Parent Global & Child Global 53 // 54 // Parent Global & Child Global & Child Application 55 // Parent Application & Child Global & Child Application 56 // Parent Global & Parent Application & Child Application 57 // Parent Global & Parent Application & Child Global 58 // 59 // Parent Global & Parent Application & Child Global & Child Application 60 // 61 // CASE 3: child + parent + super-parent manifests (n+ inheritance) 62 // Super-parent Global & Parent Global & Parent Application & Child Global 63 // Super-parent Global & Parent Global & Child Global & Child Application 64 65 var _ = Describe("manifest inheritance in push command", func() { 66 var ( 67 orgName string 68 spaceName string 69 domainName string 70 app1Name string 71 app2Name string 72 ) 73 74 BeforeEach(func() { 75 orgName = helpers.NewOrgName() 76 spaceName = helpers.PrefixedRandomName("SPACE") 77 app1Name = helpers.PrefixedRandomName("app") 78 app2Name = helpers.PrefixedRandomName("app") 79 80 setupCF(orgName, spaceName) 81 82 domainName = fmt.Sprintf("%s.com", helpers.PrefixedRandomName("DOMAIN")) 83 helpers.NewDomain(orgName, domainName).Create() 84 }) 85 86 AfterEach(func() { 87 helpers.QuickDeleteOrg(orgName) 88 }) 89 90 Context("when there is only one manifest", func() { 91 Context("when the manifest contains only applications properties", func() { 92 BeforeEach(func() { 93 pushHelloWorldAppWithManifests([]string{fmt.Sprintf(` 94 --- 95 applications: 96 - name: %s 97 memory: 128M 98 disk_quota: 128M 99 buildpack: staticfile_buildpack 100 path: {some-dir} 101 routes: 102 - route: hello.%s 103 - route: hi.%s 104 env: 105 BAR: bar 106 FOO: foo 107 - name: %s 108 memory: 128M 109 disk_quota: 128M 110 buildpack: staticfile_buildpack 111 path: {some-dir} 112 routes: 113 - route: hello.%s 114 - route: hi.%s 115 env: 116 BAR: bar 117 FOO: foo 118 `, app1Name, domainName, domainName, app2Name, domainName, domainName)}) 119 }) 120 121 It("pushes the same applications properties", func() { 122 session := helpers.CF("env", app1Name) 123 Eventually(session.Out).Should(Say("OK")) 124 Eventually(session.Out).Should(Say(`"application_uris": \[ 125 "hello\.%s"\, 126 "hi\.%s" 127 \]`, domainName, domainName)) 128 Eventually(session.Out).Should(Say(`"disk": 128`)) 129 Eventually(session.Out).Should(Say(`"mem": 128`)) 130 Eventually(session.Out).Should(Say(`User-Provided: 131 BAR: bar 132 FOO: foo 133 134 `)) 135 Eventually(session).Should(Exit(0)) 136 137 session = helpers.CF("env", app2Name) 138 Eventually(session.Out).Should(Say("OK")) 139 Eventually(session.Out).Should(Say(`"application_uris": \[ 140 "hello\.%s"\, 141 "hi\.%s" 142 \]`, domainName, domainName)) 143 Eventually(session.Out).Should(Say(`"disk": 128`)) 144 Eventually(session.Out).Should(Say(`"mem": 128`)) 145 Eventually(session.Out).Should(Say(`User-Provided: 146 BAR: bar 147 FOO: foo 148 149 `)) 150 Eventually(session).Should(Exit(0)) 151 }) 152 }) 153 154 Context("when the manifest contains mainly global properties", func() { 155 BeforeEach(func() { 156 pushHelloWorldAppWithManifests([]string{fmt.Sprintf(` 157 --- 158 memory: 128M 159 disk_quota: 128M 160 buildpack: staticfile_buildpack 161 path: {some-dir} 162 routes: 163 - route: hello.%s 164 - route: hi.%s 165 env: 166 BAR: bar 167 FOO: foo 168 applications: 169 - name: %s 170 - name: %s 171 `, domainName, domainName, app1Name, app2Name)}) 172 }) 173 174 It("pushes the same global properties", func() { 175 session := helpers.CF("env", app1Name) 176 Eventually(session.Out).Should(Say("OK")) 177 Eventually(session.Out).Should(Say(`"application_uris": \[ 178 "hello\.%s"\, 179 "hi\.%s" 180 \]`, domainName, domainName)) 181 Eventually(session.Out).Should(Say(`"disk": 128`)) 182 Eventually(session.Out).Should(Say(`"mem": 128`)) 183 Eventually(session.Out).Should(Say(`User-Provided: 184 BAR: bar 185 FOO: foo 186 187 `)) 188 Eventually(session).Should(Exit(0)) 189 190 session = helpers.CF("env", app2Name) 191 Eventually(session.Out).Should(Say("OK")) 192 Eventually(session.Out).Should(Say(`"application_uris": \[ 193 "hello\.%s"\, 194 "hi\.%s" 195 \]`, domainName, domainName)) 196 Eventually(session.Out).Should(Say(`"disk": 128`)) 197 Eventually(session.Out).Should(Say(`"mem": 128`)) 198 Eventually(session.Out).Should(Say(`User-Provided: 199 BAR: bar 200 FOO: foo 201 202 `)) 203 Eventually(session).Should(Exit(0)) 204 }) 205 }) 206 207 Context("when the manifest contains both applications and global properties", func() { 208 BeforeEach(func() { 209 pushHelloWorldAppWithManifests([]string{fmt.Sprintf(` 210 --- 211 buildpack: staticfile_buildpack 212 memory: 256M 213 disk_quota: 256M 214 routes: 215 - route: global-1.%s 216 - route: global-2.%s 217 env: 218 BAR: global 219 FOO: global 220 applications: 221 - name: %s 222 memory: 128M 223 disk_quota: 128M 224 path: {some-dir} 225 routes: 226 - route: app-1.%s 227 - route: app-2.%s 228 env: 229 BAR: app 230 BAZ: app 231 - name: %s 232 memory: 128M 233 disk_quota: 128M 234 path: {some-dir} 235 routes: 236 - route: app-1.%s 237 - route: app-2.%s 238 env: 239 BAR: app 240 BAZ: app 241 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName)}) 242 }) 243 244 It("pushes with application properties taking precedence; values are overwritten, lists are appended, and maps are merged", func() { 245 session := helpers.CF("env", app1Name) 246 Eventually(session.Out).Should(Say("OK")) 247 Eventually(session.Out).Should(Say(`"application_uris": \[ 248 "global-1\.%s"\, 249 "global-2\.%s", 250 "app-1\.%s", 251 "app-2\.%s" 252 \]`, domainName, domainName, domainName, domainName)) 253 Eventually(session.Out).Should(Say(`"disk": 128`)) 254 Eventually(session.Out).Should(Say(`"mem": 128`)) 255 Eventually(session.Out).Should(Say(`User-Provided: 256 BAR: app 257 BAZ: app 258 FOO: global 259 260 `)) 261 Eventually(session).Should(Exit(0)) 262 263 session = helpers.CF("env", app2Name) 264 Eventually(session.Out).Should(Say("OK")) 265 Eventually(session.Out).Should(Say(`"application_uris": \[ 266 "global-1\.%s"\, 267 "global-2\.%s", 268 "app-1\.%s", 269 "app-2\.%s" 270 \]`, domainName, domainName, domainName, domainName)) 271 Eventually(session.Out).Should(Say(`"disk": 128`)) 272 Eventually(session.Out).Should(Say(`"mem": 128`)) 273 Eventually(session.Out).Should(Say(`User-Provided: 274 BAR: app 275 BAZ: app 276 FOO: global 277 278 `)) 279 Eventually(session).Should(Exit(0)) 280 }) 281 }) 282 }) 283 284 Context("when there are two manifests", func() { 285 Context("when the child has applications properties; and the parent has applications properties", func() { 286 BeforeEach(func() { 287 pushHelloWorldAppWithManifests([]string{ 288 fmt.Sprintf(` 289 --- 290 inherit: {some-parent} 291 applications: 292 - name: %s 293 memory: 128M 294 disk_quota: 128M 295 path: {some-dir} 296 routes: 297 - route: child-app-1.%s 298 - route: child-app-2.%s 299 env: 300 BAR: child-app 301 BAZ: child-app 302 - name: %s 303 memory: 128M 304 disk_quota: 128M 305 path: {some-dir} 306 routes: 307 - route: child-app-1.%s 308 - route: child-app-2.%s 309 env: 310 BAR: child-app 311 BAZ: child-app 312 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 313 fmt.Sprintf(` 314 --- 315 applications: 316 - name: %s 317 buildpack: staticfile_buildpack 318 memory: 256M 319 disk_quota: 256M 320 path: {some-dir} 321 routes: 322 - route: parent-app-1.%s 323 - route: parent-app-2.%s 324 env: 325 BAR: parent-app 326 BAZ: parent-app 327 FOO: parent-app 328 - name: %s 329 buildpack: staticfile_buildpack 330 memory: 256M 331 disk_quota: 256M 332 path: {some-dir} 333 routes: 334 - route: parent-app-1.%s 335 - route: parent-app-2.%s 336 env: 337 BAR: parent-app 338 BAZ: parent-app 339 FOO: parent-app 340 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 341 }) 342 }) 343 344 It("pushes with child application properties taking precedence; values are overwritten, lists are appended, and maps are merged", func() { 345 session := helpers.CF("env", app1Name) 346 Eventually(session.Out).Should(Say("OK")) 347 Eventually(session.Out).Should(Say(`"application_uris": \[ 348 "parent-app-1\.%s", 349 "parent-app-2\.%s", 350 "child-app-1\.%s"\, 351 "child-app-2\.%s" 352 \]`, domainName, domainName, domainName, domainName)) 353 Eventually(session.Out).Should(Say(`"disk": 128`)) 354 Eventually(session.Out).Should(Say(`"mem": 128`)) 355 Eventually(session.Out).Should(Say(`User-Provided: 356 BAR: child-app 357 BAZ: child-app 358 FOO: parent-app 359 360 `)) 361 Eventually(session).Should(Exit(0)) 362 363 session = helpers.CF("env", app2Name) 364 Eventually(session.Out).Should(Say("OK")) 365 Eventually(session.Out).Should(Say(`"application_uris": \[ 366 "parent-app-1\.%s", 367 "parent-app-2\.%s", 368 "child-app-1\.%s"\, 369 "child-app-2\.%s" 370 \]`, domainName, domainName, domainName, domainName)) 371 Eventually(session.Out).Should(Say(`"disk": 128`)) 372 Eventually(session.Out).Should(Say(`"mem": 128`)) 373 Eventually(session.Out).Should(Say(`User-Provided: 374 BAR: child-app 375 BAZ: child-app 376 FOO: parent-app 377 378 `)) 379 Eventually(session).Should(Exit(0)) 380 }) 381 }) 382 383 Context("when the child has applications properties; and the parent has global properties", func() { 384 BeforeEach(func() { 385 pushHelloWorldAppWithManifests([]string{ 386 fmt.Sprintf(` 387 --- 388 inherit: {some-parent} 389 applications: 390 - name: %s 391 memory: 128M 392 disk_quota: 128M 393 path: {some-dir} 394 routes: 395 - route: child-app-1.%s 396 - route: child-app-2.%s 397 env: 398 BAR: child-app 399 BAZ: child-app 400 - name: %s 401 memory: 128M 402 disk_quota: 128M 403 path: {some-dir} 404 routes: 405 - route: child-app-1.%s 406 - route: child-app-2.%s 407 env: 408 BAR: child-app 409 BAZ: child-app 410 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 411 fmt.Sprintf(` 412 --- 413 buildpack: staticfile_buildpack 414 memory: 256M 415 disk_quota: 256M 416 path: {some-dir} 417 routes: 418 - route: parent-global-1.%s 419 - route: parent-global-2.%s 420 env: 421 BAR: parent-global 422 BAZ: parent-global 423 FOO: parent-global 424 `, domainName, domainName), 425 }) 426 SetDefaultEventuallyTimeout(300 * time.Second) 427 }) 428 429 It("pushes with child application properties taking precedence", func() { 430 session := helpers.CF("env", app1Name) 431 Eventually(session.Out).Should(Say("OK")) 432 Eventually(session.Out).Should(Say(`"application_uris": \[ 433 "parent-global-1\.%s", 434 "parent-global-2\.%s", 435 "child-app-1\.%s"\, 436 "child-app-2\.%s" 437 \]`, domainName, domainName, domainName, domainName)) 438 Eventually(session.Out).Should(Say(`"disk": 128`)) 439 Eventually(session.Out).Should(Say(`"mem": 128`)) 440 Eventually(session.Out).Should(Say(`User-Provided: 441 BAR: child-app 442 BAZ: child-app 443 FOO: parent-global 444 445 `)) 446 Eventually(session).Should(Exit(0)) 447 448 session = helpers.CF("env", app2Name) 449 Eventually(session.Out).Should(Say("OK")) 450 Eventually(session.Out).Should(Say(`"application_uris": \[ 451 "parent-global-1\.%s", 452 "parent-global-2\.%s", 453 "child-app-1\.%s"\, 454 "child-app-2\.%s" 455 \]`, domainName, domainName, domainName, domainName)) 456 Eventually(session.Out).Should(Say(`"disk": 128`)) 457 Eventually(session.Out).Should(Say(`"mem": 128`)) 458 Eventually(session.Out).Should(Say(`User-Provided: 459 BAR: child-app 460 BAZ: child-app 461 FOO: parent-global 462 463 `)) 464 Eventually(session).Should(Exit(0)) 465 }) 466 }) 467 468 Context("when the child has global properties; and the parent has applications properties", func() { 469 BeforeEach(func() { 470 pushHelloWorldAppWithManifests([]string{ 471 fmt.Sprintf(` 472 --- 473 inherit: {some-parent} 474 buildpack: staticfile_buildpack 475 memory: 128M 476 disk_quota: 128M 477 path: {some-dir} 478 routes: 479 - route: child-global-1.%s 480 - route: child-global-2.%s 481 env: 482 BAR: child-global 483 BAZ: child-global 484 `, domainName, domainName), 485 fmt.Sprintf(` 486 --- 487 applications: 488 - name: %s 489 memory: 256M 490 disk_quota: 256M 491 path: {some-dir} 492 routes: 493 - route: parent-app-1.%s 494 - route: parent-app-2.%s 495 env: 496 BAR: parent-app 497 BAZ: parent-app 498 FOO: parent-app 499 - name: %s 500 memory: 256M 501 disk_quota: 256M 502 path: {some-dir} 503 routes: 504 - route: parent-app-1.%s 505 - route: parent-app-2.%s 506 env: 507 BAR: parent-app 508 BAZ: parent-app 509 FOO: parent-app 510 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 511 }) 512 SetDefaultEventuallyTimeout(300 * time.Second) 513 }) 514 515 It("pushes with parent application properties taking precedence", func() { 516 session := helpers.CF("env", app1Name) 517 Eventually(session.Out).Should(Say("OK")) 518 Eventually(session.Out).Should(Say(`"application_uris": \[ 519 "child-global-1\.%s"\, 520 "child-global-2\.%s", 521 "parent-app-1\.%s", 522 "parent-app-2\.%s" 523 \]`, domainName, domainName, domainName, domainName)) 524 Eventually(session.Out).Should(Say(`"disk": 256`)) 525 Eventually(session.Out).Should(Say(`"mem": 256`)) 526 Eventually(session.Out).Should(Say(`User-Provided: 527 BAR: parent-app 528 BAZ: parent-app 529 FOO: parent-app 530 `)) 531 Eventually(session).Should(Exit(0)) 532 533 session = helpers.CF("env", app2Name) 534 Eventually(session.Out).Should(Say("OK")) 535 Eventually(session.Out).Should(Say(`"application_uris": \[ 536 "child-global-1\.%s"\, 537 "child-global-2\.%s", 538 "parent-app-1\.%s", 539 "parent-app-2\.%s" 540 \]`, domainName, domainName, domainName, domainName)) 541 Eventually(session.Out).Should(Say(`"disk": 256`)) 542 Eventually(session.Out).Should(Say(`"mem": 256`)) 543 Eventually(session.Out).Should(Say(`User-Provided: 544 BAR: parent-app 545 BAZ: parent-app 546 FOO: parent-app 547 `)) 548 Eventually(session).Should(Exit(0)) 549 }) 550 }) 551 552 Context("when the child has global properties; and the parent has global properties", func() { 553 BeforeEach(func() { 554 pushHelloWorldAppWithManifests([]string{ 555 fmt.Sprintf(` 556 --- 557 inherit: {some-parent} 558 memory: 128M 559 disk_quota: 128M 560 path: {some-dir} 561 routes: 562 - route: child-global-1.%s 563 - route: child-global-2.%s 564 env: 565 BAR: child-global 566 FOO: child-global 567 `, domainName, domainName), 568 fmt.Sprintf(` 569 --- 570 buildpack: staticfile_buildpack 571 memory: 256M 572 disk_quota: 256M 573 path: {some-dir} 574 routes: 575 - route: parent-global-1.%s 576 - route: parent-global-2.%s 577 env: 578 BAR: parent-global 579 FOO: parent-global 580 BAZ: parent-global 581 applications: 582 - name: %s 583 - name: %s 584 `, domainName, domainName, app1Name, app2Name), 585 }) 586 }) 587 588 It("pushes with child global properties taking precedence;", func() { 589 session := helpers.CF("env", app1Name) 590 Eventually(session.Out).Should(Say("OK")) 591 Eventually(session.Out).Should(Say(`"application_uris": \[ 592 "parent-global-1\.%s"\, 593 "parent-global-2\.%s", 594 "child-global-1\.%s", 595 "child-global-2\.%s" 596 \]`, domainName, domainName, domainName, domainName)) 597 Eventually(session.Out).Should(Say(`"disk": 128`)) 598 Eventually(session.Out).Should(Say(`"mem": 128`)) 599 Eventually(session.Out).Should(Say(`User-Provided: 600 BAR: child-global 601 BAZ: parent-global 602 FOO: child-global 603 604 `)) 605 Eventually(session).Should(Exit(0)) 606 607 session = helpers.CF("env", app2Name) 608 Eventually(session.Out).Should(Say("OK")) 609 Eventually(session.Out).Should(Say(`"application_uris": \[ 610 "parent-global-1\.%s"\, 611 "parent-global-2\.%s", 612 "child-global-1\.%s", 613 "child-global-2\.%s" 614 \]`, domainName, domainName, domainName, domainName)) 615 Eventually(session.Out).Should(Say(`"disk": 128`)) 616 Eventually(session.Out).Should(Say(`"mem": 128`)) 617 Eventually(session.Out).Should(Say(`User-Provided: 618 BAR: child-global 619 BAZ: parent-global 620 FOO: child-global 621 622 `)) 623 Eventually(session).Should(Exit(0)) 624 }) 625 }) 626 627 Context("when the child has applications and global properties; and the parent has global properties", func() { 628 BeforeEach(func() { 629 pushHelloWorldAppWithManifests([]string{ 630 fmt.Sprintf(` 631 --- 632 inherit: {some-parent} 633 memory: 128M 634 disk_quota: 128M 635 path: {some-dir} 636 routes: 637 - route: child-global-1.%s 638 - route: child-global-2.%s 639 env: 640 FOO: child-global 641 FIZ: child-global 642 applications: 643 - name: %s 644 memory: 64M 645 disk_quota: 64M 646 path: {some-dir} 647 routes: 648 - route: child-app-1.%s 649 - route: child-app-2.%s 650 env: 651 BAR: child-app 652 FOO: child-app 653 - name: %s 654 memory: 64M 655 disk_quota: 64M 656 path: {some-dir} 657 routes: 658 - route: child-app-1.%s 659 - route: child-app-2.%s 660 env: 661 BAR: child-app 662 FOO: child-app 663 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 664 fmt.Sprintf(` 665 --- 666 buildpack: staticfile_buildpack 667 memory: 256M 668 disk_quota: 256M 669 path: {some-dir} 670 routes: 671 - route: parent-global-1.%s 672 - route: parent-global-2.%s 673 env: 674 BAR: parent-global 675 FOO: parent-global 676 FIZ: parent-global 677 BAZ: parent-global 678 applications: 679 - name: %s 680 - name: %s 681 `, domainName, domainName, app1Name, app2Name), 682 }) 683 }) 684 685 It("pushes with child application taking precedence over child global over parent global", func() { 686 session := helpers.CF("env", app1Name) 687 Eventually(session.Out).Should(Say("OK")) 688 Eventually(session.Out).Should(Say(`"application_uris": \[ 689 "parent-global-1\.%s"\, 690 "parent-global-2\.%s", 691 "child-global-1\.%s", 692 "child-global-2\.%s", 693 "child-app-1\.%s", 694 "child-app-2\.%s" 695 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 696 Eventually(session.Out).Should(Say(`"disk": 64`)) 697 Eventually(session.Out).Should(Say(`"mem": 64`)) 698 Eventually(session.Out).Should(Say(`User-Provided: 699 BAR: child-app 700 BAZ: parent-global 701 FIZ: child-global 702 FOO: child-app 703 704 `)) 705 Eventually(session).Should(Exit(0)) 706 707 session = helpers.CF("env", app2Name) 708 Eventually(session.Out).Should(Say("OK")) 709 Eventually(session.Out).Should(Say(`"application_uris": \[ 710 "parent-global-1\.%s"\, 711 "parent-global-2\.%s", 712 "child-global-1\.%s", 713 "child-global-2\.%s", 714 "child-app-1\.%s", 715 "child-app-2\.%s" 716 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 717 Eventually(session.Out).Should(Say(`"disk": 64`)) 718 Eventually(session.Out).Should(Say(`"mem": 64`)) 719 Eventually(session.Out).Should(Say(`User-Provided: 720 BAR: child-app 721 BAZ: parent-global 722 FIZ: child-global 723 FOO: child-app 724 725 `)) 726 Eventually(session).Should(Exit(0)) 727 }) 728 }) 729 730 Context("when the child has applications and global properties; and the parent has applications properties", func() { 731 BeforeEach(func() { 732 pushHelloWorldAppWithManifests([]string{ 733 fmt.Sprintf(` 734 --- 735 inherit: {some-parent} 736 memory: 128M 737 disk_quota: 128M 738 path: {some-dir} 739 routes: 740 - route: child-global-1.%s 741 - route: child-global-2.%s 742 env: 743 FOO: child-global 744 FIZ: child-global 745 applications: 746 - name: %s 747 disk_quota: 64M 748 path: {some-dir} 749 routes: 750 - route: child-app-1.%s 751 - route: child-app-2.%s 752 env: 753 BAR: child-app 754 FOO: child-app 755 - name: %s 756 disk_quota: 64M 757 path: {some-dir} 758 routes: 759 - route: child-app-1.%s 760 - route: child-app-2.%s 761 env: 762 BAR: child-app 763 FOO: child-app 764 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 765 fmt.Sprintf(` 766 --- 767 buildpack: staticfile_buildpack 768 applications: 769 - name: %s 770 memory: 256M 771 disk_quota: 256M 772 path: {some-dir} 773 routes: 774 - route: parent-app-1.%s 775 - route: parent-app-2.%s 776 env: 777 BAR: parent-app 778 FOO: parent-app 779 FIZ: parent-app 780 BAZ: parent-app 781 - name: %s 782 memory: 256M 783 disk_quota: 256M 784 path: {some-dir} 785 routes: 786 - route: parent-app-1.%s 787 - route: parent-app-2.%s 788 env: 789 BAR: parent-app 790 FOO: parent-app 791 FIZ: parent-app 792 BAZ: parent-app 793 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 794 }) 795 }) 796 797 It("pushes with child application taking precedence over child global over parent application", func() { 798 session := helpers.CF("env", app1Name) 799 Eventually(session.Out).Should(Say("OK")) 800 Eventually(session.Out).Should(Say(`"application_uris": \[ 801 "child-global-1\.%s", 802 "child-global-2\.%s", 803 "parent-app-1\.%s"\, 804 "parent-app-2\.%s", 805 "child-app-1\.%s", 806 "child-app-2\.%s" 807 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 808 Eventually(session.Out).Should(Say(`"disk": 64`)) 809 Eventually(session.Out).Should(Say(`"mem": 128`)) 810 Eventually(session.Out).Should(Say(`User-Provided: 811 BAR: child-app 812 BAZ: parent-app 813 FIZ: child-global 814 FOO: child-app 815 816 `)) 817 Eventually(session).Should(Exit(0)) 818 819 session = helpers.CF("env", app2Name) 820 Eventually(session.Out).Should(Say("OK")) 821 Eventually(session.Out).Should(Say(`"application_uris": \[ 822 "child-global-1\.%s", 823 "child-global-2\.%s", 824 "parent-app-1\.%s"\, 825 "parent-app-2\.%s", 826 "child-app-1\.%s", 827 "child-app-2\.%s" 828 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 829 Eventually(session.Out).Should(Say(`"disk": 64`)) 830 Eventually(session.Out).Should(Say(`"mem": 128`)) 831 Eventually(session.Out).Should(Say(`User-Provided: 832 BAR: child-app 833 BAZ: parent-app 834 FIZ: child-global 835 FOO: child-app 836 837 `)) 838 Eventually(session).Should(Exit(0)) 839 }) 840 }) 841 842 Context("when the child has applications properties; and the parent has applications and global properties", func() { 843 BeforeEach(func() { 844 pushHelloWorldAppWithManifests([]string{ 845 fmt.Sprintf(` 846 --- 847 inherit: {some-parent} 848 applications: 849 - name: %s 850 memory: 64M 851 disk_quota: 64M 852 path: {some-dir} 853 routes: 854 - route: child-app-1.%s 855 - route: child-app-2.%s 856 env: 857 BAR: child-app 858 FOO: child-app 859 - name: %s 860 memory: 64M 861 disk_quota: 64M 862 path: {some-dir} 863 routes: 864 - route: child-app-1.%s 865 - route: child-app-2.%s 866 env: 867 BAR: child-app 868 FOO: child-app 869 `, app1Name, domainName, domainName, app2Name, domainName, domainName), 870 fmt.Sprintf(` 871 --- 872 buildpack: staticfile_buildpack 873 memory: 128M 874 disk_quota: 128M 875 path: {some-dir} 876 routes: 877 - route: parent-global-1.%s 878 - route: parent-global-2.%s 879 env: 880 FOO: parent-global 881 FIZ: parent-global 882 applications: 883 - name: %s 884 memory: 256M 885 disk_quota: 256M 886 path: {some-dir} 887 routes: 888 - route: parent-app-1.%s 889 - route: parent-app-2.%s 890 env: 891 BAR: parent-app 892 FOO: parent-app 893 FIZ: parent-app 894 BAZ: parent-app 895 - name: %s 896 memory: 256M 897 disk_quota: 256M 898 path: {some-dir} 899 routes: 900 - route: parent-app-1.%s 901 - route: parent-app-2.%s 902 env: 903 BAR: parent-app 904 FOO: parent-app 905 FIZ: parent-app 906 BAZ: parent-app 907 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 908 }) 909 }) 910 911 It("pushes with child application taking precedence over parent application over child global", func() { 912 session := helpers.CF("env", app1Name) 913 Eventually(session.Out).Should(Say("OK")) 914 Eventually(session.Out).Should(Say(`"application_uris": \[ 915 "parent-global-1\.%s", 916 "parent-global-2\.%s", 917 "parent-app-1\.%s"\, 918 "parent-app-2\.%s", 919 "child-app-1\.%s", 920 "child-app-2\.%s" 921 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 922 Eventually(session.Out).Should(Say(`"disk": 64`)) 923 Eventually(session.Out).Should(Say(`"mem": 64`)) 924 Eventually(session.Out).Should(Say(`User-Provided: 925 BAR: child-app 926 BAZ: parent-app 927 FIZ: parent-global 928 FOO: child-app 929 930 `)) 931 Eventually(session).Should(Exit(0)) 932 933 session = helpers.CF("env", app2Name) 934 Eventually(session.Out).Should(Say("OK")) 935 Eventually(session.Out).Should(Say(`"application_uris": \[ 936 "parent-global-1\.%s", 937 "parent-global-2\.%s", 938 "parent-app-1\.%s"\, 939 "parent-app-2\.%s", 940 "child-app-1\.%s", 941 "child-app-2\.%s" 942 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 943 Eventually(session.Out).Should(Say(`"disk": 64`)) 944 Eventually(session.Out).Should(Say(`"mem": 64`)) 945 Eventually(session.Out).Should(Say(`User-Provided: 946 BAR: child-app 947 BAZ: parent-app 948 FIZ: parent-global 949 FOO: child-app 950 951 `)) 952 Eventually(session).Should(Exit(0)) 953 }) 954 }) 955 956 Context("when the child has global properties; and the parent has applications and global properties", func() { 957 BeforeEach(func() { 958 pushHelloWorldAppWithManifests([]string{ 959 fmt.Sprintf(` 960 --- 961 inherit: {some-parent} 962 memory: 128M 963 disk_quota: 128M 964 path: {some-dir} 965 routes: 966 - route: child-global-1.%s 967 - route: child-global-2.%s 968 env: 969 FOO: child-global 970 FIZ: child-global 971 `, domainName, domainName), 972 fmt.Sprintf(` 973 --- 974 buildpack: staticfile_buildpack 975 routes: 976 - route: parent-global-1.%s 977 - route: parent-global-2.%s 978 env: 979 FIZ: parent-global 980 ZOOM: parent-global 981 applications: 982 - name: %s 983 memory: 256M 984 disk_quota: 256M 985 path: {some-dir} 986 routes: 987 - route: parent-app-1.%s 988 - route: parent-app-2.%s 989 env: 990 FOO: parent-app 991 BAZ: parent-app 992 - name: %s 993 memory: 256M 994 disk_quota: 256M 995 path: {some-dir} 996 routes: 997 - route: parent-app-1.%s 998 - route: parent-app-2.%s 999 env: 1000 FOO: parent-app 1001 BAZ: parent-app 1002 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 1003 }) 1004 }) 1005 1006 It("pushes with parent application taking precedence over child global over parent global", func() { 1007 session := helpers.CF("env", app1Name) 1008 Eventually(session.Out).Should(Say("OK")) 1009 Eventually(session.Out).Should(Say(`"application_uris": \[ 1010 "parent-global-1\.%s", 1011 "parent-global-2\.%s", 1012 "child-global-1\.%s", 1013 "child-global-2\.%s", 1014 "parent-app-1\.%s"\, 1015 "parent-app-2\.%s" 1016 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 1017 Eventually(session.Out).Should(Say(`"disk": 256`)) 1018 Eventually(session.Out).Should(Say(`"mem": 256`)) 1019 Eventually(session.Out).Should(Say(`User-Provided: 1020 BAZ: parent-app 1021 FIZ: child-global 1022 FOO: parent-app 1023 ZOOM: parent-global 1024 1025 `)) 1026 Eventually(session).Should(Exit(0)) 1027 1028 session = helpers.CF("env", app2Name) 1029 Eventually(session.Out).Should(Say("OK")) 1030 Eventually(session.Out).Should(Say(`"application_uris": \[ 1031 "parent-global-1\.%s", 1032 "parent-global-2\.%s", 1033 "child-global-1\.%s", 1034 "child-global-2\.%s", 1035 "parent-app-1\.%s"\, 1036 "parent-app-2\.%s" 1037 \]`, domainName, domainName, domainName, domainName, domainName, domainName)) 1038 Eventually(session.Out).Should(Say(`"disk": 256`)) 1039 Eventually(session.Out).Should(Say(`"mem": 256`)) 1040 Eventually(session.Out).Should(Say(`User-Provided: 1041 BAZ: parent-app 1042 FIZ: child-global 1043 FOO: parent-app 1044 ZOOM: parent-global 1045 1046 `)) 1047 Eventually(session).Should(Exit(0)) 1048 }) 1049 }) 1050 1051 Context("when the child has applications and global properties; and the parent has applications and global properties", func() { 1052 BeforeEach(func() { 1053 pushHelloWorldAppWithManifests([]string{ 1054 fmt.Sprintf(` 1055 --- 1056 inherit: {some-parent} 1057 instances: 2 1058 memory: 128M 1059 path: {some-dir} 1060 routes: 1061 - route: child-global-1.%s 1062 - route: child-global-2.%s 1063 env: 1064 FOO: child-global 1065 FIZ: child-global 1066 applications: 1067 - name: %s 1068 memory: 64M 1069 disk_quota: 64M 1070 path: {some-dir} 1071 routes: 1072 - route: child-app-1.%s 1073 - route: child-app-2.%s 1074 env: 1075 FOO: child-app 1076 BAR: child-app 1077 - name: %s 1078 memory: 64M 1079 disk_quota: 64M 1080 path: {some-dir} 1081 routes: 1082 - route: child-app-1.%s 1083 - route: child-app-2.%s 1084 env: 1085 FOO: child-app 1086 BAR: child-app 1087 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 1088 fmt.Sprintf(` 1089 --- 1090 buildpack: staticfile_buildpack 1091 memory: 256M 1092 disk_quota: 256M 1093 path: {some-dir} 1094 routes: 1095 - route: parent-global-1.%s 1096 - route: parent-global-2.%s 1097 env: 1098 FIZ: parent-global 1099 ZOOM: parent-global 1100 applications: 1101 - name: %s 1102 memory: 256M 1103 disk_quota: 256M 1104 path: {some-dir} 1105 routes: 1106 - route: parent-app-1.%s 1107 - route: parent-app-2.%s 1108 env: 1109 FIZ: parent-app 1110 BAZ: parent-app 1111 - name: %s 1112 memory: 256M 1113 disk_quota: 256M 1114 path: {some-dir} 1115 routes: 1116 - route: parent-app-1.%s 1117 - route: parent-app-2.%s 1118 env: 1119 FIZ: parent-app 1120 BAZ: parent-app 1121 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 1122 }) 1123 }) 1124 1125 It("pushes with parent application taking precedence over child global", func() { 1126 session := helpers.CF("app", app1Name) 1127 Eventually(session.Out).Should(Say("instances.*2")) 1128 1129 session = helpers.CF("env", app1Name) 1130 Eventually(session.Out).Should(Say("OK")) 1131 Eventually(session.Out).Should(Say(`"application_uris": \[ 1132 "parent-global-1\.%s", 1133 "parent-global-2\.%s", 1134 "child-global-1\.%s", 1135 "child-global-2\.%s", 1136 "parent-app-1\.%s"\, 1137 "parent-app-2\.%s", 1138 "child-app-1\.%s"\, 1139 "child-app-2\.%s" 1140 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1141 Eventually(session.Out).Should(Say(`"disk": 64`)) 1142 Eventually(session.Out).Should(Say(`"mem": 64`)) 1143 Eventually(session.Out).Should(Say(`User-Provided: 1144 BAR: child-app 1145 BAZ: parent-app 1146 FIZ: child-global 1147 FOO: child-app 1148 ZOOM: parent-global 1149 1150 `)) 1151 Eventually(session).Should(Exit(0)) 1152 1153 session = helpers.CF("app", app2Name) 1154 Eventually(session.Out).Should(Say("instances.*2")) 1155 1156 session = helpers.CF("env", app2Name) 1157 Eventually(session.Out).Should(Say("OK")) 1158 Eventually(session.Out).Should(Say(`"application_uris": \[ 1159 "parent-global-1\.%s", 1160 "parent-global-2\.%s", 1161 "child-global-1\.%s", 1162 "child-global-2\.%s", 1163 "parent-app-1\.%s"\, 1164 "parent-app-2\.%s", 1165 "child-app-1\.%s"\, 1166 "child-app-2\.%s" 1167 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1168 Eventually(session.Out).Should(Say(`"disk": 64`)) 1169 Eventually(session.Out).Should(Say(`"mem": 64`)) 1170 Eventually(session.Out).Should(Say(`User-Provided: 1171 BAR: child-app 1172 BAZ: parent-app 1173 FIZ: child-global 1174 FOO: child-app 1175 ZOOM: parent-global 1176 1177 `)) 1178 Eventually(session).Should(Exit(0)) 1179 }) 1180 }) 1181 }) 1182 1183 Context("when there are 3 manifests", func() { 1184 Context("when super-parent has globals, parent has globals, and child has app and globals", func() { 1185 BeforeEach(func() { 1186 pushHelloWorldAppWithManifests([]string{ 1187 fmt.Sprintf(` 1188 --- 1189 inherit: {some-parent} 1190 memory: 128M 1191 path: {some-dir} 1192 routes: 1193 - route: child-global-1.%s 1194 - route: child-global-2.%s 1195 env: 1196 FOO: child-global 1197 FIZ: child-global 1198 applications: 1199 - name: %s 1200 disk_quota: 64M 1201 path: {some-dir} 1202 routes: 1203 - route: child-app-1.%s 1204 - route: child-app-2.%s 1205 env: 1206 FOO: child-app 1207 BAR: child-app 1208 - name: %s 1209 disk_quota: 64M 1210 path: {some-dir} 1211 routes: 1212 - route: child-app-1.%s 1213 - route: child-app-2.%s 1214 env: 1215 FOO: child-app 1216 BAR: child-app 1217 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 1218 fmt.Sprintf(` 1219 --- 1220 inherit: {some-parent} 1221 instances: 2 1222 memory: 256M 1223 disk_quota: 256M 1224 path: {some-dir} 1225 routes: 1226 - route: parent-global-1.%s 1227 - route: parent-global-2.%s 1228 env: 1229 ZOOM: parent-global 1230 FIZ: parent-global 1231 `, domainName, domainName), 1232 fmt.Sprintf(` 1233 --- 1234 buildpack: staticfile_buildpack 1235 memory: 512M 1236 disk_quota: 512M 1237 path: {some-dir} 1238 routes: 1239 - route: super-parent-global-1.%s 1240 - route: super-parent-global-2.%s 1241 env: 1242 MOON: super-parent-global 1243 ZOOM: super-parent-global 1244 `, domainName, domainName), 1245 }) 1246 }) 1247 1248 It("pushes with child application taking precedence over child global over parent global over super-parent global", func() { 1249 session := helpers.CF("app", app1Name) 1250 Eventually(session.Out).Should(Say("instances.*2")) 1251 1252 session = helpers.CF("env", app1Name) 1253 Eventually(session.Out).Should(Say("OK")) 1254 Eventually(session.Out).Should(Say(`"application_uris": \[ 1255 "super-parent-global-1\.%s", 1256 "super-parent-global-2\.%s", 1257 "parent-global-1\.%s", 1258 "parent-global-2\.%s", 1259 "child-global-1\.%s", 1260 "child-global-2\.%s", 1261 "child-app-1\.%s"\, 1262 "child-app-2\.%s" 1263 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1264 Eventually(session.Out).Should(Say(`"disk": 64`)) 1265 Eventually(session.Out).Should(Say(`"mem": 128`)) 1266 Eventually(session.Out).Should(Say(`User-Provided: 1267 BAR: child-app 1268 FIZ: child-global 1269 FOO: child-app 1270 MOON: super-parent-global 1271 ZOOM: parent-global 1272 1273 `)) 1274 Eventually(session).Should(Exit(0)) 1275 1276 session = helpers.CF("app", app2Name) 1277 Eventually(session.Out).Should(Say("instances.*2")) 1278 1279 session = helpers.CF("env", app2Name) 1280 Eventually(session.Out).Should(Say("OK")) 1281 Eventually(session.Out).Should(Say(`"application_uris": \[ 1282 "super-parent-global-1\.%s", 1283 "super-parent-global-2\.%s", 1284 "parent-global-1\.%s", 1285 "parent-global-2\.%s", 1286 "child-global-1\.%s", 1287 "child-global-2\.%s", 1288 "child-app-1\.%s"\, 1289 "child-app-2\.%s" 1290 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1291 Eventually(session.Out).Should(Say(`"disk": 64`)) 1292 Eventually(session.Out).Should(Say(`"mem": 128`)) 1293 Eventually(session.Out).Should(Say(`User-Provided: 1294 BAR: child-app 1295 FIZ: child-global 1296 FOO: child-app 1297 MOON: super-parent-global 1298 ZOOM: parent-global 1299 1300 `)) 1301 Eventually(session).Should(Exit(0)) 1302 }) 1303 }) 1304 1305 Context("when super-parent has globals, parent has app and globals, and child has globals", func() { 1306 BeforeEach(func() { 1307 pushHelloWorldAppWithManifests([]string{ 1308 fmt.Sprintf(` 1309 --- 1310 inherit: {some-parent} 1311 memory: 128M 1312 path: {some-dir} 1313 routes: 1314 - route: child-global-1.%s 1315 - route: child-global-2.%s 1316 env: 1317 FOO: child-global 1318 FIZ: child-global 1319 JUNE: child-global 1320 `, domainName, domainName), 1321 fmt.Sprintf(` 1322 --- 1323 inherit: {some-parent} 1324 instances: 2 1325 memory: 256M 1326 disk_quota: 256M 1327 path: {some-dir} 1328 routes: 1329 - route: parent-global-1.%s 1330 - route: parent-global-2.%s 1331 env: 1332 ZOOM: parent-global 1333 FIZ: parent-global 1334 applications: 1335 - name: %s 1336 disk_quota: 64M 1337 path: {some-dir} 1338 routes: 1339 - route: parent-app-1.%s 1340 - route: parent-app-2.%s 1341 env: 1342 FOO: parent-app 1343 BAR: parent-app 1344 - name: %s 1345 disk_quota: 64M 1346 path: {some-dir} 1347 routes: 1348 - route: parent-app-1.%s 1349 - route: parent-app-2.%s 1350 env: 1351 FOO: parent-app 1352 BAR: parent-app 1353 `, domainName, domainName, app1Name, domainName, domainName, app2Name, domainName, domainName), 1354 fmt.Sprintf(` 1355 --- 1356 buildpack: staticfile_buildpack 1357 memory: 512M 1358 disk_quota: 512M 1359 path: {some-dir} 1360 routes: 1361 - route: super-parent-global-1.%s 1362 - route: super-parent-global-2.%s 1363 env: 1364 MOON: super-parent-global 1365 ZOOM: super-parent-global 1366 JUNE: super-parent-global 1367 `, domainName, domainName), 1368 }) 1369 }) 1370 1371 It("pushes with child application taking precedence over child global over parent global over super-parent global", func() { 1372 session := helpers.CF("app", app1Name) 1373 Eventually(session.Out).Should(Say("instances.*2")) 1374 1375 session = helpers.CF("env", app1Name) 1376 Eventually(session.Out).Should(Say("OK")) 1377 Eventually(session.Out).Should(Say(`"application_uris": \[ 1378 "super-parent-global-1\.%s", 1379 "super-parent-global-2\.%s", 1380 "parent-global-1\.%s", 1381 "parent-global-2\.%s", 1382 "child-global-1\.%s", 1383 "child-global-2\.%s", 1384 "parent-app-1\.%s"\, 1385 "parent-app-2\.%s" 1386 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1387 Eventually(session.Out).Should(Say(`"disk": 64`)) 1388 Eventually(session.Out).Should(Say(`"mem": 128`)) 1389 Eventually(session.Out).Should(Say(`User-Provided: 1390 BAR: parent-app 1391 FIZ: child-global 1392 FOO: parent-app 1393 JUNE: child-global 1394 MOON: super-parent-global 1395 ZOOM: parent-global 1396 1397 `)) 1398 Eventually(session).Should(Exit(0)) 1399 1400 session = helpers.CF("app", app1Name) 1401 Eventually(session.Out).Should(Say("instances.*2")) 1402 1403 session = helpers.CF("env", app2Name) 1404 Eventually(session.Out).Should(Say("OK")) 1405 Eventually(session.Out).Should(Say(`"application_uris": \[ 1406 "super-parent-global-1\.%s", 1407 "super-parent-global-2\.%s", 1408 "parent-global-1\.%s", 1409 "parent-global-2\.%s", 1410 "child-global-1\.%s", 1411 "child-global-2\.%s", 1412 "parent-app-1\.%s"\, 1413 "parent-app-2\.%s" 1414 \]`, domainName, domainName, domainName, domainName, domainName, domainName, domainName, domainName)) 1415 Eventually(session.Out).Should(Say(`"disk": 64`)) 1416 Eventually(session.Out).Should(Say(`"mem": 128`)) 1417 Eventually(session.Out).Should(Say(`User-Provided: 1418 BAR: parent-app 1419 FIZ: child-global 1420 FOO: parent-app 1421 JUNE: child-global 1422 MOON: super-parent-global 1423 ZOOM: parent-global 1424 1425 `)) 1426 Eventually(session).Should(Exit(0)) 1427 }) 1428 }) 1429 }) 1430 })