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