|
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)
|