Blame utils/ansible-doc-test

Packit Service ee01e6
#!/usr/bin/python
Packit Service a166ed
# -*- coding: utf-8 -*-
Packit Service a166ed
Packit Service a166ed
# Authors:
Packit Service a166ed
#   Thomas Woerner <twoerner@redhat.com>
Packit Service a166ed
#
Packit Service a166ed
# Copyright (C) 2020 Red Hat
Packit Service a166ed
# see file 'COPYING' for use and warranty information
Packit Service a166ed
#
Packit Service a166ed
# This program is free software; you can redistribute it and/or modify
Packit Service a166ed
# it under the terms of the GNU General Public License as published by
Packit Service a166ed
# the Free Software Foundation, either version 3 of the License, or
Packit Service a166ed
# (at your option) any later version.
Packit Service a166ed
#
Packit Service a166ed
# This program is distributed in the hope that it will be useful,
Packit Service a166ed
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a166ed
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a166ed
# GNU General Public License for more details.
Packit Service a166ed
#
Packit Service a166ed
# You should have received a copy of the GNU General Public License
Packit Service a166ed
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service a166ed
Packit Service a166ed
import os
Packit Service a166ed
import os.path
Packit Service a166ed
import sys
Packit Service a166ed
import argparse
Packit Service a166ed
import subprocess
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def run_ansible_doc(role, module, verbose=False):
Packit Service a166ed
    playbook_dir, module_path = get_playbook_dir(role, module)
Packit Service a166ed
Packit Service a166ed
    command = ["ansible-doc",
Packit Service a166ed
               "--playbook-dir=%s" % playbook_dir,
Packit Service a166ed
               "--type=module",
Packit Service a166ed
               "-vvv",
Packit Service a166ed
               module]
Packit Service a166ed
    process = subprocess.run(command,
Packit Service a166ed
                             stdout=subprocess.PIPE,
Packit Service a166ed
                             stderr=subprocess.PIPE)
Packit Service a166ed
    stdout = process.stdout.decode("utf8")
Packit Service a166ed
    stderr = process.stderr.decode("utf8")
Packit Service a166ed
    if process.returncode != 0 or "WARNING" in stderr:
Packit Service a166ed
        print("%s\n%s" % (module_path, stderr))
Packit Service a166ed
        print("%s\n%s" % (module_path, stdout))
Packit Service a166ed
        return 1
Packit Service a166ed
    elif verbose == 1:
Packit Service a166ed
        print(module_path)
Packit Service a166ed
    elif verbose > 1:
Packit Service a166ed
        print("%s\n%s" % (module_path, stdout))
Packit Service a166ed
    return 0
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def get_playbook_dir(role, module):
Packit Service a166ed
    if module is None:
Packit Service a166ed
        raise IOError("module is not set")
Packit Service a166ed
Packit Service a166ed
    if role is not None:
Packit Service a166ed
        playbook_dir = "roles/%s" % role
Packit Service a166ed
        module_path = "%s/library/%s" % (playbook_dir, module)
Packit Service a166ed
        if not os.path.isfile(module_path):
Packit Service a166ed
            raise IOError("No module '%s' in role '%s'" % (module, role))
Packit Service a166ed
    else:
Packit Service a166ed
        playbook_dir = "."
Packit Service a166ed
        module_path = "plugins/modules/%s" % module
Packit Service a166ed
        if not os.path.isfile(module_path):
Packit Service a166ed
            raise IOError("No module '%s'" % module)
Packit Service a166ed
Packit Service a166ed
    return playbook_dir, module_path
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
def ansible_doc_test(path, verbose):
Packit Service a166ed
    role = None
Packit Service a166ed
    module = None
Packit Service a166ed
    only_roles = False
Packit Service a166ed
    only_modules = False
Packit Service a166ed
Packit Service a166ed
    if path is not None:
Packit Service a166ed
        if path.startswith("roles/") and len(path) > 6:
Packit Service a166ed
            _path = path[6:].split("/")
Packit Service a166ed
            role = _path[0]
Packit Service a166ed
            if len(_path) == 2 and _path[1] == "":
Packit Service a166ed
                pass
Packit Service a166ed
            elif len(_path) == 3 and _path[1] == "library":
