Provide slightly better msg on fact cache error (#18759)

If the configured fact_cache plugin (fact_caching config)
fails, raise a fatal error instead of failing mysteriously
later.

Fixes #18751
This commit is contained in:
Adrian Likins 2016-12-13 14:34:58 -05:00 committed by GitHub
parent 2979488b08
commit 6c4f554f5a
2 changed files with 18 additions and 0 deletions

View file

@ -20,6 +20,7 @@ __metaclass__ = type
from collections import MutableMapping from collections import MutableMapping
from ansible import constants as C from ansible import constants as C
from ansible.errors import AnsibleError
from ansible.plugins import cache_loader from ansible.plugins import cache_loader
try: try:
@ -33,6 +34,14 @@ class FactCache(MutableMapping):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._plugin = cache_loader.get(C.CACHE_PLUGIN) self._plugin = cache_loader.get(C.CACHE_PLUGIN)
if not self._plugin:
raise AnsibleError('Unable to load the facts cache plugin (%s)\n'
'Check fact cache config options :\n'
'Current values:\n'
' fact_caching: %s\n'
' fact_caching_connection: %s' %
(C.CACHE_PLUGIN, C.CACHE_PLUGIN, C.CACHE_PLUGIN_CONNECTION))
# Backwards compat: self._display isn't really needed, just import the global display and use that. # Backwards compat: self._display isn't really needed, just import the global display and use that.
self._display = display self._display = display

View file

@ -20,6 +20,7 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
from ansible.compat.tests import unittest, mock from ansible.compat.tests import unittest, mock
from ansible.errors import AnsibleError
from ansible.plugins.cache import FactCache from ansible.plugins.cache import FactCache
from ansible.plugins.cache.base import BaseCacheModule from ansible.plugins.cache.base import BaseCacheModule
from ansible.plugins.cache.memory import CacheModule as MemoryCache from ansible.plugins.cache.memory import CacheModule as MemoryCache
@ -56,6 +57,14 @@ class TestFactCache(unittest.TestCase):
self.assertEqual(type(a_copy), dict) self.assertEqual(type(a_copy), dict)
self.assertEqual(a_copy, dict(avocado='fruit', daisy='flower')) self.assertEqual(a_copy, dict(avocado='fruit', daisy='flower'))
def test_plugin_load_failure(self):
# See https://github.com/ansible/ansible/issues/18751
# Note no fact_connection config set, so this will fail
with mock.patch('ansible.constants.CACHE_PLUGIN', 'json'):
self.assertRaisesRegexp(AnsibleError,
"Unable to load the facts cache plugin.*json.*",
FactCache)
class TestAbstractClass(unittest.TestCase): class TestAbstractClass(unittest.TestCase):