From 9a6b2175c6c6b80fd557ad6ec6cfb54df0fcfcb5 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Thu, 14 Jul 2016 18:04:59 +0200 Subject: [PATCH 01/32] Implement "osmajorrelease" by killing spaghetti --- salt/grains/core.py | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index 6c7a161aaad..278cb77aead 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -1482,32 +1482,6 @@ def os_data(): grains.update(_virtual(grains)) grains.update(_ps(grains)) - # Load additional OS family grains - if grains['os_family'] == "RedHat": - grains['osmajorrelease'] = grains['osrelease'].split('.', 1)[0] - - grains['osfinger'] = '{os}-{ver}'.format( - os=grains['osfullname'], - ver=grains['osrelease'].partition('.')[0]) - elif grains.get('osfullname') == 'Ubuntu': - grains['osmajorrelease'] = grains['osrelease'].split('.', 1)[0] - - grains['osfinger'] = '{os}-{ver}'.format( - os=grains['osfullname'], - ver=grains['osrelease']) - elif grains.get('osfullname') == "Debian": - grains['osmajorrelease'] = grains['osrelease'].split('.', 1)[0] - - grains['osfinger'] = '{os}-{ver}'.format( - os=grains['osfullname'], - ver=grains['osrelease'].partition('.')[0]) - elif grains.get('os') in ('FreeBSD', 'OpenBSD', 'NetBSD', 'Mac', 'Raspbian'): - grains['osmajorrelease'] = grains['osrelease'].split('.', 1)[0] - - grains['osfinger'] = '{os}-{ver}'.format( - os=grains['os'], - ver=grains['osrelease']) - if grains.get('osrelease', ''): osrelease_info = grains['osrelease'].split('.') for idx, value in enumerate(osrelease_info): @@ -1515,6 +1489,9 @@ def os_data(): continue osrelease_info[idx] = int(value) grains['osrelease_info'] = tuple(osrelease_info) + grains['osmajorrelease'] = grains['osrelease_info'][0] + os_name = 'os' if grains.get('os') in ('FreeBSD', 'OpenBSD', 'NetBSD', 'Mac', 'Raspbian') else 'osfullname' + grains['osfinger'] = '{0}-{1}'.format(grains[os_name], grains['osrelease_info'][0]) return grains From 208fd33b48dd5c272bad428125bda616267ea59d Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Thu, 14 Jul 2016 18:05:12 +0200 Subject: [PATCH 02/32] Add unit test for osmajorrelease grain --- tests/unit/grains/core_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/unit/grains/core_test.py b/tests/unit/grains/core_test.py index 7e9c4af1997..5bfd2ee3c2d 100644 --- a/tests/unit/grains/core_test.py +++ b/tests/unit/grains/core_test.py @@ -234,6 +234,7 @@ class CoreGrainsTestCase(TestCase): self.assertEqual(os_grains.get('oscodename'), os_release_map['oscodename']) self.assertEqual(os_grains.get('osrelease'), os_release_map['osrelease']) self.assertListEqual(list(os_grains.get('osrelease_info')), os_release_map['osrelease_info']) + self.assertEqual(os_grains.get('osmajorrelease'), os_release_map['osmajorrelease']) @skipIf(not salt.utils.is_linux(), 'System is not Linux') def test_suse_os_grains_sles11sp3(self): @@ -249,6 +250,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '11.3', 'osrelease_info': [11, 3], + 'osmajorrelease': 11, 'files': ["/etc/SuSE-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -272,6 +274,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '11.4', 'osrelease_info': [11, 4], + 'osmajorrelease': 11, 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -295,6 +298,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '12', 'osrelease_info': [12], + 'osmajorrelease': 12, 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -318,6 +322,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '12.1', 'osrelease_info': [12, 1], + 'osmajorrelease': 12, 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -341,6 +346,7 @@ PATCHLEVEL = 3 'osfullname': "Leap", 'osrelease': '42.1', 'osrelease_info': [42, 1], + 'osmajorrelease': 42, 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -364,6 +370,7 @@ PATCHLEVEL = 3 'osfullname': "Tumbleweed", 'osrelease': '20160504', 'osrelease_info': [20160504], + 'osmajorrelease': 20160504, 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) From c138cc03e39cd9c61b4b780cbdd3852858a890f3 Mon Sep 17 00:00:00 2001 From: Mike Place Date: Thu, 14 Jul 2016 13:24:23 -0600 Subject: [PATCH 03/32] Configuration settings for IPC buffers --- salt/config/__init__.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index fee83262cf3..780c86fc82a 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -41,6 +41,13 @@ import salt.exceptions import salt.utils.sdb from salt.utils.locales import sdecode +try: + import psutil + HAS_PSUTIL = True +except ImportError: + HAS_PSUTIL = False + import salt.grains.core + log = logging.getLogger(__name__) _DFLT_LOG_DATEFMT = '%H:%M:%S' @@ -60,6 +67,12 @@ else: _DFLT_IPC_MODE = 'ipc' _MASTER_TRIES = 1 +# For the time being this will be a fixed calculation +# TODO: Allow user configuration +_DFLT_IPC_WBUFFER = _gather_buffer_space() * .5 +# TODO: Reserved for future use +_DFLT_IPC_RBUFFER = _gather_buffer_space() * .5 + FLO_DIR = os.path.join( os.path.dirname(os.path.dirname(__file__)), 'daemons', 'flo') @@ -444,6 +457,10 @@ VALID_OPTS = { # ZMQ HWM for EventPublisher pub socket 'event_publisher_pub_hwm': int, + # IPC buffer size + # Refs https://github.com/saltstack/salt/issues/34215 + 'ipc_write_buffer': _DEFLT_IPC_WBUFFER, + # The number of MWorker processes for a master to startup. This number needs to scale up as # the number of connected minions increases. 'worker_threads': int, @@ -1540,6 +1557,24 @@ def _read_conf_file(path): conf_opts[key] = value.encode('utf-8') return conf_opts +def _gather_buffer_space(): + ''' + Gather some system data and then calculate + buffer space. + + Result is in bytes. + ''' + if HAS_PSUTIL: + # Oh good, we have psutil. This will be quick. + total_mem = psutil.virtual_memory().total + else: + # We need to load up some grains. This will be slow. + os_data = salt.grains.core.os_data() + grains = salt.grains.core._memdata(os_data) + total_mem = grains['mem_total'] + # Return the higher number between 5% of the system memory and 100MB + return min([total_mem * 0.05, 100 << 20]) + def _absolute_path(path, relative_to=None): ''' From 78f6251c092878014210d6c8f0fd12bd270c158d Mon Sep 17 00:00:00 2001 From: Mike Place Date: Thu, 14 Jul 2016 13:48:52 -0600 Subject: [PATCH 04/32] Correct issues with config --- salt/config/__init__.py | 38 ++++++++++++++++++++------------------ salt/transport/ipc.py | 6 +++++- salt/utils/event.py | 2 ++ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 780c86fc82a..20e5d668388 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -67,6 +67,24 @@ else: _DFLT_IPC_MODE = 'ipc' _MASTER_TRIES = 1 +def _gather_buffer_space(): + ''' + Gather some system data and then calculate + buffer space. + + Result is in bytes. + ''' + if HAS_PSUTIL: + # Oh good, we have psutil. This will be quick. + total_mem = psutil.virtual_memory().total + else: + # We need to load up some grains. This will be slow. + os_data = salt.grains.core.os_data() + grains = salt.grains.core._memdata(os_data) + total_mem = grains['mem_total'] + # Return the higher number between 5% of the system memory and 100MB + return min([total_mem * 0.05, 100 << 20]) + # For the time being this will be a fixed calculation # TODO: Allow user configuration _DFLT_IPC_WBUFFER = _gather_buffer_space() * .5 @@ -459,7 +477,7 @@ VALID_OPTS = { # IPC buffer size # Refs https://github.com/saltstack/salt/issues/34215 - 'ipc_write_buffer': _DEFLT_IPC_WBUFFER, + 'ipc_write_buffer': int, # The number of MWorker processes for a master to startup. This number needs to scale up as # the number of connected minions increases. @@ -1193,6 +1211,7 @@ DEFAULT_MASTER_OPTS = { 'minion_data_cache': True, 'enforce_mine_cache': False, 'ipc_mode': _DFLT_IPC_MODE, + 'ipc_write_buffer': _DFLT_IPC_WBUFFER, 'ipv6': False, 'tcp_master_pub_port': 4512, 'tcp_master_pull_port': 4513, @@ -1557,23 +1576,6 @@ def _read_conf_file(path): conf_opts[key] = value.encode('utf-8') return conf_opts -def _gather_buffer_space(): - ''' - Gather some system data and then calculate - buffer space. - - Result is in bytes. - ''' - if HAS_PSUTIL: - # Oh good, we have psutil. This will be quick. - total_mem = psutil.virtual_memory().total - else: - # We need to load up some grains. This will be slow. - os_data = salt.grains.core.os_data() - grains = salt.grains.core._memdata(os_data) - total_mem = grains['mem_total'] - # Return the higher number between 5% of the system memory and 100MB - return min([total_mem * 0.05, 100 << 20]) def _absolute_path(path, relative_to=None): diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index b6737c3cd3d..bb13f6bcd16 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -431,9 +431,10 @@ class IPCMessagePublisher(object): A Tornado IPC Publisher similar to Tornado's TCPServer class but using either UNIX domain sockets or TCP sockets ''' - def __init__(self, socket_path, io_loop=None): + def __init__(self, opts, socket_path, io_loop=None): ''' Create a new Tornado IPC server + :param dict opts: Salt options :param str/int socket_path: Path on the filesystem for the socket to bind to. This socket does not need to exist prior to calling @@ -444,6 +445,7 @@ class IPCMessagePublisher(object): for a tcp localhost connection. :param IOLoop io_loop: A Tornado ioloop to handle scheduling ''' + self.opts = opts self.socket_path = socket_path self._started = False @@ -505,10 +507,12 @@ class IPCMessagePublisher(object): def handle_connection(self, connection, address): log.trace('IPCServer: Handling connection to address: {0}'.format(address)) + log.debug('BUFFER SET: {0}'.format(self.opts['ipc_write_buffer'])) try: stream = IOStream( connection, io_loop=self.io_loop, + max__buffer_size = self.opts['ipc_write_buffer'] ) self.streams.add(stream) except Exception as exc: diff --git a/salt/utils/event.py b/salt/utils/event.py index 551eac623dc..7e981996f6a 100644 --- a/salt/utils/event.py +++ b/salt/utils/event.py @@ -865,6 +865,7 @@ class AsyncEventPublisher(object): raise self.publisher = salt.transport.ipc.IPCMessagePublisher( + self.opts, epub_uri, io_loop=self.io_loop ) @@ -953,6 +954,7 @@ class EventPublisher(salt.utils.process.SignalHandlingMultiprocessingProcess): ) self.publisher = salt.transport.ipc.IPCMessagePublisher( + self.opts, epub_uri, io_loop=self.io_loop ) From 3e3e2a997e50f5a91bd14d03cbf566385a8db34a Mon Sep 17 00:00:00 2001 From: Mike Place Date: Thu, 14 Jul 2016 13:50:34 -0600 Subject: [PATCH 05/32] Typo --- salt/transport/ipc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index bb13f6bcd16..1694e47b7fc 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -507,12 +507,12 @@ class IPCMessagePublisher(object): def handle_connection(self, connection, address): log.trace('IPCServer: Handling connection to address: {0}'.format(address)) - log.debug('BUFFER SET: {0}'.format(self.opts['ipc_write_buffer'])) + log.trace('IPCPublisher write buffer set to: {0}'.format(self.opts['ipc_write_buffer'])) try: stream = IOStream( connection, io_loop=self.io_loop, - max__buffer_size = self.opts['ipc_write_buffer'] + max_buffer_size = self.opts['ipc_write_buffer'] ) self.streams.add(stream) except Exception as exc: From c4395ae84e9caa7bf80265da1c98c6fbdc16224e Mon Sep 17 00:00:00 2001 From: Mike Place Date: Thu, 14 Jul 2016 15:28:43 -0600 Subject: [PATCH 06/32] Dial down default buffer and apply to just write buffer --- salt/config/__init__.py | 2 +- salt/transport/ipc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 20e5d668388..3de9b4f0a58 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -83,7 +83,7 @@ def _gather_buffer_space(): grains = salt.grains.core._memdata(os_data) total_mem = grains['mem_total'] # Return the higher number between 5% of the system memory and 100MB - return min([total_mem * 0.05, 100 << 20]) + return min([total_mem * 0.05, 10 << 20]) # For the time being this will be a fixed calculation # TODO: Allow user configuration diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index 1694e47b7fc..b3b9a0282a9 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -512,7 +512,7 @@ class IPCMessagePublisher(object): stream = IOStream( connection, io_loop=self.io_loop, - max_buffer_size = self.opts['ipc_write_buffer'] + max_write_buffer_size = self.opts['ipc_write_buffer'] ) self.streams.add(stream) except Exception as exc: From 2c1c92c48e6e41985d163560d6d9c7e3632ecd16 Mon Sep 17 00:00:00 2001 From: Mike Place Date: Sat, 16 Jul 2016 12:45:08 -0600 Subject: [PATCH 07/32] Lint --- salt/config/__init__.py | 2 +- salt/transport/ipc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 3de9b4f0a58..f9ed6e0501e 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -67,6 +67,7 @@ else: _DFLT_IPC_MODE = 'ipc' _MASTER_TRIES = 1 + def _gather_buffer_space(): ''' Gather some system data and then calculate @@ -1577,7 +1578,6 @@ def _read_conf_file(path): return conf_opts - def _absolute_path(path, relative_to=None): ''' Return an absolute path. In case ``relative_to`` is passed and ``path`` is diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index b3b9a0282a9..ef645e035d7 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -512,7 +512,7 @@ class IPCMessagePublisher(object): stream = IOStream( connection, io_loop=self.io_loop, - max_write_buffer_size = self.opts['ipc_write_buffer'] + max_write_buffer_size=self.opts['ipc_write_buffer'] ) self.streams.add(stream) except Exception as exc: From b2d636017d02974185673e31bb49d6e6f25334ff Mon Sep 17 00:00:00 2001 From: Mike Place Date: Mon, 18 Jul 2016 11:46:52 -0600 Subject: [PATCH 08/32] Add IPC to minion opts --- salt/config/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index f9ed6e0501e..c8a6fdc3368 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -969,6 +969,7 @@ DEFAULT_MINION_OPTS = { 'mine_return_job': False, 'mine_interval': 60, 'ipc_mode': _DFLT_IPC_MODE, + 'ipc_write_buffer': _DFLT_IPC_WBUFFER, 'ipv6': False, 'file_buffer_size': 262144, 'tcp_pub_port': 4510, From 110a422d5aeffeb39b3992c536cd83ade71c6383 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Tue, 19 Jul 2016 17:52:08 +0200 Subject: [PATCH 09/32] Keep osmajorrelease as a string type for 2016.3 release --- salt/grains/core.py | 2 +- tests/unit/grains/core_test.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index 278cb77aead..060225ee6b3 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -1489,7 +1489,7 @@ def os_data(): continue osrelease_info[idx] = int(value) grains['osrelease_info'] = tuple(osrelease_info) - grains['osmajorrelease'] = grains['osrelease_info'][0] + grains['osmajorrelease'] = str(grains['osrelease_info'][0]) ## This will be an integer in the next release os_name = 'os' if grains.get('os') in ('FreeBSD', 'OpenBSD', 'NetBSD', 'Mac', 'Raspbian') else 'osfullname' grains['osfinger'] = '{0}-{1}'.format(grains[os_name], grains['osrelease_info'][0]) diff --git a/tests/unit/grains/core_test.py b/tests/unit/grains/core_test.py index 5bfd2ee3c2d..b207f54cfa7 100644 --- a/tests/unit/grains/core_test.py +++ b/tests/unit/grains/core_test.py @@ -250,7 +250,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '11.3', 'osrelease_info': [11, 3], - 'osmajorrelease': 11, + 'osmajorrelease': '11', 'files': ["/etc/SuSE-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -274,7 +274,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '11.4', 'osrelease_info': [11, 4], - 'osmajorrelease': 11, + 'osmajorrelease': '11', 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -298,7 +298,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '12', 'osrelease_info': [12], - 'osmajorrelease': 12, + 'osmajorrelease': '12', 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -322,7 +322,7 @@ PATCHLEVEL = 3 'osfullname': "SLES", 'osrelease': '12.1', 'osrelease_info': [12, 1], - 'osmajorrelease': 12, + 'osmajorrelease': '12', 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -346,7 +346,7 @@ PATCHLEVEL = 3 'osfullname': "Leap", 'osrelease': '42.1', 'osrelease_info': [42, 1], - 'osmajorrelease': 42, + 'osmajorrelease': '42', 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) @@ -370,7 +370,7 @@ PATCHLEVEL = 3 'osfullname': "Tumbleweed", 'osrelease': '20160504', 'osrelease_info': [20160504], - 'osmajorrelease': 20160504, + 'osmajorrelease': '20160504', 'files': ["/etc/os-release"], } self._run_suse_os_grains_tests(_os_release_map) From 35a845fff57f4255b0715075858995cab5cefa7d Mon Sep 17 00:00:00 2001 From: Mike Place Date: Tue, 19 Jul 2016 13:24:25 -0600 Subject: [PATCH 10/32] Only set IPC with write buffer if set --- salt/transport/ipc.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index ef645e035d7..1cd5d67034b 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -507,13 +507,18 @@ class IPCMessagePublisher(object): def handle_connection(self, connection, address): log.trace('IPCServer: Handling connection to address: {0}'.format(address)) - log.trace('IPCPublisher write buffer set to: {0}'.format(self.opts['ipc_write_buffer'])) try: - stream = IOStream( - connection, - io_loop=self.io_loop, - max_write_buffer_size=self.opts['ipc_write_buffer'] - ) + if self.opts['ipc_write_buffer']: + stream = IOStream( + connection, + io_loop=self.io_loop, + max_write_buffer_size=self.opts['ipc_write_buffer'] + ) + else: + stream = IOStream( + connection, + io_loop=self.io_loop + ) self.streams.add(stream) except Exception as exc: log.error('IPC streaming error: {0}'.format(exc)) From 3cfb82cdd4fbbd9fa6ac692197a51765514ab8aa Mon Sep 17 00:00:00 2001 From: Mike Place Date: Tue, 19 Jul 2016 13:29:02 -0600 Subject: [PATCH 11/32] Fix silly error --- salt/config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index c8a6fdc3368..566f6e55b07 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -84,7 +84,7 @@ def _gather_buffer_space(): grains = salt.grains.core._memdata(os_data) total_mem = grains['mem_total'] # Return the higher number between 5% of the system memory and 100MB - return min([total_mem * 0.05, 10 << 20]) + return max([total_mem * 0.05, 10 << 20]) # For the time being this will be a fixed calculation # TODO: Allow user configuration From d48c6d2dcbfcd409425e03cdcebdad3a372e4f5e Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Tue, 19 Jul 2016 21:31:31 +0200 Subject: [PATCH 12/32] accomidate use of "fake" vdev type disk, this behavior may be broken later if a disk vdev ever gets added to the cli tools. improve documentation explaining how to create a striped pool without the "fake" vdev type --- salt/states/zpool.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/salt/states/zpool.py b/salt/states/zpool.py index d0cad3bac3d..2f85fbeca13 100644 --- a/salt/states/zpool.py +++ b/salt/states/zpool.py @@ -30,6 +30,17 @@ Management zpool /dev/disk2 /dev/disk3 + simplepool: + zpool.present: + - config: + import: false + force: true + - properties: + comment: another salty storage pool + - layout: + - /dev/disk0 + - /dev/disk1 + .. warning:: The layout will never be updated, it will only be used at time of creation. @@ -171,7 +182,9 @@ def present(name, properties=None, filesystem_properties=None, layout=None, conf layout_result = {} for root_dev in layout: if '-' in root_dev: - if root_dev.split('-')[0] not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: + # NOTE: people seem to be confused a lot and want to use the 'disk' vdev which does not exist + # we try to accomidate them in the state module by faking it. + if root_dev.split('-')[0] not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare', 'disk']: layout_valid = False layout_result[root_dev] = 'not a valid vdev type' layout[root_dev] = layout[root_dev].keys() if isinstance(layout[root_dev], OrderedDict) else layout[root_dev].split(' ') @@ -267,8 +280,10 @@ def present(name, properties=None, filesystem_properties=None, layout=None, conf params.append(name) for root_dev in layout: if '-' in root_dev: # special device - params.append(root_dev.split('-')[0]) # add the type by stripping the ID - if root_dev.split('-')[0] in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: + # NOTE: accomidate non existing 'disk' vdev + if root_dev.split('-')[0] in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare', 'disk']: + if root_dev.split('-')[0] != 'disk': + params.append(root_dev.split('-')[0]) # add the type by stripping the ID for sub_dev in layout[root_dev]: # add all sub devices if '/' not in sub_dev and config['device_dir'] and os.path.exists(config['device_dir']): sub_dev = os.path.join(config['device_dir'], sub_dev) From 0dfe3aaf31f0426f65c9d55f8baffa90a3641dbd Mon Sep 17 00:00:00 2001 From: Mike Place Date: Tue, 19 Jul 2016 14:45:51 -0600 Subject: [PATCH 13/32] Set up dynamic config --- salt/config/__init__.py | 10 +++++++++- salt/transport/ipc.py | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 566f6e55b07..7a7d4fcd064 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -2979,6 +2979,11 @@ def apply_minion_config(overrides=None, # if there is no beacons option yet, add an empty beacons dict if 'beacons' not in opts: opts['beacons'] = {} + + if overrides.get('ipc_write_buffer', '') == 'dynamic': + opts['ipc_write_buffer'] = _DFLT_IPC_WBUFFER + if 'ipc_write_buffer' not in overrides: + opts['ipc_write_buffer'] = 0 # if there is no schedule option yet, add an empty scheduler if 'schedule' not in opts: @@ -3054,7 +3059,10 @@ def apply_master_config(overrides=None, defaults=None): ) opts['token_dir'] = os.path.join(opts['cachedir'], 'tokens') opts['syndic_dir'] = os.path.join(opts['cachedir'], 'syndics') - + if overrides.get('ipc_write_buffer', '') == 'dynamic': + opts['ipc_write_buffer'] = _DFLT_IPC_WBUFFER + if 'ipc_write_buffer' not in overrides: + opts['ipc_write_buffer'] = 0 using_ip_for_id = False append_master = False if not opts.get('id'): diff --git a/salt/transport/ipc.py b/salt/transport/ipc.py index 1cd5d67034b..2d8d261e978 100644 --- a/salt/transport/ipc.py +++ b/salt/transport/ipc.py @@ -508,7 +508,8 @@ class IPCMessagePublisher(object): def handle_connection(self, connection, address): log.trace('IPCServer: Handling connection to address: {0}'.format(address)) try: - if self.opts['ipc_write_buffer']: + if self.opts['ipc_write_buffer'] > 0: + log.trace('Setting IPC connection write buffer: {0}'.format((self.opts['ipc_write_buffer']))) stream = IOStream( connection, io_loop=self.io_loop, From 76eb46fb08ad3e1e1032028f5238de0610e9244f Mon Sep 17 00:00:00 2001 From: Mike Place Date: Tue, 19 Jul 2016 14:50:23 -0600 Subject: [PATCH 14/32] Document master setting --- conf/master | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/master b/conf/master index 1bbeb50c51b..27190a48018 100644 --- a/conf/master +++ b/conf/master @@ -243,6 +243,14 @@ # ZMQ high-water-mark for EventPublisher pub socket #event_publisher_pub_hwm: 10000 +# The master may allocate memory per-event and not +# reclaim it. +# To set a high-water mark for memory allocation, use +# ipc_write_buffer to set a high-water mark for message +# buffering. +# Value: In bytes. Set to 'dynamic' to have Salt select +# a value for you. Default is disabled. +# ipc_write_buffer: 'dynamic' ##### Security settings ##### From ccd53e9214e294eca2225b019767d88a8d4930f8 Mon Sep 17 00:00:00 2001 From: Mike Place Date: Tue, 19 Jul 2016 15:50:23 -0600 Subject: [PATCH 15/32] Lint --- salt/config/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 7a7d4fcd064..cc42a2fe839 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -2979,11 +2979,11 @@ def apply_minion_config(overrides=None, # if there is no beacons option yet, add an empty beacons dict if 'beacons' not in opts: opts['beacons'] = {} - + if overrides.get('ipc_write_buffer', '') == 'dynamic': opts['ipc_write_buffer'] = _DFLT_IPC_WBUFFER if 'ipc_write_buffer' not in overrides: - opts['ipc_write_buffer'] = 0 + opts['ipc_write_buffer'] = 0 # if there is no schedule option yet, add an empty scheduler if 'schedule' not in opts: @@ -3062,7 +3062,7 @@ def apply_master_config(overrides=None, defaults=None): if overrides.get('ipc_write_buffer', '') == 'dynamic': opts['ipc_write_buffer'] = _DFLT_IPC_WBUFFER if 'ipc_write_buffer' not in overrides: - opts['ipc_write_buffer'] = 0 + opts['ipc_write_buffer'] = 0 using_ip_for_id = False append_master = False if not opts.get('id'): From 64c850410f5b874e35b58b9f81f2350c2196f3e5 Mon Sep 17 00:00:00 2001 From: Jason Unovitch Date: Mon, 18 Jul 2016 20:00:49 -0400 Subject: [PATCH 16/32] salt/state.py: set `chunk['order'] = 0' with `order: first'; fixes #24744 Currently the `order: first' keyword executes later states without order options. Consider a test case such as: ```SaltStack sleep 1: cmd.run: - order: first sleep 2: cmd.run sleep 3: cmd.run sleep 4: cmd.run: - order: last ``` The contents of each chunk dictionary at runtime show that the 'first' state is not evaluated to 'first'. {'name': 'sleep 4', 'state': 'cmd', '__id__': 'sleep 4', 'fun': 'run', '__env__': 'base', '__sls__': u'test', 'order': 1010100} {'name': 'sleep 2', 'state': 'cmd', '__id__': 'sleep 2', 'fun': 'run', '__env__': 'base', '__sls__': u'test', 'order': 10000} {'name': 'sleep 3', 'state': 'cmd', '__id__': 'sleep 3', 'fun': 'run', '__env__': 'base', '__sls__': u'test', 'order': 10001} {'name': 'sleep 1', 'state': 'cmd', '__id__': 'sleep 1', 'fun': 'run', '__env__': 'base', '__sls__': u'test', 'order': 10100} --- salt/state.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/salt/state.py b/salt/state.py index 103c30c5a9c..7ea76c295a8 100644 --- a/salt/state.py +++ b/salt/state.py @@ -512,6 +512,8 @@ class Compiler(object): if not isinstance(chunk['order'], (int, float)): if chunk['order'] == 'last': chunk['order'] = cap + 1000000 + elif chunk['order'] == 'first': + chunk['order'] = 0 else: chunk['order'] = cap if 'name_order' in chunk: @@ -1140,6 +1142,8 @@ class State(object): if not isinstance(chunk['order'], (int, float)): if chunk['order'] == 'last': chunk['order'] = cap + 1000000 + elif chunk['order'] == 'first': + chunk['order'] = 0 else: chunk['order'] = cap if 'name_order' in chunk: From a6bcbd615fff3f985c4d6b9d9e87aa384142fa3f Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Wed, 20 Jul 2016 15:26:18 +0200 Subject: [PATCH 17/32] Lintfix PEP8: E262 --- salt/grains/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index 060225ee6b3..365c45210ee 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -1489,7 +1489,7 @@ def os_data(): continue osrelease_info[idx] = int(value) grains['osrelease_info'] = tuple(osrelease_info) - grains['osmajorrelease'] = str(grains['osrelease_info'][0]) ## This will be an integer in the next release + grains['osmajorrelease'] = str(grains['osrelease_info'][0]) # This will be an integer in the next release os_name = 'os' if grains.get('os') in ('FreeBSD', 'OpenBSD', 'NetBSD', 'Mac', 'Raspbian') else 'osfullname' grains['osfinger'] = '{0}-{1}'.format(grains[os_name], grains['osrelease_info'][0]) From 9abb6f91bb34d969a6cc4e30febfa3be62a933f3 Mon Sep 17 00:00:00 2001 From: Justin Anderson Date: Wed, 20 Jul 2016 09:24:24 -0600 Subject: [PATCH 18/32] Skip mysql state test if mysqladmin is not available --- tests/integration/states/mysql.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/integration/states/mysql.py b/tests/integration/states/mysql.py index 32dfe8a1e43..6b0dc796b39 100644 --- a/tests/integration/states/mysql.py +++ b/tests/integration/states/mysql.py @@ -17,6 +17,7 @@ ensure_in_syspath('../../') # Import salt libs import integration +import salt.utils import salt.ext.six as six from salt.modules import mysql as mysqlmod @@ -28,6 +29,9 @@ try: except ImportError: NO_MYSQL = True +if not salt.utils.which('mysqladmin'): + NO_MYSQL = True + @skipIf( NO_MYSQL, From 7bda166e9dad18e12cee654c7be00fadcab9d338 Mon Sep 17 00:00:00 2001 From: Thomas S Hatch Date: Wed, 20 Jul 2016 14:55:22 -0600 Subject: [PATCH 19/32] keep this beacon from stack tracing at the loader (#34825) --- salt/beacons/network_settings.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/salt/beacons/network_settings.py b/salt/beacons/network_settings.py index bdc40ccf54e..8e10a3629a8 100644 --- a/salt/beacons/network_settings.py +++ b/salt/beacons/network_settings.py @@ -9,6 +9,7 @@ from __future__ import absolute_import # Import third party libs try: from pyroute2.ipdb import IPDB + IP = IPDB() HAS_PYROUTE2 = True except ImportError: HAS_PYROUTE2 = False @@ -29,8 +30,6 @@ ATTRS = ['family', 'txqlen', 'ipdb_scope', 'index', 'operstate', 'group', LAST_STATS = {} -IP = IPDB() - class Hashabledict(dict): ''' From dd64494a19f5735727271ae7b3973cfea27e2f78 Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Wed, 20 Jul 2016 23:43:47 +0200 Subject: [PATCH 20/32] salt.modules.zpool - drop vdev types to make it more future proof, fallback to zpool cli error messages --- salt/modules/zpool.py | 76 +++++-------------------------------------- 1 file changed, 8 insertions(+), 68 deletions(-) diff --git a/salt/modules/zpool.py b/salt/modules/zpool.py index 930fb18fbb1..943488038e8 100644 --- a/salt/modules/zpool.py +++ b/salt/modules/zpool.py @@ -646,7 +646,6 @@ def create(zpool, *vdevs, **kwargs): salt '*' zpool.create myzpool /path/to/vdev1 [...] properties="{'property1': 'value1', 'property2': 'value2'}" ''' ret = {} - dlist = [] # Check if the pool_name is already being used if exists(zpool): @@ -657,23 +656,7 @@ def create(zpool, *vdevs, **kwargs): ret[zpool] = 'no devices specified' return ret - # make sure files are present on filesystem - ret[zpool] = {} - for vdev in vdevs: - if vdev not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: - if not os.path.exists(vdev): - ret[zpool][vdev] = 'not present on filesystem' - continue - mode = os.stat(vdev).st_mode - if not stat.S_ISBLK(mode) and not stat.S_ISREG(mode) and not stat.S_ISCHR(mode): - ret[zpool][vdev] = 'not a block device, a file vdev or character special device' - continue - dlist.append(vdev) - - if len(ret[zpool]) > 0: - return ret - - devs = ' '.join(dlist) + devs = ' '.join(vdevs) zpool_cmd = _check_zpool() force = kwargs.get('force', False) altroot = kwargs.get('altroot', None) @@ -718,7 +701,7 @@ def create(zpool, *vdevs, **kwargs): if res['retcode'] != 0: ret[zpool] = res['stderr'] if 'stderr' in res else res['stdout'] else: - ret[zpool] = 'created' + ret[zpool] = 'created with {0}'.format(devs) return ret @@ -743,7 +726,6 @@ def add(zpool, *vdevs, **kwargs): salt '*' zpool.add myzpool /path/to/vdev1 /path/to/vdev2 [...] ''' ret = {} - dlist = [] # check for pool if not exists(zpool): @@ -755,24 +737,7 @@ def add(zpool, *vdevs, **kwargs): return ret force = kwargs.get('force', False) - - # make sure files are present on filesystem - ret[zpool] = {} - for vdev in vdevs: - if vdev not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: - if not os.path.exists(vdev): - ret[zpool][vdev] = 'not present on filesystem' - continue - mode = os.stat(vdev).st_mode - if not stat.S_ISBLK(mode) and not stat.S_ISREG(mode): - ret[zpool][vdev] = 'not a block device, a file vdev or character special device' - continue - dlist.append(vdev) - - if len(ret[zpool]) > 0: - return ret - - devs = ' '.join(dlist) + devs = ' '.join(vdevs) # try and add watch out for mismatched replication levels zpool_cmd = _check_zpool() @@ -786,10 +751,7 @@ def add(zpool, *vdevs, **kwargs): if res['retcode'] != 0: ret[zpool] = res['stderr'] if 'stderr' in res else res['stdout'] else: - ret[zpool] = {} - for device in dlist: - if device not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: - ret[zpool][device] = 'added' + ret[zpool] = 'added {0}'.format(devs) return ret @@ -970,8 +932,7 @@ def replace(zpool, old_device, new_device=None, force=False): if res['retcode'] != 0: ret[zpool] = res['stderr'] if 'stderr' in res else res['stdout'] else: - ret[zpool] = {} - ret[zpool][old_device] = 'replaced with {0}'.format(new_device) + ret[zpool] = 'replaced {0} with {1}'.format(old_device, new_device) return ret @@ -1207,22 +1168,7 @@ def online(zpool, *vdevs, **kwargs): # get expand option expand = kwargs.get('expand', False) - # make sure files are present on filesystem - ret[zpool] = {} - for vdev in vdevs: - if not os.path.exists(vdev): - ret[zpool][vdev] = 'not present on filesystem' - continue - mode = os.stat(vdev).st_mode - if not stat.S_ISBLK(mode) and not stat.S_ISREG(mode): - ret[zpool][vdev] = 'not a block device, a file vdev or character special device' - continue - dlist.append(vdev) - - if len(ret[zpool]) > 0: - return ret - - devs = ' '.join(dlist) + devs = ' '.join(vdevs) zpool_cmd = _check_zpool() cmd = '{zpool_cmd} online {expand}{zpool} {devs}'.format( zpool_cmd=zpool_cmd, @@ -1235,10 +1181,7 @@ def online(zpool, *vdevs, **kwargs): if res['retcode'] != 0: ret[zpool] = res['stderr'] if 'stderr' in res else res['stdout'] else: - ret[zpool] = {} - for device in dlist: - if device not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: - ret[zpool][device] = 'onlined' + ret[zpool] = 'onlined {0}'.format(devs) return ret @@ -1294,10 +1237,7 @@ def offline(zpool, *vdevs, **kwargs): if res['retcode'] != 0: ret[zpool] = res['stderr'] if 'stderr' in res else res['stdout'] else: - ret[zpool] = {} - for device in vdevs: - if device not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare']: - ret[zpool][device] = 'offlined' + ret[zpool] = 'offlined {0}'.format(devs) return ret From 1e8c585cd38b7418b25c168d043650b0c25ff419 Mon Sep 17 00:00:00 2001 From: Thomas S Hatch Date: Wed, 20 Jul 2016 15:55:18 -0600 Subject: [PATCH 21/32] Fix #34345 --- salt/client/ssh/wrapper/grains.py | 34 +++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/salt/client/ssh/wrapper/grains.py b/salt/client/ssh/wrapper/grains.py index 7f4c4db1d05..0aec1c0e228 100644 --- a/salt/client/ssh/wrapper/grains.py +++ b/salt/client/ssh/wrapper/grains.py @@ -8,10 +8,12 @@ from __future__ import absolute_import import collections import copy import math +import json # Import salt libs import salt.utils import salt.utils.dictupdate +from salt.defaults import DEFAULT_TARGET_DELIM from salt.exceptions import SaltException # Import 3rd-party libs @@ -46,7 +48,7 @@ _SANITIZERS = { } -def get(key, default=''): +def get(key, default='', delimiter=DEFAULT_TARGET_DELIM, ordered=True): ''' Attempt to retrieve the named value from grains, if the named value is not available return the passed default. The default return is an empty string. @@ -67,7 +69,35 @@ def get(key, default=''): salt '*' grains.get pkg:apache ''' - return salt.utils.traverse_dict_and_list(__grains__, key, default) + if ordered is True: + grains = __grains__ + else: + grains = json.loads(json.dumps(__grains__)) + return salt.utils.traverse_dict_and_list(__grains__, + key, + default, + delimiter) + + +def has_value(key): + ''' + Determine whether a named value exists in the grains dictionary. + + Given a grains dictionary that contains the following structure:: + + {'pkg': {'apache': 'httpd'}} + + One would determine if the apache key in the pkg dict exists by:: + + pkg:apache + + CLI Example: + + .. code-block:: bash + + salt '*' grains.has_value pkg:apache + ''' + return True if salt.utils.traverse_dict_and_list(__grains__, key, False) else False def items(sanitize=False): From 1f34299a84ebc657c6c1cf1b2cac4aa3404cc960 Mon Sep 17 00:00:00 2001 From: Thomas S Hatch Date: Wed, 20 Jul 2016 16:20:58 -0600 Subject: [PATCH 22/32] Check if a valid value is passed to unlyif/unless --- salt/state.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/salt/state.py b/salt/state.py index 446e292d2e2..19e671f1297 100644 --- a/salt/state.py +++ b/salt/state.py @@ -51,6 +51,7 @@ import salt.utils.yamlloader as yamlloader # pylint: disable=import-error,no-name-in-module,redefined-builtin import salt.ext.six as six from salt.ext.six.moves import map, range +from salt.ext.six import string_types # pylint: enable=import-error,no-name-in-module,redefined-builtin log = logging.getLogger(__name__) @@ -786,6 +787,9 @@ class State(object): else: low_data_onlyif = low_data['onlyif'] for entry in low_data_onlyif: + if not isinstance(entry, string_types): + ret.update({'comment': 'onlyif execution failed, bad type passed', 'result': False}) + return ret cmd = self.functions['cmd.retcode']( entry, ignore_retcode=True, python_shell=True, **cmd_opts) log.debug('Last command return code: {0}'.format(cmd)) @@ -804,6 +808,9 @@ class State(object): else: low_data_unless = low_data['unless'] for entry in low_data_unless: + if not isinstance(entry, string_types): + ret.update({'comment': 'unless execution failed, bad type passed', 'result': False}) + return ret cmd = self.functions['cmd.retcode']( entry, ignore_retcode=True, python_shell=True, **cmd_opts) log.debug('Last command return code: {0}'.format(cmd)) From a5a98845c76fe6616b73ce2bf07194696e970817 Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Thu, 21 Jul 2016 00:28:23 +0200 Subject: [PATCH 23/32] salt.module.zpool - fix bug with properties on/off being parsed as true/false --- salt/modules/zpool.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/salt/modules/zpool.py b/salt/modules/zpool.py index 943488038e8..7b419336900 100644 --- a/salt/modules/zpool.py +++ b/salt/modules/zpool.py @@ -671,10 +671,13 @@ def create(zpool, *vdevs, **kwargs): if properties: # create "-o property=value" pairs optlist = [] for prop in properties: - if ' ' in properties[prop]: - value = "'{0}'".format(properties[prop]) + if isinstance(properties[prop], bool): + value = 'on' if properties[prop] else 'off' else: - value = properties[prop] + if ' ' in properties[prop]: + value = "'{0}'".format(properties[prop]) + else: + value = properties[prop] optlist.append('-o {0}={1}'.format(prop, value)) opts = ' '.join(optlist) cmd = '{0} {1}'.format(cmd, opts) From 47b8dc946c8fc6bef15e8bfe8a4fafc613025257 Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Thu, 21 Jul 2016 00:38:35 +0200 Subject: [PATCH 24/32] salt.states.zpool - work with updates exec module --- salt/states/zpool.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/states/zpool.py b/salt/states/zpool.py index 2f85fbeca13..fe8dab3db5c 100644 --- a/salt/states/zpool.py +++ b/salt/states/zpool.py @@ -295,11 +295,11 @@ def present(name, properties=None, filesystem_properties=None, layout=None, conf # execute zpool.create ret['result'] = __salt__['zpool.create'](*params, force=config['force'], properties=properties, filesystem_properties=filesystem_properties) - if ret['result'].get(name) == 'created': + if ret['result'].get(name).startswith('created'): ret['result'] = True else: if ret['result'].get(name): - ret['comment'] = ret['result'][name] + ret['comment'] = ret['result'].get(name) ret['result'] = False if ret['result']: From 77dce3920ca30f048d6fd90ac289e5031e9aff85 Mon Sep 17 00:00:00 2001 From: Thomas S Hatch Date: Wed, 20 Jul 2016 16:40:13 -0600 Subject: [PATCH 25/32] update the state wrapper to include show_low_sls --- salt/client/ssh/wrapper/state.py | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/salt/client/ssh/wrapper/state.py b/salt/client/ssh/wrapper/state.py index 31252d6d206..c46ac279df5 100644 --- a/salt/client/ssh/wrapper/state.py +++ b/salt/client/ssh/wrapper/state.py @@ -528,6 +528,56 @@ def show_sls(mods, saltenv='base', test=None, env=None, **kwargs): return high_data +def show_low_sls(mods, saltenv='base', test=None, env=None, **kwargs): + ''' + Display the low state data from a specific sls or list of sls files on the + master + + CLI Example: + + .. code-block:: bash + + salt '*' state.show_sls core,edit.vim dev + ''' + __pillar__.update(kwargs.get('pillar', {})) + __opts__['grains'] = __grains__ + if env is not None: + salt.utils.warn_until( + 'Carbon', + 'Passing a salt environment should be done using \'saltenv\' ' + 'not \'env\'. This functionality will be removed in Salt Carbon.' + ) + # Backwards compatibility + saltenv = env + + opts = copy.copy(__opts__) + if salt.utils.test_mode(test=test, **kwargs): + opts['test'] = True + else: + opts['test'] = __opts__.get('test', None) + st_ = salt.client.ssh.state.SSHHighState( + __opts__, + __pillar__, + __salt__, + __context__['fileclient']) + if isinstance(mods, string_types): + mods = mods.split(',') + high_data, errors = st_.render_highstate({saltenv: mods}) + high_data, ext_errors = st_.state.reconcile_extend(high_data) + errors += ext_errors + errors += st_.state.verify_high(high_data) + if errors: + return errors + high_data, req_in_errors = st_.state.requisite_in(high_data) + errors += req_in_errors + high_data = st_.state.apply_exclude(high_data) + # Verify that the high data is structurally sound + if errors: + return errors + ret = st_.state.compile_high_data(high_data) + return ret + + def show_top(): ''' Return the top data that the minion will use for a highstate From 25d6c8139b5621d57399e6cf14456697eb1eec3c Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Thu, 21 Jul 2016 00:53:45 +0200 Subject: [PATCH 26/32] eliminate hardcoded vdev type from zpool state --- salt/states/zpool.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/salt/states/zpool.py b/salt/states/zpool.py index fe8dab3db5c..a78781ced1e 100644 --- a/salt/states/zpool.py +++ b/salt/states/zpool.py @@ -281,13 +281,12 @@ def present(name, properties=None, filesystem_properties=None, layout=None, conf for root_dev in layout: if '-' in root_dev: # special device # NOTE: accomidate non existing 'disk' vdev - if root_dev.split('-')[0] in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare', 'disk']: - if root_dev.split('-')[0] != 'disk': - params.append(root_dev.split('-')[0]) # add the type by stripping the ID - for sub_dev in layout[root_dev]: # add all sub devices - if '/' not in sub_dev and config['device_dir'] and os.path.exists(config['device_dir']): - sub_dev = os.path.join(config['device_dir'], sub_dev) - params.append(sub_dev) + if root_dev.split('-')[0] != 'disk': + params.append(root_dev.split('-')[0]) # add the type by stripping the ID + for sub_dev in layout[root_dev]: # add all sub devices + if '/' not in sub_dev and config['device_dir'] and os.path.exists(config['device_dir']): + sub_dev = os.path.join(config['device_dir'], sub_dev) + params.append(sub_dev) else: # normal device if '/' not in root_dev and config['device_dir'] and os.path.exists(config['device_dir']): root_dev = os.path.join(config['device_dir'], root_dev) From a7ff9524b0409acebe4fca62b0eaccde64a19d63 Mon Sep 17 00:00:00 2001 From: Jorge Schrauwen Date: Thu, 21 Jul 2016 01:07:20 +0200 Subject: [PATCH 27/32] drop parsing of vdevs, error passthrough from zpool cli --- salt/states/zpool.py | 55 ++++++++------------------------------------ 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/salt/states/zpool.py b/salt/states/zpool.py index a78781ced1e..62560901feb 100644 --- a/salt/states/zpool.py +++ b/salt/states/zpool.py @@ -53,7 +53,6 @@ from __future__ import absolute_import # Import Python libs import os -import stat import logging # Import Salt libs @@ -80,23 +79,6 @@ def __virtual__(): ) -def _check_device(device, config): - ''' - Check if device is present - ''' - if '/' not in device and config['device_dir'] and os.path.exists(config['device_dir']): - device = os.path.join(config['device_dir'], device) - - if not os.path.exists(device): - return False, 'not present on filesystem' - else: - mode = os.stat(device).st_mode - if not stat.S_ISBLK(mode) and not stat.S_ISREG(mode) and not stat.S_ISCHR(mode): - return False, 'not a block device, a file vdev or character special device' - - return True, '' - - def present(name, properties=None, filesystem_properties=None, layout=None, config=None): ''' ensure storage pool is present on the system @@ -170,41 +152,22 @@ def present(name, properties=None, filesystem_properties=None, layout=None, conf config = { 'import': True, 'import_dirs': None, - 'device_dir': None if __grains__['kernel'] != 'SunOS' else '/dev/rdsk', + 'device_dir': None, 'force': False } + if __grains__['kernel'] == 'SunOS': + config['device_dir'] = '/dev/rdsk' + elif __grains__['kernel'] == 'Linux': + config['device_dir'] = '/dev' config.update(state_config) log.debug('zpool.present::{0}::config - {1}'.format(name, config)) - # validate layout + # parse layout if layout: - layout_valid = True - layout_result = {} for root_dev in layout: - if '-' in root_dev: - # NOTE: people seem to be confused a lot and want to use the 'disk' vdev which does not exist - # we try to accomidate them in the state module by faking it. - if root_dev.split('-')[0] not in ['mirror', 'log', 'cache', 'raidz1', 'raidz2', 'raidz3', 'spare', 'disk']: - layout_valid = False - layout_result[root_dev] = 'not a valid vdev type' - layout[root_dev] = layout[root_dev].keys() if isinstance(layout[root_dev], OrderedDict) else layout[root_dev].split(' ') - - for dev in layout[root_dev]: - dev_info = _check_device(dev, config) - if not dev_info[0]: - layout_valid = False - layout_result[root_dev] = {} - layout_result[root_dev][dev] = dev_info[1] - else: - dev_info = _check_device(root_dev, config) - if not dev_info[0]: - layout_valid = False - layout_result[root_dev] = dev_info[1] - - if not layout_valid: - ret['result'] = False - ret['comment'] = "{0}".format(layout_result) - return ret + if '-' not in root_dev: + continue + layout[root_dev] = layout[root_dev].keys() if isinstance(layout[root_dev], OrderedDict) else layout[root_dev].split(' ') log.debug('zpool.present::{0}::layout - {1}'.format(name, layout)) From b4cfebb1073ee36891ea5b75a564aced31e8a09b Mon Sep 17 00:00:00 2001 From: Denys Havrysh Date: Thu, 21 Jul 2016 15:03:54 +0300 Subject: [PATCH 28/32] Fix Salt failure after merge of #34683 --- salt/config/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py index 1db123b4a93..4de3d2ec57b 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py @@ -47,6 +47,7 @@ try: HAS_PSUTIL = True except ImportError: HAS_PSUTIL = False + import platform import salt.grains.core log = logging.getLogger(__name__) @@ -80,8 +81,8 @@ def _gather_buffer_space(): # Oh good, we have psutil. This will be quick. total_mem = psutil.virtual_memory().total else: - # We need to load up some grains. This will be slow. - os_data = salt.grains.core.os_data() + # We need to load up ``mem_total`` grain. Let's mimic required OS data. + os_data = {'kernel': platform.system()} grains = salt.grains.core._memdata(os_data) total_mem = grains['mem_total'] # Return the higher number between 5% of the system memory and 100MB From 4dc7827020daf55ce2814d0072aa1674a6a94379 Mon Sep 17 00:00:00 2001 From: Denys Havrysh Date: Thu, 21 Jul 2016 15:43:48 +0300 Subject: [PATCH 29/32] Fix comment in master config, prevents the service from starting --- conf/master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/master b/conf/master index 1c4d480e5bf..9c474029843 100644 --- a/conf/master +++ b/conf/master @@ -86,7 +86,7 @@ # Set the default output file used by the salt command. Default is to output # to the CLI and not to a file. Functions the same way as the "--out-file" -CLI option, only sets this to a single file for all salt commands. +# CLI option, only sets this to a single file for all salt commands. #output_file: None # Return minions that timeout when running commands like test.ping From 59fffa86bce98f3f9195c64fce90c60c9d87af3b Mon Sep 17 00:00:00 2001 From: Nicole Thomas Date: Thu, 21 Jul 2016 10:02:01 -0600 Subject: [PATCH 30/32] Update release notes for 2016.3.2 (#34848) --- doc/topics/releases/2016.3.2.rst | 999 +++++++++++++++++++++++++++++++ 1 file changed, 999 insertions(+) diff --git a/doc/topics/releases/2016.3.2.rst b/doc/topics/releases/2016.3.2.rst index 86fdbb67108..fe551b39ec3 100644 --- a/doc/topics/releases/2016.3.2.rst +++ b/doc/topics/releases/2016.3.2.rst @@ -11,3 +11,1002 @@ Returner Changes - Any returner which implements a ``save_load`` function is now required to accept a ``minions`` keyword argument. All returners which ship with Salt have been modified to do so. + + +Changes for v2016.3.1..2016.3 +----------------------------- + +Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs): + +*Generated at: 2016-07-21T15:35:16Z* + +Statistics: + +- Total Merges: **173** + +Changes: + +- **PR** `#34837`_: (*thatch45*) Fix `#34345`_ + +- **PR** `#34838`_: (*thatch45*) Check if a valid value is passed to unlyif/unless + +- **PR** `#34840`_: (*thatch45*) update the state wrapper to include show_low_sls + +- **PR** `#34842`_: (*sjorge*) 2016.3 zpool cleanup and fixes + +- **PR** `#34770`_: (*aphor*) zpool state module needs support for disk vdev `#34762`_ + +- **PR** `#34825`_: (*thatch45*) keep this beacon from stack tracing at the loader + +- **PR** `#34824`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34818`_: (*jtand*) Skip mysql state test if mysqladmin is not available + +- **PR** `#34803`_: (*junovitch*) salt/state.py: set `chunk['order'] = 0' with `order: first'; fixes `#24744`_ + +- **PR** `#34642`_: (*jtand*) Check that mysqladmin exists before running mysql integration tests + +- **PR** `#34670`_: (*isbm*) Add "osmajorrelease" grain (2016.3) + +- **PR** `#34683`_: (*cachedout*) Fix publisher leak + +- **PR** `#34791`_: (*sjorge*) salt.state.zpool tweaks + +- **PR** `#34784`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34773`_: (*randomed*) Bugfix: Startup states on minions are not being written to mysql returner + +- **PR** `#34754`_: (*cachedout*) Disable test + +- **PR** `#34751`_: (*cachedout*) Remove unnedeed config test + +- **PR** `#34741`_: (*rallytime*) Back-port `#34726`_ to 2015.8 + +- **PR** `#34726`_: (*martinhoefling*) Always loop over updated keys in non recursive update + +- **PR** `#34606`_: (*isbm*) Bugfix: Exit on configuration read (backport) + +- **PR** `#34756`_: (*jacobhammons*) Rebuild man pages + +- **PR** `#34746`_: (*rallytime*) Update azure lib dep to match the one in cloud.clouds.msazure + +- **PR** `#34744`_: (*jtand*) Test valid docs fix + +- **PR** `#34740`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34721`_: (*rallytime*) Add output_file option to master config docs + +- **PR** `#34607`_: (*isbm*) Bugfix: Exit on configuration read (backport) + +- **PR** `#34739`_: (*cachedout*) Remove unnedeed config test + +- **PR** `#34607`_: (*isbm*) Bugfix: Exit on configuration read (backport) + +- **PR** `#34722`_: (*rallytime*) Various spelling fixes + +- **PR** `#34714`_: (*sjmh*) Fix ldap auth for function matches + +- **PR** `#34720`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34695`_: (*isbm*) Bugfix: Zypper `pkg.list_products` returns False on some empty values (2015.8) + +- **PR** `#34689`_: (*Azidburn*) fix second run problems with pkg.installed using sources + +- **PR** `#34682`_: (*jfindlay*) update 2015.8.11 release notes + +- **PR** `#34707`_: (*rallytime*) Add versionadded to "special" option in cron.present state + +- **PR** `#34696`_: (*isbm*) Bugfix: Zypper `pkg.list_products` returns False on some empty values (2016.3) + +- **PR** `#34702`_: (*farcaller*) Fixed dockerng.list_tags + +- **PR** `#34681`_: (*rallytime*) Back-port `#34549`_ to 2016.3 + +- **PR** `#34549`_: (*Inveracity*) fixes multiple values in mof configuration + +- **PR** `#34679`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34676`_: (*cachedout*) Revert "Modify lodaer global test to use populated dunders" + +- **PR** `#34651`_: (*rallytime*) Lint 34644 + +- **PR** `#34647`_: (*cachedout*) Adjust the mine test a little bit to give it a better chance of success + +- **PR** `#34644`_: (*cachedout*) Cleanup loader errors + +- **PR** `#34642`_: (*jtand*) Check that mysqladmin exists before running mysql integration tests + +- **PR** `#34618`_: (*jtand*) Network state integration test test=True + +- **PR** `#34601`_: (*lorengordon*) Clarifies the proper way to reference states + +- **PR** `#34605`_: (*gtmanfred*) catch error if no dns domains exist + +- **PR** `#34557`_: (*jacobweinstock*) handle jboss cli expression type in the parsing of output + +- **PR** `#34652`_: (*rallytime*) Spelling fixes found in sqlite3 pillar docs + +- **PR** `#34565`_: (*Ch3LL*) add num_cpus grain to freebsd + +- **PR** `#34621`_: (*jtand*) Suse Leap doesn't have 'man' + +- **PR** `#34619`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34617`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34593`_: (*rallytime*) Back-port `#33851`_ to 2015.8 + +- **PR** `#34592`_: (*jtand*) Update github IP for ssh state integration tests + +- **PR** `#34591`_: (*jtand*) Gate docker unit test to check for docker + +- **PR** `#34590`_: (*oeuftete*) [2015.8] dockerng: When sorting list actual_data, make it a list + +- **PR** `#34584`_: (*rallytime*) [2015.5] Avoid circular imports when calling salt.utils functions + +- **PR** `#34560`_: (*terminalmage*) Add a bunch of documentation on getting files from other environments + +- **PR** `#34545`_: (*terminalmage*) Handle cases where Docker Remote API returns an empty ExecutionDriver + +- **PR** `#34531`_: (*terminalmage*) Support ignore_epoch argument in version comparisons + +- **PR** `#33851`_: (*ticosax*) [dockerng] Add support for edge case when `Cmd` and `Entrypoint` can't be blanked + +- **PR** `#34585`_: (*rallytime*) [2016.3] Avoid salt.utils circular imports when using "from" + +- **PR** `#34616`_: (*jacobhammons*) Adds a mock required for the network settings beacon + +- **PR** `#34553`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34546`_: (*rallytime*) Rename unit.states.boto_secgroup to unit.states.boto_secgroup_test + +- **PR** `#34537`_: (*rallytime*) Rename tests.unit.simple to tests.unit.simple_test + +- **PR** `#34527`_: (*rallytime*) [2015.8] Update bootstrap script to latest stable + +- **PR** `#34521`_: (*cachedout*) Prevent many errors in the test suite in loader tests + +- **PR** `#34518`_: (*terminalmage*) Fix pkg.latest integration test for non-LTS ubuntu + +- **PR** `#34507`_: (*AAbouZaid*) Fix wrong order of retention_policy_exists. + +- **PR** `#34569`_: (*eliasp*) Minor doc fixes for PostgreSQL states + +- **PR** `#34524`_: (*terminalmage*) yumpkg: Avoid spurious logging in pkg.upgrade + +- **PR** `#34490`_: (*cachedout*) Fix master crash on ctl-c for long-running job + +- **PR** `#34520`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34513`_: (*cachedout*) Lower the log level for modules which cannot be loaded to trace + +- **PR** `#34505`_: (*terminalmage*) Improve top file merging documentation + +- **PR** `#34503`_: (*rallytime*) Rename some unit test files by adding _test + +- **PR** `#34498`_: (*rallytime*) Use -O in the wget example in the bootstrap tutorial for the develop branch + +- **PR** `#34492`_: (*zer0def*) Gracefully handle non-XML output in GlusterFS execution module. + +- **PR** `#34489`_: (*jtand*) Use skipTest for network state integration test + +- **PR** `#34488`_: (*rallytime*) Update dnsmasq.get_config docs to use correct config_file param. + +- **PR** `#34499`_: (*gtmanfred*) remove unnecessary block parsing ip addrs for nova + +- **PR** `#34468`_: (*twangboy*) Use Python 2.7.12 for Windows Build + +- **PR** `#34493`_: (*twangboy*) Use Python 2.7.12 for Mac Build + +- **PR** `#34486`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34467`_: (*rallytime*) Back-port `#34457`_ to 2015.8 + +- **PR** `#34462`_: (*terminalmage*) Use --always when available to git describe + +- **PR** `#34457`_: (*ryan-lane*) Only access key metadata if we found key metadata + +- **PR** `#34455`_: (*cro*) Forgot reference to inotify + +- **PR** `#34432`_: (*twangboy*) Fix file.append + +- **PR** `#34429`_: (*terminalmage*) Skip version checking for targeted packages in pkg.latest state + +- **PR** `#34459`_: (*terminalmage*) Ignore retcode when formatting highstate output + +- **PR** `#34463`_: (*terminalmage*) states/git: pass required cwd parameter to git.describe. + +- **PR** `#34466`_: (*rallytime*) Back-port `#34436`_ to 2016.3 + +- **PR** `#34436`_: (*artxki*) Fix `#34395`_ Nonfunctional default_password in states.postgres_user.present + +- **PR** `#34453`_: (*jtand*) Arch linux does not have osrelease or osmajorrelease grains + +- **PR** `#34456`_: (*thatch45*) Be more careful when making the SMinion + +- **PR** `#34452`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34451`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34435`_: (*cachedout*) Backport change to integraiton test suite + +- **PR** `#34426`_: (*cro*) Document that inotify is Linux only + +- **PR** `#34401`_: (*terminalmage*) Use rpmdev-vercmp as a fallback for version comparison on RHEL5 + +- **PR** `#34366`_: (*steverweber*) Update service.py + +- **PR** `#34427`_: (*twangboy*) Automated signing fixes for Ubuntu 16.04, 14.04, 12.04 (for dmurphy) + +- **PR** `#34400`_: (*cachedout*) Fix uninitialized value + +- **PR** `#34404`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34392`_: (*cro*) Clarify that salt-cloud doesn't get installed by bootstrap + +- **PR** `#34377`_: (*terminalmage*) Optimize pkg integration tests and add a couple new tests + +- **PR** `#34373`_: (*jtand*) Network state integration test + +- **PR** `#34292`_: (*twangboy*) Fix runas function for System Account + +- **PR** `#34388`_: (*rallytime*) Back-port `#34378`_ to 2016.3 + +- **PR** `#34378`_: (*adelcast*) network_settings.py: fix documentation + +- **PR** `#34352`_: (*cro*) Esxi dvs + +- **PR** `#34386`_: (*rallytime*) Beacon network docs + +- **PR** `#34376`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34368`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34344`_: (*rallytime*) Back-port `#34324`_ to 2015.8 + +- **PR** `#34342`_: (*rallytime*) Back-port `#34316`_ to 2015.8 + +- **PR** `#34324`_: (*cachedout*) Test custom grains matcher + +- **PR** `#34316`_: (*edgan*) Making salt-ssh pass proper return codes for jinja rendering errors + +- **PR** `#34252`_: (*gtmanfred*) return list of nodes for lxc driver when called directly + +- **PR** `#34365`_: (*sjorge*) fixes computenode_* grains on SmartOS compute nodes + +- **PR** `#34353`_: (*cro*) Remove proxy check and additional GetConnection--this makes the proxy… + +- **PR** `#34348`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34339`_: (*terminalmage*) Revert py3modernize lint changes + +- **PR** `#34335`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34325`_: (*terminalmage*) Remove unnecessarily-disabled sanity check + +- **PR** `#34323`_: (*jacobhammons*) Doc clarifications to file modules, addition of new `profile` log lev… + +- **PR** `#34319`_: (*rallytime*) Back-port `#34244`_ to 2015.8 + +- **PR** `#34313`_: (*rallytime*) [2015.5] Update to latest bootstrap script v2016.06.27 + +- **PR** `#34312`_: (*rallytime*) [2015.8] Update to latest bootstrap script v2016.06.27 + +- **PR** `#34307`_: (*rallytime*) Fix test example in integration testing docs + +- **PR** `#34306`_: (*ghedo*) Fix iptables.flush state: Do not force 'filter' table when flushing + +- **PR** `#34244`_: (*the-glu*) Typo in dockerio doc + +- **PR** `#34343`_: (*rallytime*) Back-port `#34256`_ to 2016.3 + +- **PR** `#34256`_: (*tmehlinger*) detect running from master in State.event method + +- **PR** `#34338`_: (*themalkolm*) Add listen/listen_in support to stateconf.py + +- **PR** `#34283`_: (*sjorge*) 2016.3 mount vfstab support + +- **PR** `#34322`_: (*Ch3LL*) add osmajorrelease grain for raspbian + +- **PR** `#34337`_: (*clinta*) Change merge-if-exists logic to properly report changes + +- **PR** `#34300`_: (*vutny*) Make apache.configfile state handle the Options list correctly + +- **PR** `#34333`_: (*rallytime*) Back-port `#33734`_ to 2016.3 + +- **PR** `#34304`_: (*rallytime*) Back-port `#33734`_ to 2016.3 + +- **PR** `#33734`_: (*glomium*) modules/rabbitmq.py version checking had a logical error + +- **PR** `#34330`_: (*clinta*) fix `#34329`_ + +- **PR** `#34318`_: (*rallytime*) Back-port `#32182`_ to 2016.3 + +- **PR** `#32182`_: (*dongweiming*) Fix psutil.cpu_times unpack error + +- **PR** `#34311`_: (*rallytime*) [2016.3] Update to latest bootstrap script v2016.06.27 + +- **PR** `#34284`_: (*rallytime*) Don't require 'domain' to be present before checking fqdn_ip* grains + +- **PR** `#34296`_: (*sjorge*) 2016.3 status module now works on Solaris like platforms + +- **PR** `#34281`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34274`_: (*clinta*) Don't escape source before calling managed + +- **PR** `#34258`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34257`_: (*rallytime*) Use 'config_dir' setting instead of CONFIG_DIR in gpg renderer + +- **PR** `#34233`_: (*thegoodduke*) ipset: fix the comment containing blank + +- **PR** `#34232`_: (*thegoodduke*) ipset: fix commont containing blank + +- **PR** `#34225`_: (*richardscollin*) Fix win_system.set_system_date_time + +- **PR** `#34271`_: (*opdude*) Fixed symlinks on windows where the slashes don't match + +- **PR** `#34254`_: (*sjorge*) Fix for `#14915`_ + +- **PR** `#34259`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34136`_: (*meaksh*) Fixed behavior for SUSE OS grains in 2015.8 + +- **PR** `#34134`_: (*meaksh*) Fixed behavior for SUSE OS grains in 2016.3 + +- **PR** `#34093`_: (*terminalmage*) Catch CommandExecutionError in pkg states + +- **PR** `#33903`_: (*meaksh*) Fetching grains['os'] from /etc/os-release on SUSE systems if it is possible + +- **PR** `#34134`_: (*meaksh*) Fixed behavior for SUSE OS grains in 2016.3 + +- **PR** `#33903`_: (*meaksh*) Fetching grains['os'] from /etc/os-release on SUSE systems if it is possible + +- **PR** `#34159`_: (*christoe*) Fixes to the win_task module + +- **PR** `#34223`_: (*peterdemin*) Fixed typo in filtering LDAP's potential_ous + +- **PR** `#34239`_: (*vutny*) file.find module: fix handling of broken symlinks + +- **PR** `#34229`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34218`_: (*terminalmage*) Fix a pair of gitfs bugs + +- **PR** `#34208`_: (*lomeroe*) fix regression from `#33681`_ which causes pulling a list of s3 objects … + +- **PR** `#34206`_: (*terminalmage*) Change target for dockerng assuming default status to Nitrogen release + +- **PR** `#34188`_: (*terminalmage*) Clarify pkg.list_repo_pkgs docstring for held packages + +- **PR** `#34182`_: (*rallytime*) Handle child PIDs differently depending on the availability of psutils + +- **PR** `#33942`_: (*cachedout*) ZD 762 + +- **PR** `#33681`_: (*rallytime*) Back-port `#33599`_ to 2015.8 + +- **PR** `#33599`_: (*lomeroe*) Fix s3 large file download + +- **PR** `#34214`_: (*rallytime*) Update saltutil.wheel docs to specify remote vs local minion behavior + +- **PR** `#34209`_: (*lomeroe*) fix regression in s3.query from `#33682`_ + +- **PR** `#33682`_: (*lomeroe*) backport `#33599`_ to 2016.3 + +- **PR** `#33599`_: (*lomeroe*) Fix s3 large file download + +- **PR** `#34222`_: (*cachedout*) Lint 34200 + +- **PR** `#34200`_: (*secumod*) Fix parted module set CLI example + +- **PR** `#34197`_: (*eliasp*) Make `module.ssh.recv_known_host()` more resilient against hosts not returning a key + +- **PR** `#34201`_: (*DarkKnightCZ*) Suffix temp file with .sr1 and add mandatory argument when executing PowerShell script + +- **PR** `#34198`_: (*DarkKnightCZ*) Don't use binary mode for cmdmod.exec_code + +- **PR** `#34198`_: (*DarkKnightCZ*) Don't use binary mode for cmdmod.exec_code + +- **PR** `#34172`_: (*dmurphy18*) Support for building with local packages on Debian and Ubuntu + +- **PR** `#34194`_: (*vutny*) Correct the docstrings formatting in pkgbuild modules and state + +- **PR** `#34056`_: (*vutny*) Make rpmbuild module work on non-RPM based GNU/Linux systems + +- **PR** `#34186`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34184`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34179`_: (*terminalmage*) Raise the correct exception when gitfs lockfile is empty + +- **PR** `#34178`_: (*terminalmage*) Remove unnecesssary comment + +- **PR** `#34176`_: (*rallytime*) Back-port `#34103`_ to 2015.8 + +- **PR** `#34175`_: (*rallytime*) Back-port `#34128`_ to 2015.8 + +- **PR** `#34174`_: (*rallytime*) Back-port `#34066`_ to 2015.8 + +- **PR** `#34165`_: (*mcalmer*) fix salt --summary to count not responding minions correctly + +- **PR** `#34141`_: (*jtand*) Fixed boto_vpc_test failure + +- **PR** `#34128`_: (*bebehei*) doc: add missing dot + +- **PR** `#34103`_: (*morganwillcock*) Fix diskusage beacon + +- **PR** `#34077`_: (*rallytime*) Add some grains targeting tests + +- **PR** `#34066`_: (*complexsplit*) Typo fix + +- **PR** `#33474`_: (*cachedout*) Fix diskusage beacon + +- **PR** `#34173`_: (*rallytime*) Update docs to match log_level default + +- **PR** `#34095`_: (*rallytime*) Back-port `#32396`_ to 2016.3 + +- **PR** `#32396`_: (*eradman*) Unbreak cron.file + +- **PR** `#34108`_: (*l2ol33rt*) Make dockerng.absent state honor test=true + +- **PR** `#34133`_: (*rallytime*) Back-port `#34057`_ to 2016.3 + +- **PR** `#34057`_: (*ajacoutot*) _active_mounts_openbsd: unbreak output for special filesystems + +- **PR** `#34156`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34142`_: (*isbm*) Move log message from INFO to DEBUG. + +- **PR** `#34100`_: (*terminalmage*) Update documentation on "refresh" behavior in pkg states + +- **PR** `#34072`_: (*jfindlay*) modules.pkg int tests: skip refresh_db upon error + +- **PR** `#34110`_: (*garethgreenaway*) Fixes to git module & state module related to identity file + +- **PR** `#34138`_: (*rallytime*) Update package dep note to systemd-python for RHEL7 install + +- **PR** `#34166`_: (*vutny*) Fix YAML indentation in Apache state docstrings + +- **PR** `#34098`_: (*terminalmage*) Restore old refresh logic + +- **PR** `#34087`_: (*bbinet*) Encourage to report issues to upstream PillarStack project + +- **PR** `#34075`_: (*jfindlay*) modules.inspectlib.kiwiproc: import gate lxml + +- **PR** `#34056`_: (*vutny*) Make rpmbuild module work on non-RPM based GNU/Linux systems + +- **PR** `#34073`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34069`_: (*rallytime*) Add a test to check for disconnected minion messaging + +- **PR** `#34051`_: (*tegbert*) Fixed a bug in the consul.py module that was preventing services + +- **PR** `#34048`_: (*terminalmage*) RFC: proposed fix for multiple fileserver updates in masterless runs + +- **PR** `#34045`_: (*jacobhammons*) Updated latest release version + +- **PR** `#34030`_: (*vutny*) More YAML indentation fixes in state module examples + +- **PR** `#34020`_: (*twangboy*) Always make changes to minion config if set (2015.8) + +- **PR** `#34018`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#34011`_: (*rallytime*) Back-port `#33948`_ and `#34009`_ to 2015.8 + +- **PR** `#34009`_: (*rallytime*) Back-port `#33948`_ to 2016.3 + add log message + +- **PR** `#34005`_: (*rallytime*) Lint fix for `#34000`_ + +- **PR** `#34003`_: (*vutny*) states.file: fix indentation in YAML examples + +- **PR** `#34002`_: (*lorengordon*) Remove loader test for pam module + +- **PR** `#34000`_: (*cachedout*) Fix incorrectly written test + +- **PR** `#33990`_: (*jacobhammons*) Adds links to several current Salt-related projects + +- **PR** `#33985`_: (*rallytime*) Write some more simple batch command tests + +- **PR** `#33984`_: (*jfindlay*) Add docs and tests to disk state + +- **PR** `#33983`_: (*twangboy*) Clarify the `account_exists` parameter + +- **PR** `#33953`_: (*whiteinge*) Add loader.utils() example to calling minion_mods + +- **PR** `#33951`_: (*jfindlay*) modules.gem int tests: more fixes + +- **PR** `#33948`_: (*cachedout*) Save an entire minion cache traversal on each master pub + +- **PR** `#33904`_: (*rallytime*) Back-port `#33806`_ to 2015.5 + +- **PR** `#33880`_: (*terminalmage*) pkg.uptodate: Pass kwargs to pkg.list_upgrades + +- **PR** `#33806`_: (*cachedout*) Work around upstream cherrypy bug + +- **PR** `#33684`_: (*jfindlay*) add acl unit tests + +- **PR** `#34010`_: (*terminalmage*) Do not cache remote files if they are already cached + +- **PR** `#34009`_: (*rallytime*) Back-port `#33948`_ to 2016.3 + add log message + +- **PR** `#33948`_: (*cachedout*) Save an entire minion cache traversal on each master pub + +- **PR** `#33941`_: (*cachedout*) Don't call os.getppid() on Windows + +- **PR** `#34067`_: (*jacobhammons*) Fixes doc refresh bug on chrome mobile. + +- **PR** `#34050`_: (*rallytime*) Back-port `#34026`_ to 2016.3 + +- **PR** `#34026`_: (*bensherman*) removed method that doesn't exist + +- **PR** `#33987`_: (*isbm*) inspectlib cleanup + +- **PR** `#34042`_: (*sjorge*) fix `#34038`_ + +- **PR** `#34025`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#34044`_: (*jacobhammons*) Updated latest release to 2016.3.1 + +- **PR** `#34014`_: (*jnhmcknight*) fix launch config creation params + +- **PR** `#34021`_: (*twangboy*) Always make changes to minion config if set (2016.3) + +- **PR** `#34031`_: (*eliasp*) `states.postgres_privileges` expects a real list, not a comma-separated string + +- **PR** `#33995`_: (*jacobhammons*) Understanding Jinja topic, Jinja doc issues. + +- **PR** `#33900`_: (*amendlik*) Document sudo policy for gitfs post-recieve hook + +- **PR** `#33980`_: (*twangboy*) Use full path to python.exe + +- **PR** `#33993`_: (*s0undt3ch*) Call `sys.exit()` instead of `exit()` + +- **PR** `#33976`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#33962`_: (*jacobhammons*) Adds a "Generated on " line to the html footer + +- **PR** `#33952`_: (*rallytime*) Add base argument to salt-ssh grains wrapper for filter_by func + +- **PR** `#33946`_: (*rallytime*) Back-port `#33698`_ to 2015.8 + +- **PR** `#33942`_: (*cachedout*) ZD 762 + +- **PR** `#33698`_: (*opdude*) Vsphere fixes + +- **PR** `#33912`_: (*abalashov*) utils/schedule.py:handle_func() - Fix for accessing returner configur… + +- **PR** `#33945`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3 + +- **PR** `#33936`_: (*rallytime*) Add connecting_settings to boto_elb state attributes list + +- **PR** `#33917`_: (*techhat*) Wait for up to a minute for sync_after_install + +- **PR** `#33888`_: (*jfindlay*) random.org checks + +- **PR** `#33877`_: (*rallytime*) [2015.8] Merge forward from 2015.5 to 2015.8 + +- **PR** `#33833`_: (*terminalmage*) Support syncing pillar modules to masterless minions + +- **PR** `#33829`_: (*terminalmage*) Update versionchanged directive + +- **PR** `#33814`_: (*terminalmage*) Support extraction of XZ archives in archive.extracted state + +- **PR** `#33778`_: (*sodium-chloride*) Fix minor docstring issues + +- **PR** `#33765`_: (*cachedout*) Correct issue with ping on rotate with minion cache + +- **PR** `#33726`_: (*jtand*) glance.warn_until shouldn't be checked for a doc string + +- **PR** `#33611`_: (*rolffokkens*) 2015.5 + +- **PR** `#33960`_: (*mecarus*) Fix mongo get_load to return full mongo record instead of non-existant 'load' key + +- **PR** `#33961`_: (*jacobhammons*) 2016.3.0 known issues update + +- **PR** `#33908`_: (*ticosax*) [boto_lambda] handle ommitted Permissions parameter + +- **PR** `#33896`_: (*DmitryKuzmenko*) Don't deep copy context dict values. + +- **PR** `#33905`_: (*rallytime*) Back-port `#33847`_ to 2016.3 + +- **PR** `#33910`_: (*cachedout*) Ensure tht pillar have freshest grains + +- **PR** `#33870`_: (*rallytime*) Add note about Xenial packages to 2016.3.0 release notes + +- **PR** `#33847`_: (*whiteinge*) Add docs for arg/kwarg eauth matching + +- **PR** `#33076`_: (*cachedout*) Avoid second grains load on windows multiprocessing + +- **PR** `#29153`_: (*DmitryKuzmenko*) ACL limit args + +.. _`#10206`: https://github.com/saltstack/salt/issues/10206 +.. _`#10480`: https://github.com/saltstack/salt/issues/10480 +.. _`#12470`: https://github.com/saltstack/salt/issues/12470 +.. _`#14915`: https://github.com/saltstack/salt/issues/14915 +.. _`#20809`: https://github.com/saltstack/salt/issues/20809 +.. _`#23522`: https://github.com/saltstack/salt/issues/23522 +.. _`#24744`: https://github.com/saltstack/salt/issues/24744 +.. _`#26278`: https://github.com/saltstack/salt/issues/26278 +.. _`#27980`: https://github.com/saltstack/salt/issues/27980 +.. _`#28300`: https://github.com/saltstack/salt/issues/28300 +.. _`#28569`: https://github.com/saltstack/salt/issues/28569 +.. _`#29153`: https://github.com/saltstack/salt/pull/29153 +.. _`#29249`: https://github.com/saltstack/salt/issues/29249 +.. _`#29525`: https://github.com/saltstack/salt/issues/29525 +.. _`#29643`: https://github.com/saltstack/salt/issues/29643 +.. _`#30100`: https://github.com/saltstack/salt/issues/30100 +.. _`#30493`: https://github.com/saltstack/salt/issues/30493 +.. _`#3077`: https://github.com/saltstack/salt/issues/3077 +.. _`#31164`: https://github.com/saltstack/salt/pull/31164 +.. _`#31402`: https://github.com/saltstack/salt/issues/31402 +.. _`#31499`: https://github.com/saltstack/salt/issues/31499 +.. _`#32182`: https://github.com/saltstack/salt/pull/32182 +.. _`#32276`: https://github.com/saltstack/salt/issues/32276 +.. _`#32396`: https://github.com/saltstack/salt/pull/32396 +.. _`#32525`: https://github.com/saltstack/salt/issues/32525 +.. _`#32591`: https://github.com/saltstack/salt/issues/32591 +.. _`#32761`: https://github.com/saltstack/salt/issues/32761 +.. _`#32916`: https://github.com/saltstack/salt/issues/32916 +.. _`#33023`: https://github.com/saltstack/salt/issues/33023 +.. _`#33076`: https://github.com/saltstack/salt/pull/33076 +.. _`#33452`: https://github.com/saltstack/salt/issues/33452 +.. _`#33474`: https://github.com/saltstack/salt/pull/33474 +.. _`#33575`: https://github.com/saltstack/salt/issues/33575 +.. _`#33588`: https://github.com/saltstack/salt/issues/33588 +.. _`#33599`: https://github.com/saltstack/salt/pull/33599 +.. _`#33611`: https://github.com/saltstack/salt/pull/33611 +.. _`#33633`: https://github.com/saltstack/salt/issues/33633 +.. _`#33645`: https://github.com/saltstack/salt/issues/33645 +.. _`#33649`: https://github.com/saltstack/salt/issues/33649 +.. _`#33674`: https://github.com/saltstack/salt/issues/33674 +.. _`#33681`: https://github.com/saltstack/salt/pull/33681 +.. _`#33682`: https://github.com/saltstack/salt/pull/33682 +.. _`#33684`: https://github.com/saltstack/salt/pull/33684 +.. _`#33694`: https://github.com/saltstack/salt/issues/33694 +.. _`#33697`: https://github.com/saltstack/salt/issues/33697 +.. _`#33698`: https://github.com/saltstack/salt/pull/33698 +.. _`#33726`: https://github.com/saltstack/salt/pull/33726 +.. _`#33734`: https://github.com/saltstack/salt/pull/33734 +.. _`#33765`: https://github.com/saltstack/salt/pull/33765 +.. _`#33778`: https://github.com/saltstack/salt/pull/33778 +.. _`#33806`: https://github.com/saltstack/salt/pull/33806 +.. _`#33814`: https://github.com/saltstack/salt/pull/33814 +.. _`#33829`: https://github.com/saltstack/salt/pull/33829 +.. _`#33831`: https://github.com/saltstack/salt/issues/33831 +.. _`#33833`: https://github.com/saltstack/salt/pull/33833 +.. _`#33847`: https://github.com/saltstack/salt/pull/33847 +.. _`#33851`: https://github.com/saltstack/salt/pull/33851 +.. _`#33868`: https://github.com/saltstack/salt/issues/33868 +.. _`#33870`: https://github.com/saltstack/salt/pull/33870 +.. _`#33873`: https://github.com/saltstack/salt/issues/33873 +.. _`#33877`: https://github.com/saltstack/salt/pull/33877 +.. _`#33879`: https://github.com/saltstack/salt/issues/33879 +.. _`#33880`: https://github.com/saltstack/salt/pull/33880 +.. _`#33888`: https://github.com/saltstack/salt/pull/33888 +.. _`#33896`: https://github.com/saltstack/salt/pull/33896 +.. _`#33900`: https://github.com/saltstack/salt/pull/33900 +.. _`#33903`: https://github.com/saltstack/salt/pull/33903 +.. _`#33904`: https://github.com/saltstack/salt/pull/33904 +.. _`#33905`: https://github.com/saltstack/salt/pull/33905 +.. _`#33908`: https://github.com/saltstack/salt/pull/33908 +.. _`#33910`: https://github.com/saltstack/salt/pull/33910 +.. _`#33911`: https://github.com/saltstack/salt/issues/33911 +.. _`#33912`: https://github.com/saltstack/salt/pull/33912 +.. _`#33915`: https://github.com/saltstack/salt/issues/33915 +.. _`#33917`: https://github.com/saltstack/salt/pull/33917 +.. _`#33923`: https://github.com/saltstack/salt/issues/33923 +.. _`#33927`: https://github.com/saltstack/salt/issues/33927 +.. _`#33936`: https://github.com/saltstack/salt/pull/33936 +.. _`#33941`: https://github.com/saltstack/salt/pull/33941 +.. _`#33942`: https://github.com/saltstack/salt/pull/33942 +.. _`#33945`: https://github.com/saltstack/salt/pull/33945 +.. _`#33946`: https://github.com/saltstack/salt/pull/33946 +.. _`#33948`: https://github.com/saltstack/salt/pull/33948 +.. _`#33951`: https://github.com/saltstack/salt/pull/33951 +.. _`#33952`: https://github.com/saltstack/salt/pull/33952 +.. _`#33953`: https://github.com/saltstack/salt/pull/33953 +.. _`#33960`: https://github.com/saltstack/salt/pull/33960 +.. _`#33961`: https://github.com/saltstack/salt/pull/33961 +.. _`#33962`: https://github.com/saltstack/salt/pull/33962 +.. _`#33972`: https://github.com/saltstack/salt/issues/33972 +.. _`#33976`: https://github.com/saltstack/salt/pull/33976 +.. _`#33980`: https://github.com/saltstack/salt/pull/33980 +.. _`#33983`: https://github.com/saltstack/salt/pull/33983 +.. _`#33984`: https://github.com/saltstack/salt/pull/33984 +.. _`#33985`: https://github.com/saltstack/salt/pull/33985 +.. _`#33987`: https://github.com/saltstack/salt/pull/33987 +.. _`#33990`: https://github.com/saltstack/salt/pull/33990 +.. _`#33993`: https://github.com/saltstack/salt/pull/33993 +.. _`#33995`: https://github.com/saltstack/salt/pull/33995 +.. _`#34000`: https://github.com/saltstack/salt/pull/34000 +.. _`#34002`: https://github.com/saltstack/salt/pull/34002 +.. _`#34003`: https://github.com/saltstack/salt/pull/34003 +.. _`#34005`: https://github.com/saltstack/salt/pull/34005 +.. _`#34009`: https://github.com/saltstack/salt/pull/34009 +.. _`#34010`: https://github.com/saltstack/salt/pull/34010 +.. _`#34011`: https://github.com/saltstack/salt/pull/34011 +.. _`#34012`: https://github.com/saltstack/salt/issues/34012 +.. _`#34014`: https://github.com/saltstack/salt/pull/34014 +.. _`#34018`: https://github.com/saltstack/salt/pull/34018 +.. _`#34020`: https://github.com/saltstack/salt/pull/34020 +.. _`#34021`: https://github.com/saltstack/salt/pull/34021 +.. _`#34025`: https://github.com/saltstack/salt/pull/34025 +.. _`#34026`: https://github.com/saltstack/salt/pull/34026 +.. _`#34030`: https://github.com/saltstack/salt/pull/34030 +.. _`#34031`: https://github.com/saltstack/salt/pull/34031 +.. _`#34037`: https://github.com/saltstack/salt/issues/34037 +.. _`#34038`: https://github.com/saltstack/salt/issues/34038 +.. _`#34042`: https://github.com/saltstack/salt/pull/34042 +.. _`#34043`: https://github.com/saltstack/salt/issues/34043 +.. _`#34044`: https://github.com/saltstack/salt/pull/34044 +.. _`#34045`: https://github.com/saltstack/salt/pull/34045 +.. _`#34048`: https://github.com/saltstack/salt/pull/34048 +.. _`#34050`: https://github.com/saltstack/salt/pull/34050 +.. _`#34051`: https://github.com/saltstack/salt/pull/34051 +.. _`#34056`: https://github.com/saltstack/salt/pull/34056 +.. _`#34057`: https://github.com/saltstack/salt/pull/34057 +.. _`#34066`: https://github.com/saltstack/salt/pull/34066 +.. _`#34067`: https://github.com/saltstack/salt/pull/34067 +.. _`#34069`: https://github.com/saltstack/salt/pull/34069 +.. _`#34072`: https://github.com/saltstack/salt/pull/34072 +.. _`#34073`: https://github.com/saltstack/salt/pull/34073 +.. _`#34074`: https://github.com/saltstack/salt/issues/34074 +.. _`#34075`: https://github.com/saltstack/salt/pull/34075 +.. _`#34077`: https://github.com/saltstack/salt/pull/34077 +.. _`#34087`: https://github.com/saltstack/salt/pull/34087 +.. _`#34093`: https://github.com/saltstack/salt/pull/34093 +.. _`#34094`: https://github.com/saltstack/salt/issues/34094 +.. _`#34095`: https://github.com/saltstack/salt/pull/34095 +.. _`#34098`: https://github.com/saltstack/salt/pull/34098 +.. _`#34100`: https://github.com/saltstack/salt/pull/34100 +.. _`#34103`: https://github.com/saltstack/salt/pull/34103 +.. _`#34108`: https://github.com/saltstack/salt/pull/34108 +.. _`#34110`: https://github.com/saltstack/salt/pull/34110 +.. _`#34114`: https://github.com/saltstack/salt/issues/34114 +.. _`#34120`: https://github.com/saltstack/salt/issues/34120 +.. _`#34128`: https://github.com/saltstack/salt/pull/34128 +.. _`#34129`: https://github.com/saltstack/salt/issues/34129 +.. _`#34133`: https://github.com/saltstack/salt/pull/34133 +.. _`#34134`: https://github.com/saltstack/salt/pull/34134 +.. _`#34135`: https://github.com/saltstack/salt/issues/34135 +.. _`#34136`: https://github.com/saltstack/salt/pull/34136 +.. _`#34137`: https://github.com/saltstack/salt/issues/34137 +.. _`#34138`: https://github.com/saltstack/salt/pull/34138 +.. _`#34141`: https://github.com/saltstack/salt/pull/34141 +.. _`#34142`: https://github.com/saltstack/salt/pull/34142 +.. _`#34156`: https://github.com/saltstack/salt/pull/34156 +.. _`#34159`: https://github.com/saltstack/salt/pull/34159 +.. _`#34162`: https://github.com/saltstack/salt/issues/34162 +.. _`#34165`: https://github.com/saltstack/salt/pull/34165 +.. _`#34166`: https://github.com/saltstack/salt/pull/34166 +.. _`#34170`: https://github.com/saltstack/salt/issues/34170 +.. _`#34172`: https://github.com/saltstack/salt/pull/34172 +.. _`#34173`: https://github.com/saltstack/salt/pull/34173 +.. _`#34174`: https://github.com/saltstack/salt/pull/34174 +.. _`#34175`: https://github.com/saltstack/salt/pull/34175 +.. _`#34176`: https://github.com/saltstack/salt/pull/34176 +.. _`#34178`: https://github.com/saltstack/salt/pull/34178 +.. _`#34179`: https://github.com/saltstack/salt/pull/34179 +.. _`#34182`: https://github.com/saltstack/salt/pull/34182 +.. _`#34184`: https://github.com/saltstack/salt/pull/34184 +.. _`#34186`: https://github.com/saltstack/salt/pull/34186 +.. _`#34188`: https://github.com/saltstack/salt/pull/34188 +.. _`#34194`: https://github.com/saltstack/salt/pull/34194 +.. _`#34196`: https://github.com/saltstack/salt/issues/34196 +.. _`#34197`: https://github.com/saltstack/salt/pull/34197 +.. _`#34198`: https://github.com/saltstack/salt/pull/34198 +.. _`#34199`: https://github.com/saltstack/salt/issues/34199 +.. _`#34200`: https://github.com/saltstack/salt/pull/34200 +.. _`#34201`: https://github.com/saltstack/salt/pull/34201 +.. _`#34206`: https://github.com/saltstack/salt/pull/34206 +.. _`#34208`: https://github.com/saltstack/salt/pull/34208 +.. _`#34209`: https://github.com/saltstack/salt/pull/34209 +.. _`#34212`: https://github.com/saltstack/salt/issues/34212 +.. _`#34213`: https://github.com/saltstack/salt/issues/34213 +.. _`#34214`: https://github.com/saltstack/salt/pull/34214 +.. _`#34215`: https://github.com/saltstack/salt/issues/34215 +.. _`#34218`: https://github.com/saltstack/salt/pull/34218 +.. _`#34222`: https://github.com/saltstack/salt/pull/34222 +.. _`#34223`: https://github.com/saltstack/salt/pull/34223 +.. _`#34224`: https://github.com/saltstack/salt/issues/34224 +.. _`#34225`: https://github.com/saltstack/salt/pull/34225 +.. _`#34229`: https://github.com/saltstack/salt/pull/34229 +.. _`#34232`: https://github.com/saltstack/salt/pull/34232 +.. _`#34233`: https://github.com/saltstack/salt/pull/34233 +.. _`#34239`: https://github.com/saltstack/salt/pull/34239 +.. _`#34244`: https://github.com/saltstack/salt/pull/34244 +.. _`#34247`: https://github.com/saltstack/salt/issues/34247 +.. _`#34249`: https://github.com/saltstack/salt/issues/34249 +.. _`#34252`: https://github.com/saltstack/salt/pull/34252 +.. _`#34254`: https://github.com/saltstack/salt/pull/34254 +.. _`#34255`: https://github.com/saltstack/salt/issues/34255 +.. _`#34256`: https://github.com/saltstack/salt/pull/34256 +.. _`#34257`: https://github.com/saltstack/salt/pull/34257 +.. _`#34258`: https://github.com/saltstack/salt/pull/34258 +.. _`#34259`: https://github.com/saltstack/salt/pull/34259 +.. _`#34261`: https://github.com/saltstack/salt/issues/34261 +.. _`#34271`: https://github.com/saltstack/salt/pull/34271 +.. _`#34273`: https://github.com/saltstack/salt/issues/34273 +.. _`#34274`: https://github.com/saltstack/salt/pull/34274 +.. _`#34281`: https://github.com/saltstack/salt/pull/34281 +.. _`#34283`: https://github.com/saltstack/salt/pull/34283 +.. _`#34284`: https://github.com/saltstack/salt/pull/34284 +.. _`#34292`: https://github.com/saltstack/salt/pull/34292 +.. _`#34296`: https://github.com/saltstack/salt/pull/34296 +.. _`#34300`: https://github.com/saltstack/salt/pull/34300 +.. _`#34302`: https://github.com/saltstack/salt/issues/34302 +.. _`#34304`: https://github.com/saltstack/salt/pull/34304 +.. _`#34306`: https://github.com/saltstack/salt/pull/34306 +.. _`#34307`: https://github.com/saltstack/salt/pull/34307 +.. _`#34311`: https://github.com/saltstack/salt/pull/34311 +.. _`#34312`: https://github.com/saltstack/salt/pull/34312 +.. _`#34313`: https://github.com/saltstack/salt/pull/34313 +.. _`#34316`: https://github.com/saltstack/salt/pull/34316 +.. _`#34318`: https://github.com/saltstack/salt/pull/34318 +.. _`#34319`: https://github.com/saltstack/salt/pull/34319 +.. _`#34321`: https://github.com/saltstack/salt/issues/34321 +.. _`#34322`: https://github.com/saltstack/salt/pull/34322 +.. _`#34323`: https://github.com/saltstack/salt/pull/34323 +.. _`#34324`: https://github.com/saltstack/salt/pull/34324 +.. _`#34325`: https://github.com/saltstack/salt/pull/34325 +.. _`#34329`: https://github.com/saltstack/salt/issues/34329 +.. _`#34330`: https://github.com/saltstack/salt/pull/34330 +.. _`#34333`: https://github.com/saltstack/salt/pull/34333 +.. _`#34335`: https://github.com/saltstack/salt/pull/34335 +.. _`#34337`: https://github.com/saltstack/salt/pull/34337 +.. _`#34338`: https://github.com/saltstack/salt/pull/34338 +.. _`#34339`: https://github.com/saltstack/salt/pull/34339 +.. _`#34342`: https://github.com/saltstack/salt/pull/34342 +.. _`#34343`: https://github.com/saltstack/salt/pull/34343 +.. _`#34344`: https://github.com/saltstack/salt/pull/34344 +.. _`#34345`: https://github.com/saltstack/salt/issues/34345 +.. _`#34348`: https://github.com/saltstack/salt/pull/34348 +.. _`#34352`: https://github.com/saltstack/salt/pull/34352 +.. _`#34353`: https://github.com/saltstack/salt/pull/34353 +.. _`#34365`: https://github.com/saltstack/salt/pull/34365 +.. _`#34366`: https://github.com/saltstack/salt/pull/34366 +.. _`#34368`: https://github.com/saltstack/salt/pull/34368 +.. _`#34371`: https://github.com/saltstack/salt/issues/34371 +.. _`#34373`: https://github.com/saltstack/salt/pull/34373 +.. _`#34376`: https://github.com/saltstack/salt/pull/34376 +.. _`#34377`: https://github.com/saltstack/salt/pull/34377 +.. _`#34378`: https://github.com/saltstack/salt/pull/34378 +.. _`#34379`: https://github.com/saltstack/salt/issues/34379 +.. _`#34382`: https://github.com/saltstack/salt/issues/34382 +.. _`#34386`: https://github.com/saltstack/salt/pull/34386 +.. _`#34388`: https://github.com/saltstack/salt/pull/34388 +.. _`#34390`: https://github.com/saltstack/salt/issues/34390 +.. _`#34392`: https://github.com/saltstack/salt/pull/34392 +.. _`#34395`: https://github.com/saltstack/salt/issues/34395 +.. _`#34397`: https://github.com/saltstack/salt/issues/34397 +.. _`#34400`: https://github.com/saltstack/salt/pull/34400 +.. _`#34401`: https://github.com/saltstack/salt/pull/34401 +.. _`#34404`: https://github.com/saltstack/salt/pull/34404 +.. _`#34426`: https://github.com/saltstack/salt/pull/34426 +.. _`#34427`: https://github.com/saltstack/salt/pull/34427 +.. _`#34429`: https://github.com/saltstack/salt/pull/34429 +.. _`#34432`: https://github.com/saltstack/salt/pull/34432 +.. _`#34435`: https://github.com/saltstack/salt/pull/34435 +.. _`#34436`: https://github.com/saltstack/salt/pull/34436 +.. _`#34439`: https://github.com/saltstack/salt/issues/34439 +.. _`#34451`: https://github.com/saltstack/salt/pull/34451 +.. _`#34452`: https://github.com/saltstack/salt/pull/34452 +.. _`#34453`: https://github.com/saltstack/salt/pull/34453 +.. _`#34455`: https://github.com/saltstack/salt/pull/34455 +.. _`#34456`: https://github.com/saltstack/salt/pull/34456 +.. _`#34457`: https://github.com/saltstack/salt/pull/34457 +.. _`#34459`: https://github.com/saltstack/salt/pull/34459 +.. _`#34462`: https://github.com/saltstack/salt/pull/34462 +.. _`#34463`: https://github.com/saltstack/salt/pull/34463 +.. _`#34466`: https://github.com/saltstack/salt/pull/34466 +.. _`#34467`: https://github.com/saltstack/salt/pull/34467 +.. _`#34468`: https://github.com/saltstack/salt/pull/34468 +.. _`#34486`: https://github.com/saltstack/salt/pull/34486 +.. _`#34488`: https://github.com/saltstack/salt/pull/34488 +.. _`#34489`: https://github.com/saltstack/salt/pull/34489 +.. _`#34490`: https://github.com/saltstack/salt/pull/34490 +.. _`#34492`: https://github.com/saltstack/salt/pull/34492 +.. _`#34493`: https://github.com/saltstack/salt/pull/34493 +.. _`#34498`: https://github.com/saltstack/salt/pull/34498 +.. _`#34499`: https://github.com/saltstack/salt/pull/34499 +.. _`#34503`: https://github.com/saltstack/salt/pull/34503 +.. _`#34505`: https://github.com/saltstack/salt/pull/34505 +.. _`#34507`: https://github.com/saltstack/salt/pull/34507 +.. _`#34513`: https://github.com/saltstack/salt/pull/34513 +.. _`#34518`: https://github.com/saltstack/salt/pull/34518 +.. _`#34520`: https://github.com/saltstack/salt/pull/34520 +.. _`#34521`: https://github.com/saltstack/salt/pull/34521 +.. _`#34524`: https://github.com/saltstack/salt/pull/34524 +.. _`#34527`: https://github.com/saltstack/salt/pull/34527 +.. _`#34531`: https://github.com/saltstack/salt/pull/34531 +.. _`#34537`: https://github.com/saltstack/salt/pull/34537 +.. _`#34545`: https://github.com/saltstack/salt/pull/34545 +.. _`#34546`: https://github.com/saltstack/salt/pull/34546 +.. _`#34548`: https://github.com/saltstack/salt/issues/34548 +.. _`#34549`: https://github.com/saltstack/salt/pull/34549 +.. _`#34553`: https://github.com/saltstack/salt/pull/34553 +.. _`#34554`: https://github.com/saltstack/salt/issues/34554 +.. _`#34557`: https://github.com/saltstack/salt/pull/34557 +.. _`#34560`: https://github.com/saltstack/salt/pull/34560 +.. _`#34565`: https://github.com/saltstack/salt/pull/34565 +.. _`#34569`: https://github.com/saltstack/salt/pull/34569 +.. _`#34584`: https://github.com/saltstack/salt/pull/34584 +.. _`#34585`: https://github.com/saltstack/salt/pull/34585 +.. _`#34590`: https://github.com/saltstack/salt/pull/34590 +.. _`#34591`: https://github.com/saltstack/salt/pull/34591 +.. _`#34592`: https://github.com/saltstack/salt/pull/34592 +.. _`#34593`: https://github.com/saltstack/salt/pull/34593 +.. _`#34601`: https://github.com/saltstack/salt/pull/34601 +.. _`#34605`: https://github.com/saltstack/salt/pull/34605 +.. _`#34606`: https://github.com/saltstack/salt/pull/34606 +.. _`#34607`: https://github.com/saltstack/salt/pull/34607 +.. _`#34616`: https://github.com/saltstack/salt/pull/34616 +.. _`#34617`: https://github.com/saltstack/salt/pull/34617 +.. _`#34618`: https://github.com/saltstack/salt/pull/34618 +.. _`#34619`: https://github.com/saltstack/salt/pull/34619 +.. _`#34621`: https://github.com/saltstack/salt/pull/34621 +.. _`#34630`: https://github.com/saltstack/salt/issues/34630 +.. _`#34642`: https://github.com/saltstack/salt/pull/34642 +.. _`#34644`: https://github.com/saltstack/salt/pull/34644 +.. _`#34647`: https://github.com/saltstack/salt/pull/34647 +.. _`#34651`: https://github.com/saltstack/salt/pull/34651 +.. _`#34652`: https://github.com/saltstack/salt/pull/34652 +.. _`#34661`: https://github.com/saltstack/salt/issues/34661 +.. _`#34670`: https://github.com/saltstack/salt/pull/34670 +.. _`#34676`: https://github.com/saltstack/salt/pull/34676 +.. _`#34678`: https://github.com/saltstack/salt/issues/34678 +.. _`#34679`: https://github.com/saltstack/salt/pull/34679 +.. _`#34681`: https://github.com/saltstack/salt/pull/34681 +.. _`#34682`: https://github.com/saltstack/salt/pull/34682 +.. _`#34683`: https://github.com/saltstack/salt/pull/34683 +.. _`#34689`: https://github.com/saltstack/salt/pull/34689 +.. _`#34695`: https://github.com/saltstack/salt/pull/34695 +.. _`#34696`: https://github.com/saltstack/salt/pull/34696 +.. _`#34702`: https://github.com/saltstack/salt/pull/34702 +.. _`#34703`: https://github.com/saltstack/salt/issues/34703 +.. _`#34707`: https://github.com/saltstack/salt/pull/34707 +.. _`#34714`: https://github.com/saltstack/salt/pull/34714 +.. _`#34720`: https://github.com/saltstack/salt/pull/34720 +.. _`#34721`: https://github.com/saltstack/salt/pull/34721 +.. _`#34722`: https://github.com/saltstack/salt/pull/34722 +.. _`#34726`: https://github.com/saltstack/salt/pull/34726 +.. _`#34739`: https://github.com/saltstack/salt/pull/34739 +.. _`#34740`: https://github.com/saltstack/salt/pull/34740 +.. _`#34741`: https://github.com/saltstack/salt/pull/34741 +.. _`#34744`: https://github.com/saltstack/salt/pull/34744 +.. _`#34746`: https://github.com/saltstack/salt/pull/34746 +.. _`#34751`: https://github.com/saltstack/salt/pull/34751 +.. _`#34754`: https://github.com/saltstack/salt/pull/34754 +.. _`#34756`: https://github.com/saltstack/salt/pull/34756 +.. _`#34762`: https://github.com/saltstack/salt/issues/34762 +.. _`#34770`: https://github.com/saltstack/salt/pull/34770 +.. _`#34773`: https://github.com/saltstack/salt/pull/34773 +.. _`#34784`: https://github.com/saltstack/salt/pull/34784 +.. _`#34791`: https://github.com/saltstack/salt/pull/34791 +.. _`#34803`: https://github.com/saltstack/salt/pull/34803 +.. _`#34818`: https://github.com/saltstack/salt/pull/34818 +.. _`#34824`: https://github.com/saltstack/salt/pull/34824 +.. _`#34825`: https://github.com/saltstack/salt/pull/34825 +.. _`#34837`: https://github.com/saltstack/salt/pull/34837 +.. _`#34838`: https://github.com/saltstack/salt/pull/34838 +.. _`#34840`: https://github.com/saltstack/salt/pull/34840 +.. _`#34842`: https://github.com/saltstack/salt/pull/34842 +.. _`bp-32396`: https://github.com/saltstack/salt/pull/32396 +.. _`bp-33698`: https://github.com/saltstack/salt/pull/33698 +.. _`bp-33806`: https://github.com/saltstack/salt/pull/33806 +.. _`bp-33847`: https://github.com/saltstack/salt/pull/33847 +.. _`bp-33948`: https://github.com/saltstack/salt/pull/33948 +.. _`bp-34057`: https://github.com/saltstack/salt/pull/34057 +.. _`bp-34103`: https://github.com/saltstack/salt/pull/34103 +.. _`bp-34378`: https://github.com/saltstack/salt/pull/34378 +.. _`bp-34436`: https://github.com/saltstack/salt/pull/34436 +.. _`bp-34457`: https://github.com/saltstack/salt/pull/34457 +.. _`bp-34726`: https://github.com/saltstack/salt/pull/34726 +.. _`fix-33879`: https://github.com/saltstack/salt/issues/33879 +.. _`fix-33911`: https://github.com/saltstack/salt/issues/33911 +.. _`fix-34037`: https://github.com/saltstack/salt/issues/34037 +.. _`fix-34043`: https://github.com/saltstack/salt/issues/34043 +.. _`fix-34120`: https://github.com/saltstack/salt/issues/34120 +.. _`fix-34129`: https://github.com/saltstack/salt/issues/34129 +.. _`fix-34162`: https://github.com/saltstack/salt/issues/34162 +.. _`fix-34630`: https://github.com/saltstack/salt/issues/34630 +.. _`fix-34703`: https://github.com/saltstack/salt/issues/34703 From 15b4f5a8b37d8d4694780ffa37381608b65206a6 Mon Sep 17 00:00:00 2001 From: rallytime Date: Thu, 21 Jul 2016 10:53:00 -0600 Subject: [PATCH 31/32] Skip GCE unit tests - causes test suite to hang --- tests/unit/cloud/clouds/gce_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/cloud/clouds/gce_test.py b/tests/unit/cloud/clouds/gce_test.py index 91ada38a2f0..87824eb798b 100644 --- a/tests/unit/cloud/clouds/gce_test.py +++ b/tests/unit/cloud/clouds/gce_test.py @@ -78,6 +78,7 @@ class ExtendedTestCase(TestCase): self.assertEqual(exc.message, exc_msg) +@skipIf(True, 'Test mock token is not properly mocked and occassionally causes the test suite to hang.') @skipIf(not HAS_CERTS, 'Cannot find CA cert bundle') @skipIf(NO_MOCK, NO_MOCK_REASON) @patch('salt.cloud.clouds.gce.__virtual__', MagicMock(return_value='gce')) From 742317749113f2ae7d1ddbfb6edea468578748f7 Mon Sep 17 00:00:00 2001 From: Nicole Thomas Date: Thu, 21 Jul 2016 11:18:31 -0600 Subject: [PATCH 32/32] Update 2016.3.2 release notes (#34850) --- doc/topics/releases/2016.3.2.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/topics/releases/2016.3.2.rst b/doc/topics/releases/2016.3.2.rst index fe551b39ec3..9e84fe6ffc3 100644 --- a/doc/topics/releases/2016.3.2.rst +++ b/doc/topics/releases/2016.3.2.rst @@ -13,8 +13,8 @@ Returner Changes have been modified to do so. -Changes for v2016.3.1..2016.3 ------------------------------ +Changes for v2016.3.1..2016.3.2 +------------------------------- Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs): @@ -26,6 +26,8 @@ Statistics: Changes: +- **PR** `#34844`_: (*vutny*) Fix getting total available memory without `psutil` installed + - **PR** `#34837`_: (*thatch45*) Fix `#34345`_ - **PR** `#34838`_: (*thatch45*) Check if a valid value is passed to unlyif/unless @@ -990,6 +992,7 @@ Changes: .. _`#34838`: https://github.com/saltstack/salt/pull/34838 .. _`#34840`: https://github.com/saltstack/salt/pull/34840 .. _`#34842`: https://github.com/saltstack/salt/pull/34842 +.. _`#34844`: https://github.com/saltstack/salt/pull/34844 .. _`bp-32396`: https://github.com/saltstack/salt/pull/32396 .. _`bp-33698`: https://github.com/saltstack/salt/pull/33698 .. _`bp-33806`: https://github.com/saltstack/salt/pull/33806