Expect(deletedLRPGuid).To(Equal(processGuid)) Expect(deletedLRPIndex).To(Equal(index)) Expect(deletedLRPInstanceKey).To(Equal(&actualLRPGroup.Instance.ActualLRPInstanceKey)) }) It("emits a removed event to the hub", func() { Eventually(actualHub.EmitCallCount).Should(Equal(1)) event := actualHub.EmitArgsForCall(0) removedEvent, ok := event.(*models.ActualLRPRemovedEvent) Expect(ok).To(BeTrue()) Expect(removedEvent.ActualLrpGroup).To(Equal(&models.ActualLRPGroup{Instance: &actualLRP})) }) Context("when removing the actual lrp fails", func() { BeforeEach(func() { fakeActualLRPDB.RemoveActualLRPReturns(errors.New("boom!")) }) It("retries removing up to RetireActualLRPRetryAttempts times", func() { Expect(response.Error.Message).To(Equal("boom!")) Expect(fakeActualLRPDB.RemoveActualLRPCallCount()).To(Equal(5)) Expect(fakeActualLRPDB.ActualLRPGroupByProcessGuidAndIndexCallCount()).To(Equal(5)) }) It("does not emit a change event to the hub", func() { Consistently(actualHub.EmitCallCount).Should(Equal(0)) }) }) }) Context("when the LRP is crashed", func() {
Expect(response.KeepContainer).To(BeFalse()) Expect(response.Error).To(Equal(models.ErrActualLRPCannotBeRemoved)) }) It("emits only the removal of the evacuating to the hub", func() { Eventually(actualHub.EmitCallCount).Should(Equal(1)) event := actualHub.EmitArgsForCall(0) removeEvent, ok := event.(*models.ActualLRPRemovedEvent) Expect(ok).To(BeTrue()) Expect(removeEvent.ActualLrpGroup).To(Equal(&models.ActualLRPGroup{Evacuating: actual})) }) }) Context("when the DB returns an unrecoverable error", func() { BeforeEach(func() { fakeActualLRPDB.RemoveActualLRPReturns(models.NewUnrecoverableError(nil)) }) It("logs and writes to the exit channel", func() { Eventually(logger).Should(gbytes.Say("unrecoverable-error")) Eventually(exitCh).Should(Receive()) }) }) Context("when removing the actual lrp fails", func() { BeforeEach(func() { fakeActualLRPDB.RemoveActualLRPReturns(errors.New("boom!")) }) It("returns an error but does not keep the container", func() { response := models.EvacuationResponse{}