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 }