From 5d8bc210bf75e24a57910f8d10b68745a09c3a67 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Fri, 15 Sep 2017 14:14:47 -0400 Subject: [PATCH] fixed issue with default callback inheritance (#30427) * fixed issue with default callback inheritance - callbacks need to document same options as callbacks they inherit from to get them configured - since default is also used by many 3rd party callbacks for inheritance, making the code 'tolerate' the missing docs and fallback to using the direct constant to configure it's options. (cherry picked from commit 81fd67c10fb03d4b46e4f7c9551c5f2f67a82e18) --- lib/ansible/plugins/callback/actionable.py | 2 + lib/ansible/plugins/callback/debug.py | 2 + lib/ansible/plugins/callback/default.py | 37 +++++-------------- lib/ansible/plugins/callback/dense.py | 2 + lib/ansible/plugins/callback/full_skip.py | 2 + lib/ansible/plugins/callback/skippy.py | 2 + lib/ansible/plugins/callback/stderr.py | 2 + .../module_docs_fragments/default_callback.py | 29 +++++++++++++++ 8 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 lib/ansible/utils/module_docs_fragments/default_callback.py diff --git a/lib/ansible/plugins/callback/actionable.py b/lib/ansible/plugins/callback/actionable.py index d738db0cda6..d0127a36d16 100644 --- a/lib/ansible/plugins/callback/actionable.py +++ b/lib/ansible/plugins/callback/actionable.py @@ -14,6 +14,8 @@ DOCUMENTATION = ''' - Use this callback when you dont care about OK nor Skipped. - This callback suppreses any non Failed or Changed status. version_added: "2.1" + extends_documentation_fragment: + - default_callback requirements: - set as stdout callback in configuration ''' diff --git a/lib/ansible/plugins/callback/debug.py b/lib/ansible/plugins/callback/debug.py index 3d5969f648b..247470e1174 100644 --- a/lib/ansible/plugins/callback/debug.py +++ b/lib/ansible/plugins/callback/debug.py @@ -11,6 +11,8 @@ DOCUMENTATION = ''' description: - Use this callback to sort though extensive debug output version_added: "2.4" + extends_documentation_fragment: + - default_callback requirements: - set as stdout in configuration ''' diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py index 23c10a73ecb..03c5f495b5b 100644 --- a/lib/ansible/plugins/callback/default.py +++ b/lib/ansible/plugins/callback/default.py @@ -12,27 +12,8 @@ DOCUMENTATION = ''' version_added: historical description: - This is the default output callback for ansible-playbook. - options: - show_skipped_hosts: - name: Show skipped hosts - description: "Toggle to control displaying skipped task/host results in a task" - default: True - env: - - name: DISPLAY_SKIPPED_HOSTS - ini: - - key: display_skipped_hosts - section: defaults - type: boolean - show_custom_stats: - name: Show custom stats - description: 'This adds the custom stats set via the set_stats plugin to the play recap' - default: False - env: - - name: ANSIBLE_SHOW_CUSTOM_STATS - ini: - - key: show_custom_stats - section: defaults - type: bool + extends_documentation_fragment: + - default_callback requirements: - set as stdout in configuration ''' @@ -118,9 +99,8 @@ class CallbackModule(CallbackBase): self._display.display(msg, color=color) def v2_runner_on_skipped(self, result): - if self._plugin_options['show_skipped_hosts']: + if self._plugin_options.get('show_skipped_hosts', C.DISPLAY_SKIPPED_HOSTS): # fallback on constants for inherited plugins missing docs - delegated_vars = result._result.get('_ansible_delegated_vars', None) self._clean_results(result._result, result._task.action) if self._play.strategy == 'free' and self._last_task_banner != result._task._uuid: @@ -247,7 +227,7 @@ class CallbackModule(CallbackBase): self._display.display(msg + " (item=%s) => %s" % (self._get_item(result._result), self._dump_results(result._result)), color=C.COLOR_ERROR) def v2_runner_item_on_skipped(self, result): - if self._plugin_options['show_skipped_hosts']: + if self._plugin_options.get('show_skipped_hosts', C.DISPLAY_SKIPPED_HOSTS): # fallback on constants for inherited plugins missing docs self._clean_results(result._result, result._task.action) msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result)) if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: @@ -286,7 +266,7 @@ class CallbackModule(CallbackBase): self._display.display("", screen_only=True) # print custom stats - if self._plugin_options['show_custom_stats'] and stats.custom: + if self._plugin_options.get('show_custom_stats', C.SHOW_CUSTOM_STATS) and stats.custom: # fallback on constants for inherited plugins missing docs self._display.banner("CUSTOM STATS: ") # per host # TODO: come up with 'pretty format' @@ -307,11 +287,12 @@ class CallbackModule(CallbackBase): self._display.banner("PLAYBOOK: %s" % basename(playbook._file_name)) if self._display.verbosity > 3: - if self._plugin_options is not None: - for option in dir(self._plugin_options): + # show CLI options + if self._options is not None: + for option in dir(self._options): if option.startswith('_') or option in ['read_file', 'ensure_value', 'read_module']: continue - val = getattr(self._plugin_options, option) + val = getattr(self._options, option) if val: self._display.vvvv('%s: %s' % (option, val)) diff --git a/lib/ansible/plugins/callback/dense.py b/lib/ansible/plugins/callback/dense.py index 4694b76ada1..0c120fce656 100644 --- a/lib/ansible/plugins/callback/dense.py +++ b/lib/ansible/plugins/callback/dense.py @@ -9,6 +9,8 @@ DOCUMENTATION = ''' callback: dense type: stdout short_description: minimal stdout output + extends_documentation_fragment: + - default_callback description: - When in verbose mode it will act the same as the default callback version_added: "2.3" diff --git a/lib/ansible/plugins/callback/full_skip.py b/lib/ansible/plugins/callback/full_skip.py index fdb8a6d4101..bc5b0dbfb27 100644 --- a/lib/ansible/plugins/callback/full_skip.py +++ b/lib/ansible/plugins/callback/full_skip.py @@ -13,6 +13,8 @@ DOCUMENTATION = ''' description: - Use this plugin when you dont care about any output for tasks that were completly skipped version_added: "2.4" + extends_documentation_fragment: + - default_callback requirements: - set as stdout in configuation ''' diff --git a/lib/ansible/plugins/callback/skippy.py b/lib/ansible/plugins/callback/skippy.py index bf7745cf272..92076cc146e 100644 --- a/lib/ansible/plugins/callback/skippy.py +++ b/lib/ansible/plugins/callback/skippy.py @@ -13,6 +13,8 @@ DOCUMENTATION = ''' - set as main display callback short_description: Ansible screen output that ignores skipped status version_added: "2.0" + extends_documentation_fragment: + - default_callback description: - This callback does the same as the default except it does not output skipped host/task/item status ''' diff --git a/lib/ansible/plugins/callback/stderr.py b/lib/ansible/plugins/callback/stderr.py index fcf53850d22..9d8240cb1b1 100644 --- a/lib/ansible/plugins/callback/stderr.py +++ b/lib/ansible/plugins/callback/stderr.py @@ -13,6 +13,8 @@ DOCUMENTATION = ''' - set as main display callback short_description: Splits output, sending failed tasks to stderr version_added: "2.4" + extends_documentation_fragment: + - default_callback description: - This is the stderr callback plugin, it behaves like the default callback plugin but sends error output to stderr. - Also it does not output skipped host/task/item status diff --git a/lib/ansible/utils/module_docs_fragments/default_callback.py b/lib/ansible/utils/module_docs_fragments/default_callback.py new file mode 100644 index 00000000000..9cca95e9faf --- /dev/null +++ b/lib/ansible/utils/module_docs_fragments/default_callback.py @@ -0,0 +1,29 @@ +# (c) 2017 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +class ModuleDocFragment(object): + + DOCUMENTATION = """ + options: + show_skipped_hosts: + name: Show skipped hosts + description: "Toggle to control displaying skipped task/host results in a task" + default: True + env: + - name: DISPLAY_SKIPPED_HOSTS + ini: + - key: display_skipped_hosts + section: defaults + type: boolean + show_custom_stats: + name: Show custom stats + description: 'This adds the custom stats set via the set_stats plugin to the play recap' + default: False + env: + - name: ANSIBLE_SHOW_CUSTOM_STATS + ini: + - key: show_custom_stats + section: defaults + type: bool +"""