コード例 #1
0
def command_sanity_ansible_doc(args, targets, python_version):
    """
    :type args: SanityConfig
    :type targets: SanityTargets
    :type python_version: str
    :rtype: SanityResult
    """
    test = 'ansible-doc'

    with open('test/sanity/ansible-doc/skip.txt', 'r') as skip_fd:
        skip_modules = set(skip_fd.read().splitlines())

    modules = sorted(
        set(m for i in targets.include_external
            for m in i.modules) - set(m for i in targets.exclude_external
                                      for m in i.modules) - skip_modules)

    if not modules:
        return SanitySkipped(test, python_version=python_version)

    env = ansible_environment(args, color=False)
    cmd = ['ansible-doc'] + modules

    try:
        stdout, stderr = intercept_command(args,
                                           cmd,
                                           target_name='ansible-doc',
                                           env=env,
                                           capture=True,
                                           python_version=python_version)
        status = 0
    except SubprocessError as ex:
        stdout = ex.stdout
        stderr = ex.stderr
        status = ex.status

    if status:
        summary = str(SubprocessError(cmd=cmd, status=status, stderr=stderr))
        return SanityFailure(test,
                             summary=summary,
                             python_version=python_version)

    if stdout:
        display.info(stdout.strip(), verbosity=3)

    if stderr:
        summary = 'Output on stderr from ansible-doc is considered an error.\n\n%s' % SubprocessError(
            cmd, stderr=stderr)
        return SanityFailure(test,
                             summary=summary,
                             python_version=python_version)

    return SanitySuccess(test, python_version=python_version)
コード例 #2
0
def command_sanity_import(args, targets, python_version):
    """
    :type args: SanityConfig
    :type targets: SanityTargets
    :type python_version: str
    :rtype: SanityResult
    """
    test = 'import'

    with open('test/sanity/import/skip.txt', 'r') as skip_fd:
        skip_paths = skip_fd.read().splitlines()

    skip_paths_set = set(skip_paths)

    paths = sorted(
        i.path
        for i in targets.include
        if os.path.splitext(i.path)[1] == '.py' and
        (i.path.startswith('lib/ansible/modules/') or i.path.startswith('lib/ansible/module_utils/')) and
        i.path not in skip_paths_set
    )

    if not paths:
        return SanitySkipped(test, python_version=python_version)

    env = ansible_environment(args, color=False)

    # create a clean virtual environment to minimize the available imports beyond the python standard library
    virtual_environment_path = os.path.abspath('test/runner/.tox/minimal-py%s' % python_version.replace('.', ''))
    virtual_environment_bin = os.path.join(virtual_environment_path, 'bin')

    remove_tree(virtual_environment_path)

    cmd = ['virtualenv', virtual_environment_path, '--python', 'python%s' % python_version, '--no-setuptools', '--no-wheel']

    if not args.coverage:
        cmd.append('--no-pip')

    run_command(args, cmd, capture=True)

    # add the importer to our virtual environment so it can be accessed through the coverage injector
    importer_path = os.path.join(virtual_environment_bin, 'importer.py')
    os.symlink(os.path.abspath('test/runner/importer.py'), importer_path)

    # activate the virtual environment
    env['PATH'] = '%s:%s' % (virtual_environment_bin, env['PATH'])
    env['PYTHONPATH'] = os.path.abspath('test/runner/import/lib')

    # make sure coverage is available in the virtual environment if needed
    if args.coverage:
        run_command(args, generate_pip_install('sanity.import', packages=['coverage']), env=env)
        run_command(args, ['pip', 'uninstall', '--disable-pip-version-check', '-y', 'pip'], env=env)

    cmd = ['importer.py'] + paths

    results = []

    try:
        stdout, stderr = intercept_command(args, cmd, target_name=test, env=env, capture=True, python_version=python_version, path=env['PATH'])

        if stdout or stderr:
            raise SubprocessError(cmd, stdout=stdout, stderr=stderr)
    except SubprocessError as ex:
        if ex.status != 10 or ex.stderr or not ex.stdout:
            raise

        pattern = r'^(?P<path>[^:]*):(?P<line>[0-9]+):(?P<column>[0-9]+): (?P<message>.*)$'

        results = [re.search(pattern, line).groupdict() for line in ex.stdout.splitlines()]

        results = [SanityMessage(
            message=r['message'],
            path=r['path'],
            line=int(r['line']),
            column=int(r['column']),
        ) for r in results]

        results = [result for result in results if result.path not in skip_paths]

    if results:
        return SanityFailure(test, messages=results, python_version=python_version)

    return SanitySuccess(test, python_version=python_version)