Blame tests/test_playbook_runs.py

Packit Service 0a38ef
#!/usr/bin/env python
Packit Service 0a38ef
Packit Service 0a38ef
import os
Packit Service 0a38ef
import functools
Packit Service 0a38ef
import tempfile
Packit Service 0a38ef
Packit Service 0a38ef
from subprocess import Popen
Packit Service 0a38ef
Packit Service 0a38ef
from unittest import TestCase
Packit Service 0a38ef
Packit Service 0a38ef
import pytest
Packit Service 0a38ef
Packit Service 0a38ef
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def get_inventory_content():
Packit Service 0a38ef
    ipa_server_host = os.getenv("IPA_SERVER_HOST")
Packit Service 0a38ef
    return "[ipaserver]\n{}".format(ipa_server_host).encode("utf8")
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def run_playbook(playbook):
Packit Service 0a38ef
    with tempfile.NamedTemporaryFile() as inventory_file:
Packit Service 0a38ef
        inventory_file.write(get_inventory_content())
Packit Service 0a38ef
        inventory_file.flush()
Packit Service 0a38ef
        cmd = [
Packit Service 0a38ef
            "ansible-playbook",
Packit Service 0a38ef
            "-i",
Packit Service 0a38ef
            inventory_file.name,
Packit Service 0a38ef
            playbook,
Packit Service 0a38ef
        ]
Packit Service 0a38ef
        process = Popen(cmd, cwd=SCRIPT_DIR)
Packit Service 0a38ef
        process.wait()
Packit Service 0a38ef
Packit Service 0a38ef
    return process
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def list_test_yaml(dir_path):
Packit Service 0a38ef
    yamls = []
Packit Service 0a38ef
    for yaml_name in os.listdir(dir_path):
Packit Service 0a38ef
        if yaml_name.startswith("test_") and yaml_name.endswith(".yml"):
Packit Service 0a38ef
            yamls.append(
Packit Service 0a38ef
                {
Packit Service 0a38ef
                    "path": os.path.join(dir_path, yaml_name),
Packit Service 0a38ef
                    "name": yaml_name.split(".")[0],
Packit Service 0a38ef
                }
Packit Service 0a38ef
            )
Packit Service 0a38ef
    return yamls
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def get_test_groups():
Packit Service 0a38ef
    test_dirs = os.listdir(SCRIPT_DIR)
Packit Service 0a38ef
    groups = {}
Packit Service 0a38ef
    for test_group_dir in test_dirs:
Packit Service 0a38ef
        group_dir_path = os.path.join(SCRIPT_DIR, test_group_dir)
Packit Service 0a38ef
        if not os.path.isdir(group_dir_path):
Packit Service 0a38ef
            continue
Packit Service 0a38ef
        yamls = list_test_yaml(group_dir_path)
Packit Service 0a38ef
        if yamls:
Packit Service 0a38ef
            groups[test_group_dir] = yamls
Packit Service 0a38ef
    return groups
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def prepare_test(test_name, test_path):
Packit Service 0a38ef
    def decorator(func):
Packit Service 0a38ef
        @functools.wraps(func)
Packit Service 0a38ef
        def wrapper(*args, **kwargs):
Packit Service 0a38ef
            kwargs["test_path"] = test_path
Packit Service 0a38ef
            return func(*args, **kwargs)
Packit Service 0a38ef
Packit Service 0a38ef
        return wrapper
Packit Service 0a38ef
Packit Service 0a38ef
    decorator.__name__ = test_name
Packit Service 0a38ef
    return decorator
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
# Dynamically create the TestCase classes with respective
Packit Service 0a38ef
#   test_* methods.
Packit Service 0a38ef
for group_name, group_tests in get_test_groups().items():
Packit Service 0a38ef
    _tests = {}
Packit Service 0a38ef
    for test_config in group_tests:
Packit Service 0a38ef
        test_name = test_config["name"].replace("-", "_")
Packit Service 0a38ef
        test_path = test_config["path"]
Packit Service 0a38ef
Packit Service 0a38ef
        @pytest.mark.skipif(
Packit Service 0a38ef
            os.getenv("IPA_SERVER_HOST") is None,
Packit Service 0a38ef
            reason="Environment variable IPA_SERVER_HOST must be set",
Packit Service 0a38ef
        )
Packit Service 0a38ef
        @prepare_test(test_name, test_path)
Packit Service 0a38ef
        def method(self, test_path):
Packit Service 0a38ef
            result = run_playbook(test_path)
Packit Service 0a38ef
            assert result.returncode == 0
Packit Service 0a38ef
Packit Service 0a38ef
        _tests[test_name] = method
Packit Service 0a38ef
    globals()[group_name] = type(group_name, (TestCase,), _tests)