From d332b33c8a653445bf04b8b77de36d68b9698c83 Mon Sep 17 00:00:00 2001 From: Daniel Wallace Date: Mon, 13 Feb 2017 12:19:55 -0600 Subject: [PATCH] add extmod_blacklist to make it easier to remove modules --- doc/ref/configuration/master.rst | 6 +- doc/ref/configuration/minion.rst | 9 +- salt/config/__init__.py | 5 +- salt/modules/saltutil.py | 127 ++++++++++++++-------- salt/runners/saltutil.py | 148 ++++++++++++++++++-------- salt/utils/extmods.py | 13 ++- tests/integration/modules/saltutil.py | 43 +++++++- 7 files changed, 260 insertions(+), 91 deletions(-) diff --git a/doc/ref/configuration/master.rst b/doc/ref/configuration/master.rst index 59a5b8cc2951..b5a431f6dfd9 100644 --- a/doc/ref/configuration/master.rst +++ b/doc/ref/configuration/master.rst @@ -245,7 +245,7 @@ each of Salt's module types such as ``runners``, ``output``, ``wheel``, extension_modules: /root/salt_extmods -``extmod_whitelist`` +``extmod_whitelist/extmod_blacklist`` -------------------- .. versionadded:: Nitrogen @@ -263,6 +263,10 @@ whitelist an empty list. - custom_engine pillars: [] + extmod_blacklist: + modules: + - specific_module + Valid options: - modules - states diff --git a/doc/ref/configuration/minion.rst b/doc/ref/configuration/minion.rst index ab7eac2f2e16..0b9b93c3be0d 100644 --- a/doc/ref/configuration/minion.rst +++ b/doc/ref/configuration/minion.rst @@ -1197,12 +1197,12 @@ below. providers: service: systemd -``extmod_whitelist`` +``extmod_whitelist/extmod_blacklist`` -------------------- .. versionadded:: Nitrogen -By using this dictionary, the modules that are synced to the minion's extmod cache using `saltutil.sync_*`can be +By using this dictionary, the modules that are synced to the minion's extmod cache using `saltutil.sync_*` can be limited. If nothing is set to a specific type, then all modules are accepted. To block all modules of a specific type, whitelist an empty list. @@ -1215,6 +1215,11 @@ whitelist an empty list. - custom_engine pillars: [] + extmod_blacklist: + modules: + - specific_module + + Valid options: - beacons - sdb diff --git a/salt/config/__init__.py b/salt/config/__init__.py index b218fd619642..02a9010b461c 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -993,8 +993,9 @@ def _gather_buffer_space(): # to the master is attempted. 'scheduler_before_connect': bool, - # Whitelist specific modules to be synced + # Whitelist/blacklist specific modules to be synced 'extmod_whitelist': dict, + 'extmod_blacklist': dict, # django auth 'django_auth_path': str, @@ -1256,6 +1257,7 @@ def _gather_buffer_space(): 'scheduler_before_connect': False, 'cache': 'localfs', 'extmod_whitelist': {}, + 'extmod_blacklist': {}, } DEFAULT_MASTER_OPTS = { @@ -1536,6 +1538,7 @@ def _gather_buffer_space(): 'min_extra_mods': '', 'ssl': None, 'extmod_whitelist': {}, + 'extmod_blacklist': {}, 'clean_dynamic_modules': True, 'django_auth_path': '', 'django_auth_settings': '', diff --git a/salt/modules/saltutil.py b/salt/modules/saltutil.py index e74d2888af06..8a50efd125b0 100644 --- a/salt/modules/saltutil.py +++ b/salt/modules/saltutil.py @@ -90,7 +90,7 @@ def _get_top_file_envs(): return envs -def _sync(form, saltenv=None, extmod_whitelist=None): +def _sync(form, saltenv=None, extmod_whitelist=None, extmod_blacklist=None): ''' Sync the given directory in the given environment ''' @@ -98,7 +98,8 @@ def _sync(form, saltenv=None, extmod_whitelist=None): saltenv = _get_top_file_envs() if isinstance(saltenv, six.string_types): saltenv = saltenv.split(',') - ret, touched = salt.utils.extmods.sync(__opts__, form, saltenv=saltenv, extmod_whitelist=extmod_whitelist) + ret, touched = salt.utils.extmods.sync(__opts__, form, saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist) # Dest mod_dir is touched? trigger reload if requested if touched: mod_file = os.path.join(__opts__['cachedir'], 'module_refresh') @@ -180,7 +181,7 @@ def update(version=None): return ret -def sync_beacons(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_beacons(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2015.5.1 @@ -198,6 +199,9 @@ def sync_beacons(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash @@ -206,13 +210,13 @@ def sync_beacons(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_beacons saltenv=dev salt '*' saltutil.sync_beacons saltenv=base,dev ''' - ret = _sync('beacons', saltenv, extmod_whitelist) + ret = _sync('beacons', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_beacons() return ret -def sync_sdb(saltenv=None, extmod_whitelist=None): +def sync_sdb(saltenv=None, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2015.5.8,2015.8.3 @@ -229,6 +233,9 @@ def sync_sdb(saltenv=None, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash @@ -237,11 +244,11 @@ def sync_sdb(saltenv=None, extmod_whitelist=None): salt '*' saltutil.sync_sdb saltenv=dev salt '*' saltutil.sync_sdb saltenv=base,dev ''' - ret = _sync('sdb', saltenv, extmod_whitelist) + ret = _sync('sdb', saltenv, extmod_whitelist, extmod_blacklist) return ret -def sync_modules(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_modules(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 0.10.0 @@ -276,6 +283,9 @@ def sync_modules(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash @@ -284,13 +294,13 @@ def sync_modules(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_modules saltenv=dev salt '*' saltutil.sync_modules saltenv=base,dev ''' - ret = _sync('modules', saltenv, extmod_whitelist) + ret = _sync('modules', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_states(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_states(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 0.10.0 @@ -308,6 +318,9 @@ def sync_states(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -316,13 +329,13 @@ def sync_states(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_states saltenv=dev salt '*' saltutil.sync_states saltenv=base,dev ''' - ret = _sync('states', saltenv, extmod_whitelist) + ret = _sync('states', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_grains(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_grains(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 0.10.0 @@ -341,6 +354,9 @@ def sync_grains(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -349,14 +365,14 @@ def sync_grains(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_grains saltenv=dev salt '*' saltutil.sync_grains saltenv=base,dev ''' - ret = _sync('grains', saltenv, extmod_whitelist) + ret = _sync('grains', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() refresh_pillar() return ret -def sync_renderers(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_renderers(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 0.10.0 @@ -375,6 +391,9 @@ def sync_renderers(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -383,13 +402,13 @@ def sync_renderers(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_renderers saltenv=dev salt '*' saltutil.sync_renderers saltenv=base,dev ''' - ret = _sync('renderers', saltenv, extmod_whitelist) + ret = _sync('renderers', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_returners(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_returners(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 0.10.0 @@ -407,6 +426,9 @@ def sync_returners(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -414,13 +436,13 @@ def sync_returners(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_returners salt '*' saltutil.sync_returners saltenv=dev ''' - ret = _sync('returners', saltenv, extmod_whitelist) + ret = _sync('returners', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_proxymodules(saltenv=None, refresh=False, extmod_whitelist=None): +def sync_proxymodules(saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2015.8.2 @@ -438,6 +460,9 @@ def sync_proxymodules(saltenv=None, refresh=False, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -446,13 +471,13 @@ def sync_proxymodules(saltenv=None, refresh=False, extmod_whitelist=None): salt '*' saltutil.sync_proxymodules saltenv=dev salt '*' saltutil.sync_proxymodules saltenv=base,dev ''' - ret = _sync('proxy', saltenv, extmod_whitelist) + ret = _sync('proxy', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_engines(saltenv=None, refresh=False, extmod_whitelist=None): +def sync_engines(saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2016.3.0 @@ -470,6 +495,9 @@ def sync_engines(saltenv=None, refresh=False, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -477,13 +505,13 @@ def sync_engines(saltenv=None, refresh=False, extmod_whitelist=None): salt '*' saltutil.sync_engines salt '*' saltutil.sync_engines saltenv=base,dev ''' - ret = _sync('engines', saltenv, extmod_whitelist) + ret = _sync('engines', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_output(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_output(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' Sync outputters from ``salt://_output`` to the minion @@ -499,6 +527,9 @@ def sync_output(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -507,7 +538,7 @@ def sync_output(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_output saltenv=dev salt '*' saltutil.sync_output saltenv=base,dev ''' - ret = _sync('output', saltenv, extmod_whitelist) + ret = _sync('output', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret @@ -515,7 +546,7 @@ def sync_output(saltenv=None, refresh=True, extmod_whitelist=None): sync_outputters = salt.utils.alias_function(sync_output, 'sync_outputters') -def sync_utils(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_utils(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2014.7.0 @@ -533,6 +564,9 @@ def sync_utils(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -541,7 +575,7 @@ def sync_utils(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_utils saltenv=dev salt '*' saltutil.sync_utils saltenv=base,dev ''' - ret = _sync('utils', saltenv, extmod_whitelist) + ret = _sync('utils', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret @@ -571,7 +605,7 @@ def list_extmods(): return ret -def sync_log_handlers(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_log_handlers(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2015.8.0 @@ -589,6 +623,9 @@ def sync_log_handlers(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -597,13 +634,13 @@ def sync_log_handlers(saltenv=None, refresh=True, extmod_whitelist=None): salt '*' saltutil.sync_log_handlers saltenv=dev salt '*' saltutil.sync_log_handlers saltenv=base,dev ''' - ret = _sync('log_handlers', saltenv, extmod_whitelist) + ret = _sync('log_handlers', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret -def sync_pillar(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_pillar(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2015.8.11,2016.3.2 @@ -619,6 +656,9 @@ def sync_pillar(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + .. note:: This function will raise an error if executed on a traditional (i.e. not masterless) minion @@ -634,14 +674,14 @@ def sync_pillar(saltenv=None, refresh=True, extmod_whitelist=None): raise CommandExecutionError( 'Pillar modules can only be synced to masterless minions' ) - ret = _sync('pillar', saltenv, extmod_whitelist) + ret = _sync('pillar', saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() refresh_pillar() return ret -def sync_all(saltenv=None, refresh=True, extmod_whitelist=None): +def sync_all(saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None): ''' .. versionchanged:: 2015.8.11,2016.3.2 On masterless minions, pillar modules are now synced, and refreshed @@ -676,6 +716,9 @@ def sync_all(saltenv=None, refresh=True, extmod_whitelist=None): extmod_whitelist : None dictionary of modules to sync based on type + extmod_blacklist : None + dictionary of modules to blacklist based on type + CLI Examples: .. code-block:: bash @@ -687,20 +730,20 @@ def sync_all(saltenv=None, refresh=True, extmod_whitelist=None): ''' log.debug('Syncing all') ret = {} - ret['beacons'] = sync_beacons(saltenv, False, extmod_whitelist) - ret['modules'] = sync_modules(saltenv, False, extmod_whitelist) - ret['states'] = sync_states(saltenv, False, extmod_whitelist) - ret['sdb'] = sync_sdb(saltenv, extmod_whitelist) - ret['grains'] = sync_grains(saltenv, False, extmod_whitelist) - ret['renderers'] = sync_renderers(saltenv, False, extmod_whitelist) - ret['returners'] = sync_returners(saltenv, False, extmod_whitelist) - ret['output'] = sync_output(saltenv, False, extmod_whitelist) - ret['utils'] = sync_utils(saltenv, False, extmod_whitelist) - ret['log_handlers'] = sync_log_handlers(saltenv, False, extmod_whitelist) - ret['proxymodules'] = sync_proxymodules(saltenv, False, extmod_whitelist) - ret['engines'] = sync_engines(saltenv, False, extmod_whitelist) + ret['beacons'] = sync_beacons(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['modules'] = sync_modules(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['states'] = sync_states(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['sdb'] = sync_sdb(saltenv, extmod_whitelist, extmod_blacklist) + ret['grains'] = sync_grains(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['renderers'] = sync_renderers(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['returners'] = sync_returners(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['output'] = sync_output(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['utils'] = sync_utils(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['log_handlers'] = sync_log_handlers(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['proxymodules'] = sync_proxymodules(saltenv, False, extmod_whitelist, extmod_blacklist) + ret['engines'] = sync_engines(saltenv, False, extmod_whitelist, extmod_blacklist) if __opts__['file_client'] == 'local': - ret['pillar'] = sync_pillar(saltenv, False, extmod_whitelist) + ret['pillar'] = sync_pillar(saltenv, False, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() refresh_pillar() diff --git a/salt/runners/saltutil.py b/salt/runners/saltutil.py index 3b36ca34db15..c593740e0c53 100644 --- a/salt/runners/saltutil.py +++ b/salt/runners/saltutil.py @@ -15,7 +15,7 @@ log = logging.getLogger(__name__) -def sync_all(saltenv='base', extmod_whitelist=None): +def sync_all(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync all custom types @@ -26,6 +26,9 @@ def sync_all(saltenv='base', extmod_whitelist=None): extmod_whitelist : None dictionary of modules to sync based on type + extmod_blacklist : None + dictionary of modules to blacklist based on type + CLI Example: .. code-block:: bash @@ -35,24 +38,27 @@ def sync_all(saltenv='base', extmod_whitelist=None): ''' log.debug('Syncing all') ret = {} - ret['modules'] = sync_modules(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['states'] = sync_states(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['grains'] = sync_grains(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['renderers'] = sync_renderers(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['returners'] = sync_returners(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['output'] = sync_output(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['proxymodules'] = sync_proxymodules(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['runners'] = sync_runners(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['wheel'] = sync_wheel(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['engines'] = sync_engines(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['queues'] = sync_queues(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['pillar'] = sync_pillar(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['utils'] = sync_utils(saltenv=saltenv, extmod_whitelist=extmod_whitelist) - ret['sdb'] = sync_sdb(saltenv=saltenv, extmod_whitelist=extmod_whitelist) + ret['modules'] = sync_modules(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['states'] = sync_states(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['grains'] = sync_grains(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['renderers'] = sync_renderers(saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist) + ret['returners'] = sync_returners(saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist) + ret['output'] = sync_output(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['proxymodules'] = sync_proxymodules(saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist) + ret['runners'] = sync_runners(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['wheel'] = sync_wheel(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['engines'] = sync_engines(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['queues'] = sync_queues(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['pillar'] = sync_pillar(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['utils'] = sync_utils(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) + ret['sdb'] = sync_sdb(saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist) return ret -def sync_modules(saltenv='base', extmod_whitelist=None): +def sync_modules(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync execution modules from ``salt://_modules`` to the master @@ -63,16 +69,20 @@ def sync_modules(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_modules ''' - return salt.utils.extmods.sync(__opts__, 'modules', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'modules', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_states(saltenv='base', extmod_whitelist=None): +def sync_states(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync state modules from ``salt://_states`` to the master @@ -83,16 +93,20 @@ def sync_states(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_states ''' - return salt.utils.extmods.sync(__opts__, 'states', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'states', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_grains(saltenv='base', extmod_whitelist=None): +def sync_grains(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync grains modules from ``salt://_grains`` to the master @@ -103,16 +117,20 @@ def sync_grains(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_grains ''' - return salt.utils.extmods.sync(__opts__, 'grains', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'grains', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_renderers(saltenv='base', extmod_whitelist=None): +def sync_renderers(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync renderer modules from from ``salt://_renderers`` to the master @@ -123,16 +141,20 @@ def sync_renderers(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_renderers ''' - return salt.utils.extmods.sync(__opts__, 'renderers', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'renderers', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_returners(saltenv='base', extmod_whitelist=None): +def sync_returners(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync returner modules from ``salt://_returners`` to the master @@ -143,16 +165,20 @@ def sync_returners(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_returners ''' - return salt.utils.extmods.sync(__opts__, 'returners', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'returners', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_output(saltenv='base', extmod_whitelist=None): +def sync_output(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync output modules from ``salt://_output`` to the master @@ -163,16 +189,20 @@ def sync_output(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_output ''' - return salt.utils.extmods.sync(__opts__, 'output', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'output', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_proxymodules(saltenv='base', extmod_whitelist=None): +def sync_proxymodules(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync proxy modules from ``salt://_proxy`` to the master @@ -183,16 +213,20 @@ def sync_proxymodules(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_proxy ''' - return salt.utils.extmods.sync(__opts__, 'proxy', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'proxy', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_runners(saltenv='base', extmod_whitelist=None): +def sync_runners(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync runners from ``salt://_runners`` to the master @@ -203,16 +237,20 @@ def sync_runners(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_runners ''' - return salt.utils.extmods.sync(__opts__, 'runners', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'runners', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_wheel(saltenv='base', extmod_whitelist=None): +def sync_wheel(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync wheel modules from ``salt://_wheel`` to the master @@ -223,16 +261,20 @@ def sync_wheel(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_wheel ''' - return salt.utils.extmods.sync(__opts__, 'wheel', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'wheel', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_engines(saltenv='base', extmod_whitelist=None): +def sync_engines(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync engines from ``salt://_engines`` to the master @@ -243,16 +285,20 @@ def sync_engines(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_engines ''' - return salt.utils.extmods.sync(__opts__, 'engines', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'engines', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_queues(saltenv='base', extmod_whitelist=None): +def sync_queues(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync queue modules from ``salt://_queues`` to the master @@ -263,16 +309,20 @@ def sync_queues(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_queues ''' - return salt.utils.extmods.sync(__opts__, 'queues', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'queues', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_pillar(saltenv='base', extmod_whitelist=None): +def sync_pillar(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' Sync pillar modules from ``salt://_pillar`` to the master @@ -283,16 +333,20 @@ def sync_pillar(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_pillar ''' - return salt.utils.extmods.sync(__opts__, 'pillar', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'pillar', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_utils(saltenv='base', extmod_whitelist=None): +def sync_utils(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: 2016.11.0 @@ -305,16 +359,20 @@ def sync_utils(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_utils ''' - return salt.utils.extmods.sync(__opts__, 'utils', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'utils', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] -def sync_sdb(saltenv='base', extmod_whitelist=None): +def sync_sdb(saltenv='base', extmod_whitelist=None, extmod_blacklist=None): ''' .. versionadded:: Nitrogen @@ -327,10 +385,14 @@ def sync_sdb(saltenv='base', extmod_whitelist=None): extmod_whitelist : None comma-seperated list of modules to sync + extmod_blacklist : None + comma-seperated list of modules to blacklist based on type + CLI Example: .. code-block:: bash salt-run saltutil.sync_sdb ''' - return salt.utils.extmods.sync(__opts__, 'sdb', saltenv=saltenv, extmod_whitelist=extmod_whitelist)[0] + return salt.utils.extmods.sync(__opts__, 'sdb', saltenv=saltenv, extmod_whitelist=extmod_whitelist, + extmod_blacklist=extmod_blacklist)[0] diff --git a/salt/utils/extmods.py b/salt/utils/extmods.py index 23c0d9fd4ba4..5d4263b80fae 100644 --- a/salt/utils/extmods.py +++ b/salt/utils/extmods.py @@ -36,18 +36,27 @@ def _listdir_recursively(rootdir): return file_list -def sync(opts, form, saltenv=None, extmod_whitelist=None): +def sync(opts, form, saltenv=None, extmod_whitelist=None, extmod_blacklist=None): ''' Sync custom modules into the extension_modules directory ''' if saltenv is None: saltenv = ['base'] + if extmod_whitelist is None: extmod_whitelist = opts['extmod_whitelist'] elif isinstance(extmod_whitelist, six.string_types): extmod_whitelist = {form: extmod_whitelist.split(',')} elif not isinstance(extmod_whitelist, dict): log.error('extmod_whitelist must be a string or dictionary: {0}'.format(extmod_whitelist)) + + if extmod_blacklist is None: + extmod_blacklist = opts['extmod_blacklist'] + elif isinstance(extmod_blacklist, six.string_types): + extmod_blacklist = {form: extmod_blacklist.split(',')} + elif not isinstance(extmod_blacklist, dict): + log.error('extmod_blacklist must be a string or dictionary: {0}'.format(extmod_blacklist)) + if isinstance(saltenv, six.string_types): saltenv = saltenv.split(',') ret = [] @@ -94,6 +103,8 @@ def sync(opts, form, saltenv=None, extmod_whitelist=None): relname = os.path.splitext(relpath)[0].replace(os.sep, '.') if extmod_whitelist and form in extmod_whitelist and relname not in extmod_whitelist[form]: continue + if extmod_blacklist and form in extmod_blacklist and relname in extmod_blacklist[form]: + continue remote.add(relpath) dest = os.path.join(mod_dir, relpath) log.info('Copying \'{0}\' to \'{1}\''.format(fn_, dest)) diff --git a/tests/integration/modules/saltutil.py b/tests/integration/modules/saltutil.py index cb072fa8c59f..3be8ec4919be 100644 --- a/tests/integration/modules/saltutil.py +++ b/tests/integration/modules/saltutil.py @@ -97,7 +97,7 @@ def test_sync_all(self): def test_sync_all_whitelist(self): ''' - Test syncing all ModuleCase + Test syncing all ModuleCase with whitelist ''' expected_return = {'engines': [], 'grains': [], @@ -114,6 +114,47 @@ def test_sync_all_whitelist(self): ret = self.run_function('saltutil.sync_all', extmod_whitelist={'modules': ['salttest']}) self.assertEqual(ret, expected_return) + def test_sync_all_blacklist(self): + ''' + Test syncing all ModuleCase with blacklist + ''' + expected_return = {'engines': [], + 'grains': [], + 'beacons': [], + 'utils': [], + 'returners': [], + 'modules': ['modules.override_test', + 'modules.runtests_helpers', + 'modules.salttest'], + 'renderers': [], + 'log_handlers': [], + 'states': [], + 'sdb': [], + 'proxymodules': [], + 'output': []} + ret = self.run_function('saltutil.sync_all', extmod_blacklist={'modules': ['runtests_decorators']}) + self.assertEqual(ret, expected_return) + + def test_sync_all_blacklist_and_whitelist(self): + ''' + Test syncing all ModuleCase with whitelist and blacklist + ''' + expected_return = {'engines': [], + 'grains': [], + 'beacons': [], + 'utils': [], + 'returners': [], + 'modules': [], + 'renderers': [], + 'log_handlers': [], + 'states': [], + 'sdb': [], + 'proxymodules': [], + 'output': []} + ret = self.run_function('saltutil.sync_all', extmod_whitelist={'modules': ['runtests_decorators']}, + extmod_blacklist={'modules': ['runtests_decorators']}) + self.assertEqual(ret, expected_return) + if __name__ == '__main__': from integration import run_tests