Browse Source

test: tag E2E Docker resources and autoremove them (#5558)

Fixes #5555.
pull/5568/head
Erik Grinaker 4 years ago
committed by Erik Grinaker
parent
commit
75879ab1d7
2 changed files with 48 additions and 15 deletions
  1. +44
    -15
      test/e2e/runner/cleanup.go
  2. +4
    -0
      test/e2e/runner/setup.go

+ 44
- 15
test/e2e/runner/cleanup.go View File

@ -11,44 +11,73 @@ import (
// Cleanup removes the Docker Compose containers and testnet directory. // Cleanup removes the Docker Compose containers and testnet directory.
func Cleanup(testnet *e2e.Testnet) error { func Cleanup(testnet *e2e.Testnet) error {
if testnet.Dir == "" {
return errors.New("no directory set")
err := cleanupDocker()
if err != nil {
return err
} }
_, err := os.Stat(testnet.Dir)
if os.IsNotExist(err) {
return nil
} else if err != nil {
err = cleanupDir(testnet.Dir)
if err != nil {
return err return err
} }
return nil
}
// cleanupDocker removes all E2E resources (with label e2e=True), regardless
// of testnet.
func cleanupDocker() error {
logger.Info("Removing Docker containers and networks") logger.Info("Removing Docker containers and networks")
err = execCompose(testnet.Dir, "stop")
// 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 -q --filter label=e2e | xargs %v docker container rm -f", xargsR))
if err != nil {
return err
}
err = exec("bash", "-c", fmt.Sprintf(
"docker network ls -q --filter label=e2e | xargs %v docker network rm", xargsR))
if err != nil { if err != nil {
return err return err
} }
return nil
}
// 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 // 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 // runs as root inside the container, so we need to clean them up from within a
// container running as root too. // container running as root too.
absDir, err := filepath.Abs(testnet.Dir)
absDir, err := filepath.Abs(dir)
if err != nil { if err != nil {
return err return err
} }
err = execDocker("run", "--entrypoint", "", "-v", fmt.Sprintf("%v:/network", absDir),
err = execDocker("run", "--rm", "--entrypoint", "", "-v", fmt.Sprintf("%v:/network", absDir),
"tendermint/e2e-node", "sh", "-c", "rm -rf /network/*/") "tendermint/e2e-node", "sh", "-c", "rm -rf /network/*/")
if err != nil { if err != nil {
return err return err
} }
err = execCompose(testnet.Dir, "down")
err = os.RemoveAll(dir)
if err != nil { if err != nil {
return err return err
} }
logger.Info(fmt.Sprintf("Removing testnet directory %q", testnet.Dir))
err = os.RemoveAll(testnet.Dir)
if err != nil {
return err
}
return nil return nil
} }

+ 4
- 0
test/e2e/runner/setup.go View File

@ -122,6 +122,8 @@ func MakeDockerCompose(testnet *e2e.Testnet) ([]byte, error) {
networks: networks:
{{ .Name }}: {{ .Name }}:
labels:
e2e: true
driver: bridge driver: bridge
{{- if .IPv6 }} {{- if .IPv6 }}
enable_ipv6: true enable_ipv6: true
@ -134,6 +136,8 @@ networks:
services: services:
{{- range .Nodes }} {{- range .Nodes }}
{{ .Name }}: {{ .Name }}:
labels:
e2e: true
container_name: {{ .Name }} container_name: {{ .Name }}
image: tendermint/e2e-node image: tendermint/e2e-node
{{- if eq .ABCIProtocol "builtin" }} {{- if eq .ABCIProtocol "builtin" }}


Loading…
Cancel
Save