feat!: use gov v1 proposals in upgrade cli (#14880)

This commit is contained in:
Julien Robert
2023-02-02 13:55:48 +01:00
committed by GitHub
parent f926631d04
commit 5ec3d2b875
14 changed files with 174 additions and 190 deletions
+4 -19
View File
@@ -3,33 +3,18 @@ package cli
import (
"cosmossdk.io/x/upgrade/types"
"github.com/spf13/pflag"
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
)
func parseArgsToContent(fs *pflag.FlagSet, name string) (gov.Content, error) {
title, err := fs.GetString(cli.FlagTitle)
if err != nil {
return nil, err
}
description, err := fs.GetString(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
if err != nil {
return nil, err
}
func parsePlan(fs *pflag.FlagSet, name string) (types.Plan, error) {
height, err := fs.GetInt64(FlagUpgradeHeight)
if err != nil {
return nil, err
return types.Plan{}, err
}
info, err := fs.GetString(FlagUpgradeInfo)
if err != nil {
return nil, err
return types.Plan{}, err
}
plan := types.Plan{Name: name, Height: height, Info: info}
content := types.NewSoftwareUpgradeProposal(title, description, plan)
return content, nil
return types.Plan{Name: name, Height: height, Info: info}, nil
}
+7 -18
View File
@@ -6,16 +6,12 @@ import (
"cosmossdk.io/x/upgrade/types"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
)
func TestParseArgsToContent(t *testing.T) {
fs := NewCmdSubmitLegacyUpgradeProposal().Flags()
func TestParsePlan(t *testing.T) {
fs := NewCmdSubmitUpgradeProposal().Flags()
proposal := types.SoftwareUpgradeProposal{ //nolint:staticcheck // SA1019: types.SoftwareUpgradeProposal is deprecated: use types.Content instead
Title: "proposal title",
Description: "proposal description",
proposal := types.MsgSoftwareUpgrade{
Plan: types.Plan{
Name: "plan name",
Height: 123456,
@@ -23,19 +19,12 @@ func TestParseArgsToContent(t *testing.T) {
},
}
fs.Set(cli.FlagTitle, proposal.Title)
fs.Set(cli.FlagDescription, proposal.Description) //nolint:staticcheck // SA1019: cli.FlagDescription is deprecated: use cli.FlagProposalDescription instead
fs.Set(FlagUpgradeHeight, strconv.FormatInt(proposal.Plan.Height, 10))
fs.Set(FlagUpgradeInfo, proposal.Plan.Info)
content, err := parseArgsToContent(fs, proposal.Plan.Name)
p, err := parsePlan(fs, proposal.Plan.Name)
require.NoError(t, err)
p, ok := content.(*types.SoftwareUpgradeProposal) //nolint:staticcheck // SA1019: types.SoftwareUpgradeProposal is deprecated: use types.Content instead
require.Equal(t, ok, true)
require.Equal(t, p.Title, proposal.Title)
require.Equal(t, p.Description, proposal.Description)
require.Equal(t, p.Plan.Name, proposal.Plan.Name)
require.Equal(t, p.Plan.Height, proposal.Plan.Height)
require.Equal(t, p.Plan.Info, proposal.Plan.Info)
require.Equal(t, p.Name, proposal.Plan.Name)
require.Equal(t, p.Height, proposal.Plan.Height)
require.Equal(t, p.Info, proposal.Plan.Info)
}
+70 -58
View File
@@ -1,6 +1,7 @@
package cli
import (
"fmt"
"os"
"path/filepath"
@@ -10,19 +11,19 @@ import (
"cosmossdk.io/x/upgrade/types"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/address"
"github.com/cosmos/cosmos-sdk/x/gov/client/cli"
"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
)
const (
// Deprecated: only used for v1beta1 legacy proposals.
FlagUpgradeHeight = "upgrade-height"
// Deprecated: only used for v1beta1 legacy proposals.
FlagUpgradeInfo = "upgrade-info"
FlagNoValidate = "no-validate"
FlagDaemonName = "daemon-name"
FlagUpgradeInfo = "upgrade-info"
FlagNoValidate = "no-validate"
FlagDaemonName = "daemon-name"
FlagAuthority = "authority"
)
// GetTxCmd returns the transaction commands for this module
@@ -32,41 +33,53 @@ func GetTxCmd() *cobra.Command {
Short: "Upgrade transaction subcommands",
}
cmd.AddCommand(
NewCmdSubmitUpgradeProposal(),
NewCmdSubmitCancelUpgradeProposal(),
)
return cmd
}
// NewCmdSubmitLegacyUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
// Deprecated: please use NewCmdSubmitUpgradeProposal instead.
func NewCmdSubmitLegacyUpgradeProposal() *cobra.Command {
// NewCmdSubmitUpgradeProposal implements a command handler for submitting a software upgrade proposal transaction.
func NewCmdSubmitUpgradeProposal() *cobra.Command {
cmd := &cobra.Command{
Use: "software-upgrade [name] (--upgrade-height [height]) (--upgrade-info [info]) [flags]",
Args: cobra.ExactArgs(1),
Short: "Submit a software upgrade proposal",
Long: "Submit a software upgrade along with an initial deposit.\n" +
"Please specify a unique name and height for the upgrade to take effect.\n" +
"You may include info to reference a binary download link, in a format compatible with: https://github.com/cosmos/cosmos-sdk/tree/main/cosmovisor",
"You may include info to reference a binary download link, in a format compatible with: https://docs.cosmos.network/main/tooling/cosmovisor",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
name := args[0]
content, err := parseArgsToContent(cmd.Flags(), name)
proposal, err := cli.ReadGovPropFlags(clientCtx, cmd.Flags())
if err != nil {
return err
}
name := args[0]
p, err := parsePlan(cmd.Flags(), name)
if err != nil {
return err
}
noValidate, err := cmd.Flags().GetBool(FlagNoValidate)
if err != nil {
return err
}
if !noValidate {
prop := content.(*types.SoftwareUpgradeProposal) //nolint:staticcheck // we are intentionally using a deprecated proposal type.
var daemonName string
if daemonName, err = cmd.Flags().GetString(FlagDaemonName); err != nil {
return err
}
var planInfo *plan.Info
if planInfo, err = plan.ParseInfo(prop.Plan.Info); err != nil {
if planInfo, err = plan.ParseInfo(p.Info); err != nil {
return err
}
if err = planInfo.ValidateFull(daemonName); err != nil {
@@ -74,40 +87,44 @@ func NewCmdSubmitLegacyUpgradeProposal() *cobra.Command {
}
}
from := clientCtx.GetFromAddress()
depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
if err != nil {
return err
}
deposit, err := sdk.ParseCoinsNormalized(depositStr)
if err != nil {
return err
authority, _ := cmd.Flags().GetString(FlagAuthority)
if authority != "" {
if _, err = sdk.AccAddressFromBech32(authority); err != nil {
return fmt.Errorf("invalid authority address: %w", err)
}
} else {
authority = sdk.AccAddress(address.Module("gov")).String()
}
msg, err := v1beta1.NewMsgSubmitProposal(content, deposit, from)
if err != nil {
return err
if err := proposal.SetMsgs([]sdk.Msg{
&types.MsgSoftwareUpgrade{
Authority: authority,
Plan: p,
},
}); err != nil {
return fmt.Errorf("failed to create cancel upgrade message: %w", err)
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), proposal)
},
}
cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
cmd.Flags().String(cli.FlagDescription, "", "description of proposal") //nolint:staticcheck // we are intentionally using a deprecated flag here.
cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
cmd.Flags().Int64(FlagUpgradeHeight, 0, "The height at which the upgrade must happen")
cmd.Flags().String(FlagUpgradeInfo, "", "Info for the upgrade plan such as new version download urls, etc.")
cmd.Flags().Bool(FlagNoValidate, false, "Skip validation of the upgrade info")
cmd.Flags().String(FlagDaemonName, getDefaultDaemonName(), "The name of the executable being upgraded (for upgrade-info validation). Default is the DAEMON_NAME env var if set, or else this executable")
cmd.Flags().String(FlagAuthority, "", "The address of the upgrade module authority (defaults to gov)")
// add common proposal flags
flags.AddTxFlagsToCmd(cmd)
cli.AddGovPropFlagsToCmd(cmd)
cmd.MarkFlagRequired(cli.FlagTitle)
return cmd
}
// NewCmdSubmitLegacyCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
// Deprecated: please use NewCmdSubmitCancelUpgradeProposal instead.
func NewCmdSubmitLegacyCancelUpgradeProposal() *cobra.Command {
// NewCmdSubmitCancelUpgradeProposal implements a command handler for submitting a software upgrade cancel proposal transaction.
func NewCmdSubmitCancelUpgradeProposal() *cobra.Command {
cmd := &cobra.Command{
Use: "cancel-software-upgrade [flags]",
Args: cobra.ExactArgs(0),
@@ -118,44 +135,39 @@ func NewCmdSubmitLegacyCancelUpgradeProposal() *cobra.Command {
if err != nil {
return err
}
from := clientCtx.GetFromAddress()
depositStr, err := cmd.Flags().GetString(cli.FlagDeposit)
proposal, err := cli.ReadGovPropFlags(clientCtx, cmd.Flags())
if err != nil {
return err
}
deposit, err := sdk.ParseCoinsNormalized(depositStr)
if err != nil {
return err
authority, _ := cmd.Flags().GetString(FlagAuthority)
if authority != "" {
if _, err = sdk.AccAddressFromBech32(authority); err != nil {
return fmt.Errorf("invalid authority address: %w", err)
}
} else {
authority = sdk.AccAddress(address.Module("gov")).String()
}
title, err := cmd.Flags().GetString(cli.FlagTitle)
if err != nil {
return err
if err := proposal.SetMsgs([]sdk.Msg{
&types.MsgCancelUpgrade{
Authority: authority,
},
}); err != nil {
return fmt.Errorf("failed to create cancel upgrade message: %w", err)
}
description, err := cmd.Flags().GetString(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
if err != nil {
return err
}
content := types.NewCancelSoftwareUpgradeProposal(title, description)
msg, err := v1beta1.NewMsgSubmitProposal(content, deposit, from)
if err != nil {
return err
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), proposal)
},
}
cmd.Flags().String(cli.FlagTitle, "", "title of proposal")
cmd.Flags().String(cli.FlagDescription, "", "description of proposal") //nolint:staticcheck // we are intentionally using a deprecated flag here.
cmd.Flags().String(cli.FlagDeposit, "", "deposit of proposal")
cmd.Flags().String(FlagAuthority, "", "The address of the upgrade module authority (defaults to gov)")
// add common proposal flags
flags.AddTxFlagsToCmd(cmd)
cli.AddGovPropFlagsToCmd(cmd)
cmd.MarkFlagRequired(cli.FlagTitle)
cmd.MarkFlagRequired(cli.FlagDescription) //nolint:staticcheck // we are intentionally using a deprecated flag here.
return cmd
}