package host import ( "context" "slices" "github.com/carlosframework/platform/internal/hostclaim" execlease "github.com/carlosframework/platform/internal/hostexec" "github.com/carlosframework/platform/internal/hostguard" ) func (a ClaimAssembly) completedRetirementDischarge(ctx context.Context, o hostclaim.Observed, binding execlease.Binding) (bool, error) { if o.Claim == nil || o.Claim.Holder == nil || binding.Host != o.Host || binding.Incarnation != o.Claim.Holder.Incarnation || binding.Op == "" || binding.Op != o.Claim.Op.ID || (o.Claim.Op.Kind != hostclaim.KindDeleting && o.Claim.Op.Kind != hostclaim.KindParking) { return false, nil } h := o.Claim.Holder captured := hostguard.Captured{Incarnation: h.Incarnation, Stamp: h.Stamp} var view hostguard.FenceView var err error if a.Guard.Root != nil { view, err = a.Guard.Root.View(ctx, o.Host, captured) } else if a.Guard.FenceView != nil { view, err = a.Guard.FenceView(ctx, o.Host, captured) } else { return false, nil } if err != nil { return true, err } if !slices.Contains(view.Retired, captured) { return false, nil } if view.Barrier != nil || view.Installation.Host != o.Host || view.Installation.Incarnation != h.Incarnation || view.Installation.Box != binding.Box || view.Installation.Enrollment != binding.Enrollment { return true, ErrClaimStopIdentity } for _, receipt := range view.Receipts { r := receipt.Target if r.Host == binding.Host && r.Incarnation == binding.Incarnation && r.Stamp == h.Stamp && r.Session == h.Session && r.Op == binding.Op && r.ObligationID != "" && r.Box == binding.Box && r.Enrollment == binding.Enrollment { return true, verifyRetirementReceipt(ctx, receipt) } } return true, ErrClaimStopReceipt }