package host import ( "context" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/regionname" "github.com/carlosframework/platform/internal/release" ) // ClaimOriginProof implements moves' Proven contract. HomeRegion must come from // the verified roster/placement binding, and Claims is the deployment store. // Admission.NewGeneration is deliberately not evidence of admission. type ClaimOriginProof struct { Claims release.Store HomeRegion, Region string } func (p ClaimOriginProof) Proven(ctx context.Context, o hostclaim.Observed, _ hostclaim.Admission, generations []string) (map[string]bool, error) { if o.Absent || o.Claim == nil || o.Claim.Holder == nil || p.Region == "" { return nil, hostclaim.ErrWrongState } h := o.Claim.Holder regions := []string{p.Region} if p.HomeRegion != "" && regionname.PlacementRegion(p.HomeRegion) == p.HomeRegion && regionname.SameRegion(p.HomeRegion, p.Region, regionname.HomeRegion) { if p.Region == regionname.HomeRegion { regions = append(regions, p.HomeRegion) } else { regions = append(regions, regionname.HomeRegion) } } set := make([]hostclaim.OriginTuple, 0, len(regions)*len(generations)) for _, generation := range generations { for _, region := range regions { set = append(set, hostclaim.OriginTuple{Incarnation: h.Incarnation, Location: h.Location, Region: region, Generation: generation}) } } proven, err := hostclaim.AdmittedOrigins(ctx, p.Claims, o, set) if err != nil { return nil, err } result := make(map[string]bool, len(generations)) for _, tuple := range set { result[tuple.Generation] = result[tuple.Generation] || proven[tuple] } return result, nil }