github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/integration/v6/isolated/start_command_test.go (about) 1 package isolated 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("start command", func() { 17 Describe("help", func() { 18 When("--help flag is set", func() { 19 It("Displays command usage to output", func() { 20 session := helpers.CF("start", "--help") 21 Eventually(session).Should(Say("NAME:")) 22 Eventually(session).Should(Say("start - Start an app")) 23 Eventually(session).Should(Say("USAGE:")) 24 Eventually(session).Should(Say("cf start APP_NAME")) 25 Eventually(session).Should(Say("ALIAS:")) 26 Eventually(session).Should(Say("st")) 27 Eventually(session).Should(Say("ENVIRONMENT:")) 28 Eventually(session).Should(Say(`CF_STAGING_TIMEOUT=15\s+Max wait time for buildpack staging, in minutes`)) 29 Eventually(session).Should(Say(`CF_STARTUP_TIMEOUT=5\s+Max wait time for app instance startup, in minutes`)) 30 Eventually(session).Should(Say("SEE ALSO:")) 31 Eventually(session).Should(Say("apps, logs, restart, run-task, scale, ssh, stop")) 32 Eventually(session).Should(Exit(0)) 33 }) 34 }) 35 }) 36 37 When("the environment is not setup correctly", func() { 38 It("fails with the appropriate errors", func() { 39 helpers.CheckEnvironmentTargetedCorrectly(true, true, ReadOnlyOrg, "start", "app-name") 40 }) 41 }) 42 43 When("the environment is set up correctly", func() { 44 var ( 45 orgName string 46 spaceName string 47 ) 48 49 BeforeEach(func() { 50 orgName = helpers.NewOrgName() 51 spaceName = helpers.NewSpaceName() 52 53 helpers.SetupCF(orgName, spaceName) 54 }) 55 56 AfterEach(func() { 57 helpers.QuickDeleteOrg(orgName) 58 }) 59 60 When("the app does not exist", func() { 61 It("tells the user that the start is not found and exits 1", func() { 62 appName := helpers.PrefixedRandomName("app") 63 session := helpers.CF("start", appName) 64 65 Eventually(session).Should(Say("FAILED")) 66 Eventually(session.Err).Should(Say("App '%s' not found", appName)) 67 Eventually(session).Should(Exit(1)) 68 }) 69 }) 70 71 When("the app does exist", func() { 72 var ( 73 domainName string 74 appName string 75 ) 76 77 When("the app is started", func() { 78 BeforeEach(func() { 79 appName = helpers.PrefixedRandomName("app") 80 domainName = helpers.DefaultSharedDomain() 81 helpers.WithHelloWorldApp(func(appDir string) { 82 Eventually(helpers.CF("push", appName, "-p", appDir, "-b", "staticfile_buildpack")).Should(Exit(0)) 83 }) 84 }) 85 86 It("only displays the app already started message", func() { 87 userName, _ := helpers.GetCredentials() 88 session := helpers.CF("start", appName) 89 Eventually(session).Should(Say("Starting app %s in org %s / space %s as %s...", appName, orgName, spaceName, userName)) 90 Eventually(session).Should(Say("App %s is already started", appName)) 91 Eventually(session).Should(Exit(0)) 92 }) 93 }) 94 95 When("the app is stopped", func() { 96 When("the app has been staged", func() { 97 BeforeEach(func() { 98 appName = helpers.PrefixedRandomName("app") 99 domainName = helpers.DefaultSharedDomain() 100 helpers.WithHelloWorldApp(func(appDir string) { 101 manifestContents := []byte(fmt.Sprintf(` 102 --- 103 applications: 104 - name: %s 105 memory: 128M 106 instances: 2 107 disk_quota: 128M 108 routes: 109 - route: %s.%s 110 `, appName, appName, domainName)) 111 manifestPath := filepath.Join(appDir, "manifest.yml") 112 err := ioutil.WriteFile(manifestPath, manifestContents, 0666) 113 Expect(err).ToNot(HaveOccurred()) 114 115 Eventually(helpers.CF("push", appName, "-p", appDir, "-f", manifestPath, "-b", "staticfile_buildpack")).Should(Exit(0)) 116 }) 117 Eventually(helpers.CF("stop", appName)).Should(Exit(0)) 118 }) 119 120 Describe("multiprocess display", func() { 121 It("uses the multiprocess display", func() { 122 userName, _ := helpers.GetCredentials() 123 124 session := helpers.CF("start", appName) 125 126 Eventually(session).Should(Say(`Starting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) 127 128 Eventually(session).Should(Say(`name:\s+%s`, appName)) 129 Eventually(session).Should(Say(`requested state:\s+started`)) 130 Eventually(session).Should(Say(`routes:\s+%s\.%s`, appName, domainName)) 131 Eventually(session).Should(Say(`last uploaded:\s+%s`, helpers.ReadableDateTimeRegex)) 132 Eventually(session).Should(Say(`stack:\s+cflinuxfs`)) 133 Eventually(session).Should(Say(`buildpacks:\s+staticfile`)) 134 Eventually(session).Should(Say(`type:\s+web`)) 135 Eventually(session).Should(Say(`instances:\s+\d/2`)) 136 Eventually(session).Should(Say(`memory usage:\s+128M`)) 137 Eventually(session).Should(Say(`\s+state\s+since\s+cpu\s+memory\s+disk`)) 138 Eventually(session).Should(Say(`#0\s+(starting|running)\s+\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z`)) 139 140 Eventually(session).Should(Exit(0)) 141 }) 142 }) 143 }) 144 145 When("the app has *not* yet been staged", func() { 146 When("the app does *not* stage properly because the app was not detected by any buildpacks", func() { 147 BeforeEach(func() { 148 appName = helpers.PrefixedRandomName("app") 149 domainName = helpers.DefaultSharedDomain() 150 helpers.WithHelloWorldApp(func(appDir string) { 151 err := os.Remove(filepath.Join(appDir, "Staticfile")) 152 Expect(err).ToNot(HaveOccurred()) 153 Eventually(helpers.CF("push", appName, "-p", appDir, "--no-start")).Should(Exit(0)) 154 }) 155 }) 156 157 It("fails and displays the staging failure message", func() { 158 userName, _ := helpers.GetCredentials() 159 session := helpers.CF("start", appName) 160 Eventually(session).Should(Say(`Starting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) 161 162 // The staticfile_buildback does compile an index.html file. However, it requires a "Staticfile" during buildpack detection. 163 Eventually(session.Err).Should(Say("Error staging application: An app was not successfully detected by any available buildpack")) 164 Eventually(session.Err).Should(Say(`TIP: Use 'cf buildpacks' to see a list of supported buildpacks.`)) 165 Eventually(session).Should(Exit(1)) 166 }) 167 }) 168 169 When("the app stages properly", func() { 170 When("the app does *not* start properly", func() { 171 BeforeEach(func() { 172 appName = helpers.PrefixedRandomName("app") 173 helpers.WithHelloWorldApp(func(appDir string) { 174 Eventually(helpers.CF("push", appName, "-p", appDir, "--no-start", "-b", "staticfile_buildpack", "-c", "gibberish")).Should(Exit(0)) 175 }) 176 }) 177 178 It("fails and displays the start failure message", func() { 179 userName, _ := helpers.GetCredentials() 180 session := helpers.CF("start", appName) 181 Eventually(session).Should(Say(`Starting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) 182 183 Eventually(session).Should(Say(`Staging app and tracing logs\.\.\.`)) 184 185 Eventually(session.Err).Should(Say("Start unsuccessful")) 186 Eventually(session.Err).Should(Say("TIP: use 'cf logs .* --recent' for more information")) 187 Eventually(session).Should(Exit(1)) 188 }) 189 }) 190 191 When("the app starts properly", func() { 192 BeforeEach(func() { 193 appName = helpers.PrefixedRandomName("app") 194 domainName = helpers.DefaultSharedDomain() 195 helpers.WithHelloWorldApp(func(appDir string) { 196 manifestContents := []byte(fmt.Sprintf(` 197 --- 198 applications: 199 - name: %s 200 memory: 128M 201 instances: 2 202 disk_quota: 128M 203 routes: 204 - route: %s.%s 205 `, appName, appName, domainName)) 206 manifestPath := filepath.Join(appDir, "manifest.yml") 207 err := ioutil.WriteFile(manifestPath, manifestContents, 0666) 208 Expect(err).ToNot(HaveOccurred()) 209 210 Eventually(helpers.CF("push", appName, "-p", appDir, "-f", manifestPath, "-b", "staticfile_buildpack", "--no-start")).Should(Exit(0)) 211 }) 212 }) 213 214 Describe("Multiprocess display", func() { 215 It("uses the multiprocess display", func() { 216 userName, _ := helpers.GetCredentials() 217 218 session := helpers.CF("start", appName) 219 220 Eventually(session).Should(Say(`Starting app %s in org %s / space %s as %s\.\.\.`, appName, orgName, spaceName, userName)) 221 222 Eventually(session).Should(Say(`name:\s+%s`, appName)) 223 Eventually(session).Should(Say(`requested state:\s+started`)) 224 Eventually(session).Should(Say(`routes:\s+%s\.%s`, appName, domainName)) 225 Eventually(session).Should(Say(`last uploaded:\s+%s`, helpers.ReadableDateTimeRegex)) 226 Eventually(session).Should(Say(`stack:\s+cflinuxfs`)) 227 Eventually(session).Should(Say(`buildpacks:\s+staticfile`)) 228 Eventually(session).Should(Say(`type:\s+web`)) 229 Eventually(session).Should(Say(`instances:\s+\d/2`)) 230 Eventually(session).Should(Say(`memory usage:\s+128M`)) 231 Eventually(session).Should(Say(`\s+state\s+since\s+cpu\s+memory\s+disk`)) 232 Eventually(session).Should(Say(`#0\s+(starting|running)\s+\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z`)) 233 234 Eventually(session).Should(Exit(0)) 235 }) 236 237 }) 238 239 When("using isolation segments", func() { 240 BeforeEach(func() { 241 Eventually(helpers.CF("create-isolation-segment", RealIsolationSegment)).Should(Exit(0)) 242 Eventually(helpers.CF("enable-org-isolation", orgName, RealIsolationSegment)).Should(Exit(0)) 243 Eventually(helpers.CF("set-space-isolation-segment", spaceName, RealIsolationSegment)).Should(Exit(0)) 244 appName = helpers.PrefixedRandomName("app") 245 helpers.WithHelloWorldApp(func(appDir string) { 246 Eventually(helpers.CF("push", appName, "-p", appDir, "--no-start")).Should(Exit(0)) 247 }) 248 }) 249 250 It("displays the app logs and information with instances table", func() { 251 session := helpers.CF("start", appName) 252 253 Eventually(session).Should(Say(`isolation segment:\s+%s`, RealIsolationSegment)) 254 }) 255 }) 256 }) 257 }) 258 }) 259 }) 260 }) 261 }) 262 })