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  }