diff --git a/api/api_storage.go b/api/api_storage.go index 137b20136..cebb6d5f0 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -72,6 +72,7 @@ type StorageMiner interface { MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error MarketListDeals(ctx context.Context) ([]storagemarket.StorageDeal, error) + MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) MarketSetAsk(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error MarketGetAsk(ctx context.Context) (*storagemarket.SignedStorageAsk, error) diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 3e2285648..607a54dc6 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -215,6 +215,7 @@ type StorageMinerStruct struct { MarketImportDealData func(context.Context, cid.Cid, string) error `perm:"write"` MarketListDeals func(ctx context.Context) ([]storagemarket.StorageDeal, error) `perm:"read"` + MarketListRetrievalDeals func(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) `perm:"read"` MarketListIncompleteDeals func(ctx context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` MarketSetAsk func(ctx context.Context, price types.BigInt, verifiedPrice types.BigInt, duration abi.ChainEpoch, minPieceSize abi.PaddedPieceSize, maxPieceSize abi.PaddedPieceSize) error `perm:"admin"` MarketGetAsk func(ctx context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` @@ -396,6 +397,7 @@ func (c *FullNodeStruct) ClientMinerQueryOffer(ctx context.Context, miner addres func (c *FullNodeStruct) ClientStartDeal(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) { return c.Internal.ClientStartDeal(ctx, params) } + func (c *FullNodeStruct) ClientGetDealInfo(ctx context.Context, deal cid.Cid) (*api.DealInfo, error) { return c.Internal.ClientGetDealInfo(ctx, deal) } @@ -989,6 +991,10 @@ func (c *StorageMinerStruct) MarketListDeals(ctx context.Context) ([]storagemark return c.Internal.MarketListDeals(ctx) } +func (c *StorageMinerStruct) MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) { + return c.Internal.MarketListRetrievalDeals(ctx) +} + func (c *StorageMinerStruct) MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) { return c.Internal.MarketListIncompleteDeals(ctx) } diff --git a/cmd/lotus-storage-miner/retrieval-deals.go b/cmd/lotus-storage-miner/retrieval-deals.go index 942e30dff..4f146ab63 100644 --- a/cmd/lotus-storage-miner/retrieval-deals.go +++ b/cmd/lotus-storage-miner/retrieval-deals.go @@ -2,9 +2,13 @@ package main import ( "fmt" + "os" + "text/tabwriter" + + "github.com/filecoin-project/go-fil-markets/retrievalmarket" + "github.com/urfave/cli/v2" lcli "github.com/filecoin-project/lotus/cli" - "github.com/urfave/cli/v2" ) var retrievalDealsCmd = &cli.Command{ @@ -12,6 +16,7 @@ var retrievalDealsCmd = &cli.Command{ Usage: "Manage retrieval deals and related configuration", Subcommands: []*cli.Command{ retrievalDealSelectionCmd, + retrievalDealsListCmd, }, } @@ -111,3 +116,35 @@ var retrievalDealSelectionRejectCmd = &cli.Command{ return nil }, } + +var retrievalDealsListCmd = &cli.Command{ + Name: "list", + Usage: "List all active retrieval deals for this miner", + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + defer closer() + + deals, err := api.MarketListRetrievalDeals(lcli.DaemonContext(cctx)) + if err != nil { + return err + } + + w := tabwriter.NewWriter(os.Stdout, 2, 4, 2, ' ', 0) + + _, _ = fmt.Fprintf(w, "Receiver\tPayload\tState\n") + + for _, deal := range deals { + _, _ = fmt.Fprint(w, "%v", deal) + receiver := deal.Receiver.String() + pc := deal.PayloadCID.String() + payload := "..." + pc[len(pc)-8:] + status := retrievalmarket.DealStatuses[deal.Status] + _, _ = fmt.Fprintf(w, "%s\t%s\t%s\n", receiver, payload, status) + } + + return w.Flush() + }, +} diff --git a/node/impl/storminer.go b/node/impl/storminer.go index a59123314..362a5988f 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -287,6 +287,17 @@ func (sm *StorageMinerAPI) MarketListDeals(ctx context.Context) ([]storagemarket return sm.StorageProvider.ListDeals(ctx) } +func (sm *StorageMinerAPI) MarketListRetrievalDeals(ctx context.Context) ([]retrievalmarket.ProviderDealState, error) { + var out []retrievalmarket.ProviderDealState + deals := sm.RetrievalProvider.ListDeals() + + for _, deal := range deals { + out = append(out, deal) + } + + return out, nil +} + func (sm *StorageMinerAPI) MarketListIncompleteDeals(ctx context.Context) ([]storagemarket.MinerDeal, error) { return sm.StorageProvider.ListLocalDeals() } @@ -317,6 +328,10 @@ func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]storagemarket.Stora return sm.StorageProvider.ListDeals(ctx) } +func (sm *StorageMinerAPI) RetrievalDealsList(ctx context.Context) (map[retrievalmarket.ProviderDealIdentifier]retrievalmarket.ProviderDealState, error) { + return sm.RetrievalProvider.ListDeals(), nil +} + func (sm *StorageMinerAPI) DealsConsiderOnlineStorageDeals(ctx context.Context) (bool, error) { return sm.ConsiderOnlineStorageDealsConfigFunc() }