}) Context("when crashing the actual lrp in the DB succeeds", func() { var desiredLRP *models.DesiredLRP BeforeEach(func() { desiredLRP = &models.DesiredLRP{ ProcessGuid: "process-guid", Domain: "some-domain", RootFs: "some-stack", MemoryMb: 128, DiskMb: 512, } fakeDesiredLRPDB.DesiredLRPByProcessGuidReturns(desiredLRP, nil) fakeActualLRPDB.CrashActualLRPReturns(&models.ActualLRPGroup{Instance: &actualLRP}, &models.ActualLRPGroup{Instance: &afterActualLRP}, true, nil) }) It("response with no error", func() { Expect(responseRecorder.Code).To(Equal(http.StatusOK)) response := &models.ActualLRPLifecycleResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred()) Expect(response.Error).To(BeNil()) }) It("crashes the actual lrp by process guid and index", func() { Expect(fakeActualLRPDB.CrashActualLRPCallCount()).To(Equal(1)) _, actualKey, actualInstanceKey, actualErrorMessage := fakeActualLRPDB.CrashActualLRPArgsForCall(0) Expect(*actualKey).To(Equal(key))
It("logs the error and continues", func() { response := models.EvacuationResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred()) Expect(response.KeepContainer).To(BeFalse()) Expect(response.Error).To(BeNil()) Expect(logger).To(gbytes.Say("failed-removing-evacuating-actual-lrp")) }) }) Context("when crashing the actual lrp fails", func() { Context("when the DB returns an unrecoverable error", func() { BeforeEach(func() { fakeActualLRPDB.CrashActualLRPReturns(nil, nil, false, models.NewUnrecoverableError(nil)) }) It("logs and writes to the exit channel", func() { Eventually(logger).Should(gbytes.Say("unrecoverable-error")) Eventually(exitCh).Should(Receive()) }) }) Context("because the error does not exist", func() { BeforeEach(func() { fakeActualLRPDB.CrashActualLRPReturns(nil, nil, false, models.ErrResourceNotFound) }) It("does not return an error or keep the container", func() { response := models.EvacuationResponse{}