github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/test/e2e/generator/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"math"
     6  	"math/rand"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/spf13/cobra"
    11  
    12  	"github.com/line/ostracon/libs/log"
    13  )
    14  
    15  const (
    16  	randomSeed int64 = 4827085738
    17  )
    18  
    19  var logger = log.NewOCLogger(log.NewSyncWriter(os.Stdout))
    20  
    21  func main() {
    22  	NewCLI().Run()
    23  }
    24  
    25  // CLI is the Cobra-based command-line interface.
    26  type CLI struct {
    27  	root *cobra.Command
    28  }
    29  
    30  // NewCLI sets up the CLI.
    31  func NewCLI() *CLI {
    32  	cli := &CLI{}
    33  	cli.root = &cobra.Command{
    34  		Use:           "generator",
    35  		Short:         "End-to-end testnet generator",
    36  		SilenceUsage:  true,
    37  		SilenceErrors: true, // we'll output them ourselves in Run()
    38  		RunE: func(cmd *cobra.Command, args []string) error {
    39  			dir, err := cmd.Flags().GetString("dir")
    40  			if err != nil {
    41  				return err
    42  			}
    43  			groups, err := cmd.Flags().GetInt("groups")
    44  			if err != nil {
    45  				return err
    46  			}
    47  			multiversion, err := cmd.Flags().GetString("multi-version")
    48  			if err != nil {
    49  				return err
    50  			}
    51  			return cli.generate(dir, groups, multiversion)
    52  		},
    53  	}
    54  
    55  	cli.root.PersistentFlags().StringP("dir", "d", "", "Output directory for manifests")
    56  	_ = cli.root.MarkPersistentFlagRequired("dir")
    57  	cli.root.PersistentFlags().StringP("multi-version", "m", "", "Include multi-version testing."+
    58  		"If multi-version is not specified, then only the current Tendermint version will be used in generated testnets.")
    59  	cli.root.PersistentFlags().IntP("groups", "g", 0, "Number of groups")
    60  
    61  	return cli
    62  }
    63  
    64  // generate generates manifests in a directory.
    65  func (cli *CLI) generate(dir string, groups int, multiversion string) error {
    66  	err := os.MkdirAll(dir, 0o755)
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	manifests, err := Generate(rand.New(rand.NewSource(randomSeed)), multiversion) //nolint:gosec
    72  	if err != nil {
    73  		return err
    74  	}
    75  	if groups <= 0 {
    76  		for i, manifest := range manifests {
    77  			err = manifest.Save(filepath.Join(dir, fmt.Sprintf("gen-%04d.toml", i)))
    78  			if err != nil {
    79  				return err
    80  			}
    81  		}
    82  	} else {
    83  		groupSize := int(math.Ceil(float64(len(manifests)) / float64(groups)))
    84  		for g := 0; g < groups; g++ {
    85  			for i := 0; i < groupSize && g*groupSize+i < len(manifests); i++ {
    86  				manifest := manifests[g*groupSize+i]
    87  				err = manifest.Save(filepath.Join(dir, fmt.Sprintf("gen-group%02d-%04d.toml", g, i)))
    88  				if err != nil {
    89  					return err
    90  				}
    91  			}
    92  		}
    93  	}
    94  	return nil
    95  }
    96  
    97  // Run runs the CLI.
    98  func (cli *CLI) Run() {
    99  	if err := cli.root.Execute(); err != nil {
   100  		logger.Error(err.Error())
   101  		os.Exit(1)
   102  	}
   103  }