Skip to content
Merged
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
94 changes: 94 additions & 0 deletions cmd/lncli/cmd_import_mission_control.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package main

import (
"context"
"errors"
"fmt"
"strconv"

"github.com/lightningnetwork/lnd/lnrpc/routerrpc"
"github.com/lightningnetwork/lnd/routing/route"
"github.com/urfave/cli"
)

const argsStr = "[source node] [dest node] [unix ts seconds] [amount in msat]"

var importMissionControlCommand = cli.Command{
Name: "importmc",
Category: "Payments",
Usage: "Import a result to the internal mission control state.",
ArgsUsage: fmt.Sprintf("importmc %v", argsStr),
Action: actionDecorator(importMissionControl),
Flags: []cli.Flag{
cli.BoolFlag{
Name: "failure",
Usage: "whether the routing history entry was a failure",
},
},
}

func importMissionControl(ctx *cli.Context) error {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is very nice, maybe could also add csv import? (Otherwise MC may change if node is busy).

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you by MC might change?

I was picturing the main use case for bulk-import to be the rpc? Since you can pass the request from QueryMissionControl directly in, adding a csv is an extra step. Could add an option to feed the json output in like we do for SendToRoute if we want to do bulk import via cli?

conn := getClientConn(ctx, false)
defer conn.Close()

if ctx.NArg() != 4 {
return fmt.Errorf("please provide args: %v", argsStr)
}

args := ctx.Args()

sourceNode, err := route.NewVertexFromStr(args[0])
if err != nil {
return fmt.Errorf("please provide valid source node: %v", err)
}

destNode, err := route.NewVertexFromStr(args[1])
if err != nil {
return fmt.Errorf("please provide valid dest node: %v", err)
}

ts, err := strconv.ParseInt(args[2], 10, 64)
if err != nil {
return fmt.Errorf("please provide unix timestamp "+
"in seconds: %v", err)
}

if ts <= 0 {
return errors.New("please provide positive timestamp")
}

amt, err := strconv.ParseInt(args[3], 10, 64)
if err != nil {
return fmt.Errorf("please provide amount in msat: %v", err)
}

if amt <= 0 {
return errors.New("amount must be >0")
}

client := routerrpc.NewRouterClient(conn)

importResult := &routerrpc.PairHistory{
NodeFrom: sourceNode[:],
NodeTo: destNode[:],
History: &routerrpc.PairData{},
}

if ctx.IsSet("failure") {
importResult.History.FailAmtMsat = amt
importResult.History.FailTime = ts
} else {
importResult.History.SuccessAmtMsat = amt
importResult.History.SuccessTime = ts
}

req := &routerrpc.XImportMissionControlRequest{
Pairs: []*routerrpc.PairHistory{
importResult,
},
}

rpcCtx := context.Background()
_, err = client.XImportMissionControl(rpcCtx, req)
return err
}
1 change: 1 addition & 0 deletions cmd/lncli/routerrpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "github.com/urfave/cli"
func routerCommands() []cli.Command {
return []cli.Command{
queryMissionControlCommand,
importMissionControlCommand,
queryProbCommand,
resetMissionControlCommand,
buildRouteCommand,
Expand Down
3 changes: 3 additions & 0 deletions lnrpc/rest-annotations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,9 @@ http:
body: "*"
- selector: routerrpc.Router.QueryProbability
get: "/v2/router/mc/probability/{from_node}/{to_node}/{amt_msat}"
- selector: routerrpc.Router.XImportMissionControl
post: "/v2/router/ximporthistory"
body: "*"
- selector: routerrpc.Router.BuildRoute
post: "/v2/router/route"
body: "*"
Expand Down
Loading