mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Implement requires_salt_modules
as a pytest marker
This commit is contained in:
parent
85e387d13b
commit
3f60d83694
1 changed files with 39 additions and 0 deletions
|
@ -16,6 +16,7 @@ import stat
|
|||
import pprint
|
||||
import shutil
|
||||
import socket
|
||||
import fnmatch
|
||||
import logging
|
||||
import tempfile
|
||||
import textwrap
|
||||
|
@ -252,6 +253,10 @@ def pytest_configure(config):
|
|||
'requires_network(only_local_network=False): Skip if no networking is set up. '
|
||||
'If \'only_local_network\' is \'True\', only the local network is checked.'
|
||||
)
|
||||
config.addinivalue_line(
|
||||
'markers',
|
||||
'requires_salt_modules(*required_module_names): Skip if at least one module is not available. '
|
||||
)
|
||||
# Make sure the test suite "knows" this is a pytest test run
|
||||
RUNTIME_VARS.PYTEST_SESSION = True
|
||||
# <---- Register Markers ---------------------------------------------------------------------------------------------
|
||||
|
@ -448,6 +453,40 @@ def pytest_runtest_setup(item):
|
|||
continue
|
||||
else:
|
||||
pytest.skip('No internet network connection was detected')
|
||||
|
||||
requires_salt_modules_marker = item.get_closest_marker('requires_salt_modules')
|
||||
if requires_salt_modules_marker is not None:
|
||||
required_salt_modules = requires_salt_modules_marker.args
|
||||
if len(required_salt_modules) == 1 and isinstance(required_salt_modules[0], (list, tuple, set)):
|
||||
required_salt_modules = required_salt_modules[0]
|
||||
required_salt_modules = set(required_salt_modules)
|
||||
sminion = create_sminion()
|
||||
available_modules = list(sminion.functions)
|
||||
not_available_modules = set()
|
||||
try:
|
||||
cached_not_available_modules = sminion.__not_availiable_modules__
|
||||
except AttributeError:
|
||||
cached_not_available_modules = sminion.__not_availiable_modules__ = set()
|
||||
|
||||
if cached_not_available_modules:
|
||||
for not_available_module in cached_not_available_modules:
|
||||
if not_available_module in required_salt_modules:
|
||||
not_available_modules.add(not_available_module)
|
||||
required_salt_modules.remove(not_available_module)
|
||||
|
||||
for required_module_name in required_salt_modules:
|
||||
search_name = required_module_name
|
||||
if '.' not in search_name:
|
||||
search_name += '.*'
|
||||
if not fnmatch.filter(available_modules, search_name):
|
||||
not_available_modules.add(required_module_name)
|
||||
cached_not_available_modules.add(required_module_name)
|
||||
|
||||
if not_available_modules:
|
||||
item._skipped_by_mark = True
|
||||
if len(not_available_modules) == 1:
|
||||
pytest.skip('Salt module \'{}\' is not available'.format(*not_available_modules))
|
||||
pytest.skip('Salt modules not available: {}'.format(', '.join(not_available_modules)))
|
||||
# <---- Test Setup ---------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue