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 }
fakeActualLRPDB.ActualLRPGroupByProcessGuidAndIndexReturns(actualLRPGroup, nil) fakeActualLRPDB.UnclaimActualLRPReturns(&models.ActualLRPGroup{Instance: actual}, &models.ActualLRPGroup{Instance: afterActual}, nil) }) JustBeforeEach(func() { if request == nil { request = newTestRequest(requestBody) } handler.EvacuateRunningActualLRP(responseRecorder, request) Expect(responseRecorder.Code).To(Equal(http.StatusOK)) }) Context("when the actual lrp group exists", func() { Context("when the actual lrp instance does not exist", func() { BeforeEach(func() { actualLRPGroup.Instance = nil }) It("removes the evacuating lrp 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()) Expect(fakeEvacuationDB.RemoveEvacuatingActualLRPCallCount()).To(Equal(1)) _, actualLRPKey, actualLRPInstanceKey := fakeEvacuationDB.RemoveEvacuatingActualLRPArgsForCall(0) Expect(*actualLRPKey).To(Equal(actual.ActualLRPKey)) Expect(*actualLRPInstanceKey).To(Equal(actual.ActualLRPInstanceKey)) })