Packit Service a166ed
                module = _path[2]
Packit Service a166ed
                if module == "":
Packit Service a166ed
                    module = None
Packit Service a166ed
            elif len(_path) > 1:
Packit Service a166ed
                # Ignore other paths
Packit Service a166ed
                return 0
Packit Service a166ed
Packit Service a166ed
        elif path in ["roles", "roles/"]:
Packit Service a166ed
            # roles only
Packit Service a166ed
            only_roles = True
Packit Service a166ed
        elif path.startswith("plugins/modules/") and len(path) > 16:
Packit Service a166ed
            _path = path[16:].split("/")
Packit Service a166ed
            if len(_path) == 1:
Packit Service a166ed
                module = _path[0]
Packit Service a166ed
            else:
Packit Service a166ed
                # Ignore other paths
Packit Service a166ed
                return 0
Packit Service a166ed
        elif path in ["plugins", "plugins/",
Packit Service a166ed
                      "plugins/modules", "plugins/modules/"]:
Packit Service a166ed
            only_modules = True
Packit Service a166ed
        else:
Packit Service a166ed
            # Ignore other paths
Packit Service a166ed
            return 0
Packit Service a166ed
Packit Service a166ed
    errors = 0
Packit Service a166ed
    try:
Packit Service a166ed
        if role and not os.path.isdir("roles/%s" % role):
Packit Service a166ed
            raise IOError("No role '%s'" % role)
Packit Service a166ed
Packit Service a166ed
        if module:
Packit Service a166ed
            errors += run_ansible_doc(role, module, verbose)
Packit Service a166ed
        elif role:
Packit Service a166ed
            # All modules in role
Packit Service a166ed
            modules = os.listdir("roles/%s/library" % role)
Packit Service a166ed
            for _module in modules:
Packit Service a166ed
                if _module.endswith(".py"):
Packit Service a166ed
                    errors += run_ansible_doc(role, _module, verbose)
Packit Service a166ed
        else:
Packit Service a166ed
            if not only_modules:
Packit Service a166ed
                # All roles and plugins
Packit Service a166ed
                roles = os.listdir("roles/")
Packit Service a166ed
                for _role in roles:
Packit Service a166ed
                    if (
Packit Service a166ed
                        not os.path.isdir("roles/%s" % _role)
Packit Service a166ed
                        or not os.path.isdir("roles/%s/library" % _role)
Packit Service a166ed
                    ):
Packit Service a166ed
                        continue
Packit Service a166ed
                    modules = os.listdir("roles/%s/library" % _role)
Packit Service a166ed
                    for _module in modules:
Packit Service a166ed
                        if _module.endswith(".py"):
Packit Service a166ed
                            errors += run_ansible_doc(_role, _module, verbose)
Packit Service a166ed
            if not only_roles:
Packit Service a166ed
                modules = os.listdir("plugins/modules")
Packit Service a166ed
                for _module in modules:
Packit Service a166ed
                    if _module.endswith(".py"):
Packit Service a166ed
                        errors += run_ansible_doc(None, _module, verbose)
Packit Service a166ed
    except IOError as e:
Packit Service a166ed
        print(str(e))
Packit Service a166ed
        errors += 1
Packit Service a166ed
Packit Service a166ed
    return errors
Packit Service a166ed
Packit Service a166ed
Packit Service a166ed
usage = "Usage: ansible-doc-test [options] [path]"
Packit Service a166ed
parser = argparse.ArgumentParser(usage=usage)
Packit Service a166ed
parser.add_argument("-v", dest="verbose", action="count",
Packit Service a166ed
                    help="increase output verbosity", default=0)
Packit Service a166ed
options, args = parser.parse_known_args()
Packit Service a166ed
Packit Service a166ed
errors = 0
Packit Service a166ed
Packit Service a166ed
for arg in args:
Packit Service a166ed
    errors += ansible_doc_test(arg, options.verbose)
Packit Service a166ed
if len(args) == 0:
Packit Service a166ed
    errors += ansible_doc_test(None, options.verbose)
Packit Service a166ed
Packit Service a166ed
if errors != 0:
Packit Service a166ed
    sys.exit(1)