Blame tests/cleanup.py

a614dfd
"""
a614dfd
cleanup docker container/images and mock root for smoke testing
a614dfd
"""
a614dfd
a614dfd
import logging
a614dfd
import subprocess
a614dfd
import re
a614dfd
a614dfd
a614dfd
log = logging.getLogger('avocado.test')
a614dfd
a614dfd
def cleanup_docker_and_mock(mockcfg, img_name):
a614dfd
a614dfd
    # Clean-up old test artifacts (docker containers, image, mock root)
a614dfd
a614dfd
    docker_containerlist_cmdline = 'docker ps --filter=ancestor=%s -a -q' % img_name
a614dfd
    try:
a614dfd
        containerlist = subprocess.check_output(docker_containerlist_cmdline,
a614dfd
            stderr = subprocess.STDOUT, shell = True)
a614dfd
    except subprocess.CalledProcessError as e:
a614dfd
        log.error("command '%s' returned exit status %d; output:\n%s" %
a614dfd
            (e.cmd, e.returncode, e.output))
a614dfd
        raise
a614dfd
    else:
a614dfd
        log.info("docker container list with '%s' succeeded with output:\n%s" %
a614dfd
            (docker_containerlist_cmdline, containerlist))
a614dfd
a614dfd
    if containerlist:
a614dfd
        containers = re.sub('[\r\n]+', ' ', containerlist)
a614dfd
        log.info("docker containers using image %s need to be removed: %s\n" %
a614dfd
            (img_name, containers));
a614dfd
        docker_teardown_cmdline = 'docker rm -f %s' % containers
a614dfd
        try:
a614dfd
            docker_teardown_output = subprocess.check_output(docker_teardown_cmdline,
a614dfd
                stderr = subprocess.STDOUT, shell = True)
a614dfd
        except subprocess.CalledProcessError as e:
a614dfd
            log.error("command '%s' returned exit status %d; output:\n%s" %
a614dfd
                (e.cmd, e.returncode, e.output))
a614dfd
            raise
a614dfd
        else:
a614dfd
            log.info("docker container teardown with '%s' succeeded with output:\n%s" %
a614dfd
                (docker_teardown_cmdline, docker_teardown_output))
a614dfd
    else:
a614dfd
        log.info("no docker containers are using image %s\n" % img_name)
a614dfd
a614dfd
    docker_teardown_cmdline = 'docker rmi %s' % img_name
a614dfd
    try:
a614dfd
        docker_teardown_output = subprocess.check_output(docker_teardown_cmdline,
a614dfd
            stderr = subprocess.STDOUT, shell = True)
a614dfd
    except subprocess.CalledProcessError as e:
a614dfd
        if "No such image" not in e.output:
a614dfd
            log.error("command '%s' returned exit status %d; output:\n%s" %
a614dfd
                (e.cmd, e.returncode, e.output))
a614dfd
            raise
a614dfd
        else:
a614dfd
            log.info("No existing docker image named %s" % img_name)
a614dfd
    else:
a614dfd
        log.info("docker teardown with '%s' succeeded with output:\n%s" %
a614dfd
            (docker_teardown_cmdline, docker_teardown_output))
a614dfd
a614dfd
    mock_teardown_cmdline = ['mock', '-r', mockcfg, '--scrub=all']
a614dfd
    try:
a614dfd
        mock_teardown_output = subprocess.check_output(mock_teardown_cmdline,
a614dfd
            stderr = subprocess.STDOUT)
a614dfd
    except subprocess.CalledProcessError as e:
a614dfd
        log.error("command '%s' returned exit status %d; output:\n%s" %
a614dfd
            (e.cmd, e.returncode, e.output))
a614dfd
        raise
a614dfd
    log.info("mock teardown with '%s' succeeded with output:\n%s" %
a614dfd
        (mock_teardown_cmdline, mock_teardown_output))
a614dfd
a614dfd
a614dfd
a614dfd
a614dfd