package main import ( "errors" "fmt" "os" "path/filepath" e2e "github.com/tendermint/tendermint/test/e2e/pkg" ) // Cleanup removes the Docker Compose containers and testnet directory. func Cleanup(testnet *e2e.Testnet) error { err := cleanupDocker() if err != nil { return err } return cleanupDir(testnet.Dir) } // cleanupDocker removes all E2E resources (with label e2e=True), regardless // of testnet. func cleanupDocker() error { logger.Info("Removing Docker containers and networks") // GNU xargs requires the -r flag to not run when input is empty, macOS // does this by default. Ugly, but works. xargsR := `$(if [[ $OSTYPE == "linux-gnu"* ]]; then echo -n "-r"; fi)` err := exec("bash", "-c", fmt.Sprintf( "docker container ls -qa --filter label=e2e | xargs %v docker container rm -f", xargsR)) if err != nil { return err } return exec("bash", "-c", fmt.Sprintf( "docker network ls -q --filter label=e2e | xargs %v docker network rm", xargsR)) } // cleanupDir cleans up a testnet directory func cleanupDir(dir string) error { if dir == "" { return errors.New("no directory set") } _, err := os.Stat(dir) if os.IsNotExist(err) { return nil } else if err != nil { return err } logger.Info(fmt.Sprintf("Removing testnet directory %q", dir)) // On Linux, some local files in the volume will be owned by root since Tendermint // runs as root inside the container, so we need to clean them up from within a // container running as root too. absDir, err := filepath.Abs(dir) if err != nil { return err } err = execDocker("run", "--rm", "--entrypoint", "", "-v", fmt.Sprintf("%v:/network", absDir), "tendermint/e2e-node", "sh", "-c", "rm -rf /network/*/") if err != nil { return err } return os.RemoveAll(dir) }