func (db *ETCDDB) rawActualLRPGroupByProcessGuidAndIndex(logger lager.Logger, processGuid string, index int32) (*models.ActualLRPGroup, error) { node, err := db.fetchRecursiveRaw(logger, ActualLRPIndexDir(processGuid, index)) if err != nil { return nil, err } group := models.ActualLRPGroup{} for _, instanceNode := range node.Nodes { var lrp models.ActualLRP deserializeErr := db.deserializeModel(logger, instanceNode, &lrp) if deserializeErr != nil { logger.Error("failed-parsing-actual-lrp", deserializeErr, lager.Data{"key": instanceNode.Key}) return nil, deserializeErr } if isInstanceActualLRPNode(instanceNode) { group.Instance = &lrp } if isEvacuatingActualLRPNode(instanceNode) { group.Evacuating = &lrp } } if group.Evacuating == nil && group.Instance == nil { return nil, models.ErrResourceNotFound } return &group, nil }
for i := 0; i < actualHub.EmitCallCount(); i++ { switch event := actualHub.EmitArgsForCall(i).(type) { case *models.ActualLRPCreatedEvent: Expect(event.ActualLrpGroup).To(Equal(&models.ActualLRPGroup{Evacuating: afterActual})) default: Fail(fmt.Sprintf("unexpected event %#v", event)) } } }) Context("when there's an existing evacuating on another cell", func() { BeforeEach(func() { evacuatingLRP := model_helpers.NewValidActualLRP("the-guid", 1) evacuatingLRP.CellId = "some-other-cell" actualLRPGroup.Evacuating = evacuatingLRP }) It("does not error and does not keep the container", func() { response := models.EvacuationResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred()) Expect(response.KeepContainer).To(BeFalse()) Expect(response.Error).To(BeNil()) }) }) Context("when evacuating the actual lrp fails", func() { BeforeEach(func() { fakeEvacuationDB.EvacuateActualLRPReturns(nil, errors.New("didnt work")) })