func itValidatesPresenceOfTheLRPKey(lrp *models.ActualLRP) { Context("when the lrp key is set", func() { BeforeEach(func() { lrp.ActualLRPKey = models.NewActualLRPKey("some-guid", 1, "domain") }) It("validate does not return an error", func() { Expect(lrp.Validate()).NotTo(HaveOccurred()) }) }) Context("when the lrp key is not set", func() { BeforeEach(func() { lrp.ActualLRPKey = models.ActualLRPKey{} }) It("validate returns an error", func() { err := lrp.Validate() Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("process_guid")) }) }) }
func (db *SQLDB) EvacuateActualLRP( logger lager.Logger, lrpKey *models.ActualLRPKey, instanceKey *models.ActualLRPInstanceKey, netInfo *models.ActualLRPNetInfo, ttl uint64, ) (*models.ActualLRPGroup, error) { logger = logger.Session("evacuate-lrp", lager.Data{"lrp_key": lrpKey, "instance_key": instanceKey, "net_info": netInfo}) logger.Debug("starting") defer logger.Debug("complete") var actualLRP *models.ActualLRP err := db.transact(logger, func(logger lager.Logger, tx *sql.Tx) error { var err error processGuid := lrpKey.ProcessGuid index := lrpKey.Index actualLRP, err = db.fetchActualLRPForUpdate(logger, processGuid, index, true, tx) if err == models.ErrResourceNotFound { logger.Debug("creating-evacuating-lrp") actualLRP, err = db.createEvacuatingActualLRP(logger, lrpKey, instanceKey, netInfo, ttl, tx) return err } if err != nil { logger.Error("failed-locking-lrp", err) return err } if actualLRP.ActualLRPKey.Equal(lrpKey) && actualLRP.ActualLRPInstanceKey.Equal(instanceKey) && reflect.DeepEqual(actualLRP.ActualLRPNetInfo, *netInfo) { logger.Debug("evacuating-lrp-already-exists") return nil } now := db.clock.Now().UnixNano() actualLRP.ModificationTag.Increment() actualLRP.ActualLRPKey = *lrpKey actualLRP.ActualLRPInstanceKey = *instanceKey actualLRP.Since = now actualLRP.ActualLRPNetInfo = *netInfo netInfoData, err := db.serializeModel(logger, netInfo) if err != nil { logger.Error("failed-serializing-net-info", err) return err } _, err = db.update(logger, tx, "actual_lrps", SQLAttributes{ "domain": actualLRP.Domain, "instance_guid": actualLRP.InstanceGuid, "cell_id": actualLRP.CellId, "net_info": netInfoData, "state": actualLRP.State, "since": actualLRP.Since, "modification_tag_index": actualLRP.ModificationTag.Index, }, "process_guid = ? AND instance_index = ? AND evacuating = ?", actualLRP.ProcessGuid, actualLRP.Index, true, ) if err != nil { logger.Error("failed-update-evacuating-lrp", err) return db.convertSQLError(err) } return nil }) return &models.ActualLRPGroup{Evacuating: actualLRP}, err }