From 08a5d506bb66fa0beddd1081e8e19f6e5f9d0cab Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Tue, 13 Dec 2016 14:35:15 -0500 Subject: [PATCH] Fix errors on 'ansible-playbook --flush-cache' (#18754) Add a unit test, and split out the flush cache logic to it's own method. Fixes #18708 --- lib/ansible/cli/playbook.py | 8 +++++-- test/units/cli/test_playbook.py | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 test/units/cli/test_playbook.py diff --git a/lib/ansible/cli/playbook.py b/lib/ansible/cli/playbook.py index 544e588465..3dc1870960 100644 --- a/lib/ansible/cli/playbook.py +++ b/lib/ansible/cli/playbook.py @@ -148,8 +148,7 @@ class PlaybookCLI(CLI): # flush fact cache if requested if self.options.flush_cache: - for host in inventory.list_hosts(): - variable_manager.clear_facts(host) + self._flush_cache(inventory, variable_manager) # create the playbook executor, which manages running the plays via a task queue manager pbex = PlaybookExecutor(playbooks=self.args, inventory=inventory, variable_manager=variable_manager, loader=loader, options=self.options, passwords=passwords) @@ -218,3 +217,8 @@ class PlaybookCLI(CLI): return 0 else: return results + + def _flush_cache(self, inventory, variable_manager): + for host in inventory.list_hosts(): + hostname = host.get_name() + variable_manager.clear_facts(hostname) diff --git a/test/units/cli/test_playbook.py b/test/units/cli/test_playbook.py new file mode 100644 index 0000000000..ea6680bf53 --- /dev/null +++ b/test/units/cli/test_playbook.py @@ -0,0 +1,40 @@ +# (c) 2016, Adrian Likins +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.compat.tests import unittest +from units.mock.loader import DictDataLoader + +from ansible.inventory import Inventory +from ansible.vars import VariableManager + +from ansible.cli.playbook import PlaybookCLI + + +class TestPlaybookCLI(unittest.TestCase): + def test_flush_cache(self): + cli = PlaybookCLI(args=["--flush-cache", "foobar.yml"]) + + variable_manager = VariableManager() + fake_loader = DictDataLoader({'foobar.yml': ""}) + inventory = Inventory(loader=fake_loader, variable_manager=variable_manager, host_list=['testhost']) + + cli._flush_cache(inventory, variable_manager) + self.assertFalse('testhost' in variable_manager._fact_cache)