diff --git a/cmd/frostfs-adm/internal/modules/morph/generate/generate.go b/cmd/frostfs-adm/internal/modules/morph/generate/generate.go index 8ecc9f1b6..c7de599e5 100644 --- a/cmd/frostfs-adm/internal/modules/morph/generate/generate.go +++ b/cmd/frostfs-adm/internal/modules/morph/generate/generate.go @@ -65,34 +65,42 @@ func initializeWallets(v *viper.Viper, walletDir string, size int) ([]string, er pubs := make(keys.PublicKeys, size) passwords := make([]string, size) + var errG errgroup.Group + for i := range wallets { password, err := config.GetPassword(v, innerring.GlagoliticLetter(i).String()) if err != nil { return nil, fmt.Errorf("can't fetch password: %w", err) } - p := filepath.Join(walletDir, innerring.GlagoliticLetter(i).String()+".json") - f, err := os.OpenFile(p, os.O_CREATE, 0o644) - if err != nil { - return nil, fmt.Errorf("can't create wallet file: %w", err) - } - if err := f.Close(); err != nil { - return nil, fmt.Errorf("can't close wallet file: %w", err) - } - w, err := wallet.NewWallet(p) - if err != nil { - return nil, fmt.Errorf("can't create wallet: %w", err) - } - if err := w.CreateAccount(constants.SingleAccountName, password); err != nil { - return nil, fmt.Errorf("can't create account: %w", err) - } + i := i + errG.Go(func() error { + p := filepath.Join(walletDir, innerring.GlagoliticLetter(i).String()+".json") + f, err := os.OpenFile(p, os.O_CREATE, 0o644) + if err != nil { + return fmt.Errorf("can't create wallet file: %w", err) + } + if err := f.Close(); err != nil { + return fmt.Errorf("can't close wallet file: %w", err) + } + w, err := wallet.NewWallet(p) + if err != nil { + return fmt.Errorf("can't create wallet: %w", err) + } + if err := w.CreateAccount(constants.SingleAccountName, password); err != nil { + return fmt.Errorf("can't create account: %w", err) + } - passwords[i] = password - wallets[i] = w - pubs[i] = w.Accounts[0].PrivateKey().PublicKey() + passwords[i] = password + wallets[i] = w + pubs[i] = w.Accounts[0].PrivateKey().PublicKey() + return nil + }) } - var errG errgroup.Group + if err := errG.Wait(); err != nil { + return nil, err + } // Create committee account with N/2+1 multi-signature. majCount := smartcontract.GetMajorityHonestNodeCount(size) diff --git a/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go b/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go index d4a4fee5d..1dd6420eb 100644 --- a/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go +++ b/cmd/frostfs-adm/internal/modules/morph/generate/generate_test.go @@ -23,8 +23,6 @@ import ( ) func TestGenerateAlphabet(t *testing.T) { - const size = 4 - walletDir := t.TempDir() buf := setupTestTerminal(t) @@ -55,13 +53,13 @@ func TestGenerateAlphabet(t *testing.T) { t.Run("no password for contract group wallet", func(t *testing.T) { buf.Reset() v.Set(commonflags.AlphabetWalletsFlag, walletDir) - require.NoError(t, cmd.Flags().Set(commonflags.AlphabetSizeFlag, strconv.FormatUint(size, 10))) - for i := uint64(0); i < size; i++ { - buf.WriteString(strconv.FormatUint(i, 10) + "\r") - } + require.NoError(t, cmd.Flags().Set(commonflags.AlphabetSizeFlag, "1")) + buf.WriteString("pass\r") require.Error(t, AlphabetCreds(cmd, nil)) }) + const size = 4 + buf.Reset() v.Set(commonflags.AlphabetWalletsFlag, walletDir) require.NoError(t, GenerateAlphabetCmd.Flags().Set(commonflags.AlphabetSizeFlag, strconv.FormatUint(size, 10)))