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