package host import ( "context" "crypto/ed25519" "time" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostops" "github.com/carlosframework/platform/internal/release" ) // WithClaimRetirementEvidence completes Plan6b's real provider bundle. It does // not manufacture the local stop inventory, kernel verifier, leases or live view. func WithClaimRetirementEvidence(ctx context.Context, providers ClaimProviders, authority hostops.ProductionAuthority, box, enrollment string, private ed25519.PrivateKey) (ClaimProviders, error) { if providers.Stop == nil || providers.Selector == nil || providers.Wake == nil { return ClaimProviders{}, ErrClaimStopUnavailable } if err := ConfigureStopEvidence(ctx, providers.Stop, authority.Directory, box, enrollment, private); err != nil { return ClaimProviders{}, err } var regional hostbox.RegionalWorker switch existing := providers.Regional.(type) { case hostbox.RegionalWorker: regional = existing case *hostbox.RegionalWorker: if existing == nil { return ClaimProviders{}, ErrClaimStopUnavailable } regional = *existing default: return ClaimProviders{}, ErrClaimStopUnavailable } if regional.Evidence == nil { return ClaimProviders{}, ErrClaimStopUnavailable } worker, err := hostops.NewClaimRegionalWorker(regional.Regional, regional.Enrollment, authority, regional.Evidence) if err != nil { return ClaimProviders{}, err } providers.Regional = worker return providers, nil } func (owners ClaimOwnerBindings) claimEvidenceCoordinator(ctx context.Context, store release.Store, mode string, actor hostbox.Actor) (*ClaimStopCoordinator, error) { a := owners.RetirementAuthority controlBucket := actor.ControlBucket if controlBucket == "" { return nil, ErrClaimStopUnavailable } if store == nil || a == nil || a.Store != store || a.Directory.Store != store || a.Now == nil || len(a.Directory.PublicKey) != ed25519.PublicKeySize || a.Directory.Bucket != controlBucket { return nil, ErrClaimStopUnavailable } if mode != "instance-control" && ((mode != "agent" && mode != "adopt") || len(owners.EvidenceKey) != 0) { return nil, ErrClaimStopUnavailable } stop := &ClaimStopCoordinator{Evidence: store, Now: time.Now} if mode == "instance-control" { var err error if owners.cleanupEnrollment != nil { if !hostbox.SameBinding(owners.cleanupEnrollment.actor, actor) { return nil, ErrClaimStopIdentity } err = owners.cleanupEnrollment.configureSigner(ctx, stop, owners.EvidenceKey) } else { err = ConfigureStopEvidence(ctx, stop, a.Directory, actor.Box, actor.Enrollment, owners.EvidenceKey) } if err != nil { return nil, err } } return stop, nil }