package hostexec import ( "github.com/carlosframework/platform/internal/hostclaim" "slices" ) func PreinstallationParticipant(c *hostclaim.Claim, box, enrollment string) error { if c == nil || c.Holder == nil || c.Validate() != nil || box == "" || enrollment == "" || slices.Contains(c.Lost, box) { return ErrInactive } if c.Op.Kind == hostclaim.KindServing { if c.Op.Exec != box || (c.Holder.WriterBox != box && (c.Holder.WriterBox != "" || c.Holder.Session != 0)) { return ErrInactive } return nil } if c.Op.Kind == hostclaim.KindCreating { if c.Op.Phase != "" || c.Op.ID == "" || c.Op.Exec != "" || c.Holder.Stamp != 0 || c.Holder.Session != 0 || c.Holder.WriterBox != "" || len(c.Op.Participants) != 1 || c.Op.Participants[0] != box || c.Op.Intent["selected_executor"] != box || c.Op.Intent["executor_enrollment"] != enrollment { return ErrInactive } return nil } if !slices.Contains(c.Op.Participants, box) || c.Op.ID == "" || c.Holder.Family != "instance" { return ErrInactive } target := c.Op.Intent["target"] if c.Op.Kind == hostclaim.KindRelocating { target = c.Op.Intent["target_box"] } if target != box || (c.Op.Intent["target_enrollment"] != "" && c.Op.Intent["target_enrollment"] != enrollment) { return ErrInactive } switch c.Op.Kind { case hostclaim.KindRelocating: switch c.Op.Phase { case hostclaim.PhaseStarting, hostclaim.PhaseReleasing, hostclaim.PhasePinning: return nil case hostclaim.PhaseInstalling, hostclaim.PhaseInstalled: if c.Op.Exec == box && c.Op.Journal["local_install"] == "" { return nil } } case hostclaim.KindMoving: if c.Op.Phase == hostclaim.PhaseMoving || c.Op.Phase == hostclaim.PhaseSealed { return nil } case hostclaim.KindLanding: if c.Op.Phase == "checking" && c.Op.Exec == box { return nil } } return ErrInactive }