github.com/vipernet-xyz/tm@v0.34.24/test/e2e/runner/perturb.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/vipernet-xyz/tm/libs/log"
     8  	rpctypes "github.com/vipernet-xyz/tm/rpc/core/types"
     9  	e2e "github.com/vipernet-xyz/tm/test/e2e/pkg"
    10  )
    11  
    12  // Perturbs a running testnet.
    13  func Perturb(testnet *e2e.Testnet) error {
    14  	for _, node := range testnet.Nodes {
    15  		for _, perturbation := range node.Perturbations {
    16  			_, err := PerturbNode(node, perturbation)
    17  			if err != nil {
    18  				return err
    19  			}
    20  			time.Sleep(3 * time.Second) // give network some time to recover between each
    21  		}
    22  	}
    23  	return nil
    24  }
    25  
    26  // PerturbNode perturbs a node with a given perturbation, returning its status
    27  // after recovering.
    28  func PerturbNode(node *e2e.Node, perturbation e2e.Perturbation) (*rpctypes.ResultStatus, error) {
    29  	testnet := node.Testnet
    30  	switch perturbation {
    31  	case e2e.PerturbationDisconnect:
    32  		logger.Info("perturb node", "msg", log.NewLazySprintf("Disconnecting node %v...", node.Name))
    33  		if err := execDocker("network", "disconnect", testnet.Name+"_"+testnet.Name, node.Name); err != nil {
    34  			return nil, err
    35  		}
    36  		time.Sleep(10 * time.Second)
    37  		if err := execDocker("network", "connect", testnet.Name+"_"+testnet.Name, node.Name); err != nil {
    38  			return nil, err
    39  		}
    40  
    41  	case e2e.PerturbationKill:
    42  		logger.Info("perturb node", "msg", log.NewLazySprintf("Killing node %v...", node.Name))
    43  		if err := execCompose(testnet.Dir, "kill", "-s", "SIGKILL", node.Name); err != nil {
    44  			return nil, err
    45  		}
    46  		if err := execCompose(testnet.Dir, "start", node.Name); err != nil {
    47  			return nil, err
    48  		}
    49  
    50  	case e2e.PerturbationPause:
    51  		logger.Info("perturb node", "msg", log.NewLazySprintf("Pausing node %v...", node.Name))
    52  		if err := execCompose(testnet.Dir, "pause", node.Name); err != nil {
    53  			return nil, err
    54  		}
    55  		time.Sleep(10 * time.Second)
    56  		if err := execCompose(testnet.Dir, "unpause", node.Name); err != nil {
    57  			return nil, err
    58  		}
    59  
    60  	case e2e.PerturbationRestart:
    61  		logger.Info("perturb node", "msg", log.NewLazySprintf("Restarting node %v...", node.Name))
    62  		if err := execCompose(testnet.Dir, "restart", node.Name); err != nil {
    63  			return nil, err
    64  		}
    65  
    66  	default:
    67  		return nil, fmt.Errorf("unexpected perturbation %q", perturbation)
    68  	}
    69  
    70  	status, err := waitForNode(node, 0, 20*time.Second)
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	logger.Info("perturb node",
    75  		"msg",
    76  		log.NewLazySprintf("Node %v recovered at height %v", node.Name, status.SyncInfo.LatestBlockHeight))
    77  	return status, nil
    78  }