Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions client/swagger/models/model_schedule.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions client/swagger/models/schedule_create_request.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions client/swagger/models/schedule_update_request.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions cmd/deal/schedule/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/data-preservation-programs/singularity/cmd/cliutil"
"github.com/data-preservation-programs/singularity/database"
"github.com/data-preservation-programs/singularity/handler/deal/schedule"
"github.com/data-preservation-programs/singularity/model"
"github.com/data-preservation-programs/singularity/util"
"github.com/urfave/cli/v2"
)
Expand Down Expand Up @@ -58,6 +59,12 @@ var CreateCmd = &cli.Command{
Usage: "Storage Provider ID to send deals to",
Required: true,
},
&cli.StringFlag{
Name: "deal-type",
Category: "Deal Proposal",
Usage: "Deal type: market (legacy f05) or pdp (f41)",
Value: string(model.DealTypeMarket),
},
&cli.StringSliceFlag{
Name: "http-header",
Category: "Boost Only",
Expand Down Expand Up @@ -219,6 +226,7 @@ var CreateCmd = &cli.Command{
request := schedule.CreateRequest{
Preparation: c.String("preparation"),
Provider: c.String("provider"),
DealType: c.String("deal-type"),
HTTPHeaders: c.StringSlice("http-header"),
URLTemplate: c.String("url-template"),
PricePerGBEpoch: c.Float64("price-per-gb-epoch"),
Expand Down
8 changes: 8 additions & 0 deletions cmd/deal/schedule/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ var UpdateCmd = &cli.Command{
Usage: "Whether to propose deals as verified",
Value: true,
},
&cli.StringFlag{
Name: "deal-type",
Category: "Deal Proposal",
Usage: "Deal type: market (legacy f05) or pdp (f41)",
},
&cli.BoolFlag{
Name: "ipni",
Category: "Boost Only",
Expand Down Expand Up @@ -208,6 +213,9 @@ var UpdateCmd = &cli.Command{
if c.IsSet("verified") {
request.Verified = ptr.Of(c.Bool("verified"))
}
if c.IsSet("deal-type") {
request.DealType = ptr.Of(c.String("deal-type"))
}
if c.IsSet("ipni") {
request.IPNI = ptr.Of(c.Bool("ipni"))
}
Expand Down
1 change: 1 addition & 0 deletions docs/en/cli-reference/deal/schedule/create.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/en/cli-reference/deal/schedule/update.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions docs/swagger/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions docs/swagger/swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions docs/swagger/swagger.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions handler/deal/schedule/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package schedule
import (
"context"
"net/url"
"slices"
"strconv"
"strings"
"time"
Expand All @@ -23,6 +24,7 @@ import (
type CreateRequest struct {
Preparation string `json:"preparation" validation:"required"` // Preparation ID or name
Provider string `json:"provider" validation:"required"` // Provider
DealType string `json:"dealType"` // Deal type: market (f05) or pdp (f41)
HTTPHeaders []string `json:"httpHeaders"` // http headers to be passed with the request (i.e. key=value)
URLTemplate string `json:"urlTemplate"` // URL template with PIECE_CID placeholder for boost to fetch the CAR file, i.e. http://127.0.0.1/piece/{PIECE_CID}.car
PricePerGBEpoch float64 `default:"0" json:"pricePerGbEpoch"` // Price in FIL per GiB per epoch
Expand Down Expand Up @@ -167,6 +169,13 @@ func (DefaultHandler) CreateHandler(
if err != nil {
return nil, errors.Join(handlererror.ErrInvalidParameter, errors.Wrapf(err, "provider %s cannot be resolved", request.Provider))
}
dealType := model.DealType(request.DealType)
if dealType == "" {
dealType = model.DealTypeMarket
}
if !slices.Contains(model.DealTypes, dealType) {
return nil, errors.Wrapf(handlererror.ErrInvalidParameter, "invalid deal type %q", request.DealType)
}

headers := make(map[string]string)
for _, header := range request.HTTPHeaders {
Expand Down Expand Up @@ -205,6 +214,7 @@ func (DefaultHandler) CreateHandler(
PricePerDeal: request.PricePerDeal,
ScheduleCronPerpetual: request.ScheduleCronPerpetual,
Force: request.Force,
DealType: dealType,
}

if err := database.DoRetry(ctx, func() error {
Expand Down
18 changes: 18 additions & 0 deletions handler/deal/schedule/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func getMockLotusClient() jsonrpc.RPCClient {
var createRequest = CreateRequest{
Preparation: "1",
Provider: "f01000",
DealType: string(model.DealTypeMarket),
HTTPHeaders: []string{"a=b"},
URLTemplate: "http://127.0.0.1",
PricePerGBEpoch: 0,
Expand Down Expand Up @@ -186,6 +187,22 @@ func TestCreateHandler_NoAssociatedWallet(t *testing.T) {
})
}

func TestCreateHandler_InvalidDealType(t *testing.T) {
testutil.All(t, func(ctx context.Context, t *testing.T, db *gorm.DB) {
err := db.Create(&model.Preparation{
Wallets: []model.Wallet{{
Address: "f01", KeyPath: "/tmp/key", KeyStore: "local",
}},
}).Error
require.NoError(t, err)
badRequest := createRequest
badRequest.DealType = "unknown"
_, err = Default.CreateHandler(ctx, db, getMockLotusClient(), badRequest)
require.ErrorIs(t, err, handlererror.ErrInvalidParameter)
require.ErrorContains(t, err, "invalid deal type")
})
}

func TestCreateHandler_InvalidProvider(t *testing.T) {
testutil.All(t, func(ctx context.Context, t *testing.T, db *gorm.DB) {
err := db.Create(&model.Preparation{
Expand Down Expand Up @@ -260,6 +277,7 @@ func TestCreateHandler_Success(t *testing.T) {
schedule, err := Default.CreateHandler(ctx, db, getMockLotusClient(), createRequest)
require.NoError(t, err)
require.NotNil(t, schedule)
require.Equal(t, model.DealTypeMarket, schedule.DealType)
require.True(t, createRequest.Force)
})
})
Expand Down
9 changes: 9 additions & 0 deletions handler/deal/schedule/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package schedule
import (
"context"
"net/url"
"slices"
"strings"

"github.com/cockroachdb/errors"
Expand Down Expand Up @@ -39,6 +40,7 @@ type UpdateRequest struct {
//nolint:tagliatelle
AllowedPieceCIDs []string `json:"allowedPieceCids"` // Allowed piece CIDs in this schedule
Force *bool `json:"force"` // Force to send out deals regardless of replication restriction
DealType *string `json:"dealType"` // Deal type: market (f05) or pdp (f41)
}

// UpdateHandler modifies an existing schedule record based on the provided update request.
Expand Down Expand Up @@ -235,6 +237,13 @@ func (DefaultHandler) UpdateHandler(
if request.Force != nil {
updates["force"] = *request.Force
}
if request.DealType != nil {
dealType := model.DealType(*request.DealType)
if !slices.Contains(model.DealTypes, dealType) {
return nil, errors.Wrapf(handlererror.ErrInvalidParameter, "invalid deal type %q", *request.DealType)
}
updates["deal_type"] = dealType
}

err = db.Model(&schedule).Updates(updates).Error
if err != nil {
Expand Down
Loading