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