package host import ( "context" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/hostguard" "github.com/carlosframework/platform/internal/release" "github.com/carlosframework/platform/internal/rootstate" ) func recoverRootInventoryStartup(ctx context.Context, store release.Store, r ClaimRuntimeResources, owners ClaimOwnerBindings, actor hostbox.Actor, journals *hostbox.JournalService, launches *hostbox.LaunchJournal) error { l, required, err := openRootMigrationParticipation() if l.State != nil { defer l.State.Close() } if err != nil || !required { return err } c, err := l.RecoveryCensus() if err != nil { return err } state, err := openRootMigrationState() if err != nil { return err } defer state.Close() if _, err := readRootMigrationState(state, l.State, rootMigrationIdentity{Deployment: actor.ControlBucket, Box: actor.Box, Enrollment: actor.Enrollment, Generation: c.Migration}); err != nil { return err } fences, err := openClaimRootAuthority() if err != nil { return err } defer fences.Close() authority := hostguard.NewRootAuthority(fences) pending, err := authority.PendingInstallations() if err != nil || len(pending) == 0 { return err } roots := map[string]string{"data": r.DataDir, "opt": r.OptDir, "units": r.UnitsDir} guard := hostguard.Guard{Root: authority, DataDir: r.DataDir, Claims: hostguard.StoreReader{Store: store}} census := &hostbox.EmptyInstallationCensus{Inventory: journals.Inventory, Registry: r.Registry, Launches: launches, Box: actor.Box, Enrollment: actor.Enrollment, DirectoryRevision: actor.Binding, Roots: roots, SharedPaths: claimGlobalSharedPaths(r)} h := ClaimRootHTTP{history: productionCreationHistory, inventoryIdentity: rootstate.ObjectIdentity, Journals: journals, Launches: launches, Roots: roots, // Fresh authority (R2): the startup actor above pins only the census. InventoryActor: owners.Identity.Verify, startupBinding: actor.Binding, Reconcile: hostbox.ReconcileAdapter{Registry: r.Registry, Inventory: journals.Inventory, Census: census, Box: actor.Box, Enrollment: actor.Enrollment}, Stop: ClaimStopHTTP{Coordinator: ClaimStopCoordinator{Guard: guard, Evidence: store}}} if err := h.recoverRootInventory(ctx); err != nil { return err } pending, err = authority.PendingInstallations() if err != nil { return err } if len(pending) != 0 { return errRootMigrationBusy } return nil }