[#683] cmd/neofs-adm: Add CLI flags for morph commands
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
c20eb15bd5
commit
6bf01a0a22
6 changed files with 185 additions and 0 deletions
|
@ -8,8 +8,10 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/cli/input"
|
||||||
"github.com/nspcc-dev/neofs-node/pkg/innerring"
|
"github.com/nspcc-dev/neofs-node/pkg/innerring"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
type configTemplate struct {
|
type configTemplate struct {
|
||||||
|
@ -122,3 +124,14 @@ func generateConfigExample(appDir string, credSize int) (string, error) {
|
||||||
|
|
||||||
return buf.String(), nil
|
return buf.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AlphabetPassword(v *viper.Viper, index int) (string, error) {
|
||||||
|
letter := innerring.GlagoliticLetter(index)
|
||||||
|
key := "credentials." + letter.String()
|
||||||
|
if v.IsSet(key) {
|
||||||
|
return v.GetString(key), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt := "Password for " + letter.String() + " wallet > "
|
||||||
|
return input.ReadPassword(prompt)
|
||||||
|
}
|
||||||
|
|
13
cmd/neofs-adm/internal/modules/morph/epoch.go
Normal file
13
cmd/neofs-adm/internal/modules/morph/epoch.go
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package morph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func forceNewEpochCmd(cmd *cobra.Command, args []string) error {
|
||||||
|
cmd.Println("endpoint:", viper.GetString(endpointFlag))
|
||||||
|
cmd.Println("alphabet-wallets:", viper.GetString(alphabetWalletsFlag))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
45
cmd/neofs-adm/internal/modules/morph/generate.go
Normal file
45
cmd/neofs-adm/internal/modules/morph/generate.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package morph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-adm/internal/modules/config"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateAlphabetCreds(cmd *cobra.Command, args []string) error {
|
||||||
|
// alphabet size is not part of the config
|
||||||
|
size, err := cmd.Flags().GetUint(alphabetSizeFlag)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pwds := make([]string, size)
|
||||||
|
for i := 0; i < int(size); i++ {
|
||||||
|
pwds[i], err = config.AlphabetPassword(viper.GetViper(), i)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Println("size:", size)
|
||||||
|
cmd.Println("alphabet-wallets:", viper.GetString(alphabetWalletsFlag))
|
||||||
|
for i := range pwds {
|
||||||
|
cmd.Printf("wallet[%d]: %s\n", i, pwds[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateStorageCreds(cmd *cobra.Command, args []string) error {
|
||||||
|
// storage wallet path is not part of the config
|
||||||
|
storageWalletPath, err := cmd.Flags().GetString(storageWalletFlag)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Println("endpoint:", viper.GetString(endpointFlag))
|
||||||
|
cmd.Println("alphabet-wallets:", viper.GetString(alphabetWalletsFlag))
|
||||||
|
cmd.Println("storage-wallet:", storageWalletPath)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
22
cmd/neofs-adm/internal/modules/morph/initialize.go
Normal file
22
cmd/neofs-adm/internal/modules/morph/initialize.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package morph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initializeSideChainCmd(cmd *cobra.Command, args []string) error {
|
||||||
|
// contract path is not part of the config
|
||||||
|
contractsPath, err := cmd.Flags().GetString(contractsInitFlag)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Println("endpoint:", viper.GetString(endpointFlag))
|
||||||
|
cmd.Println("alphabet-wallets:", viper.GetString(alphabetWalletsFlag))
|
||||||
|
cmd.Println("contracts:", contractsPath)
|
||||||
|
cmd.Println("epoch-duration:", viper.GetUint(epochDurationInitFlag))
|
||||||
|
cmd.Println("max-object-size:", viper.GetUint(maxObjectSizeInitFlag))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
90
cmd/neofs-adm/internal/modules/morph/root.go
Normal file
90
cmd/neofs-adm/internal/modules/morph/root.go
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
package morph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
alphabetWalletsFlag = "alphabet-wallets"
|
||||||
|
alphabetSizeFlag = "size"
|
||||||
|
endpointFlag = "rpc-endpoint"
|
||||||
|
storageWalletFlag = "storage-wallet"
|
||||||
|
contractsInitFlag = "contracts"
|
||||||
|
maxObjectSizeInitFlag = "network.max_object_size"
|
||||||
|
maxObjectSizeCLIFlag = "max-object-size"
|
||||||
|
epochDurationInitFlag = "network.epoch_duration"
|
||||||
|
epochDurationCLIFlag = "epoch-duration"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// RootCmd is a root command of config section.
|
||||||
|
RootCmd = &cobra.Command{
|
||||||
|
Use: "morph",
|
||||||
|
Short: "Section for morph network configuration commands.",
|
||||||
|
}
|
||||||
|
|
||||||
|
generateAlphabetCmd = &cobra.Command{
|
||||||
|
Use: "generate-alphabet",
|
||||||
|
Short: "Generate alphabet wallets for consensus nodes of the morph network",
|
||||||
|
PreRun: func(cmd *cobra.Command, _ []string) {
|
||||||
|
// PreRun fixes https://github.com/spf13/viper/issues/233
|
||||||
|
_ = viper.BindPFlag(alphabetWalletsFlag, cmd.Flags().Lookup(alphabetWalletsFlag))
|
||||||
|
},
|
||||||
|
RunE: generateAlphabetCreds,
|
||||||
|
}
|
||||||
|
|
||||||
|
initCmd = &cobra.Command{
|
||||||
|
Use: "init",
|
||||||
|
Short: "Initialize side chain network with smart-contracts and network settings",
|
||||||
|
PreRun: func(cmd *cobra.Command, _ []string) {
|
||||||
|
_ = viper.BindPFlag(alphabetWalletsFlag, cmd.Flags().Lookup(alphabetWalletsFlag))
|
||||||
|
_ = viper.BindPFlag(endpointFlag, cmd.Flags().Lookup(endpointFlag))
|
||||||
|
_ = viper.BindPFlag(epochDurationInitFlag, cmd.Flags().Lookup(epochDurationCLIFlag))
|
||||||
|
_ = viper.BindPFlag(maxObjectSizeInitFlag, cmd.Flags().Lookup(maxObjectSizeCLIFlag))
|
||||||
|
},
|
||||||
|
RunE: initializeSideChainCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
generateStorageCmd = &cobra.Command{
|
||||||
|
Use: "generate-storage-wallet",
|
||||||
|
Short: "Generate storage node wallet for the morph network",
|
||||||
|
PreRun: func(cmd *cobra.Command, _ []string) {
|
||||||
|
_ = viper.BindPFlag(alphabetWalletsFlag, cmd.Flags().Lookup(alphabetWalletsFlag))
|
||||||
|
_ = viper.BindPFlag(endpointFlag, cmd.Flags().Lookup(endpointFlag))
|
||||||
|
},
|
||||||
|
RunE: generateStorageCreds,
|
||||||
|
}
|
||||||
|
|
||||||
|
forceNewEpoch = &cobra.Command{
|
||||||
|
Use: "force-new-epoch",
|
||||||
|
Short: "Create new NeoFS epoch event in the side chain",
|
||||||
|
PreRun: func(cmd *cobra.Command, _ []string) {
|
||||||
|
_ = viper.BindPFlag(alphabetWalletsFlag, cmd.Flags().Lookup(alphabetWalletsFlag))
|
||||||
|
_ = viper.BindPFlag(endpointFlag, cmd.Flags().Lookup(endpointFlag))
|
||||||
|
},
|
||||||
|
RunE: forceNewEpochCmd,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RootCmd.AddCommand(generateAlphabetCmd)
|
||||||
|
generateAlphabetCmd.Flags().String(alphabetWalletsFlag, "", "path to alphabet wallets dir")
|
||||||
|
generateAlphabetCmd.Flags().Uint(alphabetSizeFlag, 7, "amount of alphabet wallets to generate")
|
||||||
|
|
||||||
|
RootCmd.AddCommand(initCmd)
|
||||||
|
initCmd.Flags().String(alphabetWalletsFlag, "", "path to alphabet wallets dir")
|
||||||
|
initCmd.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")
|
||||||
|
initCmd.Flags().String(contractsInitFlag, "", "path to archive with compiled NeoFS contracts (default fetched from latest github release)")
|
||||||
|
initCmd.Flags().Uint(epochDurationCLIFlag, 240, "amount of side chain blocks in one NeoFS epoch")
|
||||||
|
initCmd.Flags().Uint(maxObjectSizeCLIFlag, 67108864, "max single object size in bytes")
|
||||||
|
|
||||||
|
RootCmd.AddCommand(generateStorageCmd)
|
||||||
|
generateStorageCmd.Flags().String(alphabetWalletsFlag, "", "path to alphabet wallets dir")
|
||||||
|
generateStorageCmd.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")
|
||||||
|
generateStorageCmd.Flags().String(storageWalletFlag, "", "path to new storage node wallet")
|
||||||
|
|
||||||
|
RootCmd.AddCommand(forceNewEpoch)
|
||||||
|
forceNewEpoch.Flags().String(alphabetWalletsFlag, "", "path to alphabet wallets dir")
|
||||||
|
forceNewEpoch.Flags().StringP(endpointFlag, "r", "", "N3 RPC node endpoint")
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-node/cmd/neofs-adm/internal/modules/config"
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-adm/internal/modules/config"
|
||||||
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-adm/internal/modules/morph"
|
||||||
"github.com/nspcc-dev/neofs-node/misc"
|
"github.com/nspcc-dev/neofs-node/misc"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
|
@ -31,6 +32,7 @@ func init() {
|
||||||
rootCmd.Flags().Bool("version", false, "application version")
|
rootCmd.Flags().Bool("version", false, "application version")
|
||||||
|
|
||||||
rootCmd.AddCommand(config.RootCmd)
|
rootCmd.AddCommand(config.RootCmd)
|
||||||
|
rootCmd.AddCommand(morph.RootCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Execute() error {
|
func Execute() error {
|
||||||
|
|
Loading…
Reference in a new issue