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  }