Context("when the running message contains a start_command", func() { It("runs the app on the executor, registers routes, and shows that they are running via the tps", func() { // desire the app resp, err := desireApp(guid, `["route-1", "route-2"]`, 2) Expect(err).NotTo(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusAccepted)) // check lrp instance statuses Eventually(helpers.RunningLRPInstancesPoller(componentMaker.Addresses.TPSListener, guid)).Should(HaveLen(2)) //both routes should be routable Eventually(helpers.ResponseCodeFromHostPoller(componentMaker.Addresses.Router, "route-1")).Should(Equal(http.StatusOK)) Eventually(helpers.ResponseCodeFromHostPoller(componentMaker.Addresses.Router, "route-2")).Should(Equal(http.StatusOK)) //a given route should route to all three running instances poller := helpers.HelloWorldInstancePoller(componentMaker.Addresses.Router, "route-1") Eventually(poller).Should(Equal([]string{"0", "1"})) }) }) Context("when the start message does not include a start_command", func() { It("runs the app, registers a route, and shows running via tps", func() { // desire the app resp, err := desireApp(guid, `["route-1"]`, 1) Expect(err).NotTo(HaveOccurred()) Expect(resp.StatusCode).To(Equal(http.StatusAccepted)) Eventually(helpers.RunningLRPInstancesPoller(componentMaker.Addresses.TPSListener, guid)).Should(HaveLen(1)) Eventually(helpers.ResponseCodeFromHostPoller(componentMaker.Addresses.Router, "route-1")).Should(Equal(http.StatusOK)) //a given route should route to the running instance
})) archive_helper.CreateZipArchive( filepath.Join(fileServerStaticDir, "lrp.zip"), fixtures.HelloWorldIndexLRP(), ) appId = helpers.GenerateGuid() processGuid = helpers.GenerateGuid() runningLRPsPoller = func() []receptor.ActualLRPResponse { return helpers.ActiveActualLRPs(receptorClient, processGuid) } helloWorldInstancePoller = helpers.HelloWorldInstancePoller(componentMaker.Addresses.Router, helpers.DefaultHost) }) AfterEach(func() { By("Stopping all the processes") helpers.StopProcesses(auctioneer, rep, converger, runtime) }) Describe("Executor fault tolerance", func() { BeforeEach(func() { auctioneer = ginkgomon.Invoke(componentMaker.Auctioneer()) }) Context("when an rep, and converger are running", func() { BeforeEach(func() { rep = ginkgomon.Invoke(componentMaker.Rep())
}) JustBeforeEach(func() { err := receptorClient.CreateDesiredLRP(lrp) Expect(err).NotTo(HaveOccurred()) }) It("eventually runs", func() { Eventually(func() []receptor.ActualLRPResponse { lrps, err := receptorClient.ActualLRPsByProcessGuid(processGuid) Expect(err).NotTo(HaveOccurred()) return lrps }).Should(HaveLen(1)) Eventually(helpers.HelloWorldInstancePoller(componentMaker.Addresses.Router, helpers.DefaultHost)).Should(ConsistOf([]string{"0"})) }) Context("when it's unhealthy for longer than its start timeout", func() { BeforeEach(func() { lrp.StartTimeout = 5 lrp.Monitor = &models.RunAction{ User: "******", Path: "false", } }) It("eventually marks the LRP as crashed", func() { Eventually(func() []receptor.ActualLRPResponse { lrps, err := receptorClient.ActualLRPsByProcessGuid(processGuid)