Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CLI refactor #410

Merged
merged 51 commits into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
32a60ab
Add Cobra
zivkovicmilos Feb 2, 2022
ba6a67d
Start the initial CLI refactor, define base outputs
zivkovicmilos Feb 3, 2022
f1c2fdf
Add support for the txpool add command
zivkovicmilos Feb 3, 2022
d7e5439
Add support for the txpool status command
zivkovicmilos Feb 4, 2022
66bc027
Add support for the txpool subscribe command
zivkovicmilos Feb 4, 2022
7e50d9f
Add support for the status command
zivkovicmilos Feb 4, 2022
10605cd
Add support for the secrets init command
zivkovicmilos Feb 5, 2022
66178b9
Add support for secrets generate
zivkovicmilos Feb 5, 2022
f06692f
Minor cleanup
zivkovicmilos Feb 5, 2022
0127e97
Add support for the peers status command
zivkovicmilos Feb 5, 2022
238bc1d
Add support for peers list
zivkovicmilos Feb 5, 2022
7d888c3
Add support for the peers add command
zivkovicmilos Feb 5, 2022
2d271e9
Add support for the monitor command
zivkovicmilos Feb 6, 2022
563c827
Minor monitor command code cleanup
zivkovicmilos Feb 6, 2022
1588ed2
Add support for the loadbot command
zivkovicmilos Feb 6, 2022
7d0b59b
Add support for ibft status command
zivkovicmilos Feb 6, 2022
e8ac8d6
Add support for ibft propose command
zivkovicmilos Feb 6, 2022
5701ef6
Add support for ibft candidates command
zivkovicmilos Feb 6, 2022
bc85948
Add support for the backup command
zivkovicmilos Feb 6, 2022
b37fe3e
Register GRPC address for the backup command
zivkovicmilos Feb 6, 2022
7eb3518
Add support for the genesis command
zivkovicmilos Feb 6, 2022
8b6a369
Add support for the server command; cleanup pending
zivkovicmilos Feb 7, 2022
f961967
Cleanup & add support for the dev command
zivkovicmilos Feb 7, 2022
564539f
Adios, mitchellh/cli
zivkovicmilos Feb 7, 2022
bb44a07
Fix minor linting errors in the command package
zivkovicmilos Feb 7, 2022
8d0e0ea
Resolve remaining linting errors
zivkovicmilos Feb 7, 2022
3089081
Fix faulty checks
zivkovicmilos Feb 7, 2022
21813cb
Resolve failing tests
zivkovicmilos Feb 8, 2022
77dc801
Cleanup server command
zivkovicmilos Feb 8, 2022
e3f9f0f
Merge branch 'develop' into feature/cli-refactor
zivkovicmilos Feb 8, 2022
a549ce9
Fix rogue GenesisPath renames
zivkovicmilos Feb 8, 2022
69281ec
Fix rogue DNSAddr renames
zivkovicmilos Feb 8, 2022
c8b130e
Merge branch 'develop' into feature/cli-refactor
zivkovicmilos Feb 10, 2022
1854505
Merge branch 'develop' into feature/cli-refactor
zivkovicmilos Feb 14, 2022
865136e
Refactor the comamnd grouping
zivkovicmilos Feb 14, 2022
d942a00
Add additional explanation
zivkovicmilos Feb 14, 2022
94c2647
Merge branch 'develop' into feature/cli-refactor
zivkovicmilos Mar 1, 2022
bd621ea
Resolve linting errors
zivkovicmilos Mar 1, 2022
0475ab1
Add command name to switch helper
zivkovicmilos Mar 1, 2022
6db5543
Merge branch 'develop' into feature/cli-refactor
zivkovicmilos Mar 2, 2022
7a50ac2
Resolve linting errors
zivkovicmilos Mar 2, 2022
0cdaefd
Set the from field in the ibft switch command
zivkovicmilos Mar 2, 2022
7eaf9d8
Add support for backwards compatibility of certain flags
zivkovicmilos Mar 2, 2022
788abbc
Fix rogue SecretsConfigPath rename
zivkovicmilos Mar 3, 2022
62c7e31
Fix rogue SecretsConfigPath rename pt.2
zivkovicmilos Mar 3, 2022
e36d4c0
Rename package import to use camel case
zivkovicmilos Mar 3, 2022
f1405b1
Fix rogue ShouldSeal comments
zivkovicmilos Mar 3, 2022
35422d4
Move out the DNS regex code blocks to the networking package
zivkovicmilos Mar 3, 2022
eecd37b
Move out the output logic to the command package
zivkovicmilos Mar 3, 2022
2364242
Simplify append in test server
zivkovicmilos Mar 3, 2022
61e0d02
Drop the protocol name in the default json address
zivkovicmilos Mar 3, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
188 changes: 45 additions & 143 deletions command/backup/backup.go
Original file line number Diff line number Diff line change
@@ -1,168 +1,70 @@
package backup

