package host import ( "context" "fmt" "strconv" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostclaim" execlease "github.com/carlosframework/platform/internal/hostexec" ) func (h ClaimRootHTTP) retainedExecutionSource(ctx context.Context, q execlease.ExecutionRequest, actor hostbox.Actor, c *hostclaim.Claim, a execlease.ExecutionAuthority) (execlease.ExecutionAuthority, error) { source := c.Op.Intent["source"] if c.Op.Kind == hostclaim.KindRelocating { source = c.Op.Intent["source_box"] } if (!claimMovesKind(c.Op.Kind) && c.Op.Kind != hostclaim.KindRelocating) || source != actor.Box || c.Op.Intent["source_enrollment"] != actor.Enrollment { return a, execlease.ErrLost } guard := h.Stop.Coordinator.Guard prior, err := guard.Capture(q.Host) if err != nil { return a, err } if prior.Incarnation != q.Incarnation || prior.Stamp >= q.Stamp { return a, execlease.ErrLost } if stamp := c.Op.Journal[hostclaim.JournalSourceStamp]; stamp != "" && stamp != strconv.FormatUint(prior.Stamp, 10) { return a, execlease.ErrLost } view, err := guard.Root.View(ctx, q.Host, prior) if err != nil { return a, err } in := view.Installation if view.Barrier != nil || in.Host != q.Host || in.Incarnation != q.Incarnation || in.Stamp != prior.Stamp || in.Account != a.Account || in.App != a.App || in.Record != c.Holder.Key || in.Box != actor.Box || in.Enrollment != actor.Enrollment || in.Migration == 0 || in.InventoryRevision == 0 { return a, execlease.ErrLost } inventory, revision, err := h.Journals.Inventory.Snapshot(ctx, q.Host, prior) if err != nil { return a, err } if revision != in.InventoryRevision || !inventory.Complete || inventory.Box != actor.Box || inventory.Enrollment != actor.Enrollment { return a, execlease.ErrLost } a.ParticipationOnly = true a.Migration = in.Migration a.Installation = fmt.Sprintf("%s/%d/%s/%s", in.Incarnation, in.Stamp, in.Box, in.Enrollment) return a, nil }