From e6958f7f1507d608d764dbd5bb7a64816b55b490 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Thu, 24 Nov 2016 18:27:53 +0100 Subject: [PATCH 01/15] Remove nonsense comment and react on generally absent path name --- salt/states/archive.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/salt/states/archive.py b/salt/states/archive.py index a7fc9b5577..72c90796c4 100644 --- a/salt/states/archive.py +++ b/salt/states/archive.py @@ -545,10 +545,9 @@ def extracted(name, ret['comment'] = '{0} is not an absolute path'.format(name) return ret else: - if name is None: - # Only way this happens is if some doofus specifies "- name: None" - # in their SLS file. Prevent tracebacks by failing gracefully. - ret['comment'] = 'None is not a valid directory path' + if not name: + # Empty name, like None, '' etc. + ret['comment'] = 'Name of the directory path needs to be specified' return ret # os.path.isfile() returns False when there is a trailing slash, hence # our need for first stripping the slash and then adding it back later. From 91b42578b21f66e02c38c7daf299ebad721344da Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Thu, 24 Nov 2016 19:06:20 +0100 Subject: [PATCH 02/15] Add overwrite option so the extraction of the archive can be always performed. --- salt/states/archive.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/salt/states/archive.py b/salt/states/archive.py index 72c90796c4..526f888806 100644 --- a/salt/states/archive.py +++ b/salt/states/archive.py @@ -12,6 +12,7 @@ import logging import os import re import shlex +import shutil import stat import tarfile from contextlib import closing @@ -140,6 +141,7 @@ def extracted(name, enforce_toplevel=True, enforce_ownership_on=None, archive_format=None, + overwrite=False, **kwargs): ''' .. versionadded:: 2014.1.0 @@ -497,6 +499,10 @@ def extracted(name, .. _zipfile: https://docs.python.org/2/library/zipfile.html .. _xz-utils: http://tukaani.org/xz/ + overwrite + If archive was already extracted, then setting this to True will + extract it all over again. + **Examples** 1. tar with lmza (i.e. xz) compression: @@ -897,7 +903,14 @@ def extracted(name, # already need to catch an OSError to cover edge cases where the minion is # running as a non-privileged user and is trying to check for the existence # of a path to which it does not have permission. - extraction_needed = False + + extraction_needed = overwrite + + if extraction_needed: + destination = os.path.join(name, contents['top_level_dirs'][0]) + if os.path.exists(destination): + shutil.rmtree(destination) + try: if_missing_path_exists = os.path.exists(if_missing) except TypeError: From 1970814111c9b07a5154781fac589eae6eef5293 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Mon, 28 Nov 2016 22:20:51 +0100 Subject: [PATCH 03/15] Prevent crash during externally changed archive permissions --- salt/states/archive.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/salt/states/archive.py b/salt/states/archive.py index 526f888806..0570d99f51 100644 --- a/salt/states/archive.py +++ b/salt/states/archive.py @@ -909,7 +909,13 @@ def extracted(name, if extraction_needed: destination = os.path.join(name, contents['top_level_dirs'][0]) if os.path.exists(destination): - shutil.rmtree(destination) + try: + shutil.rmtree(destination) + except OSError as err: + ret['comment'] = 'Error removing destination directory ' \ + '"{0}": {1}'.format(destination, err) + ret['result'] = False + return ret try: if_missing_path_exists = os.path.exists(if_missing) From e67706bd2913030bb1a5252f9d9adacf0b6a2059 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Mon, 28 Nov 2016 22:22:38 +0100 Subject: [PATCH 04/15] Document the behaviour. --- salt/states/archive.py | 1 + 1 file changed, 1 insertion(+) diff --git a/salt/states/archive.py b/salt/states/archive.py index 0570d99f51..88431fa05e 100644 --- a/salt/states/archive.py +++ b/salt/states/archive.py @@ -502,6 +502,7 @@ def extracted(name, overwrite If archive was already extracted, then setting this to True will extract it all over again. + **WARNING: This operation will flush clean all the previous content, if exists!** **Examples** From a96789353f1db129488a05c56e351b9feedcaf74 Mon Sep 17 00:00:00 2001 From: Scott Walton Date: Tue, 29 Nov 2016 14:00:12 +0000 Subject: [PATCH 05/15] Updated the bins_dir to default to pg_bin #37935 The config looking for initdb wasn't consistent with documentation so this updates that. It might be best to add a default but I need to look into the code a bit more first. --- salt/modules/postgres.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index 50781079b8..9d623f613b 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -26,6 +26,9 @@ Module to provide Postgres compatibility to salt. of the postgres bin's path to the relevant minion for this module:: postgres.pg_bin: '/usr/pgsql-9.5/bin/' + +:note: Older versions of Salt had a bug where postgres.bins_dir was used + instead of postgres.pg_bin. You should upgrade this as soon as possible. ''' # This pylint error is popping up where there are no colons? @@ -112,7 +115,7 @@ def __virtual__(): ''' Only load this module if the psql and initdb bin exist ''' - utils = ['psql', 'initdb'] + utils = ['psql'] if not HAS_CSV: return False for util in utils: @@ -128,7 +131,15 @@ def _find_pg_binary(util): Helper function to locate various psql related binaries ''' - pg_bin_dir = __salt__['config.option']('postgres.bins_dir') + pg_bin_dir = __salt__['config.option']('postgres.pg_bin') + + if not pg_bin_dir: # Fallback to incorrectly-documented setting + pg_bin_dir = __salt__['config.option']('postgres.bins_dir') + if pg_bin_dir: + log.warning( + 'Using postgres.bins_dir is not supported. ' + 'Replace this with postgres.pg_bin') + util_bin = salt.utils.which(util) if not util_bin: if pg_bin_dir: From a041b9f8e8bfe9bf72f0209c62a52a2975e8755f Mon Sep 17 00:00:00 2001 From: Scott Walton Date: Tue, 29 Nov 2016 14:30:49 +0000 Subject: [PATCH 06/15] Use Salt deprecation warning #37935 --- salt/modules/postgres.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index 9d623f613b..bbf9710002 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -136,9 +136,11 @@ def _find_pg_binary(util): if not pg_bin_dir: # Fallback to incorrectly-documented setting pg_bin_dir = __salt__['config.option']('postgres.bins_dir') if pg_bin_dir: - log.warning( - 'Using postgres.bins_dir is not supported. ' - 'Replace this with postgres.pg_bin') + salt.utils.warn_until( + 'Oxygen', + 'Using \'postgres.bins_dir\' is not officially supported and ' + 'only exists as a workaround. Please replace this in your ' + 'configuration with \'postgres.pg_bin\'.') util_bin = salt.utils.which(util) if not util_bin: From d33d4039695093b39860d363328263d1f6ccc7d1 Mon Sep 17 00:00:00 2001 From: Scott Walton Date: Tue, 29 Nov 2016 15:43:57 +0000 Subject: [PATCH 07/15] Restored missing initdb #37935 Realised I missed off the initdb check so I've restored it as before. --- salt/modules/postgres.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index bbf9710002..42769f18be 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -115,7 +115,7 @@ def __virtual__(): ''' Only load this module if the psql and initdb bin exist ''' - utils = ['psql'] + utils = ['psql', 'initdb'] if not HAS_CSV: return False for util in utils: From 6976be4b9a444c00b8453d8d4db874e769a00d38 Mon Sep 17 00:00:00 2001 From: Nicole Thomas Date: Tue, 29 Nov 2016 14:02:43 -0700 Subject: [PATCH 08/15] Pylint fix (#37971) --- salt/utils/sanitizers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/salt/utils/sanitizers.py b/salt/utils/sanitizers.py index d2f1cff0ef..d05d39955d 100644 --- a/salt/utils/sanitizers.py +++ b/salt/utils/sanitizers.py @@ -14,11 +14,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Import Python libs +from __future__ import absolute_import import re import os.path + +# Import Salt libs from salt.ext.six import text_type as text - - from salt.exceptions import CommandExecutionError From 186b3c7959eb203489033fdc2f4cf7eb0b4900d3 Mon Sep 17 00:00:00 2001 From: Nicole Thomas Date: Tue, 29 Nov 2016 14:34:07 -0700 Subject: [PATCH 09/15] Fix RST link format (#37958) (#37970) --- doc/topics/releases/2016.11.0.rst | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/topics/releases/2016.11.0.rst b/doc/topics/releases/2016.11.0.rst index 159535fc90..a38307a50f 100644 --- a/doc/topics/releases/2016.11.0.rst +++ b/doc/topics/releases/2016.11.0.rst @@ -268,6 +268,32 @@ Pillar Changes location on the Master so that they are available in execution modules called from Pillar SLS files. +Network Automation: NAPALM +========================== + +Beginning with 2016.11.0, network automation is inclued by default in the core +of Salt. It is based on a the `NAPALM `_ +library and provides facilities to manage the configuration and retrieve data +from network devices running widely used operating systems such: JunOS, IOS-XR, +eOS, IOS, NX-OS etc. +- see `the complete list of supported devices `_. + +The connection is established via the :mod:`NAPALM proxy `. + +In the current release, the following modules were included: + +- :mod:`NAPALM grains ` - Select network devices based on their characteristics +- :mod:`NET execution module ` - Networking basic features +- :mod:`NTP execution module ` +- :mod:`BGP execution module ` +- :mod:`Routes execution module ` +- :mod:`SNMP execution module ` +- :mod:`Users execution module ` +- :mod:`Probes execution module ` +- :mod:`NTP peers management state ` +- :mod:`SNMP configuration management state ` +- :mod:`Users management state ` + Junos Module Changes =================== From 6135dfa4ddb2c5e70dc348da773a6ff5b8eb9ea7 Mon Sep 17 00:00:00 2001 From: Erik Johnson Date: Tue, 29 Nov 2016 15:35:04 -0600 Subject: [PATCH 10/15] Revert addition of pillar_roots_override_ext_pillar This turned out to be an unnecessary addition, as the root cause was ext_pillar_first not behaving as documented. --- doc/ref/configuration/master.rst | 21 +-------------------- salt/pillar/__init__.py | 23 ++++++----------------- 2 files changed, 7 insertions(+), 37 deletions(-) diff --git a/doc/ref/configuration/master.rst b/doc/ref/configuration/master.rst index e40967098b..1ea7019e34 100644 --- a/doc/ref/configuration/master.rst +++ b/doc/ref/configuration/master.rst @@ -2459,24 +2459,6 @@ Default: ``[]`` There are additional details at :ref:`salt-pillars` -.. conf_master:: pillar_roots_override_ext_pillar - -``pillar_roots_override_ext_pillar`` ------------------------------------- - -.. versionadded:: 2016.11.0 - -Default: ``False`` - -This option allows for external pillar sources to be evaluated before -:conf_master:`pillar_roots`, which means that values obtained from -:conf_master:`pillar_roots` take precedence over those found from -:conf_master:`ext_pillar` sources. - -.. code-block:: yaml - - pillar_roots_override_ext_pillar: False - .. conf_master:: ext_pillar_first ``ext_pillar_first`` @@ -2488,8 +2470,7 @@ Default: ``False`` This option allows for external pillar sources to be evaluated before :conf_master:`pillar_roots`. This allows for targeting file system pillar from -ext_pillar. Note that ext_pillar_first option is deprecated by -pillar_roots_override_ext_pillar option and will be removed in future releases. +ext_pillar. .. code-block:: yaml diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py index bf2508cd2a..78213870cf 100644 --- a/salt/pillar/__init__.py +++ b/salt/pillar/__init__.py @@ -780,27 +780,16 @@ class Pillar(object): ''' top, top_errors = self.get_top() if ext: - if self.opts.get('pillar_roots_override_ext_pillar', False) or self.opts.get('ext_pillar_first', False): - salt.utils.warn_until('Nitrogen', - 'The \'ext_pillar_first\' option has been deprecated and ' - 'replaced by \'pillar_roots_override_ext_pillar\'.' - ) + if self.opts.get('ext_pillar_first', False): self.opts['pillar'], errors = self.ext_pillar({}, pillar_dirs) self.rend = salt.loader.render(self.opts, self.functions) matches = self.top_matches(top) pillar, errors = self.render_pillar(matches, errors=errors) - if self.opts.get('pillar_roots_override_ext_pillar', False): - pillar = merge(self.opts['pillar'], - pillar, - self.merge_strategy, - self.opts.get('renderer', 'yaml'), - self.opts.get('pillar_merge_lists', False)) - else: - pillar = merge(pillar, - self.opts['pillar'], - self.merge_strategy, - self.opts.get('renderer', 'yaml'), - self.opts.get('pillar_merge_lists', False)) + pillar = merge(self.opts['pillar'], + pillar, + self.merge_strategy, + self.opts.get('renderer', 'yaml'), + self.opts.get('pillar_merge_lists', False)) else: matches = self.top_matches(top) pillar, errors = self.render_pillar(matches) From c5c7a53d722df7e662f900e730512c85685fb59a Mon Sep 17 00:00:00 2001 From: Nicolas Delaby Date: Wed, 30 Nov 2016 17:06:17 +0100 Subject: [PATCH 11/15] Remove initdb dependency to consume postgres module. --- salt/modules/postgres.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index 42769f18be..b77501a2f8 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -53,7 +53,7 @@ except ImportError: # Import salt libs import salt.utils import salt.utils.itertools -from salt.exceptions import SaltInvocationError +from salt.exceptions import CommandExecutionError, SaltInvocationError # Import 3rd-party libs import salt.ext.six as six @@ -113,9 +113,10 @@ _PRIVILEGE_TYPE_MAP = { def __virtual__(): ''' - Only load this module if the psql and initdb bin exist + Only load this module if the psql bin exist. + initdb bin might also be used, but its presence will be detected on runtime. ''' - utils = ['psql', 'initdb'] + utils = ['psql'] if not HAS_CSV: return False for util in utils: @@ -145,7 +146,7 @@ def _find_pg_binary(util): util_bin = salt.utils.which(util) if not util_bin: if pg_bin_dir: - return os.path.join(pg_bin_dir, util) + return salt.utils.which(os.path.join(pg_bin_dir, util)) else: return util_bin @@ -221,6 +222,8 @@ def _run_initdb(name, if user is None: user = runas _INITDB_BIN = _find_pg_binary('initdb') + if not _INITDB_BIN: + raise CommandExecutionError('initdb executable not found.') cmd = [ _INITDB_BIN, '--pgdata={0}'.format(name), From 9caf0b406d9c510ac2dd9602f22ce4d204e5871f Mon Sep 17 00:00:00 2001 From: Daniel Wallace Date: Tue, 29 Nov 2016 10:24:58 -0600 Subject: [PATCH 12/15] use sleep from path for docker.sls_build sleep sometimes is found in /bin/sleep, like in ubuntu. We should just depend on the PATH variable being correct, and finding sleep, instead of explicitly saying /usr/bin/sleep --- salt/modules/dockerng.py | 2 +- tests/unit/modules/dockerng_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/modules/dockerng.py b/salt/modules/dockerng.py index dabb0b2efe..f3db83cdc5 100644 --- a/salt/modules/dockerng.py +++ b/salt/modules/dockerng.py @@ -5883,7 +5883,7 @@ def sls_build(name, base='opensuse/python', mods=None, saltenv='base', # start a new container ret = __salt__['dockerng.create'](image=base, name=name, - cmd='/usr/bin/sleep infinity', + cmd='sleep infinity', interactive=True, tty=True) id_ = ret['Id'] try: diff --git a/tests/unit/modules/dockerng_test.py b/tests/unit/modules/dockerng_test.py index 8b0acf8676..ec4901e275 100644 --- a/tests/unit/modules/dockerng_test.py +++ b/tests/unit/modules/dockerng_test.py @@ -671,7 +671,7 @@ class DockerngTestCase(TestCase): mods='foo', ) docker_create_mock.assert_called_once_with( - cmd='/usr/bin/sleep infinity', + cmd='sleep infinity', image='opensuse/python', interactive=True, name='foo', tty=True) docker_start_mock.assert_called_once_with('ID') docker_sls_mock.assert_called_once_with('ID', 'foo', 'base') From 1d221aa91c3353709cf6fda501b1e644eb208d04 Mon Sep 17 00:00:00 2001 From: Mike Place Date: Wed, 30 Nov 2016 09:44:56 -0700 Subject: [PATCH 13/15] Update gem test for 2016.11 --- tests/integration/modules/gem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/modules/gem.py b/tests/integration/modules/gem.py index 805ecfbe4d..6df4626392 100644 --- a/tests/integration/modules/gem.py +++ b/tests/integration/modules/gem.py @@ -127,7 +127,7 @@ class GemModuleTest(integration.ModuleCase): self.run_function('gem.update', [OLD_GEM]) gem_list = self.run_function('gem.list', [OLD_GEM]) - self.assertEqual({'thor': ['0.19.1', '0.17.0']}, gem_list) + self.assertEqual({'thor': ['0.19.4', '0.17.0']}, gem_list) self.run_function('gem.uninstall', [OLD_GEM]) self.assertFalse(self.run_function('gem.list', [OLD_GEM])) From 6f34332e875193e9591f3682cafe7769e6df6fea Mon Sep 17 00:00:00 2001 From: Nicole Thomas Date: Thu, 1 Dec 2016 09:01:25 -0700 Subject: [PATCH 14/15] Adjust code examples to use the actual bootstrap-salt.sh file name (#38011) --- doc/topics/tutorials/salt_bootstrap.rst | 70 ++++++++++++------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/doc/topics/tutorials/salt_bootstrap.rst b/doc/topics/tutorials/salt_bootstrap.rst index 827f721f0d..d5d93a3aa4 100644 --- a/doc/topics/tutorials/salt_bootstrap.rst +++ b/doc/topics/tutorials/salt_bootstrap.rst @@ -115,39 +115,39 @@ Install using curl Using ``curl`` to install latest development version from GitHub: -.. code:: console +.. code-block:: bash - curl -o bootstrap_salt.sh -L https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh git develop + curl -o bootstrap-salt.sh -L https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh git develop If you want to install a specific release version (based on the Git tags): -.. code:: console +.. code-block:: bash - curl -o bootstrap_salt.sh -L https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh git v2015.8.8 + curl -o bootstrap-salt.sh -L https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh git v2015.8.8 To install a specific branch from a Git fork: -.. code:: console +.. code-block:: bash - curl -o bootstrap_salt.sh -L https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh -g https://github.com/myuser/salt.git git mybranch + curl -o bootstrap-salt.sh -L https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh -g https://github.com/myuser/salt.git git mybranch If all you want is to install a ``salt-master`` using latest Git: -.. code:: console +.. code-block:: bash - curl -o bootstrap_salt.sh -L https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh -M -N git develop + curl -o bootstrap-salt.sh -L https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh -M -N git develop If your host has Internet access only via HTTP proxy: -.. code:: console +.. code-block:: bash PROXY='http://user:password@myproxy.example.com:3128' - curl -o bootstrap_salt.sh -L -x "$PROXY" https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh -G -H "$PROXY" git + curl -o bootstrap-salt.sh -L -x "$PROXY" https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh -G -H "$PROXY" git Install using wget @@ -155,24 +155,24 @@ Install using wget Using ``wget`` to install your distribution's stable packages: -.. code:: console +.. code-block:: bash - wget -O bootstrap_salt.sh https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh + wget -O bootstrap-salt.sh https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh Downloading the script from develop branch: .. code-block:: bash - wget -O bootstrap_salt.sh https://bootstrap.saltstack.com/develop - sudo sh bootstrap_salt.sh + wget -O bootstrap-salt.sh https://bootstrap.saltstack.com/develop + sudo sh bootstrap-salt.sh Installing a specific version from git using ``wget``: -.. code:: console +.. code-block:: bash - wget -O bootstrap_salt.sh https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh -P git v2015.8.8 + wget -O bootstrap-salt.sh https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh -P git v2015.8.8 .. note:: @@ -185,17 +185,17 @@ Install using Python If you already have Python installed, ``python 2.6``, then it's as easy as: -.. code:: console +.. code-block:: bash - python -m urllib "https://bootstrap.saltstack.com" > bootstrap_salt.sh - sudo sh bootstrap_salt.sh git develop + python -m urllib "https://bootstrap.saltstack.com" > bootstrap-salt.sh + sudo sh bootstrap-salt.sh git develop All Python versions should support the following in-line code: -.. code:: console +.. code-block:: bash - python -c 'import urllib; print urllib.urlopen("https://bootstrap.saltstack.com").read()' > bootstrap_salt.sh - sudo sh bootstrap_salt.sh git develop + python -c 'import urllib; print urllib.urlopen("https://bootstrap.saltstack.com").read()' > bootstrap-salt.sh + sudo sh bootstrap-salt.sh git develop Install using fetch @@ -204,26 +204,26 @@ Install using fetch On a FreeBSD base system you usually don't have either of the above binaries available. You **do** have ``fetch`` available though: -.. code:: console +.. code-block:: bash - fetch -o bootstrap_salt.sh https://bootstrap.saltstack.com - sudo sh bootstrap_salt.sh + fetch -o bootstrap-salt.sh https://bootstrap.saltstack.com + sudo sh bootstrap-salt.sh If you have any SSL issues install ``ca_root_nssp``: -.. code:: console +.. code-block:: bash pkg install ca_root_nssp And either copy the certificates to the place where fetch can find them: -.. code:: console +.. code-block:: bash cp /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem Or link them to the right place: -.. code:: console +.. code-block:: bash ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem From e51448f5eddedcb49dc98712bf1de3467f53421a Mon Sep 17 00:00:00 2001 From: Dmitry Kuzmenko Date: Thu, 1 Dec 2016 19:59:15 +0300 Subject: [PATCH 15/15] Added Carbon release notes. Fixed sphinx errors in the file. (#38022) --- doc/topics/releases/2016.11.0.rst | 39 ++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/doc/topics/releases/2016.11.0.rst b/doc/topics/releases/2016.11.0.rst index a38307a50f..47f1826c34 100644 --- a/doc/topics/releases/2016.11.0.rst +++ b/doc/topics/releases/2016.11.0.rst @@ -104,6 +104,9 @@ Additional Features - The ``junos`` state module is now available. It has all the functions that are present in the ``junos`` execution module. +- The minion data cache is a pluggable data store now. It's configurable with + :conf_master:`cache` option. Default is ``localfs``. +- User names in :conf_master:`client_acl` support glob matching now. New Top File Merging Strategy for States ======================================== @@ -245,7 +248,7 @@ Beacons Changes =============== - The ``loadavg`` beacon now outputs averages as integers instead of strings. - (Via :issuse:`31124`.) + (Via :issue:`31124`.) Runner Changes ============== @@ -295,7 +298,7 @@ In the current release, the following modules were included: - :mod:`Users management state ` Junos Module Changes -=================== +==================== - The following new functionalities were added to the junos module @@ -313,6 +316,36 @@ Returner Changes accept a `minions` keyword argument. All returners which ship with Salt have been modified to do so. +Renderer Changes +================ + +Added the ability to restrict allowed renderers. Two new config parameters, +:conf_master:`renderer_whitelist` and :conf_master:`renderer_blacklist` are +introduced for this purpose. + +eAuth Changes +============= + +- External auth modules' ``auth`` method can return an ACL list for the given + username instead of ``True``. This list should be in the same format as + described in the :doc:`eAuth documentation `. It will be + used for the user instead of one set in master config. + + Example of the ``auth`` method return that allows a user to execute functions + in the ``test`` and ``network`` modules on the minions that match the ``web*`` + target and allow access to ``wheel`` and ``runner`` modules: + + .. code-block:: python + + [{'web*': ['test.*', + 'network.*']}, + '@wheel', + '@runner'] + +- External auth is supported by :doc:`salt-run ` and + :doc:`salt-key ` now. Note that master must be started to + use them with eAuth. + External Module Packaging ========================= @@ -515,7 +548,7 @@ General Deprecations - Deprecations in ``minion.py``: - The ``salt.minion.parse_args_and_kwargs`` function has been removed. Please - use the ``salt.minion.load_args_and_kwargs`` function instead. + use the ``salt.minion.load_args_and_kwargs`` function instead. Cloud Deprecations ------------------