JustBeforeEach(func() { request := newTestRequest(requestBody) handler.DesiredLRPByProcessGuid(logger, responseRecorder, request) }) Context("when reading desired lrp from DB succeeds", func() { var desiredLRP *models.DesiredLRP BeforeEach(func() { desiredLRP = &models.DesiredLRP{ProcessGuid: processGuid} fakeDesiredLRPDB.DesiredLRPByProcessGuidReturns(desiredLRP, nil) }) It("fetches desired lrp by process guid", func() { Expect(fakeDesiredLRPDB.DesiredLRPByProcessGuidCallCount()).To(Equal(1)) _, actualProcessGuid := fakeDesiredLRPDB.DesiredLRPByProcessGuidArgsForCall(0) Expect(actualProcessGuid).To(Equal(processGuid)) Expect(responseRecorder.Code).To(Equal(http.StatusOK)) response := models.DesiredLRPResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred()) Expect(response.Error).To(BeNil()) Expect(response.DesiredLrp).To(Equal(desiredLRP)) }) }) Context("when the DB returns no desired lrp", func() { BeforeEach(func() { fakeDesiredLRPDB.DesiredLRPByProcessGuidReturns(nil, models.ErrResourceNotFound)
}) It("unclaims the actual lrp instance and requests an auction", 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(fakeActualLRPDB.UnclaimActualLRPCallCount()).To(Equal(1)) _, lrpKey := fakeActualLRPDB.UnclaimActualLRPArgsForCall(0) Expect(lrpKey.ProcessGuid).To(Equal("process-guid")) Expect(lrpKey.Index).To(BeEquivalentTo(1)) Expect(fakeDesiredLRPDB.DesiredLRPByProcessGuidCallCount()).To(Equal(1)) _, guid := fakeDesiredLRPDB.DesiredLRPByProcessGuidArgsForCall(0) Expect(guid).To(Equal("process-guid")) expectedStartRequest := auctioneer.NewLRPStartRequestFromModel(desiredLRP, int(actual.Index)) Expect(fakeAuctioneerClient.RequestLRPAuctionsCallCount()).To(Equal(1)) _, startRequests := fakeAuctioneerClient.RequestLRPAuctionsArgsForCall(0) Expect(startRequests).To(Equal([]*auctioneer.LRPStartRequest{&expectedStartRequest})) }) Context("when the DB returns an unrecoverable error", func() { BeforeEach(func() { fakeEvacuationDB.RemoveEvacuatingActualLRPReturns(models.NewUnrecoverableError(nil)) }) It("logs and writes to the exit channel", func() { Eventually(logger).Should(gbytes.Say("unrecoverable-error"))