Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd_runner: added flag check_mode_skip to context #4736

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelogs/fragments/4736-cmd-runner-skip-if-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- cmd_runner module util - added parameters ``check_mode_skip`` and ``check_mode_return`` to ``CmdRunner.context()``, so that the command is not executed when ``check_mode=True`` (https://github.com/ansible-collections/community.general/pull/4736).
12 changes: 9 additions & 3 deletions plugins/module_utils/cmd_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ def __init__(self, module, command, arg_formats=None, default_args_order=(),
if mod_param_name not in self.arg_formats:
self.arg_formats[mod_param_name] = _Format.as_default_type(spec['type'], mod_param_name)

def context(self, args_order=None, output_process=None, ignore_value_none=True, **kwargs):
def context(self, args_order=None, output_process=None, ignore_value_none=True, check_mode_skip=False, check_mode_return=None, **kwargs):
if output_process is None:
output_process = _process_as_is
if args_order is None:
Expand All @@ -209,18 +209,22 @@ def context(self, args_order=None, output_process=None, ignore_value_none=True,
return _CmdRunnerContext(runner=self,
args_order=args_order,
output_process=output_process,
ignore_value_none=ignore_value_none, **kwargs)
ignore_value_none=ignore_value_none,
check_mode_skip=check_mode_skip,
check_mode_return=check_mode_return, **kwargs)

def has_arg_format(self, arg):
return arg in self.arg_formats


class _CmdRunnerContext(object):
def __init__(self, runner, args_order, output_process, ignore_value_none, **kwargs):
def __init__(self, runner, args_order, output_process, ignore_value_none, check_mode_skip, check_mode_return, **kwargs):
self.runner = runner
self.args_order = tuple(args_order)
self.output_process = output_process
self.ignore_value_none = ignore_value_none
self.check_mode_skip = check_mode_skip
self.check_mode_return = check_mode_return
self.run_command_args = dict(kwargs)

self.environ_update = runner.environ_update
Expand Down Expand Up @@ -260,6 +264,8 @@ def run(self, **kwargs):
except Exception as e:
raise FormatError(arg_name, value, runner.arg_formats[arg_name], e)

if self.check_mode_skip and module.check_mode:
return self.check_mode_return
results = module.run_command(self.cmd, **self.run_command_args)
self.results_rc, self.results_out, self.results_err = results
self.results_processed = self.output_process(*results)
Expand Down
42 changes: 9 additions & 33 deletions tests/integration/targets/cmd_runner/library/cmd_echo.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,8 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type

import sys

DOCUMENTATION = '''
module: cmd_echo
author: "Alexei Znamensky (@russoz)"
short_description: Simple module for testing
description:
- Simple module test description.
options:
command:
description: aaa
type: list
elements: str
required: true
arg_formats:
description: bbb
type: dict
required: true
arg_order:
description: ccc
type: raw
required: true
arg_values:
description: ddd
type: list
required: true
aa:
description: eee
type: raw
'''

DOCUMENTATION = ""

EXAMPLES = ""

Expand All @@ -51,11 +23,15 @@ def main():
arg_formats=dict(type="dict", default={}),
arg_order=dict(type="raw", required=True),
arg_values=dict(type="dict", default={}),
check_mode_skip=dict(type="bool", default=False),
aa=dict(type="raw"),
),
supports_check_mode=True,
)
p = module.params

info = None

arg_formats = {}
for arg, fmt_spec in p['arg_formats'].items():
func = getattr(fmt, fmt_spec['func'])
Expand All @@ -65,11 +41,11 @@ def main():

runner = CmdRunner(module, ['echo', '--'], arg_formats=arg_formats)

info = None
with runner.context(p['arg_order']) as ctx:
with runner.context(p['arg_order'], check_mode_skip=p['check_mode_skip']) as ctx:
result = ctx.run(**p['arg_values'])
info = ctx.run_info
rc, out, err = result
check = "check"
rc, out, err = result if result is not None else (None, None, None)

module.exit_json(rc=rc, out=out, err=err, info=info)

Expand Down
2 changes: 2 additions & 0 deletions tests/integration/targets/cmd_runner/tasks/test_cmd_echo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
arg_formats: "{{ item.arg_formats|default(omit) }}"
arg_order: "{{ item.arg_order }}"
arg_values: "{{ item.arg_values|default(omit) }}"
check_mode_skip: "{{ item.check_mode_skip|default(omit) }}"
aa: "{{ item.aa|default(omit) }}"
register: test_result
check_mode: "{{ item.check_mode|default(omit) }}"
ignore_errors: "{{ item.expect_error|default(omit) }}"

- name: check results [{{ item.name }}]
Expand Down
38 changes: 38 additions & 0 deletions tests/integration/targets/cmd_runner/vars/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,41 @@ cmd_echo_tests:
- >-
"MissingArgumentValue: Cannot find value for parameter bb"
in test_result.module_stderr

- name: set aa and bb value with check_mode on
arg_formats:
aa:
func: as_opt_eq_val
args: [--answer]
bb:
func: as_bool
args: [--bb-here]
arg_order: 'aa bb'
arg_values:
bb: true
aa: 11
check_mode: true
assertions:
- test_result.rc == 0
- test_result.out == "-- --answer=11 --bb-here\n"
- test_result.err == ""

- name: set aa and bb value with check_mode and check_mode_skip on
arg_formats:
aa:
func: as_opt_eq_val
args: [--answer]
bb:
func: as_bool
args: [--bb-here]
arg_order: 'aa bb'
arg_values:
bb: true
check_mode_skip: true
aa: 11
check_mode: true
expect_error: true # because if result contains rc != 0, ansible assumes error
assertions:
- test_result.rc == None
- test_result.out == None
- test_result.err == None