diff --git a/cmd/frostfs-adm/internal/modules/morph/generate.go b/cmd/frostfs-adm/internal/modules/morph/generate/generate.go similarity index 97% rename from cmd/frostfs-adm/internal/modules/morph/generate.go rename to cmd/frostfs-adm/internal/modules/morph/generate/generate.go index 57c40ec9f..364ce2c6e 100644 --- a/cmd/frostfs-adm/internal/modules/morph/generate.go +++ b/cmd/frostfs-adm/internal/modules/morph/generate/generate.go @@ -1,4 +1,4 @@ -package morph +package generate import ( "errors" @@ -24,9 +24,9 @@ import ( "golang.org/x/sync/errgroup" ) -func generateAlphabetCreds(cmd *cobra.Command, _ []string) error { +func AlphabetCreds(cmd *cobra.Command, _ []string) error { // alphabet size is not part of the config - size, err := cmd.Flags().GetUint(alphabetSizeFlag) + size, err := cmd.Flags().GetUint(morphUtil.AlphabetSizeFlag) if err != nil { return err } diff --git a/cmd/frostfs-adm/internal/modules/morph/generate_test.go b/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go similarity index 77% rename from cmd/frostfs-adm/internal/modules/morph/generate_test.go rename to cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go index e9e942d74..49379ee26 100644 --- a/cmd/frostfs-adm/internal/modules/morph/generate_test.go +++ b/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go @@ -1,4 +1,4 @@ -package morph +package generate import ( "bytes" @@ -21,57 +21,55 @@ import ( "golang.org/x/term" ) -const testContractPassword = "grouppass" - func TestGenerateAlphabet(t *testing.T) { const size = 4 walletDir := t.TempDir() buf := setupTestTerminal(t) - cmd := generateAlphabetCmd + cmd := GenerateAlphabetCmd v := viper.GetViper() t.Run("zero size", func(t *testing.T) { buf.Reset() v.Set(util.AlphabetWalletsFlag, walletDir) - require.NoError(t, cmd.Flags().Set(alphabetSizeFlag, "0")) + require.NoError(t, cmd.Flags().Set(util.AlphabetSizeFlag, "0")) buf.WriteString("pass\r") - require.Error(t, generateAlphabetCreds(cmd, nil)) + require.Error(t, AlphabetCreds(cmd, nil)) }) t.Run("no password provided", func(t *testing.T) { buf.Reset() v.Set(util.AlphabetWalletsFlag, walletDir) - require.NoError(t, cmd.Flags().Set(alphabetSizeFlag, "1")) - require.Error(t, generateAlphabetCreds(cmd, nil)) + require.NoError(t, cmd.Flags().Set(util.AlphabetSizeFlag, "1")) + require.Error(t, AlphabetCreds(cmd, nil)) }) t.Run("missing directory", func(t *testing.T) { buf.Reset() dir := filepath.Join(os.TempDir(), "notexist."+strconv.FormatUint(rand.Uint64(), 10)) v.Set(util.AlphabetWalletsFlag, dir) - require.NoError(t, cmd.Flags().Set(alphabetSizeFlag, "1")) + require.NoError(t, cmd.Flags().Set(util.AlphabetSizeFlag, "1")) buf.WriteString("pass\r") - require.Error(t, generateAlphabetCreds(cmd, nil)) + require.Error(t, AlphabetCreds(cmd, nil)) }) t.Run("no password for contract group wallet", func(t *testing.T) { buf.Reset() v.Set(util.AlphabetWalletsFlag, walletDir) - require.NoError(t, cmd.Flags().Set(alphabetSizeFlag, strconv.FormatUint(size, 10))) + require.NoError(t, cmd.Flags().Set(util.AlphabetSizeFlag, strconv.FormatUint(size, 10))) for i := uint64(0); i < size; i++ { buf.WriteString(strconv.FormatUint(i, 10) + "\r") } - require.Error(t, generateAlphabetCreds(cmd, nil)) + require.Error(t, AlphabetCreds(cmd, nil)) }) buf.Reset() v.Set(util.AlphabetWalletsFlag, walletDir) - require.NoError(t, generateAlphabetCmd.Flags().Set(alphabetSizeFlag, strconv.FormatUint(size, 10))) + require.NoError(t, GenerateAlphabetCmd.Flags().Set(util.AlphabetSizeFlag, strconv.FormatUint(size, 10))) for i := uint64(0); i < size; i++ { buf.WriteString(strconv.FormatUint(i, 10) + "\r") } - buf.WriteString(testContractPassword + "\r") - require.NoError(t, generateAlphabetCreds(generateAlphabetCmd, nil)) + buf.WriteString(util.TestContractPassword + "\r") + require.NoError(t, AlphabetCreds(GenerateAlphabetCmd, nil)) var wg sync.WaitGroup for i := uint64(0); i < size; i++ { @@ -105,7 +103,7 @@ func TestGenerateAlphabet(t *testing.T) { w, err := wallet.NewWalletFromFile(p) require.NoError(t, err, "contract wallet doesn't exist") require.Equal(t, 1, len(w.Accounts), "contract wallet must have 1 accout") - require.NoError(t, w.Accounts[0].Decrypt(testContractPassword, keys.NEP2ScryptParams())) + require.NoError(t, w.Accounts[0].Decrypt(util.TestContractPassword, keys.NEP2ScryptParams())) }) } diff --git a/cmd/frostfs-adm/internal/modules/morph/generate/root.go b/cmd/frostfs-adm/internal/modules/morph/generate/root.go new file mode 100644 index 000000000..e5f5b38cd --- /dev/null +++ b/cmd/frostfs-adm/internal/modules/morph/generate/root.go @@ -0,0 +1,76 @@ +package generate + +import ( + "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/util" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +const ( + storageWalletLabelFlag = "label" + storageGasCLIFlag = "initial-gas" + storageGasConfigFlag = "storage.initial_gas" + walletAddressFlag = "wallet-address" +) + +var ( + GenerateStorageCmd = &cobra.Command{ + Use: "generate-storage-wallet", + Short: "Generate storage node wallet for the morph network", + PreRun: func(cmd *cobra.Command, _ []string) { + _ = viper.BindPFlag(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) + _ = viper.BindPFlag(util.EndpointFlag, cmd.Flags().Lookup(util.EndpointFlag)) + _ = viper.BindPFlag(storageGasConfigFlag, cmd.Flags().Lookup(storageGasCLIFlag)) + }, + RunE: generateStorageCreds, + } + RefillGasCmd = &cobra.Command{ + Use: "refill-gas", + Short: "Refill GAS of storage node's wallet in the morph network", + PreRun: func(cmd *cobra.Command, _ []string) { + _ = viper.BindPFlag(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) + _ = viper.BindPFlag(util.EndpointFlag, cmd.Flags().Lookup(util.EndpointFlag)) + _ = viper.BindPFlag(util.RefillGasAmountFlag, cmd.Flags().Lookup(util.RefillGasAmountFlag)) + }, + RunE: func(cmd *cobra.Command, args []string) error { + return refillGas(cmd, util.RefillGasAmountFlag, false) + }, + } + 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(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) + }, + RunE: AlphabetCreds, + } +) + +func initRefillGasCmd() { + RefillGasCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) + RefillGasCmd.Flags().StringP(util.EndpointFlag, util.EndpointFlagShort, "", util.EndpointFlagDesc) + RefillGasCmd.Flags().String(util.StorageWalletFlag, "", "Path to storage node wallet") + RefillGasCmd.Flags().String(walletAddressFlag, "", "Address of wallet") + RefillGasCmd.Flags().String(util.RefillGasAmountFlag, "", "Additional amount of GAS to transfer") + RefillGasCmd.MarkFlagsMutuallyExclusive(walletAddressFlag, util.StorageWalletFlag) +} + +func initGenerateStorageCmd() { + GenerateStorageCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) + GenerateStorageCmd.Flags().StringP(util.EndpointFlag, util.EndpointFlagShort, "", util.EndpointFlagDesc) + GenerateStorageCmd.Flags().String(util.StorageWalletFlag, "", "Path to new storage node wallet") + GenerateStorageCmd.Flags().String(storageGasCLIFlag, "", "Initial amount of GAS to transfer") + GenerateStorageCmd.Flags().StringP(storageWalletLabelFlag, "l", "", "Wallet label") +} + +func initGenerateAlphabetCmd() { + GenerateAlphabetCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) + GenerateAlphabetCmd.Flags().Uint(util.AlphabetSizeFlag, 7, "Amount of alphabet wallets to generate") +} + +func init() { + initRefillGasCmd() + initGenerateStorageCmd() + initGenerateAlphabetCmd() +} diff --git a/cmd/frostfs-adm/internal/modules/morph/initialize_test.go b/cmd/frostfs-adm/internal/modules/morph/initialize_test.go index 8b0fddf3d..3315b5d33 100644 --- a/cmd/frostfs-adm/internal/modules/morph/initialize_test.go +++ b/cmd/frostfs-adm/internal/modules/morph/initialize_test.go @@ -10,6 +10,7 @@ import ( "time" cmdConfig "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/config" + "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/generate" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/netmap" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/node" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/policy" @@ -100,12 +101,12 @@ func generateTestData(t *testing.T, dir string, size int) error { v.Set(util.AlphabetWalletsFlag, dir) sizeStr := strconv.FormatUint(uint64(size), 10) - if err := generateAlphabetCmd.Flags().Set(alphabetSizeFlag, sizeStr); err != nil { + if err := generate.GenerateAlphabetCmd.Flags().Set(util.AlphabetSizeFlag, sizeStr); err != nil { return err } setTestCredentials(v, size) - if err := generateAlphabetCreds(generateAlphabetCmd, nil); err != nil { + if err := generate.AlphabetCreds(generate.GenerateAlphabetCmd, nil); err != nil { return err } @@ -148,7 +149,7 @@ func setTestCredentials(v *viper.Viper, size int) { for i := 0; i < size; i++ { v.Set("credentials."+innerring.GlagoliticLetter(i).String(), strconv.FormatUint(uint64(i), 10)) } - v.Set("credentials.contract", testContractPassword) + v.Set("credentials.contract", util.TestContractPassword) } func TestNextPollInterval(t *testing.T) { diff --git a/cmd/frostfs-adm/internal/modules/morph/root.go b/cmd/frostfs-adm/internal/modules/morph/root.go index 44ff543d9..e2a4517f3 100644 --- a/cmd/frostfs-adm/internal/modules/morph/root.go +++ b/cmd/frostfs-adm/internal/modules/morph/root.go @@ -7,6 +7,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/container" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/contract" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/frostfsid" + "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/generate" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/netmap" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/node" "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/frostfs-adm/internal/modules/morph/notary" @@ -18,12 +19,6 @@ import ( ) const ( - alphabetSizeFlag = "size" - - storageWalletLabelFlag = "label" - storageGasCLIFlag = "initial-gas" - storageGasConfigFlag = "storage.initial_gas" - maxObjectSizeCLIFlag = "max-object-size" epochDurationCLIFlag = "epoch-duration" @@ -36,8 +31,6 @@ const ( homomorphicHashDisabledCLIFlag = "homomorphic-disabled" withdrawFeeCLIFlag = "withdraw-fee" - - walletAddressFlag = "wallet-address" ) var ( @@ -47,16 +40,6 @@ var ( 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(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) - }, - RunE: generateAlphabetCreds, - } - initCmd = &cobra.Command{ Use: "init", Short: "Initialize side chain network with smart-contracts and network settings", @@ -74,37 +57,13 @@ var ( }, 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(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) - _ = viper.BindPFlag(util.EndpointFlag, cmd.Flags().Lookup(util.EndpointFlag)) - _ = viper.BindPFlag(storageGasConfigFlag, cmd.Flags().Lookup(storageGasCLIFlag)) - }, - RunE: generateStorageCreds, - } - - refillGasCmd = &cobra.Command{ - Use: "refill-gas", - Short: "Refill GAS of storage node's wallet in the morph network", - PreRun: func(cmd *cobra.Command, _ []string) { - _ = viper.BindPFlag(util.AlphabetWalletsFlag, cmd.Flags().Lookup(util.AlphabetWalletsFlag)) - _ = viper.BindPFlag(util.EndpointFlag, cmd.Flags().Lookup(util.EndpointFlag)) - _ = viper.BindPFlag(util.RefillGasAmountFlag, cmd.Flags().Lookup(util.RefillGasAmountFlag)) - }, - RunE: func(cmd *cobra.Command, args []string) error { - return refillGas(cmd, util.RefillGasAmountFlag, false) - }, - } ) func init() { - initGenerateAlphabetCmd() + RootCmd.AddCommand(generate.RefillGasCmd) initInitCmd() RootCmd.AddCommand(contract.DeployCmd) - initGenerateStorageCmd() + RootCmd.AddCommand(generate.GenerateStorageCmd) RootCmd.AddCommand(netmap.ForceNewEpoch) RootCmd.AddCommand(node.RemoveCmd) RootCmd.AddCommand(policy.Set) @@ -117,7 +76,7 @@ func init() { RootCmd.AddCommand(container.ListCmd) RootCmd.AddCommand(container.RestoreCmd) RootCmd.AddCommand(container.DumpCmd) - initRefillGasCmd() + RootCmd.AddCommand(generate.GenerateAlphabetCmd) RootCmd.AddCommand(notary.DepositCmd) RootCmd.AddCommand(netmap.CandidatesCmd) @@ -128,25 +87,6 @@ func init() { RootCmd.AddCommand(frostfsid.Cmd) } -func initRefillGasCmd() { - RootCmd.AddCommand(refillGasCmd) - refillGasCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) - refillGasCmd.Flags().StringP(util.EndpointFlag, util.EndpointFlagShort, "", util.EndpointFlagDesc) - refillGasCmd.Flags().String(util.StorageWalletFlag, "", "Path to storage node wallet") - refillGasCmd.Flags().String(walletAddressFlag, "", "Address of wallet") - refillGasCmd.Flags().String(util.RefillGasAmountFlag, "", "Additional amount of GAS to transfer") - refillGasCmd.MarkFlagsMutuallyExclusive(walletAddressFlag, util.StorageWalletFlag) -} - -func initGenerateStorageCmd() { - RootCmd.AddCommand(generateStorageCmd) - generateStorageCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) - generateStorageCmd.Flags().StringP(util.EndpointFlag, util.EndpointFlagShort, "", util.EndpointFlagDesc) - generateStorageCmd.Flags().String(util.StorageWalletFlag, "", "Path to new storage node wallet") - generateStorageCmd.Flags().String(storageGasCLIFlag, "", "Initial amount of GAS to transfer") - generateStorageCmd.Flags().StringP(storageWalletLabelFlag, "l", "", "Wallet label") -} - func initInitCmd() { RootCmd.AddCommand(initCmd) initCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) @@ -163,9 +103,3 @@ func initInitCmd() { initCmd.Flags().String(util.LocalDumpFlag, "", "Path to the blocks dump file") initCmd.MarkFlagsMutuallyExclusive(util.ContractsInitFlag, util.ContractsURLFlag) } - -func initGenerateAlphabetCmd() { - RootCmd.AddCommand(generateAlphabetCmd) - generateAlphabetCmd.Flags().String(util.AlphabetWalletsFlag, "", util.AlphabetWalletsFlagDesc) - generateAlphabetCmd.Flags().Uint(alphabetSizeFlag, 7, "Amount of alphabet wallets to generate") -} diff --git a/cmd/frostfs-adm/internal/modules/morph/util/const.go b/cmd/frostfs-adm/internal/modules/morph/util/const.go index a37afc3da..1128adee9 100644 --- a/cmd/frostfs-adm/internal/modules/morph/util/const.go +++ b/cmd/frostfs-adm/internal/modules/morph/util/const.go @@ -32,6 +32,7 @@ const ( MaintenanceModeAllowedInitFlag = "network.maintenance_mode_allowed" HomomorphicHashDisabledInitFlag = "network.homomorphic_hash_disabled" CustomZoneFlag = "domain" + AlphabetSizeFlag = "size" SingleAccountName = "single" CommitteeAccountName = "committee" @@ -56,6 +57,8 @@ const ( DeployMethodName = "deploy" UpdateMethodName = "update" + + TestContractPassword = "grouppass" ) var (