import (
"bytes"
"errors"
"fmt"
"github.com/0xPolygon/polygon-edge/command"
"github.com/spf13/cobra"

"github.com/0xPolygon/polygon-edge/archive"
"github.com/0xPolygon/polygon-edge/command/helper"
"github.com/0xPolygon/polygon-edge/types"
"github.com/hashicorp/go-hclog"
)

type BackupCommand struct {
helper.Base
Formatter *helper.FormatterFlag
GRPC *helper.GRPCFlag
}

// DefineFlags defines the command flags
func (c *BackupCommand) DefineFlags() {
c.Base.DefineFlags(c.Formatter, c.GRPC)

c.FlagMap["out"] = helper.FlagDescriptor{
Description: "The path of backup data to save",
Arguments: []string{
"OUT",
},
ArgumentsOptional: false,
func GetCommand() *cobra.Command {
backupCmd := &cobra.Command{
Use: "backup",
Short: "Create blockchain backup file by fetching blockchain data from the running node",
PreRunE: runPreRun,
Run: runCommand,
}

c.FlagMap["from"] = helper.FlagDescriptor{
Description: "Beginning height of chain in backup",
Arguments: []string{
"FROM",
},
ArgumentsOptional: true,
}

c.FlagMap["to"] = helper.FlagDescriptor{
Description: "End height of the chain in backup",
Arguments: []string{
"TO",
},
ArgumentsOptional: true,
}
}

// GetHelperText returns a simple description of the command
func (c *BackupCommand) GetHelperText() string {
return "Create blockchain backup data by fetching from running node"
}

func (c *BackupCommand) GetBaseCommand() string {
return "backup"
}
helper.RegisterGRPCAddressFlag(backupCmd)

// Help implements the cli.Command interface
func (c *BackupCommand) Help() string {
c.DefineFlags()
setFlags(backupCmd)
setRequiredFlags(backupCmd)

return helper.GenerateHelp(c.Synopsis(), helper.GenerateUsage(c.GetBaseCommand(), c.FlagMap), c.FlagMap)
return backupCmd
}

// Synopsis implements the cli.Command interface
func (c *BackupCommand) Synopsis() string {
return c.GetHelperText()
}

// Run implements the cli.Command interface
func (c *BackupCommand) Run(args []string) int {
flags := c.Base.NewFlagSet(c.GetBaseCommand(), c.Formatter, c.GRPC)

var out, rawFrom, rawTo string

flags.StringVar(&out, "out", "", "")
flags.StringVar(&rawFrom, "from", "0", "")
flags.StringVar(&rawTo, "to", "", "")

if err := flags.Parse(args); err != nil {
c.Formatter.OutputError(err)

return 1
}

var (
from uint64
to *uint64
err error
func setFlags(cmd *cobra.Command) {
cmd.Flags().StringVar(
&params.out,
outFlag,
"",
"the export path for the backup",
)

if out == "" {
c.Formatter.OutputError(errors.New("the path of backup file is required"))

return 1
}

if from, err = types.ParseUint64orHex(&rawFrom); err != nil {
c.Formatter.OutputError(fmt.Errorf("failed to decode from: %w", err))

return 1
}

if rawTo != "" {
var parsedTo uint64

if parsedTo, err = types.ParseUint64orHex(&rawTo); err != nil {
c.Formatter.OutputError(fmt.Errorf("failed to decode to: %w", err))

return 1
} else if from > parsedTo {
c.Formatter.OutputError(errors.New("to must be greater than or equal to from"))

return 1
}

to = &parsedTo
}

conn, err := c.GRPC.Conn()
if err != nil {
c.Formatter.OutputError(err)

return 1
}

logger := hclog.New(&hclog.LoggerOptions{
Name: "backup",
Level: hclog.LevelFromString("INFO"),
})

// resFrom and resTo represents the range of blocks that can be included in the file
resFrom, resTo, err := archive.CreateBackup(conn, logger, from, to, out)
if err != nil {
c.Formatter.OutputError(err)
cmd.Flags().StringVar(
&params.fromRaw,
fromFlag,
"0",
"the beginning height of the chain in backup",
)

return 1
}
cmd.Flags().StringVar(
&params.toRaw,
toFlag,
"",
"the end height of the chain in backup",
)
}

res := &BackupResult{
From: resFrom,
To: resTo,
Out: out,
func setRequiredFlags(cmd *cobra.Command) {
for _, requiredFlag := range params.getRequiredFlags() {
_ = cmd.MarkFlagRequired(requiredFlag)
}
c.Formatter.OutputResult(res)

return 0
}
Kourin1996 marked this conversation as resolved.
Show resolved Hide resolved

type BackupResult struct {
From uint64 `json:"from"`
To uint64 `json:"to"`
Out string `json:"out"`
func runPreRun(_ *cobra.Command, _ []string) error {
return params.validateFlags()
}

func (r *BackupResult) Output() string {
var buffer bytes.Buffer
func runCommand(cmd *cobra.Command, _ []string) {
outputter := command.InitializeOutputter(cmd)
defer outputter.WriteOutput()

buffer.WriteString("\n[BACKUP]\n")
buffer.WriteString("Exported backup file successfully:\n")
buffer.WriteString(helper.FormatKV([]string{
fmt.Sprintf("File|%s", r.Out),
fmt.Sprintf("From|%d", r.From),
fmt.Sprintf("To|%d", r.To),
}))
if err := params.createBackup(helper.GetGRPCAddress(cmd)); err != nil {
outputter.SetError(err)

return
}

return buffer.String()
outputter.SetCommandResult(params.getResult())
}
105 changes: 105 additions & 0 deletions command/backup/params.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package backup

import (
"errors"
"github.com/0xPolygon/polygon-edge/archive"
"github.com/0xPolygon/polygon-edge/command"
"github.com/0xPolygon/polygon-edge/command/helper"
"github.com/0xPolygon/polygon-edge/types"
"github.com/hashicorp/go-hclog"
)

const (
outFlag = "out"
fromFlag = "from"
toFlag = "to"
)

var (
params = &backupParams{}
)
Kourin1996 marked this conversation as resolved.
Show resolved Hide resolved

var (
errDecodeRange = errors.New("unable to decode range value")
errInvalidRange = errors.New(`invalid "to" value; must be >= "from"`)
)

type backupParams struct {
out string

fromRaw string
toRaw string

from uint64
to *uint64

resFrom uint64
resTo uint64
}

func (p *backupParams) validateFlags() error {
var parseErr error

if p.from, parseErr = types.ParseUint64orHex(&p.fromRaw); parseErr != nil {
return errDecodeRange
}

if p.toRaw != "" {
var parsedTo uint64

if parsedTo, parseErr = types.ParseUint64orHex(&p.toRaw); parseErr != nil {
return errDecodeRange
}

if p.from > parsedTo {
return errInvalidRange
}

p.to = &parsedTo
}

return nil
}

func (p *backupParams) getRequiredFlags() []string {
return []string{
outFlag,
}
}

func (p *backupParams) createBackup(grpcAddress string) error {
connection, err := helper.GetGRPCConnection(
grpcAddress,
)
if err != nil {
return err
}

// resFrom and resTo represents the range of blocks that can be included in the file
resFrom, resTo, err := archive.CreateBackup(
connection,
hclog.New(&hclog.LoggerOptions{
Name: "backup",
Level: hclog.LevelFromString("INFO"),
}),
p.from,
p.to,
p.out,
)
if err != nil {
return err
}

p.resFrom = resFrom
p.resTo = resTo

return nil
}

func (p *backupParams) getResult() command.CommandResult {
return &BackupResult{
From: p.resFrom,
To: p.resTo,
Out: p.out,
}
}
27 changes: 27 additions & 0 deletions command/backup/result.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package backup

import (
"bytes"
"fmt"
"github.com/0xPolygon/polygon-edge/command/helper"
)

type BackupResult struct {
From uint64 `json:"from"`
To uint64 `json:"to"`
Out string `json:"out"`
}

func (r *BackupResult) GetOutput() string {
var buffer bytes.Buffer

buffer.WriteString("\n[BACKUP]\n")
buffer.WriteString("Exported backup file successfully:\n")
buffer.WriteString(helper.FormatKV([]string{
fmt.Sprintf("File|%s", r.Out),
fmt.Sprintf("From|%d", r.From),
fmt.Sprintf("To|%d", r.To),
}))

return buffer.String()
}
32 changes: 32 additions & 0 deletions command/cli_output.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package command

import (
"fmt"
"os"
)

type CLIOutput struct {
commonOutputFormatter
}

func newCLIOutput() *CLIOutput {
return &CLIOutput{}
}

func (cli *CLIOutput) WriteOutput() {
if cli.errorOutput != nil {
_, _ = fmt.Fprintln(os.Stderr, cli.getErrorOutput())

return
}

_, _ = fmt.Fprintln(os.Stdout, cli.getCommandOutput())
}

func (cli *CLIOutput) getErrorOutput() string {
return cli.errorOutput.Error()
}

func (cli *CLIOutput) getCommandOutput() string {
return cli.commandOutput.GetOutput()
}
8 changes: 8 additions & 0 deletions command/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package command

const (
ConsensusFlag = "consensus"
NoDiscoverFlag = "no-discover"
BootnodeFlag = "bootnode"
LogLevelFlag = "log-level"
)