From ebb22655e42f944cfa898488a7cfd3003297ecfe Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Thu, 11 Jun 2020 10:40:25 -0400 Subject: [PATCH] implemented 'prefix' for file based cache (#69872) * implemented 'prefix' for file based cache Co-authored-by: s-hertel --- changelogs/fragments/add_prefix_to_cache.yml | 2 ++ lib/ansible/plugins/cache/__init__.py | 18 +++++++++++++----- .../targets/collections/cache.statichost.yml | 1 + test/integration/targets/collections/runme.sh | 5 +++++ test/integration/targets/set_fact/runme.sh | 9 ++++++++- 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 changelogs/fragments/add_prefix_to_cache.yml diff --git a/changelogs/fragments/add_prefix_to_cache.yml b/changelogs/fragments/add_prefix_to_cache.yml new file mode 100644 index 00000000000..ed98052dbf4 --- /dev/null +++ b/changelogs/fragments/add_prefix_to_cache.yml @@ -0,0 +1,2 @@ +bugfixes: + - added 'unimplemented' prefix to file based caching diff --git a/lib/ansible/plugins/cache/__init__.py b/lib/ansible/plugins/cache/__init__.py index a91b66afe77..68b960e1065 100644 --- a/lib/ansible/plugins/cache/__init__.py +++ b/lib/ansible/plugins/cache/__init__.py @@ -138,6 +138,14 @@ class BaseFileCacheModule(BaseCacheModule): raise AnsibleError("error in '%s' cache, configured path (%s) does not have necessary permissions (rwx), disabling plugin" % ( self.plugin_name, self._cache_dir)) + def _get_cache_file_name(self, key): + prefix = self.get_option('_prefix') + if prefix: + cachefile = "%s/%s%s" % (self._cache_dir, prefix, key) + else: + cachefile = "%s/%s" % (self._cache_dir, key) + return cachefile + def get(self, key): """ This checks the in memory cache first as the fact was not expired at 'gather time' and it would be problematic if the key did expire after some long running tasks and @@ -148,7 +156,7 @@ class BaseFileCacheModule(BaseCacheModule): if self.has_expired(key) or key == "": raise KeyError - cachefile = "%s/%s" % (self._cache_dir, key) + cachefile = self._get_cache_file_name(key) try: value = self._load(cachefile) self._cache[key] = value @@ -170,7 +178,7 @@ class BaseFileCacheModule(BaseCacheModule): self._cache[key] = value - cachefile = "%s/%s" % (self._cache_dir, key) + cachefile = self._get_cache_file_name(key) try: self._dump(value, cachefile) except (OSError, IOError) as e: @@ -181,7 +189,7 @@ class BaseFileCacheModule(BaseCacheModule): if self._timeout == 0: return False - cachefile = "%s/%s" % (self._cache_dir, key) + cachefile = self._get_cache_file_name(key) try: st = os.stat(cachefile) except (OSError, IOError) as e: @@ -206,7 +214,7 @@ class BaseFileCacheModule(BaseCacheModule): return keys def contains(self, key): - cachefile = "%s/%s" % (self._cache_dir, key) + cachefile = self._get_cache_file_name(key) if key in self._cache: return True @@ -228,7 +236,7 @@ class BaseFileCacheModule(BaseCacheModule): except KeyError: pass try: - os.remove("%s/%s" % (self._cache_dir, key)) + os.remove(self._get_cache_file_name(key)) except (OSError, IOError): pass # TODO: only pass on non existing? diff --git a/test/integration/targets/collections/cache.statichost.yml b/test/integration/targets/collections/cache.statichost.yml index 322f41d12a9..b2adcfa63c8 100644 --- a/test/integration/targets/collections/cache.statichost.yml +++ b/test/integration/targets/collections/cache.statichost.yml @@ -4,3 +4,4 @@ hostname: cache_host_a cache_plugin: testns.content_adj.custom_jsonfile cache: yes cache_connection: inventory_cache +cache_prefix: 'prefix_' diff --git a/test/integration/targets/collections/runme.sh b/test/integration/targets/collections/runme.sh index e0c7ef0319c..8a1248193ce 100755 --- a/test/integration/targets/collections/runme.sh +++ b/test/integration/targets/collections/runme.sh @@ -66,6 +66,11 @@ fi CACHEFILE="$(find ./inventory_cache -type f ! -path './inventory_cache/.keep')" +if [[ $CACHEFILE != ./inventory_cache/prefix_* ]]; then + echo "Unexpected cache file" + exit 1 +fi + # Check the cache for the expected hosts if [[ "$(grep -wc "cache_host_a" "$CACHEFILE")" -ne "1" ]]; then diff --git a/test/integration/targets/set_fact/runme.sh b/test/integration/targets/set_fact/runme.sh index 426d2f009e8..364798a1f55 100755 --- a/test/integration/targets/set_fact/runme.sh +++ b/test/integration/targets/set_fact/runme.sh @@ -13,9 +13,16 @@ ANSIBLE_INJECT_FACT_VARS=1 ansible-playbook -i inventory incremental.yml ansible-playbook -i inventory nowarn_clean_facts.yml | grep '[WARNING]: Removed restricted key from module data: ansible_ssh_common_args' && exit 1 # test cached feature -export ANSIBLE_CACHE_PLUGIN=jsonfile ANSIBLE_CACHE_PLUGIN_CONNECTION="${MYTMPDIR}" +export ANSIBLE_CACHE_PLUGIN=jsonfile ANSIBLE_CACHE_PLUGIN_CONNECTION="${MYTMPDIR}" ANSIBLE_CACHE_PLUGIN_PREFIX=prefix_ ansible-playbook -i inventory "$@" set_fact_cached_1.yml ansible-playbook -i inventory "$@" set_fact_cached_2.yml + +# check contents of the fact cache directory before flushing it +if [[ "$(find "${MYTMPDIR}" -type f)" != $MYTMPDIR/prefix_* ]]; then + echo "Unexpected cache file" + exit 1 +fi + ansible-playbook -i inventory --flush-cache "$@" set_fact_no_cache.yml # Test boolean conversions in set_fact