implemented 'prefix' for file based cache (#69872) (#70008)

* implemented 'prefix' for file based cache

Co-authored-by: s-hertel <shertel@redhat.com>
(cherry picked from commit ebb22655e4)
pull/69860/head
Brian Coca 5 years ago committed by GitHub
parent 2cba0dc75c
commit e0322a0420
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
bugfixes:
- added 'unimplemented' prefix to file based caching

@ -132,6 +132,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
@ -142,7 +150,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
@ -164,7 +172,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:
@ -175,7 +183,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:
@ -200,7 +208,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
@ -222,7 +230,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?

@ -0,0 +1,7 @@
# use inventory and cache plugins defined in a content-adjacent collection
plugin: testns.content_adj.statichost
hostname: cache_host_a
cache_plugin: testns.content_adj.custom_jsonfile
cache: yes
cache_connection: inventory_cache
cache_prefix: 'prefix_'

@ -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

Loading…
Cancel
Save