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  }