func (db *ETCDDB) UpdateDesiredLRP(logger lager.Logger, processGuid string, update *models.DesiredLRPUpdate) (*models.DesiredLRP, error) { logger.Info("starting") defer logger.Info("complete") var schedulingInfo *models.DesiredLRPSchedulingInfo var err error var beforeDesiredLRP *models.DesiredLRP for i := 0; i < 2; i++ { var index uint64 beforeDesiredLRP, index, err = db.rawDesiredLRPByProcessGuid(logger, processGuid) if err != nil { logger.Error("failed-to-fetch-desired-lrp", err) break } schedulingInfoValue := beforeDesiredLRP.DesiredLRPSchedulingInfo() schedulingInfo = &schedulingInfoValue schedulingInfo.ApplyUpdate(update) err = db.updateDesiredLRPSchedulingInfo(logger, schedulingInfo, index) if err != nil { logger.Error("update-scheduling-info-failed", err) modelErr := models.ConvertError(err) if modelErr != models.ErrResourceConflict { break } // Retry on CAS fail continue } break } if err != nil { return nil, err } return beforeDesiredLRP, nil }
It("request an auction", 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()) Expect(fakeDesiredLRPDB.DesiredLRPByProcessGuidCallCount()).To(Equal(1)) _, processGuid := fakeDesiredLRPDB.DesiredLRPByProcessGuidArgsForCall(0) Expect(processGuid).To(Equal("process-guid")) Expect(fakeAuctioneerClient.RequestLRPAuctionsCallCount()).To(Equal(1)) _, startRequests := fakeAuctioneerClient.RequestLRPAuctionsArgsForCall(0) Expect(startRequests).To(HaveLen(1)) schedulingInfo := desiredLRP.DesiredLRPSchedulingInfo() expectedStartRequest := auctioneer.NewLRPStartRequestFromSchedulingInfo(&schedulingInfo, 1) Expect(startRequests[0]).To(BeEquivalentTo(&expectedStartRequest)) }) }) Context("when the actual lrp should not be restarted (e.g., crashed)", func() { BeforeEach(func() { fakeActualLRPDB.CrashActualLRPReturns(&models.ActualLRPGroup{Instance: &actualLRP}, &models.ActualLRPGroup{Instance: &actualLRP}, false, nil) }) It("does not request an auction", func() { Expect(responseRecorder.Code).To(Equal(http.StatusOK)) response := &models.ActualLRPLifecycleResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred())