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 ansible import constants as C
from ansible.errors import AnsibleError
from ansible.plugins import cache_loader
try:
@ -33,6 +34,14 @@ class FactCache(MutableMapping):
def __init__(self, *args, **kwargs):
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.
self._display = display

View file

@ -20,6 +20,7 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.compat.tests import unittest, mock
from ansible.errors import AnsibleError
from ansible.plugins.cache import FactCache
from ansible.plugins.cache.base import BaseCacheModule
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(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):