Skip to content

Commit

Permalink
Check sys.modules before loading modules
Browse files Browse the repository at this point in the history
Code for a plugin is usually loaded by a PluginLoader(), and henceforth
available from self._module_cache, which prevents duplicate loading.
However there are situations (e.g. where one action plugin imports code
from another one) where the plugin module might be already imported (and
resident in sys.modules), but not present in the PluginLoader's
_module_cache, which causes imp.load_source() to effectively reload the
module, overwriting global class declarations and causing subtle latent
bugs.

Fixes ansible#13110.
Fixes ansible#12979.
  • Loading branch information
mgedmin committed Nov 10, 2015
1 parent d8fb5ef commit 54eae4a
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/ansible/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ def has_plugin(self, name):
__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]
with open(path, 'r') as module_file:
module = imp.load_source(name, path, module_file)
return module
Expand Down

0 comments on commit 54eae4a

Please sign in to comment.