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  })