mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Plug-ins loaded from top-level plug-in directory
PluginLoader._get_paths, as of 391fb98e
, was only finding plug-ins that
were in a subdirectory of one of the basedirs (i.e. in a category
directory). For example, action_plugins/foo.py would never be loaded,
but action_plugins/bar/foo.py would work.
This makes it so that "uncategorized" plug-ins in the top level of a
directory such as action_plugins will be loaded, though plug-ins in a
"category" subdirectory will still be preferred. For example,
action_plugins/bar/foo.py would be preferred over action_plugins/foo.py.
This commit is contained in:
parent
1d3782cfc7
commit
611d56dc4c
5 changed files with 46 additions and 3 deletions
|
@ -100,11 +100,10 @@ class PluginLoader(object):
|
||||||
files = glob.glob("%s/*" % fullpath)
|
files = glob.glob("%s/*" % fullpath)
|
||||||
for file in files:
|
for file in files:
|
||||||
if os.path.isdir(file) and file not in ret:
|
if os.path.isdir(file) and file not in ret:
|
||||||
ret.append(file)
|
ret.append(file)
|
||||||
else:
|
|
||||||
if fullpath not in ret:
|
if fullpath not in ret:
|
||||||
ret.append(fullpath)
|
ret.append(fullpath)
|
||||||
|
|
||||||
# look in any configured plugin paths, allow one level deep for subcategories
|
# look in any configured plugin paths, allow one level deep for subcategories
|
||||||
configured_paths = self.config.split(os.pathsep)
|
configured_paths = self.config.split(os.pathsep)
|
||||||
for path in configured_paths:
|
for path in configured_paths:
|
||||||
|
|
|
@ -27,6 +27,7 @@ class TestRunner(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.user = getpass.getuser()
|
self.user = getpass.getuser()
|
||||||
self.runner = ansible.runner.Runner(
|
self.runner = ansible.runner.Runner(
|
||||||
|
basedir='test/',
|
||||||
module_name='ping',
|
module_name='ping',
|
||||||
module_path='library/',
|
module_path='library/',
|
||||||
module_args='',
|
module_args='',
|
||||||
|
@ -77,6 +78,12 @@ class TestRunner(unittest.TestCase):
|
||||||
assert "localhost" in results['contacted']
|
assert "localhost" in results['contacted']
|
||||||
return results['contacted']['localhost']
|
return results['contacted']['localhost']
|
||||||
|
|
||||||
|
def test_action_plugins(self):
|
||||||
|
result = self._run("uncategorized_plugin", [])
|
||||||
|
assert result.get("msg") == "uncategorized"
|
||||||
|
result = self._run("categorized_plugin", [])
|
||||||
|
assert result.get("msg") == "categorized"
|
||||||
|
|
||||||
def test_ping(self):
|
def test_ping(self):
|
||||||
result = self._run('ping', [])
|
result = self._run('ping', [])
|
||||||
assert "ping" in result
|
assert "ping" in result
|
||||||
|
|
15
test/action_plugins/categorized_plugin.py
Normal file
15
test/action_plugins/categorized_plugin.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from ansible.runner import return_data
|
||||||
|
|
||||||
|
|
||||||
|
class ActionModule (object):
|
||||||
|
def __init__(self, runner):
|
||||||
|
self.runner = runner
|
||||||
|
|
||||||
|
def run(self, conn, tmp, module_name, module_args, inject,
|
||||||
|
complex_args=None, **kwargs):
|
||||||
|
# This plug-in should be ignored in deference to
|
||||||
|
# category/categorized_plugin.py, so it should never actually
|
||||||
|
# run.
|
||||||
|
return return_data.ReturnData(
|
||||||
|
conn=conn, comm_ok=True,
|
||||||
|
result={"msg": "this plug-in should never be run"})
|
11
test/action_plugins/category/categorized_plugin.py
Normal file
11
test/action_plugins/category/categorized_plugin.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from ansible.runner import return_data
|
||||||
|
|
||||||
|
|
||||||
|
class ActionModule (object):
|
||||||
|
def __init__(self, runner):
|
||||||
|
self.runner = runner
|
||||||
|
|
||||||
|
def run(self, conn, tmp, module_name, module_args, inject,
|
||||||
|
complex_args=None, **kwargs):
|
||||||
|
return return_data.ReturnData(conn=conn, comm_ok=True,
|
||||||
|
result={"msg": "categorized"})
|
11
test/action_plugins/uncategorized_plugin.py
Normal file
11
test/action_plugins/uncategorized_plugin.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from ansible.runner import return_data
|
||||||
|
|
||||||
|
|
||||||
|
class ActionModule (object):
|
||||||
|
def __init__(self, runner):
|
||||||
|
self.runner = runner
|
||||||
|
|
||||||
|
def run(self, conn, tmp, module_name, module_args, inject,
|
||||||
|
complex_args=None, **kwargs):
|
||||||
|
return return_data.ReturnData(conn=conn, comm_ok=True,
|
||||||
|
result={"msg": "uncategorized"})
|
Loading…
Reference in a new issue