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 }