From ad45bd72c1c214e7b126c7709448a140392e963f Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Wed, 5 Dec 2018 12:41:57 -0800 Subject: [PATCH] Fix for a caching traceback When the user specified caching plugin doesn't initialize correctly, we were falling back to a dict. however, dicts do not have the same update() method as the FactCache. We use the update method when we update a cache with a subsequent value. So when that combination of things happened, the code would traceback. In devel, we made this change to fix things: https://github.com/ansible/ansible/pull/49516 but that involves several deprecations. So we're doing this smaller hack in 2.7 to fix the traceback without introducing those deprecations in a stable release. --- changelogs/fragments/vm_fix.yml | 2 ++ lib/ansible/vars/manager.py | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/vm_fix.yml diff --git a/changelogs/fragments/vm_fix.yml b/changelogs/fragments/vm_fix.yml new file mode 100644 index 00000000000..29bd711dc7d --- /dev/null +++ b/changelogs/fragments/vm_fix.yml @@ -0,0 +1,2 @@ +bugfixes: +- Fix traceback when updating facts and the fact cache plugin was nonfunctional diff --git a/lib/ansible/vars/manager.py b/lib/ansible/vars/manager.py index 8a8efc13ef5..cb58ed63fcb 100644 --- a/lib/ansible/vars/manager.py +++ b/lib/ansible/vars/manager.py @@ -622,10 +622,21 @@ class VariableManager: if host.name not in self._fact_cache: self._fact_cache[host.name] = facts else: - try: - self._fact_cache.update(host.name, facts) - except KeyError: - self._fact_cache[host.name] = facts + if isinstance(self._fact_cache, FactCache): + try: + self._fact_cache.update(host.name, facts) + except KeyError: + self._fact_cache[host.name] = facts + else: + # Dictionary fallback so we need to use a dictionary update. + try: + host_cache = self._fact_cache[host.name] + except KeyError: + host_cache = facts + else: + host_cache.update(facts) + + self._fact_cache[host.name] = host_cache def set_nonpersistent_facts(self, host, facts): '''