package host import ( "context" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostclaim" execlease "github.com/carlosframework/platform/internal/hostexec" "github.com/carlosframework/platform/internal/instancectl" "time" ) func (h *ClaimLaunchRoot) execPermit(ctx context.Context, q hostbox.RoleLaunchRequest) (instancectl.ClaimExecPermit, error) { r := q.Reservation o, err := h.Guard.Claims.Read(ctx, r.Target.Host) if err != nil { return instancectl.ClaimExecPermit{}, err } if o.Absent || o.Claim == nil { return instancectl.ClaimExecPermit{}, hostbox.ErrChanged } _, boot, err := h.Clock.Now() if err != nil { return instancectl.ClaimExecPermit{}, err } // Serving also gets a finite start window. An operation's lease may only // shorten it; a later renewal cannot extend this reservation's permit. until := boot + int64(30*time.Second) state, err := h.readExecution(ctx, o.Claim) if err != nil { return instancectl.ClaimExecPermit{}, err } if o.Claim.Op.Kind != hostclaim.KindServing { if state.SafeUntil < until { until = state.SafeUntil } } if boot >= until { return instancectl.ClaimExecPermit{}, execlease.ErrLost } return instancectl.ClaimExecPermit{Reservation: r.ID, Inputs: r.Inputs, BootID: r.Target.BootID, SafeUntil: until, Containment: 1}, nil }