From a53cc97f196c2faf5bf6d93fa2c85d843e82b4e6 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Fri, 14 Jul 2017 23:38:03 -0400 Subject: [PATCH] ensure prefix in plugin loading to avoid conflicts when using 'all' to load all plugins were ending in main namespace creating conflicts with each other and random modulesr i.e. when trying to access json callback we were getting json 'parsing' lib (cherry picked from commit b93b9e68d71adb4f8688da4be2230af9317e9c62) --- lib/ansible/plugins/__init__.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/ansible/plugins/__init__.py b/lib/ansible/plugins/__init__.py index 5d836bb2727..6677fb3ee75 100644 --- a/lib/ansible/plugins/__init__.py +++ b/lib/ansible/plugins/__init__.py @@ -329,13 +329,18 @@ class PluginLoader: __contains__ = has_plugin def _load_module_source(self, name, path): - if name in sys.modules: - # See https://github.com/ansible/ansible/issues/13110 - return sys.modules[name] + + # avoid collisions across plugins + full_name = '.'.join([self.package, name]) + + if full_name in sys.modules: + # Avoids double loading, See https://github.com/ansible/ansible/issues/13110 + return sys.modules[full_name] + with warnings.catch_warnings(): warnings.simplefilter("ignore", RuntimeWarning) with open(path, 'rb') as module_file: - module = imp.load_source(name, path, module_file) + module = imp.load_source(full_name, path, module_file) return module def get(self, name, *args, **kwargs): @@ -350,7 +355,7 @@ class PluginLoader: return None if path not in self._module_cache: - self._module_cache[path] = self._load_module_source('.'.join([self.package, name]), path) + self._module_cache[path] = self._load_module_source(name, path) found_in_cache = False obj = getattr(self._module_cache[path], self.class_name)