github.com/badrootd/nibiru-cometbft@v0.37.5-0.20240307173500-2a75559eee9b/test/e2e/runner/start.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 "time" 7 8 "github.com/badrootd/nibiru-cometbft/libs/log" 9 e2e "github.com/badrootd/nibiru-cometbft/test/e2e/pkg" 10 ) 11 12 func Start(testnet *e2e.Testnet) error { 13 if len(testnet.Nodes) == 0 { 14 return fmt.Errorf("no nodes in testnet") 15 } 16 17 // Nodes are already sorted by name. Sort them by name then startAt, 18 // which gives the overall order startAt, mode, name. 19 nodeQueue := testnet.Nodes 20 sort.SliceStable(nodeQueue, func(i, j int) bool { 21 a, b := nodeQueue[i], nodeQueue[j] 22 switch { 23 case a.Mode == b.Mode: 24 return false 25 case a.Mode == e2e.ModeSeed: 26 return true 27 case a.Mode == e2e.ModeValidator && b.Mode == e2e.ModeFull: 28 return true 29 } 30 return false 31 }) 32 33 sort.SliceStable(nodeQueue, func(i, j int) bool { 34 return nodeQueue[i].StartAt < nodeQueue[j].StartAt 35 }) 36 37 if nodeQueue[0].StartAt > 0 { 38 return fmt.Errorf("no initial nodes in testnet") 39 } 40 41 // Start initial nodes (StartAt: 0) 42 logger.Info("Starting initial network nodes...") 43 for len(nodeQueue) > 0 && nodeQueue[0].StartAt == 0 { 44 node := nodeQueue[0] 45 nodeQueue = nodeQueue[1:] 46 if err := execCompose(testnet.Dir, "up", "-d", node.Name); err != nil { 47 return err 48 } 49 if _, err := waitForNode(node, 0, 15*time.Second); err != nil { 50 return err 51 } 52 if node.PrometheusProxyPort > 0 { 53 logger.Info("start", "msg", log.NewLazySprintf("Node %v up on http://127.0.0.1:%v; with Prometheus on http://127.0.0.1:%v/metrics", node.Name, node.ProxyPort, node.PrometheusProxyPort)) 54 } else { 55 logger.Info("start", "msg", log.NewLazySprintf("Node %v up on http://127.0.0.1:%v", node.Name, node.ProxyPort)) 56 } 57 } 58 59 networkHeight := testnet.InitialHeight 60 61 // Wait for initial height 62 logger.Info("Waiting for initial height", 63 "height", networkHeight, 64 "nodes", len(testnet.Nodes)-len(nodeQueue), 65 "pending", len(nodeQueue)) 66 67 block, blockID, err := waitForHeight(testnet, networkHeight) 68 if err != nil { 69 return err 70 } 71 72 // Update any state sync nodes with a trusted height and hash 73 for _, node := range nodeQueue { 74 if node.StateSync || node.Mode == e2e.ModeLight { 75 err = UpdateConfigStateSync(node, block.Height, blockID.Hash.Bytes()) 76 if err != nil { 77 return err 78 } 79 } 80 } 81 82 for _, node := range nodeQueue { 83 if node.StartAt > networkHeight { 84 // if we're starting a node that's ahead of 85 // the last known height of the network, then 86 // we should make sure that the rest of the 87 // network has reached at least the height 88 // that this node will start at before we 89 // start the node. 90 91 networkHeight = node.StartAt 92 93 logger.Info("Waiting for network to advance before starting catch up node", 94 "node", node.Name, 95 "height", networkHeight) 96 97 if _, _, err := waitForHeight(testnet, networkHeight); err != nil { 98 return err 99 } 100 } 101 102 logger.Info("Starting catch up node", "node", node.Name, "height", node.StartAt) 103 104 if err := execCompose(testnet.Dir, "up", "-d", node.Name); err != nil { 105 return err 106 } 107 status, err := waitForNode(node, node.StartAt, 3*time.Minute) 108 if err != nil { 109 return err 110 } 111 logger.Info("start", "msg", log.NewLazySprintf("Node %v up on http://127.0.0.1:%v at height %v", 112 node.Name, node.ProxyPort, status.SyncInfo.LatestBlockHeight)) 113 } 114 115 return nil 116 }