bitbucket.org/number571/tendermint@v0.8.14/test/e2e/runner/start.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 "time" 7 8 e2e "bitbucket.org/number571/tendermint/test/e2e/pkg" 9 ) 10 11 func Start(testnet *e2e.Testnet) error { 12 13 // Nodes are already sorted by name. Sort them by name then startAt, 14 // which gives the overall order startAt, mode, name. 15 nodeQueue := testnet.Nodes 16 sort.SliceStable(nodeQueue, func(i, j int) bool { 17 a, b := nodeQueue[i], nodeQueue[j] 18 switch { 19 case a.Mode == b.Mode: 20 return false 21 case a.Mode == e2e.ModeSeed: 22 return true 23 case a.Mode == e2e.ModeValidator && b.Mode == e2e.ModeFull: 24 return true 25 } 26 return false 27 }) 28 sort.SliceStable(nodeQueue, func(i, j int) bool { 29 return nodeQueue[i].StartAt < nodeQueue[j].StartAt 30 }) 31 if len(nodeQueue) == 0 { 32 return fmt.Errorf("no nodes in testnet") 33 } 34 if nodeQueue[0].StartAt > 0 { 35 return fmt.Errorf("no initial nodes in testnet") 36 } 37 38 // Start initial nodes (StartAt: 0) 39 logger.Info("Starting initial network nodes...") 40 for len(nodeQueue) > 0 && nodeQueue[0].StartAt == 0 { 41 node := nodeQueue[0] 42 nodeQueue = nodeQueue[1:] 43 if err := execCompose(testnet.Dir, "up", "-d", node.Name); err != nil { 44 return err 45 } 46 if _, err := waitForNode(node, 0, time.Minute); err != nil { 47 return err 48 } 49 logger.Info(fmt.Sprintf("Node %v up on http://127.0.0.1:%v", node.Name, node.ProxyPort)) 50 } 51 52 // Wait for initial height 53 logger.Info(fmt.Sprintf("Waiting for initial height %v...", testnet.InitialHeight)) 54 block, blockID, err := waitForHeight(testnet, testnet.InitialHeight) 55 if err != nil { 56 return err 57 } 58 59 // Update any state sync nodes with a trusted height and hash 60 for _, node := range nodeQueue { 61 if node.StateSync || node.Mode == e2e.ModeLight { 62 err = UpdateConfigStateSync(node, block.Height, blockID.Hash.Bytes()) 63 if err != nil { 64 return err 65 } 66 } 67 } 68 69 // Start up remaining nodes 70 for _, node := range nodeQueue { 71 logger.Info(fmt.Sprintf("Starting node %v at height %v...", node.Name, node.StartAt)) 72 if _, _, err := waitForHeight(testnet, node.StartAt); err != nil { 73 return err 74 } 75 if err := execCompose(testnet.Dir, "up", "-d", node.Name); err != nil { 76 return err 77 } 78 status, err := waitForNode(node, node.StartAt, 8*time.Minute) 79 if err != nil { 80 return err 81 } 82 logger.Info(fmt.Sprintf("Node %v up on http://127.0.0.1:%v at height %v", 83 node.Name, node.ProxyPort, status.SyncInfo.LatestBlockHeight)) 84 } 85 86 return nil 87 }