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

* implemented 'prefix' for file based cache

Co-authored-by: s-hertel <shertel@redhat.com>
This commit is contained in:
Brian Coca 2020-06-11 10:40:25 -04:00 committed by GitHub
parent ad37218200
commit ebb22655e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 6 deletions

View file

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

View file

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

View file

@ -4,3 +4,4 @@ hostname: cache_host_a
cache_plugin: testns.content_adj.custom_jsonfile
cache: yes
cache_connection: inventory_cache
cache_prefix: 'prefix_'

View file

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

View file

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