github.com/loafoe/cli@v7.1.0+incompatible/integration/v6/push/interpolate_manifest_test.go (about)

     1  package push
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"code.cloudfoundry.org/cli/integration/helpers"
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  	. "github.com/onsi/gomega/gbytes"
    13  	. "github.com/onsi/gomega/gexec"
    14  )
    15  
    16  var _ = Describe("Push with manifest variable interpolation", func() {
    17  	var (
    18  		appName   string
    19  		instances int
    20  
    21  		manifestPath string
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		appName = helpers.NewAppName()
    26  		instances = 4
    27  
    28  		tmp, err := ioutil.TempFile("", "manifest-interpolation")
    29  		Expect(err).ToNot(HaveOccurred())
    30  		Expect(tmp.Close()).ToNot(HaveOccurred())
    31  		manifestPath = tmp.Name()
    32  
    33  		helpers.WriteManifest(manifestPath, map[string]interface{}{
    34  			"applications": []map[string]interface{}{
    35  				{
    36  					"name":      "((vars1))",
    37  					"instances": "((vars2))",
    38  				},
    39  			},
    40  		})
    41  	})
    42  
    43  	AfterEach(func() {
    44  		Expect(os.RemoveAll(manifestPath)).ToNot(HaveOccurred())
    45  	})
    46  
    47  	When("only `--vars-file` flags are provided", func() {
    48  		var (
    49  			tmpDir string
    50  
    51  			firstVarsFilePath  string
    52  			secondVarsFilePath string
    53  		)
    54  
    55  		BeforeEach(func() {
    56  			var err error
    57  			tmpDir, err = ioutil.TempDir("", "vars-files")
    58  			Expect(err).ToNot(HaveOccurred())
    59  		})
    60  
    61  		AfterEach(func() {
    62  			Expect(os.RemoveAll(tmpDir)).ToNot(HaveOccurred())
    63  		})
    64  
    65  		When("there are no duplicate variables", func() {
    66  			BeforeEach(func() {
    67  				firstVarsFilePath = filepath.Join(tmpDir, "vars1")
    68  				vars1 := fmt.Sprintf("vars1: %s", appName)
    69  				err := ioutil.WriteFile(firstVarsFilePath, []byte(vars1), 0666)
    70  				Expect(err).ToNot(HaveOccurred())
    71  
    72  				secondVarsFilePath = filepath.Join(tmpDir, "vars2")
    73  				vars2 := fmt.Sprintf("vars2: %d", instances)
    74  				err = ioutil.WriteFile(secondVarsFilePath, []byte(vars2), 0666)
    75  				Expect(err).ToNot(HaveOccurred())
    76  			})
    77  
    78  			It("pushes the app with the interpolated values in the manifest", func() {
    79  				helpers.WithHelloWorldApp(func(dir string) {
    80  
    81  					session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "-f", manifestPath, "--vars-file", firstVarsFilePath, "--vars-file", secondVarsFilePath)
    82  					Eventually(session).Should(Say(`Getting app info\.\.\.`))
    83  					Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`))
    84  					Eventually(session).Should(Say(`\+\s+name:\s+%s`, appName))
    85  					Eventually(session).Should(Say(`\+\s+instances:\s+%d`, instances))
    86  					Eventually(session).Should(Say(`Mapping routes\.\.\.`))
    87  					Eventually(session).Should(Say(`Waiting for app to start\.\.\.`))
    88  					Eventually(session).Should(Say(`requested state:\s+started`))
    89  					Eventually(session).Should(Exit(0))
    90  				})
    91  				session := helpers.CF("app", appName)
    92  				Eventually(session).Should(Exit(0))
    93  			})
    94  		})
    95  
    96  		When("a variable in manifest is not found in var_file", func() {
    97  			BeforeEach(func() {
    98  				firstVarsFilePath = filepath.Join(tmpDir, "vars1")
    99  				vars1 := fmt.Sprintf("vars1: %s", appName)
   100  				err := ioutil.WriteFile(firstVarsFilePath, []byte(vars1), 0666)
   101  				Expect(err).ToNot(HaveOccurred())
   102  
   103  				helpers.WriteManifest(manifestPath, map[string]interface{}{
   104  					"applications": []map[string]interface{}{
   105  						{
   106  							"name": "((not_vars))",
   107  						},
   108  					},
   109  				})
   110  			})
   111  
   112  			It("fails with error saying that variable is missing", func() {
   113  				helpers.WithHelloWorldApp(func(dir string) {
   114  					session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "-f", manifestPath, "--vars-file", firstVarsFilePath)
   115  					Eventually(session.Err).Should(Say("Expected to find variables: not_vars"))
   116  					Eventually(session).Should(Exit(1))
   117  				})
   118  			})
   119  		})
   120  
   121  		When("there are duplicate variables", func() {
   122  			BeforeEach(func() {
   123  				firstVarsFilePath = filepath.Join(tmpDir, "vars1")
   124  				vars1 := fmt.Sprintf("vars1: %s\nvars2: %d", "some-garbage-appname", instances)
   125  				err := ioutil.WriteFile(firstVarsFilePath, []byte(vars1), 0666)
   126  				Expect(err).ToNot(HaveOccurred())
   127  
   128  				secondVarsFilePath = filepath.Join(tmpDir, "vars2")
   129  				vars2 := fmt.Sprintf("vars1: %s", appName)
   130  				err = ioutil.WriteFile(secondVarsFilePath, []byte(vars2), 0666)
   131  				Expect(err).ToNot(HaveOccurred())
   132  			})
   133  
   134  			It("pushes the app using the values from the latter vars-file interpolated in the manifest", func() {
   135  				helpers.WithHelloWorldApp(func(dir string) {
   136  					session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "-f", manifestPath, "--vars-file", firstVarsFilePath, "--vars-file", secondVarsFilePath)
   137  					Eventually(session).Should(Say(`Getting app info\.\.\.`))
   138  					Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`))
   139  					Eventually(session).Should(Say(`\+\s+name:\s+%s`, appName))
   140  					Eventually(session).Should(Say(`\+\s+instances:\s+%d`, instances))
   141  					Eventually(session).Should(Say(`Mapping routes\.\.\.`))
   142  					Eventually(session).Should(Say(`Waiting for app to start\.\.\.`))
   143  					Eventually(session).Should(Say(`requested state:\s+started`))
   144  					Eventually(session).Should(Exit(0))
   145  				})
   146  				session := helpers.CF("app", appName)
   147  				Eventually(session).Should(Exit(0))
   148  			})
   149  		})
   150  	})
   151  
   152  	When("only `--var` flag vars are provided", func() {
   153  		It("replaces the variables with the provided values", func() {
   154  			helpers.WithHelloWorldApp(func(dir string) {
   155  				session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "-f", manifestPath, "--var", fmt.Sprintf("vars1=%s", appName), "--var", fmt.Sprintf("vars2=%d", instances))
   156  				Eventually(session).Should(Say(`Getting app info\.\.\.`))
   157  				Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`))
   158  				Eventually(session).Should(Say(`\+\s+name:\s+%s`, appName))
   159  				Eventually(session).Should(Say(`\+\s+instances:\s+%d`, instances))
   160  				Eventually(session).Should(Say(`Mapping routes\.\.\.`))
   161  				Eventually(session).Should(Say(`Waiting for app to start\.\.\.`))
   162  				Eventually(session).Should(Say(`requested state:\s+started`))
   163  				Eventually(session).Should(Exit(0))
   164  			})
   165  			session := helpers.CF("app", appName)
   166  			Eventually(session).Should(Exit(0))
   167  		})
   168  	})
   169  
   170  	When("`--vars-file` and `--var` flag vars are provided", func() {
   171  		var varsFilePath string
   172  		BeforeEach(func() {
   173  			tmp, err := ioutil.TempFile("", "varsfile-interpolation")
   174  			Expect(err).ToNot(HaveOccurred())
   175  			Expect(tmp.Close()).ToNot(HaveOccurred())
   176  
   177  			varsFilePath = tmp.Name()
   178  			vars1 := fmt.Sprintf("vars1: %s\nvars2: %d", "some-garbage-appname", instances)
   179  			Expect(ioutil.WriteFile(varsFilePath, []byte(vars1), 0666)).ToNot(HaveOccurred())
   180  		})
   181  
   182  		AfterEach(func() {
   183  			Expect(os.RemoveAll(varsFilePath)).ToNot(HaveOccurred())
   184  		})
   185  
   186  		It("overwrites the vars-file with the provided var key value pair", func() {
   187  			helpers.WithHelloWorldApp(func(dir string) {
   188  				session := helpers.CustomCF(helpers.CFEnv{WorkingDirectory: dir}, PushCommandName, "-f", manifestPath, "--var", fmt.Sprintf("vars1=%s", appName), "--vars-file", varsFilePath)
   189  				Eventually(session).Should(Say(`Getting app info\.\.\.`))
   190  				Eventually(session).Should(Say(`Creating app with these attributes\.\.\.`))
   191  				Eventually(session).Should(Say(`\+\s+name:\s+%s`, appName))
   192  				Eventually(session).Should(Say(`\+\s+instances:\s+%d`, instances))
   193  				Eventually(session).Should(Say(`Mapping routes\.\.\.`))
   194  				Eventually(session).Should(Say(`Waiting for app to start\.\.\.`))
   195  				Eventually(session).Should(Say(`requested state:\s+started`))
   196  				Eventually(session).Should(Exit(0))
   197  			})
   198  			session := helpers.CF("app", appName)
   199  			Eventually(session).Should(Exit(0))
   200  		})
   201  	})
   202  })