From f1f1bfc5c10d2ee7e83e44855c07c85943532f8a Mon Sep 17 00:00:00 2001 From: twangboy Date: Tue, 8 May 2018 18:47:24 -0600 Subject: [PATCH 01/66] Show GPO settings, raise error if trying to set gpo managed settings --- salt/modules/win_snmp.py | 99 +++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 17 deletions(-) diff --git a/salt/modules/win_snmp.py b/salt/modules/win_snmp.py index baa119e388..a2807aa4d8 100644 --- a/salt/modules/win_snmp.py +++ b/salt/modules/win_snmp.py @@ -9,17 +9,21 @@ from __future__ import absolute_import import logging # Import salt libs -from salt.exceptions import SaltInvocationError +from salt.exceptions import SaltInvocationError, CommandExecutionError import salt.utils # Import 3rd party libs from salt.ext import six _HKEY = 'HKLM' + _SNMP_KEY = r'SYSTEM\CurrentControlSet\Services\SNMP\Parameters' _AGENT_KEY = r'{0}\RFC1156Agent'.format(_SNMP_KEY) _COMMUNITIES_KEY = r'{0}\ValidCommunities'.format(_SNMP_KEY) +_SNMP_GPO_KEY = r'SOFTWARE\Policies\SNMP\Parameters' +_COMMUNITIES_GPO_KEY = r'{0}\ValidCommunities'.format(_SNMP_GPO_KEY) + _PERMISSION_TYPES = {'None': 1, 'Notify': 2, 'Read Only': 4, @@ -285,6 +289,21 @@ def get_community_names(): ''' Get the current accepted SNMP community names and their permissions. + If community names are being managed by Group Policy, those values will be + returned instead like this: + + .. code-block:: bash + + TestCommunity: + Managed by GPO + + Community names managed normally will denote the permission instead: + + .. code-block:: bash + + TestCommunity: + Read Only + Returns: dict: A dictionary of community names and permissions. @@ -295,25 +314,57 @@ def get_community_names(): salt '*' win_snmp.get_community_names ''' ret = dict() - current_values = __salt__['reg.list_values']( - _HKEY, _COMMUNITIES_KEY, include_default=False) - # The communities are stored as the community name with a numeric permission - # value. Convert the numeric value to the text equivalent, as present in the - # Windows SNMP service GUI. - if isinstance(current_values, list): - for current_value in current_values: + # Look in GPO settings first + if __salt__['reg.key_exists'](_HKEY, _COMMUNITIES_GPO_KEY): - # Ignore error values - if not isinstance(current_value, dict): - continue + _LOG.debug('Loading communities from Group Policy settings') - permissions = str() - for permission_name in _PERMISSION_TYPES: - if current_value['vdata'] == _PERMISSION_TYPES[permission_name]: - permissions = permission_name - break - ret[current_value['vname']] = permissions + current_values = __salt__['reg.list_values']( + _HKEY, _COMMUNITIES_GPO_KEY, include_default=False) + + # GPO settings are different in that they do not designate permissions + # They are a numbered list of communities like so: + # + # {1: "community 1", + # 2: "community 2"} + if isinstance(current_values, list): + for current_value in current_values: + + # Ignore error values + if not isinstance(current_value, dict): + continue + + ret[current_value['vdata']] = 'Managed by GPO' + + if not ret: + + _LOG.debug('Loading communities from SNMP settings') + + current_values = __salt__['reg.list_values']( + _HKEY, _COMMUNITIES_KEY, include_default=False) + + # The communities are stored as the community name with a numeric + # permission value. Like this (4 = Read Only): + # + # {"community 1": 4, + # "community 2": 4} + # + # Convert the numeric value to the text equivalent, as present in the + # Windows SNMP service GUI. + if isinstance(current_values, list): + for current_value in current_values: + + # Ignore error values + if not isinstance(current_value, dict): + continue + + permissions = str() + for permission_name in _PERMISSION_TYPES: + if current_value['vdata'] == _PERMISSION_TYPES[permission_name]: + permissions = permission_name + break + ret[current_value['vname']] = permissions if not ret: _LOG.debug('Unable to find existing communities.') @@ -324,6 +375,11 @@ def set_community_names(communities): ''' Manage the SNMP accepted community names and their permissions. + .. note:: + Settings managed by Group Policy will always take precedence over those + set using the SNMP interface. Therefore if this function finds Group + Policy settings it will raise a CommandExecutionError + Args: communities (dict): A dictionary of SNMP community names and permissions. The possible permissions can be found via @@ -332,6 +388,10 @@ def set_community_names(communities): Returns: bool: True if successful, otherwise False + Raises: + CommandExecutionError: + If SNMP settings are being managed by Group Policy + CLI Example: .. code-block:: bash @@ -340,6 +400,11 @@ def set_community_names(communities): ''' values = dict() + if __salt__['reg.key_exists'](_HKEY, _COMMUNITIES_GPO_KEY): + _LOG.debug('Communities on this system are managed by Group Policy') + raise CommandExecutionError( + 'Communities on this system are managed by Group Policy') + current_communities = get_community_names() if communities == current_communities: From 87097eefb6b4241e8b1b7a0d6cfd64453713c616 Mon Sep 17 00:00:00 2001 From: twangboy Date: Tue, 8 May 2018 18:51:21 -0600 Subject: [PATCH 02/66] Add comments about how get is returning data --- salt/modules/win_snmp.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/salt/modules/win_snmp.py b/salt/modules/win_snmp.py index a2807aa4d8..db4ccd7208 100644 --- a/salt/modules/win_snmp.py +++ b/salt/modules/win_snmp.py @@ -328,6 +328,13 @@ def get_community_names(): # # {1: "community 1", # 2: "community 2"} + # + # Denote that it is being managed by Group Policy. + # + # community 1: + # Managed by GPO + # community 2: + # Managed by GPO if isinstance(current_values, list): for current_value in current_values: @@ -352,6 +359,11 @@ def get_community_names(): # # Convert the numeric value to the text equivalent, as present in the # Windows SNMP service GUI. + # + # community 1: + # Read Only + # community 2: + # Read Only if isinstance(current_values, list): for current_value in current_values: From 008af0ac6b306b0478fb5769e1bf73002b00773a Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 16 May 2018 15:13:24 -0600 Subject: [PATCH 03/66] Fix unit tests --- tests/unit/modules/test_win_snmp.py | 39 +++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tests/unit/modules/test_win_snmp.py b/tests/unit/modules/test_win_snmp.py index 9660d5d6a0..295be4e842 100644 --- a/tests/unit/modules/test_win_snmp.py +++ b/tests/unit/modules/test_win_snmp.py @@ -11,6 +11,7 @@ from __future__ import absolute_import # Import Salt Libs import salt.modules.win_snmp as win_snmp +from salt.exceptions import CommandExecutionError # Import Salt Testing Libs from tests.support.mixins import LoaderModuleMockMixin @@ -70,19 +71,47 @@ class WinSnmpTestCase(TestCase, LoaderModuleMockMixin): ''' Test - Get the current accepted SNMP community names and their permissions. ''' - mock_value = MagicMock(return_value=[{'vdata': 16, - 'vname': 'TestCommunity'}]) - with patch.dict(win_snmp.__salt__, {'reg.list_values': mock_value}): + mock_ret = MagicMock(return_value=[{'vdata': 16, + 'vname': 'TestCommunity'}]) + mock_false = MagicMock(return_value=False) + with patch.dict(win_snmp.__salt__, {'reg.list_values': mock_ret, + 'reg.key_exists': mock_false}): self.assertEqual(win_snmp.get_community_names(), COMMUNITY_NAMES) + def test_get_community_names_gpo(self): + ''' + Test - Get the current accepted SNMP community names and their permissions. + ''' + mock_ret = MagicMock(return_value=[{'vdata': 'TestCommunity', + 'vname': 1}]) + mock_false = MagicMock(return_value=True) + with patch.dict(win_snmp.__salt__, {'reg.list_values': mock_ret, + 'reg.key_exists': mock_false}): + self.assertEqual(win_snmp.get_community_names(), + {'TestCommunity': 'Managed by GPO'}) + def test_set_community_names(self): ''' Test - Manage the SNMP accepted community names and their permissions. ''' - mock_value = MagicMock(return_value=True) + mock_true = MagicMock(return_value=True) kwargs = {'communities': COMMUNITY_NAMES} - with patch.dict(win_snmp.__salt__, {'reg.set_value': mock_value}), \ + mock_false = MagicMock(return_value=False) + with patch.dict(win_snmp.__salt__, {'reg.set_value': mock_true, + 'reg.key_exists': mock_false}), \ patch('salt.modules.win_snmp.get_community_names', MagicMock(return_value=COMMUNITY_NAMES)): self.assertTrue(win_snmp.set_community_names(**kwargs)) + + def test_set_community_names_gpo(self): + ''' + Test - Manage the SNMP accepted community names and their permissions. + ''' + mock_true = MagicMock(return_value=True) + kwargs = {'communities': COMMUNITY_NAMES} + with patch.dict(win_snmp.__salt__, {'reg.set_value': mock_true, + 'reg.key_exists': mock_true}), \ + patch('salt.modules.win_snmp.get_community_names', + MagicMock(return_value=COMMUNITY_NAMES)): + self.assertRaises(CommandExecutionError, win_snmp.set_community_names, **kwargs) From b29ec75da72e971a04ebcc8462f0ce8cddea57e5 Mon Sep 17 00:00:00 2001 From: lomeroe Date: Wed, 16 May 2018 16:34:07 -0500 Subject: [PATCH 04/66] Update regexes in core grains for detecting the 'product' grain on Solaris Sparc systems. Additionally, copy the 'product' grain to 'productname' to be consistent with other OSes. --- salt/grains/core.py | 13 +-- tests/unit/grains/os-releases/solaris-11.3 | 3 + tests/unit/grains/solaris/prtconf.s7-zone | 24 ++++++ tests/unit/grains/solaris/prtconf.t5220-zone | 16 ++++ tests/unit/grains/solaris/prtdiag.s7 | 24 ++++++ tests/unit/grains/solaris/prtdiag.t5220 | 16 ++++ tests/unit/grains/test_core.py | 90 +++++++++++++++++++- 7 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 tests/unit/grains/os-releases/solaris-11.3 create mode 100644 tests/unit/grains/solaris/prtconf.s7-zone create mode 100644 tests/unit/grains/solaris/prtconf.t5220-zone create mode 100644 tests/unit/grains/solaris/prtdiag.s7 create mode 100644 tests/unit/grains/solaris/prtdiag.t5220 diff --git a/salt/grains/core.py b/salt/grains/core.py index 14b637a0b7..c6641ae6dd 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -2160,9 +2160,9 @@ def _hw_data(osdata): product_regexes = [ re.compile(r) for r in [ - r'(?im)^\s*System\s+Configuration:\s*.*?sun\d\S+\s(.*)', # prtdiag - r'(?im)^\s*banner-name:\s*(.*)', # prtconf - r'(?im)^\s*product-name:\s*(.*)', # prtconf + r'(?im)^\s*System\s+Configuration:\s*.*?sun\d\S+[^\S\r\n]*(.*)', # prtdiag + r'(?im)^[^\S\r\n]*banner-name:[^\S\r\n]*(.*)', # prtconf + r'(?im)^[^\S\r\n]*product-name:[^\S\r\n]*(.*)', # prtconf ] ] @@ -2229,8 +2229,11 @@ def _hw_data(osdata): for regex in product_regexes: res = regex.search(data) if res and len(res.groups()) >= 1: - grains['product'] = res.group(1).strip().replace("'", "") - break + t_productname = res.group(1).strip().replace("'", "") + if t_productname: + grains['product'] = t_productname + grains['productname'] = t_productname + break return grains diff --git a/tests/unit/grains/os-releases/solaris-11.3 b/tests/unit/grains/os-releases/solaris-11.3 new file mode 100644 index 0000000000..f40e9e6ab2 --- /dev/null +++ b/tests/unit/grains/os-releases/solaris-11.3 @@ -0,0 +1,3 @@ + Oracle Solaris 11.3 SPARC + Copyright (c) 1983, 2017, Oracle and/or its affiliates. All rights reserved. + Assembled 05 October 2017 \ No newline at end of file diff --git a/tests/unit/grains/solaris/prtconf.s7-zone b/tests/unit/grains/solaris/prtconf.s7-zone new file mode 100644 index 0000000000..c75205128c --- /dev/null +++ b/tests/unit/grains/solaris/prtconf.s7-zone @@ -0,0 +1,24 @@ +System Configuration: Oracle Corporation sun4v +Memory size: 16384 Megabytes +System Peripherals (PROM Nodes): + +Node 0xfffffffff + scsi-initiator-id: 00000007 + idprom: 00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000 + pcie-ari-supported: + #priqs-per-pcibus: 00000010 + #priqs-per-cpu: 00000010 + priq-eq-sizes: 00000003 + non-ios-perf-counters: 'ORCL,sn-non-ios-pr' + ios-perf-counters: 'ORCL,sn-ios-pr' + storage-variant: '8dbp' + product-name: 'SPARC S7-2' + banner-name: 'SPARC S7-2' + name: 'ORCL,SPARC-S7-2' + stick-frequency: 3b9aca00 + hv-api-groups: 00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000.000000060.00000000.00000000 + breakpoint-trap: 0000007f + device_type: 'sun4v' + compatible: 'sun4v' + #address-cells: 00000002 + #size-cells: 00000002 \ No newline at end of file diff --git a/tests/unit/grains/solaris/prtconf.t5220-zone b/tests/unit/grains/solaris/prtconf.t5220-zone new file mode 100644 index 0000000000..2183291471 --- /dev/null +++ b/tests/unit/grains/solaris/prtconf.t5220-zone @@ -0,0 +1,16 @@ +System Configuration: Oracle Corporation sun4v +Memory size: 8192 Megabytes +System Peripherals (PROM Nodes): + +Node 0xffffffff + idprom: 11111111.11111111.00000000.11111111.00000000.00000000.00000000.00000000 + scsi-initiator-id: 00000007 + banner-name: 'SPARC Enterprise T5220' + name: 'SUNW,SPARC-Enterprise-T5220' + stick-frequency: 5458c3a0 + hv-api-groups: 00000000.00000000.00000000.00000000.00000000.00000000.00000000.00000000 + breakpoint-trap: 0000007f + device_type: 'sun4v' + compatible: 'sun4v' + #address-cells: 00000002 + #size-cells: 00000002 \ No newline at end of file diff --git a/tests/unit/grains/solaris/prtdiag.s7 b/tests/unit/grains/solaris/prtdiag.s7 new file mode 100644 index 0000000000..6f86dfdd9f --- /dev/null +++ b/tests/unit/grains/solaris/prtdiag.s7 @@ -0,0 +1,24 @@ +System Configuration: Oracle Corporation sun4v SPARC S7-2 +Memory size: 16384 Megabytes + +================================ Virtual CPUs ================================ + + +CPU ID Frequency Implementation Status +------ --------- ---------------------- ------- +0 4267 MHz SPARC-S7 on-line +1 4267 MHz SPARC-S7 on-line +2 4267 MHz SPARC-S7 on-line +3 4267 MHz SPARC-S7 on-line +4 4267 MHz SPARC-S7 on-line +5 4267 MHz SPARC-S7 on-line +6 4267 MHz SPARC-S7 on-line +7 4267 MHz SPARC-S7 on-line +8 4267 MHz SPARC-S7 on-line +9 4267 MHz SPARC-S7 on-line +10 4267 MHz SPARC-S7 on-line +11 4267 MHz SPARC-S7 on-line +12 4267 MHz SPARC-S7 on-line +13 4267 MHz SPARC-S7 on-line +14 4267 MHz SPARC-S7 on-line +15 4267 MHz SPARC-S7 on-line \ No newline at end of file diff --git a/tests/unit/grains/solaris/prtdiag.t5220 b/tests/unit/grains/solaris/prtdiag.t5220 new file mode 100644 index 0000000000..67cec311c1 --- /dev/null +++ b/tests/unit/grains/solaris/prtdiag.t5220 @@ -0,0 +1,16 @@ +System Configuration: Oracle Corporation sun4v SPARC Enterprise T5220 +Memory size: 8192 Megabytes + +================================ Virtual CPUs ================================ + + +CPU ID Frequency Implementation Status +------ --------- ---------------------- ------- +0 1415 MHz SUNW,UltraSPARC-T2 on-line +1 1415 MHz SUNW,UltraSPARC-T2 on-line +2 1415 MHz SUNW,UltraSPARC-T2 on-line +3 1415 MHz SUNW,UltraSPARC-T2 on-line +4 1415 MHz SUNW,UltraSPARC-T2 on-line +5 1415 MHz SUNW,UltraSPARC-T2 on-line +6 1415 MHz SUNW,UltraSPARC-T2 on-line +7 1415 MHz SUNW,UltraSPARC-T2 on-line \ No newline at end of file diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 6c6766cdb7..ee4f456272 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -41,7 +41,7 @@ IP6_ADD1 = '2001:4860:4860::8844' IP6_ADD2 = '2001:4860:4860::8888' IP6_ADD_SCOPE = 'fe80::6238:e0ff:fe06:3f6b%enp2s0' OS_RELEASE_DIR = os.path.join(os.path.dirname(__file__), "os-releases") - +SOLARIS_DIR = os.path.join(os.path.dirname(__file__), 'solaris') @skipIf(NO_MOCK, NO_MOCK_REASON) class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): @@ -714,3 +714,91 @@ PATCHLEVEL = 3 osdata = {'kernel': 'test', } ret = core._virtual(osdata) self.assertEqual(ret['virtual'], virt) + + def test_solaris_sparc_s7zone(self): + ''' + verify productname grain for s7 zone + ''' + expectation = { + 'productname': 'SPARC S7-2', + 'prodct': 'SPARC S7-2', + } + with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtconf.s7-zone')) as sparc_return_data: + this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data += '\n' + _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + + def test_solaris_sparc_s7(self): + ''' + verify productname grain for s7 + ''' + expectation = { + 'productname': 'SPARC S7-2', + 'prodct': 'SPARC S7-2', + } + with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.s7')) as sparc_return_data: + this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data += '\n' + _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + + def test_solaris_sparc_t5220(self): + ''' + verify productname grain for t5220 + ''' + expectation = { + 'productname': 'SPARC Enterprise T5220', + 'prodct': 'SPARC Enterprise T5220', + } + with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220')) as sparc_return_data: + this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data += '\n' + _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + + def test_solaris_sparc_t5220zone(self): + ''' + verify productname grain for t5220 zone + ''' + expectation = { + 'productname': 'SPARC Enterprise T5220', + 'prodct': 'SPARC Enterprise T5220', + } + with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220-zone')) as sparc_return_data: + this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data += '\n' + _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + + def _check_solaris_sparc_productname_grains(self, prtdata, expectation): + ''' + verify product grains on solaris sparc + ''' + path_isfile_mock = MagicMock(side_effect=lambda x: x in ['/etc/release']) + with patch.object(platform, 'uname', + MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc')) + with patch.object(salt.utils, 'is_proxy', + MagicMock(return_value=False)): + with patch.object(salt.utils, 'is_linux', + MagicMock(return_value=False)): + with patch.object(salt.utils, 'is_windows', + MagicMock(return_value=False)): + with patch.object(salt.utils, 'is_smartos', + MagicMock(return_value=False)): + with patch.object(os.path, 'isfile', path_isfile_mock): + with salt.utils.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: + os_release_content = os_release_file.readlines() + with patch("salt.utils.fopen", mock_open()) as os_release_file: + os_release_file.return_value.__iter__.return_value = os_release_content + with patch.object(core, '_sunos_cpudata', + MagicMock(return_value={'cpuarch':'sparcv9', + 'num_cpus': '1', + 'cpu_model': 'MOCK_CPU_MODEL', + 'cpu_flags': []}) + with patch.object(core, '_memdata', + MagicMock(return_value={'mem_total': 16384}) + with patch.object(salt.utils, 'which', + MagicMock(return_value=True)): + sparc_return_mock = MagicMock(return_value=prtdata) + with patch.dict(core.__salt__, {'cmd.run': sparc_return_mock}) + os_grains = core.os_data() + grains = {k: v for k, v in os_grains.items() + if k in set(['product', 'productname'])} + self.assertEqual(grains, expectation) \ No newline at end of file From 8c9355d34c765dbf65ee405f1a17379cc6c094df Mon Sep 17 00:00:00 2001 From: lomeroe Date: Thu, 17 May 2018 08:34:19 -0500 Subject: [PATCH 05/66] Lint fix --- tests/unit/grains/test_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index ee4f456272..549152f17d 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -773,7 +773,7 @@ PATCHLEVEL = 3 ''' path_isfile_mock = MagicMock(side_effect=lambda x: x in ['/etc/release']) with patch.object(platform, 'uname', - MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc')) + MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc'))) with patch.object(salt.utils, 'is_proxy', MagicMock(return_value=False)): with patch.object(salt.utils, 'is_linux', From dbffba6876916a4c99eaa4a3dfd30e50e51b8bf5 Mon Sep 17 00:00:00 2001 From: lomeroe Date: Thu, 17 May 2018 10:50:50 -0500 Subject: [PATCH 06/66] fix tons of errors in my tests --- tests/unit/grains/test_core.py | 71 +++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 549152f17d..38011bf8d3 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -721,12 +721,12 @@ PATCHLEVEL = 3 ''' expectation = { 'productname': 'SPARC S7-2', - 'prodct': 'SPARC S7-2', + 'product': 'SPARC S7-2', } with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtconf.s7-zone')) as sparc_return_data: - this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' - _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) def test_solaris_sparc_s7(self): ''' @@ -734,12 +734,12 @@ PATCHLEVEL = 3 ''' expectation = { 'productname': 'SPARC S7-2', - 'prodct': 'SPARC S7-2', + 'product': 'SPARC S7-2', } with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.s7')) as sparc_return_data: - this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' - _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) def test_solaris_sparc_t5220(self): ''' @@ -747,12 +747,12 @@ PATCHLEVEL = 3 ''' expectation = { 'productname': 'SPARC Enterprise T5220', - 'prodct': 'SPARC Enterprise T5220', + 'product': 'SPARC Enterprise T5220', } with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220')) as sparc_return_data: - this_sparc_return_data = sparc_return_data.readlines() + this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' - _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) def test_solaris_sparc_t5220zone(self): ''' @@ -760,20 +760,21 @@ PATCHLEVEL = 3 ''' expectation = { 'productname': 'SPARC Enterprise T5220', - 'prodct': 'SPARC Enterprise T5220', + 'product': 'SPARC Enterprise T5220', } - with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220-zone')) as sparc_return_data: - this_sparc_return_data = sparc_return_data.readlines() + with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtconf.t5220-zone')) as sparc_return_data: + this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' - _check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) + self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) def _check_solaris_sparc_productname_grains(self, prtdata, expectation): ''' verify product grains on solaris sparc ''' + import platform path_isfile_mock = MagicMock(side_effect=lambda x: x in ['/etc/release']) with patch.object(platform, 'uname', - MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc'))) + MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc'))): with patch.object(salt.utils, 'is_proxy', MagicMock(return_value=False)): with patch.object(salt.utils, 'is_linux', @@ -782,23 +783,31 @@ PATCHLEVEL = 3 MagicMock(return_value=False)): with patch.object(salt.utils, 'is_smartos', MagicMock(return_value=False)): - with patch.object(os.path, 'isfile', path_isfile_mock): - with salt.utils.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: - os_release_content = os_release_file.readlines() - with patch("salt.utils.fopen", mock_open()) as os_release_file: - os_release_file.return_value.__iter__.return_value = os_release_content - with patch.object(core, '_sunos_cpudata', - MagicMock(return_value={'cpuarch':'sparcv9', - 'num_cpus': '1', - 'cpu_model': 'MOCK_CPU_MODEL', - 'cpu_flags': []}) - with patch.object(core, '_memdata', - MagicMock(return_value={'mem_total': 16384}) - with patch.object(salt.utils, 'which', - MagicMock(return_value=True)): - sparc_return_mock = MagicMock(return_value=prtdata) - with patch.dict(core.__salt__, {'cmd.run': sparc_return_mock}) - os_grains = core.os_data() + with patch.object(salt.utils, 'which_bin', + MagicMock(return_value=None)): + with patch.object(os.path, 'isfile', path_isfile_mock): + with salt.utils.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: + os_release_content = os_release_file.readlines() + with patch("salt.utils.fopen", mock_open()) as os_release_file: + os_release_file.return_value.__iter__.return_value = os_release_content + with patch.object(core, '_sunos_cpudata', + MagicMock(return_value={'cpuarch':'sparcv9', + 'num_cpus': '1', + 'cpu_model': 'MOCK_CPU_MODEL', + 'cpu_flags': []})): + with patch.object(core, '_memdata', + MagicMock(return_value={'mem_total': 16384})): + with patch.object(core, '_zpool_data', + MagicMock(return_value={})): + with patch.object(core, '_virtual', + MagicMock(return_value={})): + with patch.object(core, '_ps', + MagicMock(return_value={})): + with patch.object(salt.utils, 'which', + MagicMock(return_value=True)): + sparc_return_mock = MagicMock(return_value=prtdata) + with patch.dict(core.__salt__, {'cmd.run': sparc_return_mock}): + os_grains = core.os_data() grains = {k: v for k, v in os_grains.items() if k in set(['product', 'productname'])} self.assertEqual(grains, expectation) \ No newline at end of file From 6f185c917922c1a99019d63b89d1aa6c21680949 Mon Sep 17 00:00:00 2001 From: lomeroe Date: Thu, 17 May 2018 12:20:49 -0500 Subject: [PATCH 07/66] another lint fix --- tests/unit/grains/test_core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 38011bf8d3..43868d7237 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -43,6 +43,7 @@ IP6_ADD_SCOPE = 'fe80::6238:e0ff:fe06:3f6b%enp2s0' OS_RELEASE_DIR = os.path.join(os.path.dirname(__file__), "os-releases") SOLARIS_DIR = os.path.join(os.path.dirname(__file__), 'solaris') + @skipIf(NO_MOCK, NO_MOCK_REASON) class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): ''' From 49053bc106590a4f5ff837d26786cba32737adc4 Mon Sep 17 00:00:00 2001 From: lomeroe Date: Thu, 17 May 2018 13:56:24 -0500 Subject: [PATCH 08/66] lint fix --- tests/unit/grains/test_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 43868d7237..b396896dbd 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -792,7 +792,7 @@ PATCHLEVEL = 3 with patch("salt.utils.fopen", mock_open()) as os_release_file: os_release_file.return_value.__iter__.return_value = os_release_content with patch.object(core, '_sunos_cpudata', - MagicMock(return_value={'cpuarch':'sparcv9', + MagicMock(return_value={'cpuarch': 'sparcv9', 'num_cpus': '1', 'cpu_model': 'MOCK_CPU_MODEL', 'cpu_flags': []})): @@ -811,4 +811,4 @@ PATCHLEVEL = 3 os_grains = core.os_data() grains = {k: v for k, v in os_grains.items() if k in set(['product', 'productname'])} - self.assertEqual(grains, expectation) \ No newline at end of file + self.assertEqual(grains, expectation) From 7c9b0bda335fae6b0c953cf22338233d42512410 Mon Sep 17 00:00:00 2001 From: Frode Gundersen Date: Tue, 22 May 2018 14:43:11 +0000 Subject: [PATCH 09/66] add win_servermanager.list_available test --- .../modules/test_win_servermanager.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/integration/modules/test_win_servermanager.py diff --git a/tests/integration/modules/test_win_servermanager.py b/tests/integration/modules/test_win_servermanager.py new file mode 100644 index 0000000000..d9591bb3ed --- /dev/null +++ b/tests/integration/modules/test_win_servermanager.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# Import Python libs +from __future__ import absolute_import + +# Import Salt Testing libs +from tests.support.case import ModuleCase +from tests.support.unit import skipIf + +# Import Salt libs +import salt.utils + + +@skipIf(not salt.utils.is_windows(), 'windows test only') +class WinServermanagerTest(ModuleCase): + ''' + Test for salt.modules.win_servermanager + ''' + def test_list_available(self): + ''' + Test list available features to install + ''' + cmd = self.run_function('win_servermanager.list_available') + self.assertIn('DNS', cmd) + self.assertIn('NetworkController', cmd) + self.assertIn('RemoteAccess', cmd) From 872e16213767b2ab6cbcc2d1eb3a4a0d28e01a2c Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Tue, 22 May 2018 15:11:14 -0400 Subject: [PATCH 10/66] Add test_pkg integration state tests to windows --- .../files/file/base/win/repo-ng/7zip.sls | 24 +++++++++++++++++++ tests/integration/states/test_pkg.py | 18 ++++---------- tests/whitelist.txt | 1 + 3 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 tests/integration/files/file/base/win/repo-ng/7zip.sls diff --git a/tests/integration/files/file/base/win/repo-ng/7zip.sls b/tests/integration/files/file/base/win/repo-ng/7zip.sls new file mode 100644 index 0000000000..4b93665c5b --- /dev/null +++ b/tests/integration/files/file/base/win/repo-ng/7zip.sls @@ -0,0 +1,24 @@ +{% set versions = {'18':['05', '03', '01'], '16':['04', '03', '02', '00'], '9':['20']} %} + +7zip: +{% for major, subversions in versions.items() %} +{% for minor in subversions %} + '{{major}}.{{minor}}.00.0': + {% if grains['cpuarch'] == 'AMD64' %} + full_name: '7-Zip {{major}}.{{minor}} (x64 edition)' + installer: 'http://d.7-zip.org/a/7z{{major}}{{minor}}-x64.msi' + uninstaller: 'http://d.7-zip.org/a/7z{{major}}{{minor}}-x64.msi' + arch: x64 + {% else %} + full_name: '7-Zip {{major}}.{{minor}}' + installer: 'http://d.7-zip.org/a/7z{{major}}{{minor}}.msi' + uninstaller: 'http://d.7-zip.org/a/7z{{major}}{{minor}}.msi' + arch: x86 + {% endif %} + install_flags: '/qn /norestart' + uninstall_flags: '/qn /norestart' + msiexec: True + locale: en_US + reboot: False +{% endfor %} +{% endfor %} diff --git a/tests/integration/states/test_pkg.py b/tests/integration/states/test_pkg.py index 814e3578c8..01535f66d5 100644 --- a/tests/integration/states/test_pkg.py +++ b/tests/integration/states/test_pkg.py @@ -36,7 +36,7 @@ _PKG_TARGETS = { 'FreeBSD': ['aalib', 'pth'], 'Suse': ['aalib', 'python-pssh'], 'MacOS': ['libpng', 'jpeg'], - 'Windows': ['firefox', '7zip'], + 'Windows': ['putty', '7zip'], } _PKG_TARGETS_32 = { @@ -158,7 +158,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): self.run_function('pkg.refresh_db') __testcontext__['refresh'] = True - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_001_installed(self, grains=None): ''' @@ -189,7 +188,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_002_installed_with_version(self, grains=None): ''' @@ -237,7 +235,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_003_installed_multipkg(self, grains=None): ''' @@ -259,7 +256,10 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): # If this assert fails, we need to find new targets, this test needs to # be able to test successful installation of packages, so these # packages need to not be installed before we run the states below - self.assertFalse(any(version.values())) + try: + self.assertFalse(any(version.values())) + except AssertionError: + self.assertSaltTrueReturn(self.run_state('pkg.removed', name=None, pkgs=pkg_targets)) ret = self.run_state('pkg.installed', name=None, @@ -269,7 +269,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=None, pkgs=pkg_targets) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_004_installed_multipkg_with_version(self, grains=None): ''' @@ -318,7 +317,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=None, pkgs=pkg_targets) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_005_installed_32bit(self, grains=None): ''' @@ -355,7 +353,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_006_installed_32bit_with_version(self, grains=None): ''' @@ -403,7 +400,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_007_with_dot_in_pkgname(self, grains=None): ''' @@ -434,7 +430,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_008_epoch_in_version(self, grains=None): ''' @@ -485,7 +480,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): refresh=False) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_salt_modules('pkg.info_installed') def test_pkg_010_latest_with_epoch_and_info_installed(self): ''' @@ -505,7 +499,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_function('pkg.info_installed', [package]) self.assertTrue(pkgquery in str(ret)) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_011_latest(self, grains=None): ''' @@ -537,7 +530,6 @@ class PkgTest(ModuleCase, SaltReturnAssertsMixin): ret = self.run_state('pkg.removed', name=target) self.assertSaltTrueReturn(ret) - @skipIf(salt.utils.is_windows(), 'minion is windows') @requires_system_grains def test_pkg_012_latest_only_upgrade(self, grains=None): ''' diff --git a/tests/whitelist.txt b/tests/whitelist.txt index b7cb036881..a6cabf1156 100644 --- a/tests/whitelist.txt +++ b/tests/whitelist.txt @@ -38,6 +38,7 @@ integration.runners.test_salt integration.sdb.test_env integration.states.test_host integration.states.test_pip_state +integration.states.test_pkg integration.states.test_renderers integration.utils.testprogram integration.wheel.test_client From f8c467d3e6599345441fb2f7a7c574e489658253 Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Tue, 22 May 2018 15:19:51 -0400 Subject: [PATCH 11/66] Fix text editor error --- tests/integration/files/file/base/win/repo-ng/7zip.sls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/files/file/base/win/repo-ng/7zip.sls b/tests/integration/files/file/base/win/repo-ng/7zip.sls index 4b93665c5b..c1c5905c37 100644 --- a/tests/integration/files/file/base/win/repo-ng/7zip.sls +++ b/tests/integration/files/file/base/win/repo-ng/7zip.sls @@ -1,6 +1,6 @@ {% set versions = {'18':['05', '03', '01'], '16':['04', '03', '02', '00'], '9':['20']} %} -7zip: +Zzip: {% for major, subversions in versions.items() %} {% for minor in subversions %} '{{major}}.{{minor}}.00.0': From 986f6c9b2a8170181aade14e1b4a75da1358ae62 Mon Sep 17 00:00:00 2001 From: twangboy Date: Tue, 22 May 2018 18:26:39 -0600 Subject: [PATCH 12/66] Use pytz to calculate timezones --- salt/modules/win_timezone.py | 726 ++++++++++++----------------------- 1 file changed, 241 insertions(+), 485 deletions(-) diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index 4e99342aa8..c0c574c2f8 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -6,457 +6,176 @@ from __future__ import absolute_import, unicode_literals, print_function # Import Python libs import logging -import re +import pytz +from datetime import datetime # Import Salt libs +from salt.exceptions import CommandExecutionError import salt.utils.path import salt.utils.platform +import salt.utils.win_reg log = logging.getLogger(__name__) -# Maybe put in a different file ... ? %-0 -# http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml -LINTOWIN = { - 'Africa/Abidjan': 'Greenwich Standard Time', - 'Africa/Accra': 'Greenwich Standard Time', - 'Africa/Addis_Ababa': 'E. Africa Standard Time', - 'Africa/Algiers': 'W. Central Africa Standard Time', - 'Africa/Asmera': 'E. Africa Standard Time', - 'Africa/Bamako': 'Greenwich Standard Time', - 'Africa/Bangui': 'W. Central Africa Standard Time', - 'Africa/Banjul': 'Greenwich Standard Time', - 'Africa/Bissau': 'Greenwich Standard Time', - 'Africa/Blantyre': 'South Africa Standard Time', - 'Africa/Brazzaville': 'W. Central Africa Standard Time', - 'Africa/Bujumbura': 'South Africa Standard Time', - 'Africa/Cairo': 'Egypt Standard Time', - 'Africa/Casablanca': 'Morocco Standard Time', - 'Africa/Conakry': 'Greenwich Standard Time', - 'Africa/Dakar': 'Greenwich Standard Time', - 'Africa/Dar_es_Salaam': 'E. Africa Standard Time', - 'Africa/Djibouti': 'E. Africa Standard Time', - 'Africa/Douala': 'W. Central Africa Standard Time', - 'Africa/El_Aaiun': 'Greenwich Standard Time', - 'Africa/Freetown': 'Greenwich Standard Time', - 'Africa/Gaborone': 'South Africa Standard Time', - 'Africa/Harare': 'South Africa Standard Time', - 'Africa/Johannesburg': 'South Africa Standard Time', - 'Africa/Juba': 'E. Africa Standard Time', - 'Africa/Kampala': 'E. Africa Standard Time', - 'Africa/Khartoum': 'E. Africa Standard Time', - 'Africa/Kigali': 'South Africa Standard Time', - 'Africa/Kinshasa': 'W. Central Africa Standard Time', - 'Africa/Lagos': 'W. Central Africa Standard Time', - 'Africa/Libreville': 'W. Central Africa Standard Time', - 'Africa/Lome': 'Greenwich Standard Time', - 'Africa/Luanda': 'W. Central Africa Standard Time', - 'Africa/Lubumbashi': 'South Africa Standard Time', - 'Africa/Lusaka': 'South Africa Standard Time', - 'Africa/Malabo': 'W. Central Africa Standard Time', - 'Africa/Maputo': 'South Africa Standard Time', - 'Africa/Maseru': 'South Africa Standard Time', - 'Africa/Mbabane': 'South Africa Standard Time', - 'Africa/Mogadishu': 'E. Africa Standard Time', - 'Africa/Monrovia': 'Greenwich Standard Time', - 'Africa/Nairobi': 'E. Africa Standard Time', - 'Africa/Ndjamena': 'W. Central Africa Standard Time', - 'Africa/Niamey': 'W. Central Africa Standard Time', - 'Africa/Nouakchott': 'Greenwich Standard Time', - 'Africa/Ouagadougou': 'Greenwich Standard Time', - 'Africa/Porto-Novo': 'W. Central Africa Standard Time', - 'Africa/Sao_Tome': 'Greenwich Standard Time', - 'Africa/Tripoli': 'W. Europe Standard Time', - 'Africa/Tunis': 'W. Central Africa Standard Time', - 'Africa/Windhoek': 'Namibia Standard Time', - 'America/Anchorage': 'Alaskan Standard Time', - 'America/Juneau': 'Alaskan Standard Time', - 'America/Nome': 'Alaskan Standard Time', - 'America/Sitka': 'Alaskan Standard Time', - 'America/Yakutat': 'Alaskan Standard Time', - 'America/Anguilla': 'SA Western Standard Time', - 'America/Antigua': 'SA Western Standard Time', - 'America/Aruba': 'SA Western Standard Time', - 'America/Asuncion': 'Paraguay Standard Time', - 'America/Bahia': 'Bahia Standard Time', - 'America/Barbados': 'SA Western Standard Time', - 'America/Belize': 'Central America Standard Time', - 'America/Blanc-Sablon': 'SA Western Standard Time', - 'America/Bogota': 'SA Pacific Standard Time', - 'America/Buenos_Aires': 'Argentina Standard Time', - 'America/Argentina/La_Rioja': 'Argentina Standard Time', - 'America/Argentina/Rio_Gallegos': 'Argentina Standard Time', - 'America/Argentina/Salta': 'Argentina Standard Time', - 'America/Argentina/San_Juan': 'Argentina Standard Time', - 'America/Argentina/San_Luis': 'Argentina Standard Time', - 'America/Argentina/Tucuman': 'Argentina Standard Time', - 'America/Argentina/Ushuaia': 'Argentina Standard Time', - 'America/Catamarca': 'Argentina Standard Time', - 'America/Cordoba': 'Argentina Standard Time', - 'America/Jujuy': 'Argentina Standard Time', - 'America/Mendoza': 'Argentina Standard Time', - 'America/Caracas': 'Venezuela Standard Time', - 'America/Cayenne': 'SA Eastern Standard Time', - 'America/Cayman': 'SA Pacific Standard Time', - 'America/Chicago': 'Central Standard Time', - 'America/Indiana/Knox': 'Central Standard Time', - 'America/Indiana/Tell_City': 'Central Standard Time', - 'America/Menominee': 'Central Standard Time', - 'America/North_Dakota/Beulah': 'Central Standard Time', - 'America/North_Dakota/Center': 'Central Standard Time', - 'America/North_Dakota/New_Salem': 'Central Standard Time', - 'America/Chihuahua': 'Mountain Standard Time (Mexico)', - 'America/Mazatlan': 'Mountain Standard Time (Mexico)', - 'America/Coral_Harbour': 'SA Pacific Standard Time', - 'America/Costa_Rica': 'Central America Standard Time', - 'America/Cuiaba': 'Central Brazilian Standard Time', - 'America/Campo_Grande': 'Central Brazilian Standard Time', - 'America/Curacao': 'SA Western Standard Time', - 'America/Danmarkshavn': 'UTC', - 'America/Dawson_Creek': 'US Mountain Standard Time', - 'America/Creston': 'US Mountain Standard Time', - 'America/Denver': 'Mountain Standard Time', - 'America/Boise': 'Mountain Standard Time', - 'America/Shiprock': 'Mountain Standard Time', - 'America/Dominica': 'SA Western Standard Time', - 'America/Edmonton': 'Mountain Standard Time', - 'America/Cambridge_Bay': 'Mountain Standard Time', - 'America/Inuvik': 'Mountain Standard Time', - 'America/Yellowknife': 'Mountain Standard Time', - 'America/El_Salvador': 'Central America Standard Time', - 'America/Fortaleza': 'SA Eastern Standard Time', - 'America/Belem': 'SA Eastern Standard Time', - 'America/Maceio': 'SA Eastern Standard Time', - 'America/Recife': 'SA Eastern Standard Time', - 'America/Santarem': 'SA Eastern Standard Time', - 'America/Godthab': 'Greenland Standard Time', - 'America/Grand_Turk': 'Eastern Standard Time', - 'America/Grenada': 'SA Western Standard Time', - 'America/Guadeloupe': 'SA Western Standard Time', - 'America/Guatemala': 'Central America Standard Time', - 'America/Guayaquil': 'SA Pacific Standard Time', - 'America/Guyana': 'SA Western Standard Time', - 'America/Halifax': 'Atlantic Standard Time', - 'America/Glace_Bay': 'Atlantic Standard Time', - 'America/Goose_Bay': 'Atlantic Standard Time', - 'America/Moncton': 'Atlantic Standard Time', - 'America/Hermosillo': 'US Mountain Standard Time', - 'America/Indianapolis': 'US Eastern Standard Time', - 'America/Indiana/Marengo': 'US Eastern Standard Time', - 'America/Indiana/Vevay': 'US Eastern Standard Time', - 'America/Jamaica': 'SA Pacific Standard Time', - 'America/Kralendijk': 'SA Western Standard Time', - 'America/La_Paz': 'SA Western Standard Time', - 'America/Lima': 'SA Pacific Standard Time', - 'America/Los_Angeles': 'Pacific Standard Time', - 'America/Lower_Princes': 'SA Western Standard Time', - 'America/Managua': 'Central America Standard Time', - 'America/Manaus': 'SA Western Standard Time', - 'America/Boa_Vista': 'SA Western Standard Time', - 'America/Eirunepe': 'SA Western Standard Time', - 'America/Porto_Velho': 'SA Western Standard Time', - 'America/Rio_Branco': 'SA Western Standard Time', - 'America/Marigot': 'SA Western Standard Time', - 'America/Martinique': 'SA Western Standard Time', - 'America/Matamoros': 'Central Standard Time', - 'America/Mexico_City': 'Central Standard Time (Mexico)', - 'America/Bahia_Banderas': 'Central Standard Time (Mexico)', - 'America/Cancun': 'Central Standard Time (Mexico)', - 'America/Merida': 'Central Standard Time (Mexico)', - 'America/Monterrey': 'Central Standard Time (Mexico)', - 'America/Montevideo': 'Montevideo Standard Time', - 'America/Montserrat': 'SA Western Standard Time', - 'America/Nassau': 'Eastern Standard Time', - 'America/New_York': 'Eastern Standard Time', - 'America/Detroit': 'Eastern Standard Time', - 'America/Indiana/Petersburg': 'Eastern Standard Time', - 'America/Indiana/Vincennes': 'Eastern Standard Time', - 'America/Indiana/Winamac': 'Eastern Standard Time', - 'America/Kentucky/Monticello': 'Eastern Standard Time', - 'America/Louisville': 'Eastern Standard Time', - 'America/Noronha': 'UTC-02', - 'America/Ojinaga': 'Mountain Standard Time', - 'America/Panama': 'SA Pacific Standard Time', - 'America/Paramaribo': 'SA Eastern Standard Time', - 'America/Phoenix': 'US Mountain Standard Time', - 'America/Port-au-Prince': 'SA Pacific Standard Time', - 'America/Port_of_Spain': 'SA Western Standard Time', - 'America/Puerto_Rico': 'SA Western Standard Time', - 'America/Regina': 'Canada Central Standard Time', - 'America/Swift_Current': 'Canada Central Standard Time', - 'America/Santa_Isabel': 'Pacific Standard Time (Mexico)', - 'America/Santiago': 'Pacific SA Standard Time', - 'America/Santo_Domingo': 'SA Western Standard Time', - 'America/Sao_Paulo': 'E. South America Standard Time', - 'America/Araguaina': 'E. South America Standard Time', - 'America/Scoresbysund': 'Azores Standard Time', - 'America/St_Barthelemy': 'SA Western Standard Time', - 'America/St_Johns': 'Newfoundland Standard Time', - 'America/St_Kitts': 'SA Western Standard Time', - 'America/St_Lucia': 'SA Western Standard Time', - 'America/St_Thomas': 'SA Western Standard Time', - 'America/St_Vincent': 'SA Western Standard Time', - 'America/Tegucigalpa': 'Central America Standard Time', - 'America/Thule': 'Atlantic Standard Time', - 'America/Tijuana': 'Pacific Standard Time', - 'America/Toronto': 'Eastern Standard Time', - 'America/Iqaluit': 'Eastern Standard Time', - 'America/Montreal': 'Eastern Standard Time', - 'America/Nipigon': 'Eastern Standard Time', - 'America/Pangnirtung': 'Eastern Standard Time', - 'America/Thunder_Bay': 'Eastern Standard Time', - 'America/Tortola': 'SA Western Standard Time', - 'America/Whitehorse': 'Pacific Standard Time', - 'America/Vancouver': 'Pacific Standard Time', - 'America/Dawson': 'Pacific Standard Time', - 'America/Winnipeg': 'Central Standard Time', - 'America/Rainy_River': 'Central Standard Time', - 'America/Rankin_Inlet': 'Central Standard Time', - 'America/Resolute': 'Central Standard Time', - 'Antarctica/Casey': 'W. Australia Standard Time', - 'Antarctica/Davis': 'SE Asia Standard Time', - 'Antarctica/DumontDUrville': 'West Pacific Standard Time', - 'Antarctica/Macquarie': 'Central Pacific Standard Time', - 'Antarctica/Mawson': 'West Asia Standard Time', - 'Antarctica/Palmer': 'Pacific SA Standard Time', - 'Antarctica/Rothera': 'SA Eastern Standard Time', - 'Antarctica/South_Pole': 'New Zealand Standard Time', - 'Antarctica/McMurdo': 'New Zealand Standard Time', - 'Antarctica/Syowa': 'E. Africa Standard Time', - 'Antarctica/Vostok': 'Central Asia Standard Time', - 'Arctic/Longyearbyen': 'W. Europe Standard Time', - 'Asia/Aden': 'Arab Standard Time', - 'Asia/Almaty': 'Central Asia Standard Time', - 'Asia/Qyzylorda': 'Central Asia Standard Time', - 'Asia/Amman': 'Jordan Standard Time', - 'Asia/Ashgabat': 'West Asia Standard Time', - 'Asia/Baghdad': 'Arabic Standard Time', - 'Asia/Bahrain': 'Arab Standard Time', - 'Asia/Baku': 'Azerbaijan Standard Time', - 'Asia/Bangkok': 'SE Asia Standard Time', - 'Asia/Beirut': 'Middle East Standard Time', - 'Asia/Bishkek': 'Central Asia Standard Time', - 'Asia/Brunei': 'Singapore Standard Time', - 'Asia/Calcutta': 'India Standard Time', - 'Asia/Colombo': 'Sri Lanka Standard Time', - 'Asia/Damascus': 'Syria Standard Time', - 'Asia/Dhaka': 'Bangladesh Standard Time', - 'Asia/Dili': 'Tokyo Standard Time', - 'Asia/Dubai': 'Arabian Standard Time', - 'Asia/Dushanbe': 'West Asia Standard Time', - 'Asia/Gaza': 'Egypt Standard Time', - 'Asia/Hebron': 'Egypt Standard Time', - 'Asia/Hong_Kong': 'China Standard Time', - 'Asia/Hovd': 'SE Asia Standard Time', - 'Asia/Irkutsk': 'North Asia East Standard Time', - 'Asia/Jakarta': 'SE Asia Standard Time', - 'Asia/Pontianak': 'SE Asia Standard Time', - 'Asia/Jayapura': 'Tokyo Standard Time', - 'Asia/Jerusalem': 'Israel Standard Time', - 'Asia/Kabul': 'Afghanistan Standard Time', - 'Asia/Karachi': 'Pakistan Standard Time', - 'Asia/Kathmandu': 'Nepal Standard Time', - 'Asia/Katmandu': 'Nepal Standard Time', - 'Asia/Krasnoyarsk': 'North Asia Standard Time', - 'Asia/Kuala_Lumpur': 'Singapore Standard Time', - 'Asia/Kuching': 'Singapore Standard Time', - 'Asia/Kuwait': 'Arab Standard Time', - 'Asia/Macau': 'China Standard Time', - 'Asia/Magadan': 'Magadan Standard Time', - 'Asia/Anadyr Asia/Kamchatka': 'Magadan Standard Time', - 'Asia/Kamchatka': 'Magadan Standard Time', - 'Asia/Makassar': 'Singapore Standard Time', - 'Asia/Manila': 'Singapore Standard Time', - 'Asia/Muscat': 'Arabian Standard Time', - 'Asia/Nicosia': 'E. Europe Standard Time', - 'Asia/Novosibirsk': 'N. Central Asia Standard Time', - 'Asia/Novokuznetsk': 'N. Central Asia Standard Time', - 'Asia/Omsk': 'N. Central Asia Standard Time', - 'Asia/Oral': 'West Asia Standard Time', - 'Asia/Aqtau': 'West Asia Standard Time', - 'Asia/Aqtobe': 'West Asia Standard Time', - 'Asia/Phnom_Penh': 'SE Asia Standard Time', - 'Asia/Pyongyang': 'Korea Standard Time', - 'Asia/Qatar': 'Arab Standard Time', - 'Asia/Rangoon': 'Myanmar Standard Time', - 'Asia/Riyadh': 'Arab Standard Time', - 'Asia/Saigon': 'SE Asia Standard Time', - 'Asia/Seoul': 'Korea Standard Time', - 'Asia/Shanghai': 'China Standard Time', - 'Asia/Chongqing': 'China Standard Time', - 'Asia/Harbin': 'China Standard Time', - 'Asia/Kashgar': 'China Standard Time', - 'Asia/Urumqi': 'China Standard Time', - 'Asia/Singapore': 'Singapore Standard Time', - 'Asia/Taipei': 'Taipei Standard Time', - 'Asia/Tashkent': 'West Asia Standard Time', - 'Asia/Samarkand': 'West Asia Standard Time', - 'Asia/Tbilisi': 'Georgian Standard Time', - 'Asia/Tehran': 'Iran Standard Time', - 'Asia/Thimphu': 'Bangladesh Standard Time', - 'Asia/Tokyo': 'Tokyo Standard Time', - 'Asia/Ulaanbaatar': 'Ulaanbaatar Standard Time', - 'Asia/Choibalsan': 'Ulaanbaatar Standard Time', - 'Asia/Vientiane': 'SE Asia Standard Time', - 'Asia/Vladivostok': 'Vladivostok Standard Time', - 'Asia/Ust-Nera': 'Vladivostok Standard Time', - 'Asia/Sakhalin': 'Vladivostok Standard Time', - 'Asia/Yakutsk': 'Yakutsk Standard Time', - 'Asia/Khandyga': 'Yakutsk Standard Time', - 'Asia/Yekaterinburg': 'Ekaterinburg Standard Time', - 'Asia/Yerevan': 'Caucasus Standard Time', - 'Atlantic/Azores': 'Azores Standard Time', - 'Atlantic/Bermuda': 'Atlantic Standard Time', - 'Atlantic/Canary': 'GMT Standard Time', - 'Atlantic/Cape_Verde': 'Cape Verde Standard Time', - 'Atlantic/Faeroe': 'GMT Standard Time', - 'Atlantic/Reykjavik': 'Greenwich Standard Time', - 'Atlantic/South_Georgia': 'UTC-02', - 'Atlantic/St_Helena': 'Greenwich Standard Time', - 'Atlantic/Stanley': 'SA Eastern Standard Time', - 'Australia/Adelaide': 'Cen. Australia Standard Time', - 'Australia/Broken_Hill': 'Cen. Australia Standard Time', - 'Australia/Brisbane': 'E. Australia Standard Time', - 'Australia/Lindeman': 'E. Australia Standard Time', - 'Australia/Darwin': 'AUS Central Standard Time', - 'Australia/Hobart': 'Tasmania Standard Time', - 'Australia/Currie': 'Tasmania Standard Time', - 'Australia/Perth': 'W. Australia Standard Time', - 'Australia/Sydney': 'AUS Eastern Standard Time', - 'Australia/Melbourne': 'AUS Eastern Standard Time', - 'CST6CDT': 'Central Standard Time', - 'EST5EDT': 'Eastern Standard Time', - 'Etc/UTC': 'UTC', - 'Etc/GMT': 'UTC', - 'Etc/GMT+1': 'Cape Verde Standard Time', - 'Etc/GMT+10': 'Hawaiian Standard Time', - 'Etc/GMT+11': 'UTC-11', - 'Etc/GMT+12': 'Dateline Standard Time', - 'Etc/GMT+2': 'UTC-02', - 'Etc/GMT+3': 'SA Eastern Standard Time', - 'Etc/GMT+4': 'SA Western Standard Time', - 'Etc/GMT+5': 'SA Pacific Standard Time', - 'Etc/GMT+6': 'Central America Standard Time', - 'Etc/GMT+7': 'US Mountain Standard Time', - 'Etc/GMT-1': 'W. Central Africa Standard Time', - 'Etc/GMT-10': 'West Pacific Standard Time', - 'Etc/GMT-11': 'Central Pacific Standard Time', - 'Etc/GMT-12': 'UTC+12', - 'Etc/GMT-13': 'Tonga Standard Time', - 'Etc/GMT-2': 'South Africa Standard Time', - 'Etc/GMT-3': 'E. Africa Standard Time', - 'Etc/GMT-4': 'Arabian Standard Time', - 'Etc/GMT-5': 'West Asia Standard Time', - 'Etc/GMT-6': 'Central Asia Standard Time', - 'Etc/GMT-7': 'SE Asia Standard Time', - 'Etc/GMT-8': 'Singapore Standard Time', - 'Etc/GMT-9': 'Tokyo Standard Time', - 'Europe/Amsterdam': 'W. Europe Standard Time', - 'Europe/Andorra': 'W. Europe Standard Time', - 'Europe/Athens': 'GTB Standard Time', - 'Europe/Belgrade': 'Central Europe Standard Time', - 'Europe/Berlin': 'W. Europe Standard Time', - 'Europe/Busingen': 'W. Europe Standard Time', - 'Europe/Bratislava': 'Central Europe Standard Time', - 'Europe/Brussels': 'Romance Standard Time', - 'Europe/Bucharest': 'GTB Standard Time', - 'Europe/Budapest': 'Central Europe Standard Time', - 'Europe/Chisinau': 'GTB Standard Time', - 'Europe/Copenhagen': 'Romance Standard Time', - 'Europe/Dublin': 'GMT Standard Time', - 'Europe/Gibraltar': 'W. Europe Standard Time', - 'Europe/Guernsey': 'GMT Standard Time', - 'Europe/Helsinki': 'FLE Standard Time', - 'Europe/Isle_of_Man': 'GMT Standard Time', - 'Europe/Istanbul': 'Turkey Standard Time', - 'Europe/Jersey': 'GMT Standard Time', - 'Europe/Kaliningrad': 'Kaliningrad Standard Time', - 'Europe/Kiev': 'FLE Standard Time', - 'Europe/Simferopol': 'FLE Standard Time', - 'Europe/Uzhgorod': 'FLE Standard Time', - 'Europe/Zaporozhye': 'FLE Standard Time', - 'Europe/Lisbon': 'GMT Standard Time', - 'Atlantic/Madeira': 'GMT Standard Time', - 'Europe/Ljubljana': 'Central Europe Standard Time', - 'Europe/London': 'GMT Standard Time', - 'Europe/Luxembourg': 'W. Europe Standard Time', - 'Europe/Madrid': 'Romance Standard Time', - 'Africa/Ceuta': 'Romance Standard Time', - 'Europe/Malta': 'W. Europe Standard Time', - 'Europe/Mariehamn': 'FLE Standard Time', - 'Europe/Minsk': 'Kaliningrad Standard Time', - 'Europe/Monaco': 'W. Europe Standard Time', - 'Europe/Moscow': 'Russian Standard Time', - 'Europe/Volgograd': 'Russian Standard Time', - 'Europe/Samara': 'Russian Standard Time', - 'Europe/Oslo': 'W. Europe Standard Time', - 'Europe/Paris': 'Romance Standard Time', - 'Europe/Podgorica': 'Central Europe Standard Time', - 'Europe/Prague': 'Central Europe Standard Time', - 'Europe/Riga': 'FLE Standard Time', - 'Europe/Rome': 'W. Europe Standard Time', - 'Europe/San_Marino': 'W. Europe Standard Time', - 'Europe/Sarajevo': 'Central European Standard Time', - 'Europe/Skopje': 'Central European Standard Time', - 'Europe/Sofia': 'FLE Standard Time', - 'Europe/Stockholm': 'W. Europe Standard Time', - 'Europe/Tallinn': 'FLE Standard Time', - 'Europe/Tirane': 'Central Europe Standard Time', - 'Europe/Vaduz': 'W. Europe Standard Time', - 'Europe/Vatican': 'W. Europe Standard Time', - 'Europe/Vienna': 'W. Europe Standard Time', - 'Europe/Vilnius': 'FLE Standard Time', - 'Europe/Warsaw': 'Central European Standard Time', - 'Europe/Zagreb': 'Central European Standard Time', - 'Europe/Zurich': 'W. Europe Standard Time', - 'Indian/Antananarivo': 'E. Africa Standard Time', - 'Indian/Chagos': 'Central Asia Standard Time', - 'Indian/Christmas': 'SE Asia Standard Time', - 'Indian/Cocos': 'Myanmar Standard Time', - 'Indian/Comoro': 'E. Africa Standard Time', - 'Indian/Kerguelen': 'West Asia Standard Time', - 'Indian/Mahe': 'Mauritius Standard Time', - 'Indian/Maldives': 'West Asia Standard Time', - 'Indian/Mauritius': 'Mauritius Standard Time', - 'Indian/Mayotte': 'E. Africa Standard Time', - 'Indian/Reunion': 'Mauritius Standard Time', - 'MST7MDT': 'Mountain Standard Time', - 'PST8PDT': 'Pacific Standard Time', - 'Pacific/Apia': 'Samoa Standard Time', - 'Pacific/Auckland': 'New Zealand Standard Time', - 'Pacific/Efate': 'Central Pacific Standard Time', - 'Pacific/Enderbury': 'Tonga Standard Time', - 'Pacific/Fakaofo': 'Tonga Standard Time', - 'Pacific/Fiji': 'Fiji Standard Time', - 'Pacific/Funafuti': 'UTC+12', - 'Pacific/Galapagos': 'Central America Standard Time', - 'Pacific/Guadalcanal': 'Central Pacific Standard Time', - 'Pacific/Guam': 'West Pacific Standard Time', - 'Pacific/Honolulu': 'Hawaiian Standard Time', - 'Pacific/Johnston': 'Hawaiian Standard Time', - 'Pacific/Majuro Pacific/Kwajalein': 'UTC+12', - 'Pacific/Midway': 'UTC-11', - 'Pacific/Nauru': 'UTC+12', - 'Pacific/Niue': 'UTC-11', - 'Pacific/Noumea': 'Central Pacific Standard Time', - 'Pacific/Pago_Pago': 'UTC-11', - 'Pacific/Palau': 'Tokyo Standard Time', - 'Pacific/Ponape': 'Central Pacific Standard Time', - 'Pacific/Kosrae': 'Central Pacific Standard Time', - 'Pacific/Port_Moresby': 'West Pacific Standard Time', - 'Pacific/Rarotonga': 'Hawaiian Standard Time', - 'Pacific/Saipan': 'West Pacific Standard Time', - 'Pacific/Tahiti': 'Hawaiian Standard Time', - 'Pacific/Tarawa': 'UTC+12', - 'Pacific/Tongatapu': 'Tonga Standard Time', - 'Pacific/Truk': 'West Pacific Standard Time', - 'Pacific/Wake': 'UTC+12', - 'Pacific/Wallis': 'UTC+12' - } - # Define the module's virtual name __virtualname__ = 'timezone' +class TzMapper(object): + def __init__(self, unix_to_win): + self.win_to_unix = {k.lower(): v for k, v in unix_to_win.items()} + self.unix_to_win = {v.lower(): k for k, v in unix_to_win.items()} + + def add(self, k, v): + self.unix_to_win[k.lower()] = v + self.win_to_unix[v.lower()] = k + + def remove(self, k): + self.win_to_unix.pop(self.unix_to_win.pop(k.lower()).lower()) + + def get_win(self, key, default=None): + return self.unix_to_win.get(key.lower(), default) + + def get_unix(self, key, default=None): + return self.win_to_unix.get(key.lower(), default) + + +mapper = TzMapper({ + 'AUS Central Standard Time': 'Australia/Darwin', + 'AUS Eastern Standard Time': 'Australia/Sydney', + 'Afghanistan Standard Time': 'Asia/Kabul', + 'Alaskan Standard Time': 'America/Anchorage', + 'Aleutian Standard Time': 'America/Adak', + 'Altai Standard Time': 'Asia/Barnaul', + 'Arab Standard Time': 'Asia/Riyadh', + 'Arabian Standard Time': 'Asia/Dubai', + 'Arabic Standard Time': 'Asia/Baghdad', + 'Argentina Standard Time': 'America/Buenos_Aires', + 'Astrakhan Standard Time': 'Europe/Astrakhan', + 'Atlantic Standard Time': 'America/Halifax', + 'Aus Central W. Standard Time': 'Australia/Eucla', + 'Azerbaijan Standard Time': 'Asia/Baku', + 'Azores Standard Time': 'Atlantic/Azores', + 'Bahia Standard Time': 'America/Bahia', + 'Bangladesh Standard Time': 'Asia/Dhaka', + 'Belarus Standard Time': 'Europe/Minsk', + 'Bougainville Standard Time': 'Pacific/Bougainville', + 'Canada Central Standard Time': 'America/Regina', + 'Cape Verde Standard Time': 'Atlantic/Cape_Verde', + 'Caucasus Standard Time': 'Asia/Yerevan', + 'Cen. Australia Standard Time': 'Australia/Adelaide', + 'Central America Standard Time': 'America/Guatemala', + 'Central Asia Standard Time': 'Asia/Almaty', + 'Central Brazilian Standard Time': 'America/Cuiaba', + 'Central Europe Standard Time': 'Europe/Budapest', + 'Central European Standard Time': 'Europe/Warsaw', + 'Central Pacific Standard Time': 'Pacific/Guadalcanal', + 'Central Standard Time': 'America/Chicago', + 'Central Standard Time (Mexico)': 'America/Mexico_City', + 'Chatham Islands Standard Time': 'Pacific/Chatham', + 'China Standard Time': 'Asia/Shanghai', + 'Cuba Standard Time': 'America/Havana', + 'Dateline Standard Time': 'Etc/GMT+12', + 'E. Africa Standard Time': 'Africa/Nairobi', + 'E. Australia Standard Time': 'Australia/Brisbane', + 'E. Europe Standard Time': 'Europe/Chisinau', + 'E. South America Standard Time': 'America/Sao_Paulo', + 'Easter Island Standard Time': 'Pacific/Easter', + 'Eastern Standard Time': 'America/New_York', + 'Eastern Standard Time (Mexico)': 'America/Cancun', + 'Egypt Standard Time': 'Africa/Cairo', + 'Ekaterinburg Standard Time': 'Asia/Yekaterinburg', + 'FLE Standard Time': 'Europe/Kiev', + 'Fiji Standard Time': 'Pacific/Fiji', + 'GMT Standard Time': 'Europe/London', + 'GTB Standard Time': 'Europe/Bucharest', + 'Georgian Standard Time': 'Asia/Tbilisi', + 'Greenland Standard Time': 'America/Godthab', + 'Greenwich Standard Time': 'Atlantic/Reykjavik', + 'Haiti Standard Time': 'America/Port-au-Prince', + 'Hawaiian Standard Time': 'Pacific/Honolulu', + 'India Standard Time': 'Asia/Calcutta', + 'Iran Standard Time': 'Asia/Tehran', + 'Israel Standard Time': 'Asia/Jerusalem', + 'Jordan Standard Time': 'Asia/Amman', + 'Kaliningrad Standard Time': 'Europe/Kaliningrad', + 'Korea Standard Time': 'Asia/Seoul', + 'Libya Standard Time': 'Africa/Tripoli', + 'Line Islands Standard Time': 'Pacific/Kiritimati', + 'Lord Howe Standard Time': 'Australia/Lord_Howe', + 'Magadan Standard Time': 'Asia/Magadan', + 'Magallanes Standard Time': 'America/Punta_Arenas', + 'Marquesas Standard Time': 'Pacific/Marquesas', + 'Mauritius Standard Time': 'Indian/Mauritius', + 'Middle East Standard Time': 'Asia/Beirut', + 'Montevideo Standard Time': 'America/Montevideo', + 'Morocco Standard Time': 'Africa/Casablanca', + 'Mountain Standard Time': 'America/Denver', + 'Mountain Standard Time (Mexico)': 'America/Chihuahua', + 'Myanmar Standard Time': 'Asia/Rangoon', + 'N. Central Asia Standard Time': 'Asia/Novosibirsk', + 'Namibia Standard Time': 'Africa/Windhoek', + 'Nepal Standard Time': 'Asia/Katmandu', + 'New Zealand Standard Time': 'Pacific/Auckland', + 'Newfoundland Standard Time': 'America/St_Johns', + 'Norfolk Standard Time': 'Pacific/Norfolk', + 'North Asia East Standard Time': 'Asia/Irkutsk', + 'North Asia Standard Time': 'Asia/Krasnoyarsk', + 'North Korea Standard Time': 'Asia/Pyongyang', + 'Omsk Standard Time': 'Asia/Omsk', + 'Pacific SA Standard Time': 'America/Santiago', + 'Pacific Standard Time': 'America/Los_Angeles', + 'Pacific Standard Time (Mexico)': 'America/Tijuana', + 'Pakistan Standard Time': 'Asia/Karachi', + 'Paraguay Standard Time': 'America/Asuncion', + 'Romance Standard Time': 'Europe/Paris', + 'Russia Time Zone 10': 'Asia/Srednekolymsk', + 'Russia Time Zone 11': 'Asia/Kamchatka', + 'Russia Time Zone 3': 'Europe/Samara', + 'Russian Standard Time': 'Europe/Moscow', + 'SA Eastern Standard Time': 'America/Cayenne', + 'SA Pacific Standard Time': 'America/Bogota', + 'SA Western Standard Time': 'America/La_Paz', + 'SE Asia Standard Time': 'Asia/Bangkok', + 'Saint Pierre Standard Time': 'America/Miquelon', + 'Sakhalin Standard Time': 'Asia/Sakhalin', + 'Samoa Standard Time': 'Pacific/Apia', + 'Saratov Standard Time': 'Europe/Saratov', + 'Singapore Standard Time': 'Asia/Singapore', + 'South Africa Standard Time': 'Africa/Johannesburg', + 'Sri Lanka Standard Time': 'Asia/Colombo', + 'Syria Standard Time': 'Asia/Damascus', + 'Taipei Standard Time': 'Asia/Taipei', + 'Tasmania Standard Time': 'Australia/Hobart', + 'Tocantins Standard Time': 'America/Araguaina', + 'Tokyo Standard Time': 'Asia/Tokyo', + 'Tomsk Standard Time': 'Asia/Tomsk', + 'Tonga Standard Time': 'Pacific/Tongatapu', + 'Transbaikal Standard Time': 'Asia/Chita', + 'Turkey Standard Time': 'Europe/Istanbul', + 'Turks And Caicos Standard Time': 'America/Grand_Turk', + 'US Eastern Standard Time': 'America/Indianapolis', + 'US Mountain Standard Time': 'America/Phoenix', + 'UTC': 'Etc/GMT', + 'UTC+12': 'Etc/GMT-12', + 'UTC+13': 'Etc/GMT-13', + 'UTC-02': 'Etc/GMT+2', + 'UTC-08': 'Etc/GMT+8', + 'UTC-09': 'Etc/GMT+9', + 'UTC-11': 'Etc/GMT+11', + 'Ulaanbaatar Standard Time': 'Asia/Ulaanbaatar', + 'Venezuela Standard Time': 'America/Caracas', + 'Vladivostok Standard Time': 'Asia/Vladivostok', + 'W. Australia Standard Time': 'Australia/Perth', + 'W. Central Africa Standard Time': 'Africa/Lagos', + 'W. Europe Standard Time': 'Europe/Berlin', + 'W. Mongolia Standard Time': 'Asia/Hovd', + 'West Asia Standard Time': 'Asia/Tashkent', + 'West Bank Standard Time': 'Asia/Hebron', + 'West Pacific Standard Time': 'Pacific/Port_Moresby', + 'Yakutsk Standard Time': 'Asia/Yakutsk'}) + + def __virtual__(): ''' Only load on windows @@ -470,23 +189,28 @@ def get_zone(): ''' Get current timezone (i.e. America/Denver) + Returns: + str: Timezone in unix format + CLI Example: .. code-block:: bash salt '*' timezone.get_zone ''' - winzone = __salt__['cmd.run'](['tzutil', '/g'], python_shell=False) - for key in LINTOWIN: - if LINTOWIN[key] == winzone: - return key - - return False + win_zone = salt.utils.win_reg.read_value( + hive='HKLM', + key='SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation', + vname='TimeZoneKeyName')['vdata'] + return mapper.get_unix(win_zone.lower(), 'Unknown') def get_offset(): ''' - Get current numeric timezone offset from UCT (i.e. -0700) + Get current numeric timezone offset from UTC (i.e. -0700) + + Returns: + str: Offset from UTC CLI Example: @@ -494,52 +218,45 @@ def get_offset(): salt '*' timezone.get_offset ''' - string = False - zone = __salt__['cmd.run'](['tzutil', '/g'], python_shell=False) - prev = '' - zone_list = __salt__['cmd.run'](['tzutil', '/l'], - python_shell=False, - output_loglevel='trace').splitlines() - for line in zone_list: - if zone == line: - string = prev - break - else: - prev = line - - if not string: - return False - - reg = re.search(r"\(UTC(.\d\d:\d\d)\) .*", string, re.M) - if not reg: - ret = '0000' - else: - ret = reg.group(1).replace(':', '') - - return ret + # http://craigglennie.com/programming/python/2013/07/21/working-with-timezones-using-Python-and-pytz-localize-vs-normalize/ + tz_object = pytz.timezone(get_zone()) + utc_time = pytz.utc.localize(datetime.today()) + loc_time = utc_time.astimezone(tz_object) + norm_time = tz_object.normalize(loc_time) + time_zone = norm_time.astimezone(tz_object) + return time_zone.utcoffset().total_seconds() / 3600 def get_zonecode(): ''' Get current timezone (i.e. PST, MDT, etc) + Returns: + str: An abbreviated timezone code + CLI Example: .. code-block:: bash salt '*' timezone.get_zonecode ''' - # Still not implemented on windows - return False + tz_object = pytz.timezone(get_zone()) + loc_time = tz_object.localize(datetime.today()) + return loc_time.tzname() def set_zone(timezone): ''' - Unlinks, then symlinks /etc/localtime to the set timezone. + Sets the timezone using the tzutil. - The timezone is crucial to several system processes, each of which SHOULD - be restarted (for instance, whatever you system uses as its cron and - syslog daemons). This will not be magically done for you! + Args: + timezone (str): A valid timezone + + Returns: + bool: ``True`` if successful, otherwise ``False`` + + Raises: + CommandExecutionError: If invalid timezone is passed CLI Example: @@ -547,15 +264,34 @@ def set_zone(timezone): salt '*' timezone.set_zone 'America/Denver' ''' - cmd = ['tzutil', '/s', LINTOWIN[timezone]] - return __salt__['cmd.retcode'](cmd, python_shell=False) == 0 + # if it's one of the key's just use it + if timezone.lower() in mapper.win_to_unix: + win_zone = timezone + + elif timezone.lower() in mapper.unix_to_win: + # if it's one of the values, use the key + win_zone = mapper.get_win(timezone) + + else: + # Raise error because it's neither key nor value + raise CommandExecutionError('Invalid timezone passed: {0}'.format(timezone)) + + # Set the value + cmd = ['tzutil', '/s', win_zone] + __salt__['cmd.run'](cmd, python_shell=False) + return zone_compare(timezone) def zone_compare(timezone): ''' - Checks the md5sum between the given timezone, and the one set in - /etc/localtime. Returns True if they match, and False if not. Mostly useful - for running state checks. + Compares the given timezone with the machine timezone. Mostly useful for + running state checks. + + Args: + timezone (str): The timezone to compare + + Returns: + bool: ``True`` if they match, otherwise ``False`` Example: @@ -563,21 +299,37 @@ def zone_compare(timezone): salt '*' timezone.zone_compare 'America/Denver' ''' - cmd = ['tzutil', '/g'] - return __salt__['cmd.run'](cmd, python_shell=False) == LINTOWIN[timezone] + # if it's one of the key's just use it + if timezone.lower() in mapper.win_to_unix: + check_zone = timezone + + elif timezone.lower() in mapper.unix_to_win: + # if it's one of the values, use the key + check_zone = mapper.get_win(timezone) + + else: + # Raise error because it's neither key nor value + raise CommandExecutionError('Invalid timezone passed: {0}' + ''.format(timezone)) + + return get_zone() == mapper.get_unix(check_zone, 'Unknown') def get_hwclock(): ''' Get current hardware clock setting (UTC or localtime) + .. note:: + The hardware clock is always local time on Windows so this will always + return "localtime" + CLI Example: .. code-block:: bash salt '*' timezone.get_hwclock ''' - # Need to search for a way to figure it out ... + # The hardware clock is always localtime on Windows return 'localtime' @@ -585,11 +337,15 @@ def set_hwclock(clock): ''' Sets the hardware clock to be either UTC or localtime + .. note:: + The hardware clock is always local time on Windows so this will always + return ``False`` + CLI Example: .. code-block:: bash salt '*' timezone.set_hwclock UTC ''' - # Need to search for a way to figure it out ... + # The hardware clock is always localtime on Windows return False From ae881547d2db7d50d74fe405a7b6d62941d234bd Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Tue, 22 May 2018 12:11:58 -0700 Subject: [PATCH 13/66] Fixing unit.test_minion.MinionTestCase.test_beacons_before_connect and unit.test_minion.MinionTestCase.test_scheduler_before_connect. --- tests/unit/test_minion.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_minion.py b/tests/unit/test_minion.py index 037dcfb8a8..140a6924e0 100644 --- a/tests/unit/test_minion.py +++ b/tests/unit/test_minion.py @@ -266,7 +266,9 @@ class MinionTestCase(TestCase, AdaptedConfigurationTestCaseMixin): patch('salt.utils.process.SignalHandlingMultiprocessingProcess.join', MagicMock(return_value=True)): mock_opts = self.get_config('minion', from_scratch=True) mock_opts['beacons_before_connect'] = True - minion = salt.minion.Minion(mock_opts, io_loop=tornado.ioloop.IOLoop()) + io_loop = tornado.ioloop.IOLoop() + io_loop.make_current() + minion = salt.minion.Minion(mock_opts, io_loop=io_loop) try: try: @@ -290,7 +292,9 @@ class MinionTestCase(TestCase, AdaptedConfigurationTestCaseMixin): patch('salt.utils.process.SignalHandlingMultiprocessingProcess.join', MagicMock(return_value=True)): mock_opts = self.get_config('minion', from_scratch=True) mock_opts['scheduler_before_connect'] = True - minion = salt.minion.Minion(mock_opts, io_loop=tornado.ioloop.IOLoop()) + io_loop = tornado.ioloop.IOLoop() + io_loop.make_current() + minion = salt.minion.Minion(mock_opts, io_loop=io_loop) try: try: minion.tune_in(start=True) From bb357da084281efb812de85d96b4956a44b2911f Mon Sep 17 00:00:00 2001 From: Steven Joseph Date: Wed, 26 Apr 2017 15:17:00 +1000 Subject: [PATCH 14/66] add minion function to reload beacon #35960 --- salt/minion.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/salt/minion.py b/salt/minion.py index 07c572d292..8f30812900 100644 --- a/salt/minion.py +++ b/salt/minion.py @@ -1841,6 +1841,13 @@ class Minion(MinionBase): self.schedule.functions = self.functions self.schedule.returners = self.returners + def beacons_refresh(self): + ''' + Refresh the functions and returners. + ''' + log.debug('Refreshing beacons.') + self.beacons = salt.beacons.Beacon(self.opts, self.functions) + # TODO: only allow one future in flight at a time? @tornado.gen.coroutine def pillar_refresh(self, force_refresh=False): @@ -2007,6 +2014,8 @@ class Minion(MinionBase): yield self.pillar_refresh( force_refresh=data.get('force_refresh', False) ) + elif tag.startswith('beacons_refresh'): + self.beacons_refresh() elif tag.startswith('manage_schedule'): self.manage_schedule(tag, data) elif tag.startswith('manage_beacons'): From 66d8b0331a0ed26f86a816dc8aa8f49bd3cbba1b Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 11:20:51 -0600 Subject: [PATCH 15/66] Add sign.bat script for signing packages --- pkg/windows/sign.bat | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 pkg/windows/sign.bat diff --git a/pkg/windows/sign.bat b/pkg/windows/sign.bat new file mode 100644 index 0000000000..1be972f427 --- /dev/null +++ b/pkg/windows/sign.bat @@ -0,0 +1,165 @@ +:: ############################################################################ +:: +:: FILE: sign.bat +:: +:: DESCRIPTION: Signing and Hashing script for Salt builds on Windows. +:: Requires an official Code Signing Certificate and drivers +:: installed to sign the files. Generates hashes in MD5 and +:: SHA256 in a file of the same name with a `.md5` or +:: `.sha256` extension. +:: +:: NOTE: This script is used internally by SaltStack to sign and +:: hash Windows Installer builds and uses resources not +:: available to the community, such as SaltStack's Code +:: Signing Certificate. It is placed here for version +:: control. +:: +:: COPYRIGHT: (c) 2012-2018 by the SaltStack Team +:: +:: LICENSE: Apache 2.0 +:: ORGANIZATION: SaltStack, Inc (saltstack.com) +:: CREATED: 2017 +:: +:: ############################################################################ +:: +:: USAGE: The script must be located in a directory that has the installer +:: files in a subfolder named with the major version, ie: `2018.3`. +:: Insert the key fob that contains the code signing certificate. Run +:: the script passing the full version: `.\sign.bat 2018.3.1`. +:: +:: The script will sign the installers and generate the corresponding +:: hash files. These can then be uploaded to the salt repo. +:: +:: The files must be in the following format: +:: \Salt-Minion----Setup.exe +:: So, for a Salt Minion installer for 2018.3.1 on AMD64 for Python 3 +:: file would be placed in a subdirectory named `2018.3` and the file +:: would be named: `Salt-Minion-2018.3.1-Py3-AMD64-Setup.exe`. This +:: is how the file is created by the NSI Script anyway. +:: +:: ############################################################################ +@ echo off +if [%1]==[] ( + echo You must pass a version + goto quit +) else ( + set "Version=%~1" +) + +for /F "tokens=1,2 delims=." %%a in ("%Version%") do (set Series=%%a.%%b) + +:: Sign Installer Files +echo =========================================================================== +echo Signing... +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +signtool.exe sign /t http://timestamp.digicert.com ^ + "%Series%\Salt-Minion-%Version%-AMD64-Setup.exe" ^ + "%Series%\Salt-Minion-%Version%-x86-Setup.exe" ^ + "%Series%\Salt-%Version%-AMD64-Setup.exe" ^ + "%Series%\Salt-%Version%-x86-Setup.exe" ^ + "%Series%\Salt-%Version%-Py2-AMD64-Setup.exe" ^ + "%Series%\Salt-%Version%-Py2-x86-Setup.exe" ^ + "%Series%\Salt-%Version%-Py3-AMD64-Setup.exe" ^ + "%Series%\Salt-%Version%-Py3-x86-Setup.exe" ^ + "%Series%\Salt-Minion-%Version%-Py2-AMD64-Setup.exe" ^ + "%Series%\Salt-Minion-%Version%-Py2-x86-Setup.exe" ^ + "%Series%\Salt-Minion-%Version%-Py3-AMD64-Setup.exe" ^ + "%Series%\Salt-Minion-%Version%-Py3-x86-Setup.exe" +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo Signing Complete +echo =========================================================================== + +:: Create Hash files +echo =========================================================================== +echo Creating Hashes... +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +set "file_name=Salt-Minion-%Version%-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + + +set "file_name=Salt-Minion-%Version%-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-Py2-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-Py2-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-Py3-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-%Version%-Py3-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-Minion-%Version%-Py2-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-Minion-%Version%-Py2-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-Minion-%Version%-Py3-AMD64-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +set "file_name=Salt-Minion-%Version%-Py3-x86-Setup.exe" +set "file=.\%Series%\%file_name%" +if exist "%file%" ( + echo - %file_name% + powershell -c "$hash = (Get-FileHash -Algorithm MD5 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.md5\"" + powershell -c "$hash = (Get-FileHash -Algorithm SHA256 \"%file%\").Hash; Out-File -InputObject $hash\" %file_name%\" -FilePath \"%file%.sha256\"") + +echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +echo Hashing Complete +echo =========================================================================== + +:quit From be8dcd21f1b3dcf3f2c789245a148c45b03c15d6 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 23 May 2018 11:08:14 -0700 Subject: [PATCH 16/66] Try an even bigger timeout --- tests/integration/cloud/providers/test_ec2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/cloud/providers/test_ec2.py b/tests/integration/cloud/providers/test_ec2.py index d872df5b3b..888a969327 100644 --- a/tests/integration/cloud/providers/test_ec2.py +++ b/tests/integration/cloud/providers/test_ec2.py @@ -39,7 +39,7 @@ def __random_name(size=6): INSTANCE_NAME = __random_name() PROVIDER_NAME = 'ec2' HAS_WINRM = salt.utils.cloud.HAS_WINRM and salt.utils.cloud.HAS_SMB -TIMEOUT = 1000 +TIMEOUT = 1200 class EC2Test(ShellCase): From 1f1cc1357aba637768b91cd7c572599402c77941 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 23 May 2018 12:35:57 -0700 Subject: [PATCH 17/66] Increase instance size for cloud tests --- tests/integration/files/conf/cloud.profiles.d/ec2.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/files/conf/cloud.profiles.d/ec2.conf b/tests/integration/files/conf/cloud.profiles.d/ec2.conf index 1d3687db1f..eeec3219a9 100644 --- a/tests/integration/files/conf/cloud.profiles.d/ec2.conf +++ b/tests/integration/files/conf/cloud.profiles.d/ec2.conf @@ -1,12 +1,12 @@ ec2-test: provider: ec2-config image: ami-98aa1cf0 - size: m1.small + size: m1.large sh_username: ec2-user script_args: '-P -Z' ec2-win2012r2-test: provider: ec2-config - size: m1.small + size: m1.large image: ami-eb1ecd96 smb_port: 445 win_installer: '' @@ -19,7 +19,7 @@ ec2-win2012r2-test: deploy: True ec2-win2016-test: provider: ec2-config - size: m1.small + size: m1.large image: ami-ed14c790 smb_port: 445 win_installer: '' From 81308a4a44aaa14451679c7c91642f02aa44af51 Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 13:47:08 -0600 Subject: [PATCH 18/66] Add release notes for 2017.7.7 --- doc/topics/releases/2017.7.7.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/topics/releases/2017.7.7.rst diff --git a/doc/topics/releases/2017.7.7.rst b/doc/topics/releases/2017.7.7.rst new file mode 100644 index 0000000000..48357df115 --- /dev/null +++ b/doc/topics/releases/2017.7.7.rst @@ -0,0 +1,17 @@ +=========================== +In Progress: Salt 2017.7.7 Release Notes +=========================== + +Version 2017.7.7 is an **unreleased** bugfix release for :ref:`2017.7.0 `. +This release is still in progress and has not been released yet. + +New win_snmp behavior +--------------------- + +`win_snmp.get_community_names` now returns the SNMP settings actually in effect +on the box. If settings are managed via GroupPolicy, those settings will be +returned. Otherwise, normal settings are returned. + +`win_snmp.set_community_names` now raises a CommandExecutionError when SNMP +settings are being managed by GroupPolicy + From 5656183c5e2e7848bceea25c97e18c32ec06200c Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 14:18:30 -0600 Subject: [PATCH 19/66] Add timezone.list, add 2018.3.2 release notes --- doc/topics/releases/2018.3.2.rst | 16 +++++++++++++ salt/modules/win_timezone.py | 41 +++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 doc/topics/releases/2018.3.2.rst diff --git a/doc/topics/releases/2018.3.2.rst b/doc/topics/releases/2018.3.2.rst new file mode 100644 index 0000000000..723a595437 --- /dev/null +++ b/doc/topics/releases/2018.3.2.rst @@ -0,0 +1,16 @@ +=========================== +In Progress: Salt 2018.3.2 Release Notes +=========================== + +Version 2018.3.2 is an **unreleased** bugfix release for :ref:`2018.3.0 `. +This release is still in progress and has not been released yet. + +Changes to win_timezone +----------------------- + +Improves timezone detection by using the pytz module. + +``timezone.get_offset`` and ``timezone.get_zonecode`` now work properly. + +Adds ``timezone.list`` to list supported timezones in either Windows or Unix +format. diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index c0c574c2f8..a5289c79a3 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -39,6 +39,12 @@ class TzMapper(object): def get_unix(self, key, default=None): return self.win_to_unix.get(key.lower(), default) + def list_win(self): + return sorted(self.unix_to_win.values()) + + def list_unix(self): + return sorted(self.win_to_unix.values()) + mapper = TzMapper({ 'AUS Central Standard Time': 'Australia/Darwin', @@ -288,7 +294,9 @@ def zone_compare(timezone): running state checks. Args: - timezone (str): The timezone to compare + timezone (str): + The timezone to compare. This can be in Windows or Unix format. Can + be any of the values returned by the ``timezone.list`` function Returns: bool: ``True`` if they match, otherwise ``False`` @@ -315,6 +323,37 @@ def zone_compare(timezone): return get_zone() == mapper.get_unix(check_zone, 'Unknown') +def list(unix_style=True): + ''' + Return a list of Timezones that this module supports. These can be in either + Unix or Windows format. + + .. version-added:: 2018.3.2 + + Args: + unix_style (bool): + ``True`` returns Unix-style timezones. ``False`` returns + Windows-style timezones. Default is ``True`` + + Returns: + list: A list of supported timezones + + CLI Example: + + .. code-block:: bash + + # Unix-style timezones + salt '*' timezone.list + + # Windows-style timezones + salt '*' timezone.list unix_style=False + ''' + if unix_style: + return mapper.list_unix() + else: + return mapper.list_win() + + def get_hwclock(): ''' Get current hardware clock setting (UTC or localtime) From 73e033f55507d4ef2e6cf0c1f9281d13b31020a8 Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 15:00:09 -0600 Subject: [PATCH 20/66] Return offset in the same format as Unix --- salt/modules/win_timezone.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index a5289c79a3..6ff1e8ed3c 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -226,11 +226,10 @@ def get_offset(): ''' # http://craigglennie.com/programming/python/2013/07/21/working-with-timezones-using-Python-and-pytz-localize-vs-normalize/ tz_object = pytz.timezone(get_zone()) - utc_time = pytz.utc.localize(datetime.today()) + utc_time = pytz.utc.localize(datetime.utcnow()) loc_time = utc_time.astimezone(tz_object) norm_time = tz_object.normalize(loc_time) - time_zone = norm_time.astimezone(tz_object) - return time_zone.utcoffset().total_seconds() / 3600 + return norm_time.strftime('%z') def get_zonecode(): @@ -247,7 +246,7 @@ def get_zonecode(): salt '*' timezone.get_zonecode ''' tz_object = pytz.timezone(get_zone()) - loc_time = tz_object.localize(datetime.today()) + loc_time = tz_object.localize(datetime.utcnow()) return loc_time.tzname() From 6a6ab6972250cb51caf5e0ae99ac672e2ecfb74b Mon Sep 17 00:00:00 2001 From: Daniel A Wozniak Date: Sun, 6 May 2018 16:54:55 +0000 Subject: [PATCH 21/66] Get the current username on windows --- tests/integration/modules/test_cmdmod.py | 10 +++------- tests/support/helpers.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/tests/integration/modules/test_cmdmod.py b/tests/integration/modules/test_cmdmod.py index 810ff9a5fd..f17a3d1960 100644 --- a/tests/integration/modules/test_cmdmod.py +++ b/tests/integration/modules/test_cmdmod.py @@ -12,7 +12,8 @@ from tests.support.case import ModuleCase from tests.support.helpers import ( destructiveTest, skip_if_binaries_missing, - skip_if_not_root + skip_if_not_root, + this_user, ) from tests.support.paths import TMP @@ -227,12 +228,7 @@ class CMDModuleTest(ModuleCase): cmd = '''echo 'SELECT * FROM foo WHERE bar="baz"' ''' expected_result = 'SELECT * FROM foo WHERE bar="baz"' - try: - runas = os.getlogin() - except: # pylint: disable=W0702 - # On some distros (notably Gentoo) os.getlogin() fails - import pwd - runas = pwd.getpwuid(os.getuid())[0] + runas = this_user() result = self.run_function('cmd.run_stdout', [cmd], runas=runas).strip() diff --git a/tests/support/helpers.py b/tests/support/helpers.py index 6866c99730..17cbebf9d2 100644 --- a/tests/support/helpers.py +++ b/tests/support/helpers.py @@ -34,6 +34,7 @@ import types # Import 3rd-party libs import psutil # pylint: disable=3rd-party-module-not-gated import salt.ext.six as six +import salt.utils from salt.ext.six.moves import range, builtins # pylint: disable=import-error,redefined-builtin try: from pytestsalt.utils import get_unused_localhost_port # pylint: disable=unused-import @@ -52,6 +53,10 @@ except ImportError: from tests.support.unit import skip, _id from tests.support.mock import patch from tests.support.paths import FILES, TMP +if salt.utils.is_windows(): + import win32api +else: + import pwd # Import Salt libs import salt.utils @@ -1552,3 +1557,11 @@ def win32_kill_process_tree(pid, sig=signal.SIGTERM, include_parent=True, gone, alive = psutil.wait_procs(children, timeout=timeout, callback=on_terminate) return (gone, alive) + +def this_user(): + if salt.utils.is_windows(): + full_username = win32api.GetUserNameEx(win32api.NameSamCompatible) + if '\\' in full_username: + return full_username.split('\\', 1)[1] + return full_username + return pwd.getpwuid(os.getuid())[0] From a056a293f1138ff03608225d248bdf364bdd740e Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 6 May 2018 14:30:37 -0700 Subject: [PATCH 22/66] Centeralize test username lookup --- tests/support/runtests.py | 10 ++++------ tests/unit/fileserver/test_gitfs.py | 7 ++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/tests/support/runtests.py b/tests/support/runtests.py index 42ffac04f6..8f097c843d 100644 --- a/tests/support/runtests.py +++ b/tests/support/runtests.py @@ -57,6 +57,7 @@ import multiprocessing # Import tests support libs import tests.support.paths as paths +import tests.support.helpers # Import 3rd-party libs import salt.ext.six as six @@ -103,12 +104,9 @@ try: except ImportError: pass -if sys.platform.startswith('win'): - import win32api # pylint: disable=import-error - RUNNING_TESTS_USER = win32api.GetUserName() -else: - import pwd - RUNNING_TESTS_USER = pwd.getpwuid(os.getuid()).pw_name + +RUNNING_TESTS_USER = tests.support.helpers.this_user() + log = logging.getLogger(__name__) diff --git a/tests/unit/fileserver/test_gitfs.py b/tests/unit/fileserver/test_gitfs.py index 44e6f7af9f..d3c9562c99 100644 --- a/tests/unit/fileserver/test_gitfs.py +++ b/tests/unit/fileserver/test_gitfs.py @@ -31,6 +31,7 @@ from tests.support.mixins import LoaderModuleMockMixin from tests.support.unit import TestCase, skipIf from tests.support.mock import NO_MOCK, NO_MOCK_REASON from tests.support.paths import TMP, FILES +from tests.support.helpers import this_user # Import salt libs import salt.utils.gitfs @@ -207,11 +208,7 @@ class GitFSTest(TestCase, LoaderModuleMockMixin): if 'USERNAME' not in os.environ: try: import salt.utils - if salt.utils.is_windows(): - import salt.utils.win_functions - os.environ['USERNAME'] = salt.utils.win_functions.get_current_user() - else: - os.environ['USERNAME'] = pwd.getpwuid(os.geteuid()).pw_name + os.environ['USERNAME'] = this_user() except AttributeError: log.error('Unable to get effective username, falling back to ' '\'root\'.') From 9923176b682eef9e3d9f11f2978d708738d5abad Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 17:27:58 -0600 Subject: [PATCH 23/66] Use __utils__, fix unit tests --- salt/modules/win_timezone.py | 13 +++---- tests/unit/modules/test_win_timezone.py | 47 +++++++++++++++---------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index 6ff1e8ed3c..7c3ddb3d11 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -11,9 +11,6 @@ from datetime import datetime # Import Salt libs from salt.exceptions import CommandExecutionError -import salt.utils.path -import salt.utils.platform -import salt.utils.win_reg log = logging.getLogger(__name__) @@ -186,7 +183,7 @@ def __virtual__(): ''' Only load on windows ''' - if salt.utils.platform.is_windows() and salt.utils.path.which('tzutil'): + if __utils__['platform.is_windows']() and __utils__['path.which']('tzutil'): return __virtualname__ return (False, "Module win_timezone: tzutil not found or is not on Windows client") @@ -204,7 +201,7 @@ def get_zone(): salt '*' timezone.get_zone ''' - win_zone = salt.utils.win_reg.read_value( + win_zone = __utils__['reg.read_value']( hive='HKLM', key='SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation', vname='TimeZoneKeyName')['vdata'] @@ -283,7 +280,11 @@ def set_zone(timezone): # Set the value cmd = ['tzutil', '/s', win_zone] - __salt__['cmd.run'](cmd, python_shell=False) + res = __salt__['cmd.run_all'](cmd, python_shell=False) + if res['retcode']: + raise CommandExecutionError('tzutil encountered an error setting ' + 'timezone: {0}'.format(timezone), + info=res) return zone_compare(timezone) diff --git a/tests/unit/modules/test_win_timezone.py b/tests/unit/modules/test_win_timezone.py index 7e6d7d95ed..9230f93a42 100644 --- a/tests/unit/modules/test_win_timezone.py +++ b/tests/unit/modules/test_win_timezone.py @@ -2,7 +2,6 @@ ''' :codeauthor: :email:`Jayesh Kariya ` ''' - # Import Python Libs from __future__ import absolute_import, unicode_literals, print_function @@ -31,12 +30,13 @@ class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): ''' Test if it get current timezone (i.e. Asia/Calcutta) ''' - mock_cmd = MagicMock(side_effect=['India Standard Time', - 'Indian Standard Time']) - with patch.dict(win_timezone.__salt__, {'cmd.run': mock_cmd}): + mock_read = MagicMock(side_effect=[{'vdata': 'India Standard Time'}, + {'vdata': 'Indian Standard Time'}]) + + with patch.dict(win_timezone.__utils__, {'reg.read_value': mock_read}): self.assertEqual(win_timezone.get_zone(), 'Asia/Calcutta') - self.assertFalse(win_timezone.get_zone()) + self.assertEqual(win_timezone.get_zone(), 'Unknown') # 'get_offset' function tests: 1 @@ -44,15 +44,15 @@ class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): ''' Test if it get current numeric timezone offset from UCT (i.e. +0530) ''' - time = ('(UTC+05:30) Chennai, Kolkata, Mumbai, \ - New Delhi\nIndia Standard Time') - mock_cmd = MagicMock(side_effect=['India Standard Time', time]) - with patch.dict(win_timezone.__salt__, {'cmd.run': mock_cmd}): - self.assertEqual(win_timezone.get_offset(), '+0530') + # time = ('(UTC+05:30) Chennai, Kolkata, Mumbai, \ + # New Delhi\nIndia Standard Time') + # mock_cmd = MagicMock(side_effect=['India Standard Time', time]) + # with patch.dict(win_timezone.__salt__, {'cmd.run': mock_cmd}): - mock_cmd = MagicMock(return_value='India Standard Time') - with patch.dict(win_timezone.__salt__, {'cmd.run': mock_cmd}): - self.assertFalse(win_timezone.get_offset()) + mock_read = MagicMock(return_value={'vdata': 'India Standard Time'}) + + with patch.dict(win_timezone.__utils__, {'reg.read_value': mock_read}): + self.assertEqual(win_timezone.get_offset(), '+0530') # 'get_zonecode' function tests: 1 @@ -60,7 +60,10 @@ class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): ''' Test if it get current timezone (i.e. PST, MDT, etc) ''' - self.assertFalse(win_timezone.get_zonecode()) + mock_read = MagicMock(return_value={'vdata': 'India Standard Time'}) + + with patch.dict(win_timezone.__utils__, {'reg.read_value': mock_read}): + self.assertEqual(win_timezone.get_zonecode(), 'IST') # 'set_zone' function tests: 1 @@ -68,8 +71,15 @@ class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): ''' Test if it unlinks, then symlinks /etc/localtime to the set timezone. ''' - mock_cmd = MagicMock(return_value=0) - with patch.dict(win_timezone.__salt__, {'cmd.retcode': mock_cmd}): + mock_cmd = MagicMock(return_value={'pid': 78, + 'retcode': 0, + 'stderr': '', + 'stdout': ''}) + mock_read = MagicMock(return_value={'vdata': 'India Standard Time'}) + + with patch.dict(win_timezone.__salt__, {'cmd.run_all': mock_cmd}), \ + patch.dict(win_timezone.__utils__, {'reg.read_value': mock_read}): + self.assertTrue(win_timezone.set_zone('Asia/Calcutta')) # 'zone_compare' function tests: 1 @@ -80,8 +90,9 @@ class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): the one set in /etc/localtime. Returns True if they match, and False if not. Mostly useful for running state checks. ''' - mock_cmd = MagicMock(return_value='India Standard Time') - with patch.dict(win_timezone.__salt__, {'cmd.run': mock_cmd}): + mock_read = MagicMock(return_value={'vdata': 'India Standard Time'}) + + with patch.dict(win_timezone.__utils__, {'reg.read_value': mock_read}): self.assertTrue(win_timezone.zone_compare('Asia/Calcutta')) # 'get_hwclock' function tests: 1 From b8a6488688bf4cfd30f99c2d0cffbf9bc39f9c5e Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 23 May 2018 17:44:23 -0600 Subject: [PATCH 24/66] Update __virtual__ function --- salt/modules/win_timezone.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index 7c3ddb3d11..9e4092d865 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -183,9 +183,11 @@ def __virtual__(): ''' Only load on windows ''' - if __utils__['platform.is_windows']() and __utils__['path.which']('tzutil'): - return __virtualname__ - return (False, "Module win_timezone: tzutil not found or is not on Windows client") + if not __utils__['platform.is_windows'](): + return False, "Module win_timezone: Not on Windows client" + if not __utils__['path.which']('tzutil'): + return False, "Module win_timezone: tzutil not found" + return __virtualname__ def get_zone(): From e5948902af6babc56e79eafa3bc5cc71ee54f42e Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 23 May 2018 16:26:46 -0700 Subject: [PATCH 25/66] Use salt utils method for this_user --- tests/support/helpers.py | 12 ++++++------ tests/support/runtests.py | 1 - tests/unit/fileserver/test_gitfs.py | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/support/helpers.py b/tests/support/helpers.py index 17cbebf9d2..b9aec4df22 100644 --- a/tests/support/helpers.py +++ b/tests/support/helpers.py @@ -54,7 +54,7 @@ from tests.support.unit import skip, _id from tests.support.mock import patch from tests.support.paths import FILES, TMP if salt.utils.is_windows(): - import win32api + import salt.utils.win_functions else: import pwd @@ -1143,7 +1143,6 @@ def skip_if_not_root(func): func.__unittest_skip__ = True func.__unittest_skip_why__ = 'You must be logged in as root to run this test' else: - import salt.utils.win_functions current_user = salt.utils.win_functions.get_current_user() if current_user != 'SYSTEM': if not salt.utils.win_functions.is_admin(current_user): @@ -1558,10 +1557,11 @@ def win32_kill_process_tree(pid, sig=signal.SIGTERM, include_parent=True, callback=on_terminate) return (gone, alive) + def this_user(): + ''' + Get the user associated with the current process. + ''' if salt.utils.is_windows(): - full_username = win32api.GetUserNameEx(win32api.NameSamCompatible) - if '\\' in full_username: - return full_username.split('\\', 1)[1] - return full_username + return salt.utils.win_functions.get_current_user() return pwd.getpwuid(os.getuid())[0] diff --git a/tests/support/runtests.py b/tests/support/runtests.py index 8f097c843d..7791876e09 100644 --- a/tests/support/runtests.py +++ b/tests/support/runtests.py @@ -49,7 +49,6 @@ # Import Python modules from __future__ import absolute_import, print_function import os -import sys import json import shutil import logging diff --git a/tests/unit/fileserver/test_gitfs.py b/tests/unit/fileserver/test_gitfs.py index d3c9562c99..a03c40c1da 100644 --- a/tests/unit/fileserver/test_gitfs.py +++ b/tests/unit/fileserver/test_gitfs.py @@ -12,7 +12,7 @@ import textwrap import logging import stat try: - import pwd + import pwd # pylint: disable=unused-import except ImportError: pass From 2509d3688878dc818e7b6eb33a8db4590be2065a Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Thu, 24 May 2018 08:30:17 -0400 Subject: [PATCH 26/66] Add windows to service disable ERROR check in tests --- tests/integration/modules/test_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/modules/test_service.py b/tests/integration/modules/test_service.py index 77a41e4bc6..5bdd259267 100644 --- a/tests/integration/modules/test_service.py +++ b/tests/integration/modules/test_service.py @@ -118,7 +118,7 @@ class ServiceModuleTest(ModuleCase): systemd = salt.utils.systemd.booted() # check service was not enabled - if systemd: + if systemd or salt.utils.is_windows(): self.assertIn('ERROR', enable) else: self.assertFalse(enable) From 362414e53bde8e85df0c9d8a718d93c9e3f0d96e Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Thu, 24 May 2018 10:48:56 -0400 Subject: [PATCH 27/66] Remove output_loglevel in mac_system module --- salt/modules/mac_system.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/salt/modules/mac_system.py b/salt/modules/mac_system.py index 3b0facf303..bfc700152b 100644 --- a/salt/modules/mac_system.py +++ b/salt/modules/mac_system.py @@ -74,8 +74,7 @@ def _atrun_enabled(): # Collect information on service: will raise an error if it fails salt.utils.mac_utils.launchctl('list', label, - return_stdout=True, - output_loglevel='quiet') + return_stdout=True) return True except CommandExecutionError: return False @@ -111,9 +110,8 @@ def _enable_atrun(): return False salt.utils.mac_utils.launchctl('enable', - 'system/{0}'.format(label), - output_loglevel='quiet') - salt.utils.mac_utils.launchctl('load', path, output_loglevel='quiet') + 'system/{0}'.format(label)) + salt.utils.mac_utils.launchctl('load', path) return _atrun_enabled() From 7848114d6a3382cd0194807bb6e5905c8ba629d0 Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Thu, 24 May 2018 14:11:27 -0400 Subject: [PATCH 28/66] Add win_dns module integration tests for windows --- .../modules/test_win_dns_client.py | 37 +++++++++++++++++++ tests/whitelist.txt | 1 + 2 files changed, 38 insertions(+) create mode 100644 tests/integration/modules/test_win_dns_client.py diff --git a/tests/integration/modules/test_win_dns_client.py b/tests/integration/modules/test_win_dns_client.py new file mode 100644 index 0000000000..421443e5d2 --- /dev/null +++ b/tests/integration/modules/test_win_dns_client.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +# Import Python libs +from __future__ import absolute_import + +# Import Salt Testing libs +from tests.support.case import ModuleCase +from tests.support.unit import skipIf +from tests.support.helpers import destructiveTest + +# Import Salt libs +import salt.utils + + +@skipIf(not salt.utils.is_windows(), 'windows test only') +class WinDNSTest(ModuleCase): + ''' + Test for salt.modules.win_dns_client + ''' + @destructiveTest + def test_add_remove_dns(self): + ''' + Test add and removing a dns server + ''' + dns = '8.8.8.8' + interface = 'Ethernet' + # add dns server + self.assertTrue(self.run_function('win_dns_client.add_dns', [dns, interface], index=42)) + + srvs = self.run_function('win_dns_client.get_dns_servers', interface=interface) + self.assertIn(dns, srvs) + + # remove dns server + self.assertTrue(self.run_function('win_dns_client.rm_dns', [dns], interface=interface)) + + srvs = self.run_function('win_dns_client.get_dns_servers', interface=interface) + self.assertNotIn(dns, srvs) diff --git a/tests/whitelist.txt b/tests/whitelist.txt index b7cb036881..bc4de02fc4 100644 --- a/tests/whitelist.txt +++ b/tests/whitelist.txt @@ -29,6 +29,7 @@ integration.modules.test_sysmod integration.modules.test_system integration.modules.test_test integration.modules.test_useradd +integration.modules.test_win_dns_client integration.reactor.test_reactor integration.renderers.test_pydsl integration.returners.test_librato_return From cf534c7314fa01974ea071194f8327e6d0a58950 Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 14:27:16 -0400 Subject: [PATCH 29/66] Fix Linode plan selection --- salt/cloud/clouds/linode.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 990767ece4..1716695ac9 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1035,7 +1035,40 @@ def get_plan_id(kwargs=None, call=None): 'The get_plan_id function requires a \'label\'.' ) - return avail_sizes()[label]['PLANID'] + sizes = avail_sizes() + + if label not in sizes: + # Linode plan labels have changed from e.g. Linode 1024 to Linode 1GB + if "GB" not in label: + plan = label.split() + + # label is invalid if it isn't a space-separated string + if len(plan) != 2: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) + ) + + plan_type = plan[0] + try: + plan_size = int(plan[1]) + except: + plan_size = 0 + + if plan_type == "Linode" and plan_size == 1024: + plan_type = "Nanode" + + # translate from MB to GB + plan_size = plan_size/1024 + new_label = "{} {}GB".format(plan_type, plan_size) + + if new_label not in sizes: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) + ) + + label = new_label + + return sizes[label]['PLANID'] def get_private_ip(vm_): From 121303d8272f57640647657ce353c5400d2c6b20 Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 16:01:06 -0400 Subject: [PATCH 30/66] reduce complexity of get_plan_id by moving decoding of the user-supplied label to its own function --- salt/cloud/clouds/linode.py | 64 +++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 1716695ac9..44fce69c6f 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1008,33 +1008,17 @@ def get_password(vm_): ) -def get_plan_id(kwargs=None, call=None): - ''' - Returns the Linode Plan ID. +def decode_linode_plan_label(label): + """ + Attempts to decode a user-supplied Linode plan label + into the format in Linode API output label - The label, or name, of the plan to get the ID from. - - CLI Example: - - .. code-block:: bash - - salt-cloud -f get_plan_id linode label="Linode 1024" - ''' - if call == 'action': - raise SaltCloudException( - 'The show_instance action must be called with -f or --function.' - ) - - if kwargs is None: - kwargs = {} - - label = kwargs.get('label', None) - if label is None: - raise SaltCloudException( - 'The get_plan_id function requires a \'label\'.' - ) + The label, or name, of the plan to decode. + Example: + `Linode 2048` will decode to `Linode 2GB` + """ sizes = avail_sizes() if label not in sizes: @@ -1071,6 +1055,38 @@ def get_plan_id(kwargs=None, call=None): return sizes[label]['PLANID'] +def get_plan_id(kwargs=None, call=None): + ''' + Returns the Linode Plan ID. + + label + The label, or name, of the plan to get the ID from. + + CLI Example: + + .. code-block:: bash + + salt-cloud -f get_plan_id linode label="Linode 1024" + ''' + if call == 'action': + raise SaltCloudException( + 'The show_instance action must be called with -f or --function.' + ) + + if kwargs is None: + kwargs = {} + + label = kwargs.get('label', None) + if label is None: + raise SaltCloudException( + 'The get_plan_id function requires a \'label\'.' + ) + + label = decode_linode_plan_label(label) + + return label + + def get_private_ip(vm_): ''' Return True if a private ip address is requested From f52926ca87d5659c79f0cd84e321ec1f5451c73c Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 16:11:37 -0400 Subject: [PATCH 31/66] log a warning when the user supplied a label we could decode but was not in the proper format --- salt/cloud/clouds/linode.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 44fce69c6f..4b9973addb 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1050,6 +1050,10 @@ def decode_linode_plan_label(label): 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) ) + log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." + " Please update the profile to use" + " the new label format {} for the requested Linode plan size.'.format(label, new_label)) + label = new_label return sizes[label]['PLANID'] From 95e020222329b697238e94483f2c9a83c8694808 Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 16:17:03 -0400 Subject: [PATCH 32/66] more consistent use of parens in logged warning --- salt/cloud/clouds/linode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 4b9973addb..dbe9808214 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1052,7 +1052,7 @@ def decode_linode_plan_label(label): log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." " Please update the profile to use" - " the new label format {} for the requested Linode plan size.'.format(label, new_label)) + " the new label format ({}) for the requested Linode plan size.'.format(label, new_label)) label = new_label From 319fbd34067906f2fa7b05b95066aa1fa2eebeb0 Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 16:34:47 -0400 Subject: [PATCH 33/66] match quotation mark types properly --- salt/cloud/clouds/linode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index dbe9808214..1d07832c1e 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1052,7 +1052,7 @@ def decode_linode_plan_label(label): log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." " Please update the profile to use" - " the new label format ({}) for the requested Linode plan size.'.format(label, new_label)) + " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) label = new_label From 3afb50d5a29658b28c83e476b50fe31bf0775c7b Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 16:55:30 -0400 Subject: [PATCH 34/66] slight cleanup --- salt/cloud/clouds/linode.py | 50 +++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 1d07832c1e..a9b2d1b65d 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1021,40 +1021,36 @@ def decode_linode_plan_label(label): """ sizes = avail_sizes() - if label not in sizes: - # Linode plan labels have changed from e.g. Linode 1024 to Linode 1GB - if "GB" not in label: - plan = label.split() + if label not in sizes and "GB" not in label: + plan = label.split() - # label is invalid if it isn't a space-separated string - if len(plan) != 2: - raise SaltCloudException( - 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) - ) + if len(plan) != 2: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) + ) - plan_type = plan[0] - try: - plan_size = int(plan[1]) - except: - plan_size = 0 + plan_type = plan[0] + try: + plan_size = int(plan[1]) + except Exception as e: + plan_size = 0 - if plan_type == "Linode" and plan_size == 1024: - plan_type = "Nanode" + if plan_type == "Linode" and plan_size == 1024: + plan_type = "Nanode" - # translate from MB to GB - plan_size = plan_size/1024 - new_label = "{} {}GB".format(plan_type, plan_size) + plan_size = plan_size/1024 + new_label = "{} {}GB".format(plan_type, plan_size) - if new_label not in sizes: - raise SaltCloudException( - 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) - ) + if new_label not in sizes: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) + ) - log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." - " Please update the profile to use" - " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) + log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." + " Please update the profile to use" + " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) - label = new_label + label = new_label return sizes[label]['PLANID'] From 2ba4fc4cea675497baec7d0497c8260fd0eb2448 Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Wed, 23 May 2018 17:00:37 -0400 Subject: [PATCH 35/66] fix raising when a 'GB' format invalid plan is supplied --- salt/cloud/clouds/linode.py | 47 ++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index a9b2d1b65d..4710151ea4 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1021,36 +1021,41 @@ def decode_linode_plan_label(label): """ sizes = avail_sizes() - if label not in sizes and "GB" not in label: - plan = label.split() - - if len(plan) != 2: + if label not in sizes: + if "GB" in label: raise SaltCloudException( 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) ) + else: + plan = label.split() - plan_type = plan[0] - try: - plan_size = int(plan[1]) - except Exception as e: - plan_size = 0 + if len(plan) != 2: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) + ) - if plan_type == "Linode" and plan_size == 1024: - plan_type = "Nanode" + plan_type = plan[0] + try: + plan_size = int(plan[1]) + except Exception as e: + plan_size = 0 - plan_size = plan_size/1024 - new_label = "{} {}GB".format(plan_type, plan_size) + if plan_type == "Linode" and plan_size == 1024: + plan_type = "Nanode" - if new_label not in sizes: - raise SaltCloudException( - 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) - ) + plan_size = plan_size/1024 + new_label = "{} {}GB".format(plan_type, plan_size) - log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." - " Please update the profile to use" - " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) + if new_label not in sizes: + raise SaltCloudException( + 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) + ) - label = new_label + log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." + " Please update the profile to use" + " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) + + label = new_label return sizes[label]['PLANID'] From 50bce3a2f33d0a98b86dce411901d9ee3ab8a23f Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Thu, 24 May 2018 10:05:02 -0400 Subject: [PATCH 36/66] make decode_linode_plan_label a private function --- salt/cloud/clouds/linode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 4710151ea4..3e23c80462 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1008,7 +1008,7 @@ def get_password(vm_): ) -def decode_linode_plan_label(label): +def _decode_linode_plan_label(label): """ Attempts to decode a user-supplied Linode plan label into the format in Linode API output From 83565c55df6c93240cead81684abd294c4d98f0d Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Thu, 24 May 2018 14:58:42 -0400 Subject: [PATCH 37/66] Address PR feedback --- salt/cloud/clouds/linode.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index 3e23c80462..a50478fb3f 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1009,7 +1009,7 @@ def get_password(vm_): def _decode_linode_plan_label(label): - """ + ''' Attempts to decode a user-supplied Linode plan label into the format in Linode API output @@ -1018,7 +1018,7 @@ def _decode_linode_plan_label(label): Example: `Linode 2048` will decode to `Linode 2GB` - """ + ''' sizes = avail_sizes() if label not in sizes: @@ -1037,8 +1037,9 @@ def _decode_linode_plan_label(label): plan_type = plan[0] try: plan_size = int(plan[1]) - except Exception as e: + except TypeError: plan_size = 0 + log.debug('Failed to decode user-supplied Linode plan label: %s', label) if plan_type == "Linode" and plan_size == 1024: plan_type = "Nanode" @@ -1087,7 +1088,7 @@ def get_plan_id(kwargs=None, call=None): 'The get_plan_id function requires a \'label\'.' ) - label = decode_linode_plan_label(label) + label = _decode_linode_plan_label(label) return label From bd2b62fa66849185eef377589aa52722f15c957a Mon Sep 17 00:00:00 2001 From: rmcintosh Date: Thu, 24 May 2018 23:35:52 -0400 Subject: [PATCH 38/66] better debug message also, give Cloud Profile its proper capitalization and some minor formatting consistency updates --- salt/cloud/clouds/linode.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/salt/cloud/clouds/linode.py b/salt/cloud/clouds/linode.py index a50478fb3f..8b360efbb5 100644 --- a/salt/cloud/clouds/linode.py +++ b/salt/cloud/clouds/linode.py @@ -1022,7 +1022,7 @@ def _decode_linode_plan_label(label): sizes = avail_sizes() if label not in sizes: - if "GB" in label: + if 'GB' in label: raise SaltCloudException( 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(label) ) @@ -1039,10 +1039,10 @@ def _decode_linode_plan_label(label): plan_size = int(plan[1]) except TypeError: plan_size = 0 - log.debug('Failed to decode user-supplied Linode plan label: %s', label) + log.debug('Failed to decode Linode plan label in Cloud Profile: %s', label) - if plan_type == "Linode" and plan_size == 1024: - plan_type = "Nanode" + if plan_type == 'Linode' and plan_size == 1024: + plan_type = 'Nanode' plan_size = plan_size/1024 new_label = "{} {}GB".format(plan_type, plan_size) @@ -1052,9 +1052,9 @@ def _decode_linode_plan_label(label): 'Invalid Linode plan ({}) specified - call avail_sizes() for all available options'.format(new_label) ) - log.warning("An outdated Linode plan label was detected in your Cloud profile ({})." - " Please update the profile to use" - " the new label format ({}) for the requested Linode plan size.".format(label, new_label)) + log.warning('An outdated Linode plan label was detected in your Cloud Profile ({}).' + ' Please update the profile to use' + ' the new label format ({}) for the requested Linode plan size.'.format(label, new_label)) label = new_label From 72cc361c7b33e48fc7b9914ece4dc7a6f5d44ff8 Mon Sep 17 00:00:00 2001 From: twangboy Date: Fri, 25 May 2018 11:46:45 -0600 Subject: [PATCH 39/66] Move pytz to 3rd party import, add to __virtual__ Add pytz to freezer includes --- salt/modules/win_timezone.py | 10 +++++++++- setup.py | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index 9e4092d865..7178dcb7e4 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -6,12 +6,18 @@ from __future__ import absolute_import, unicode_literals, print_function # Import Python libs import logging -import pytz from datetime import datetime # Import Salt libs from salt.exceptions import CommandExecutionError +# Import 3rd party libs +try: + import pytz + HAS_PYTZ = True +except ImportError: + HAS_PYTZ = False + log = logging.getLogger(__name__) # Define the module's virtual name @@ -185,6 +191,8 @@ def __virtual__(): ''' if not __utils__['platform.is_windows'](): return False, "Module win_timezone: Not on Windows client" + if not HAS_PYTZ: + return False, "Module win_timezone: pytz not found" if not __utils__['path.which']('tzutil'): return False, "Module win_timezone: tzutil not found" return __virtualname__ diff --git a/setup.py b/setup.py index 0841c93553..3ccbf47f97 100755 --- a/setup.py +++ b/setup.py @@ -1121,6 +1121,7 @@ class SaltDistribution(distutils.dist.Distribution): 'wmi', 'site', 'psutil', + 'pytz', ]) elif IS_SMARTOS_PLATFORM: # we have them as requirements in pkg/smartos/esky/requirements.txt From 60499d18f0a58ebc7a00066b4126c563042e1b91 Mon Sep 17 00:00:00 2001 From: twangboy Date: Fri, 25 May 2018 11:53:37 -0600 Subject: [PATCH 40/66] Skip test if pytz not present --- tests/unit/modules/test_win_timezone.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/modules/test_win_timezone.py b/tests/unit/modules/test_win_timezone.py index 9230f93a42..8940399bb5 100644 --- a/tests/unit/modules/test_win_timezone.py +++ b/tests/unit/modules/test_win_timezone.py @@ -7,7 +7,7 @@ from __future__ import absolute_import, unicode_literals, print_function # Import Salt Testing Libs from tests.support.mixins import LoaderModuleMockMixin -from tests.support.unit import TestCase +from tests.support.unit import TestCase, skipIf from tests.support.mock import ( MagicMock, patch @@ -17,6 +17,7 @@ from tests.support.mock import ( import salt.modules.win_timezone as win_timezone +@skipIf(not win_timezone.HAS_PYTZ, 'This test requires pytz') class WinTimezoneTestCase(TestCase, LoaderModuleMockMixin): ''' Test cases for salt.modules.win_timezone From 019edad8e486ef7f1abaa56137069f942497ab15 Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Fri, 25 May 2018 15:13:56 -0400 Subject: [PATCH 41/66] Fix flaky refresh pillar integration test --- tests/integration/modules/test_saltutil.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/integration/modules/test_saltutil.py b/tests/integration/modules/test_saltutil.py index 121ad81c45..d1ae4f5fde 100644 --- a/tests/integration/modules/test_saltutil.py +++ b/tests/integration/modules/test_saltutil.py @@ -188,7 +188,18 @@ class SaltUtilSyncPillarTest(ModuleCase): ''')) pillar_refresh = self.run_function('saltutil.refresh_pillar') - wait = self.run_function('test.sleep', [5]) + + pillar = False + timeout = time.time() + 30 + while not pillar: + post_pillar = self.run_function('pillar.raw') + try: + self.assertIn(pillar_key, post_pillar.get(pillar_key, 'didnotwork')) + pillar = True + except AssertionError: + if time.time() > timeout: + self.assertIn(pillar_key, post_pillar.get(pillar_key, 'didnotwork')) + continue post_pillar = self.run_function('pillar.raw') self.assertIn(pillar_key, post_pillar.get(pillar_key, 'didnotwork')) From 03676712de9541061f241f82fa63386b9a1931fd Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Fri, 25 May 2018 13:01:36 -0700 Subject: [PATCH 42/66] Adding some addition documentation to the reactor runner indicating that the reactor system must be active prior to using it. --- salt/runners/reactor.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/salt/runners/reactor.py b/salt/runners/reactor.py index ba21c39579..c86378b506 100644 --- a/salt/runners/reactor.py +++ b/salt/runners/reactor.py @@ -1,6 +1,17 @@ # -*- coding: utf-8 -*- ''' A convenience system to manage reactors + +Beginning in the 2017.7 release, the reactor runner requires that the reactor +system is running. This is accomplished one of two ways, either +by having reactors configured or by including ``reactor`` in the +engine configuration for the Salt master. + + .. code-block:: yaml + + engines: + - reactor + ''' # Import python libs from __future__ import absolute_import, print_function From f037fa4064178cb442e709e248a46b2627e574b6 Mon Sep 17 00:00:00 2001 From: twangboy Date: Fri, 25 May 2018 15:43:22 -0600 Subject: [PATCH 43/66] Fix some major issues with the LGPO module Issue with the movement of the registry object to salt.utils Issues with dict values in the debug Fix __virtual__ --- salt/modules/win_lgpo.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/salt/modules/win_lgpo.py b/salt/modules/win_lgpo.py index ec62a0f777..ebe7452348 100644 --- a/salt/modules/win_lgpo.py +++ b/salt/modules/win_lgpo.py @@ -35,7 +35,7 @@ Current known limitations - lxml - uuid - struct - - salt.modules.reg + - salt.utils.win_reg ''' # Import Python libs from __future__ import absolute_import, unicode_literals, print_function @@ -98,7 +98,7 @@ try: import lxml import struct from lxml import etree - from salt.modules.reg import Registry as Registry + from salt.utils.win_reg import Registry HAS_WINDOWS_MODULES = True TRUE_VALUE_XPATH = etree.XPath('.//*[local-name() = "trueValue"]') FALSE_VALUE_XPATH = etree.XPath('.//*[local-name() = "falseValue"]') @@ -2672,9 +2672,12 @@ def __virtual__(): ''' Only works on Windows systems ''' - if salt.utils.platform.is_windows() and HAS_WINDOWS_MODULES: - return __virtualname__ - return False + if not salt.utils.platform.is_windows(): + return False, 'win_lgpo: Not a Windows System' + if not HAS_WINDOWS_MODULES: + return False, 'win_lgpo: Required modules failed to load' + log.debug('win_lgpo: LGPO module loaded successfully') + return __virtualname__ def _updateNamespace(item, new_namespace): @@ -5372,7 +5375,7 @@ def set_(computer_policy=None, user_policy=None, else: raise SaltInvocationError(msg) if policy_namespace and policy_name in _admTemplateData[policy_namespace] and the_policy is not None: - log.debug('setting == %s', _admTemplateData[policy_namespace][policy_name].lower()) + log.debug('setting == %s', six.text_type(_admTemplateData[policy_namespace][policy_name]).lower()) log.debug(six.text_type(_admTemplateData[policy_namespace][policy_name]).lower()) if six.text_type(_admTemplateData[policy_namespace][policy_name]).lower() != 'disabled' \ and six.text_type(_admTemplateData[policy_namespace][policy_name]).lower() != 'not configured': From c2f8aef7c52fc87fcef009db899ded5dc6d27572 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 27 May 2018 14:09:50 -0700 Subject: [PATCH 44/66] Fix for py3 ec2 cloud tests --- tests/support/win_installer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/support/win_installer.py b/tests/support/win_installer.py index 6aa139243f..740af145fb 100644 --- a/tests/support/win_installer.py +++ b/tests/support/win_installer.py @@ -54,7 +54,8 @@ def latest_version(repo=REPO): ''' Return the latest version found on the salt repository webpage. ''' - for name, md5 in iter_installers(requests.get(repo).content): + content = requests.get(repo).content.decode('utf-8') + for name, md5 in iter_installers(content): pass return split_installer(name)[0] From 377e34c6895779d08ef780721277d83b61ae8444 Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Fri, 25 May 2018 10:37:00 -0700 Subject: [PATCH 45/66] Updating function in saltmod to ensure that the result is a failure if the function being run returns as False. --- salt/states/saltmod.py | 3 +++ tests/integration/runners/test_state.py | 26 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/salt/states/saltmod.py b/salt/states/saltmod.py index 39f19ac1a2..3e2306f7c6 100644 --- a/salt/states/saltmod.py +++ b/salt/states/saltmod.py @@ -581,6 +581,9 @@ def function( m_ret = mdata['ret'] m_func = (not fail_function and True) or __salt__[fail_function](m_ret) + if m_ret is False: + m_func = False + if not m_func: if minion not in fail_minions: fail.add(minion) diff --git a/tests/integration/runners/test_state.py b/tests/integration/runners/test_state.py index ee7e81b262..4c214ef4cc 100644 --- a/tests/integration/runners/test_state.py +++ b/tests/integration/runners/test_state.py @@ -257,6 +257,32 @@ class StateRunnerTest(ShellCase): self.assertEqual(count('Succeeded: 1', ret), 1) self.assertEqual(count('Failed: 0', ret), 1) + def test_orchestrate_salt_function_return_false_failure(self): + ''' + Ensure that functions that only return False in the return + are flagged as failed when run as orchestrations. + + See https://github.com/saltstack/salt/issues/30367 + ''' + self.run_run('saltutil.sync_modules') + ret = salt.utils.json.loads( + '\n'.join( + self.run_run('state.orchestrate orch.issue30367 --out=json') + ) + ) + # Drill down to the changes dict + state_result = ret['data']['master']['salt_|-deploy_check_|-test.false_|-function']['result'] + func_ret = ret['data']['master']['salt_|-deploy_check_|-test.false_|-function']['changes'] + + self.assertEqual( + state_result, + False, + ) + + self.assertEqual( + func_ret, + {'out': 'highstate', 'ret': {'minion': False}} + ) @skipIf(salt.utils.platform.is_windows(), '*NIX-only test') class OrchEventTest(ShellCase): From 02609b6e61f05926470444fffbf3f266abdb7550 Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Fri, 25 May 2018 14:54:14 -0700 Subject: [PATCH 46/66] Adding state files for new test. --- tests/integration/files/file/base/orch/issue30367/init.sls | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tests/integration/files/file/base/orch/issue30367/init.sls diff --git a/tests/integration/files/file/base/orch/issue30367/init.sls b/tests/integration/files/file/base/orch/issue30367/init.sls new file mode 100644 index 0000000000..a1e404b2be --- /dev/null +++ b/tests/integration/files/file/base/orch/issue30367/init.sls @@ -0,0 +1,4 @@ +deploy_check: + salt.function: + - name: test.false + - tgt: minion From 3e074be9c3cacb827452cbbd1cec736715d47b3e Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Mon, 28 May 2018 09:36:10 -0700 Subject: [PATCH 47/66] Fixing lint --- tests/integration/runners/test_state.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/runners/test_state.py b/tests/integration/runners/test_state.py index 4c214ef4cc..879b011f4c 100644 --- a/tests/integration/runners/test_state.py +++ b/tests/integration/runners/test_state.py @@ -284,6 +284,7 @@ class StateRunnerTest(ShellCase): {'out': 'highstate', 'ret': {'minion': False}} ) + @skipIf(salt.utils.platform.is_windows(), '*NIX-only test') class OrchEventTest(ShellCase): ''' From f9f464fa51519225cf0233487b1d8f5d48fe0abd Mon Sep 17 00:00:00 2001 From: Travis Paul Date: Fri, 11 May 2018 01:52:24 +0800 Subject: [PATCH 48/66] Prevent crash on NetBSD and OpenBSD when no swap is configured. --- salt/grains/core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index d3b030a651..5c1cf808cd 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -451,7 +451,11 @@ def _bsd_memdata(osdata): if osdata['kernel'] in ['OpenBSD', 'NetBSD']: swapctl = salt.utils.path.which('swapctl') - swap_total = __salt__['cmd.run']('{0} -sk'.format(swapctl)).split(' ')[1] + swap_data = __salt__['cmd.run']('{0} -sk'.format(swapctl)) + if swap_data == 'no swap devices configured': + swap_total = 0 + else: + swap_total = swap_data.split(' ')[1] else: swap_total = __salt__['cmd.run']('{0} -n vm.swap_total'.format(sysctl)) grains['swap_total'] = int(swap_total) // 1024 // 1024 From 4ae0313797cf4b36fb44898c520799a83b605958 Mon Sep 17 00:00:00 2001 From: Travis Paul Date: Thu, 24 May 2018 14:26:27 +0800 Subject: [PATCH 49/66] Bugfixes and unit tests for pkgin module Corrects pkg.lastest_version and pkg.file_dict behavior --- salt/modules/pkgin.py | 9 +- tests/unit/modules/test_pkgin.py | 160 +++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 4 deletions(-) create mode 100755 tests/unit/modules/test_pkgin.py diff --git a/salt/modules/pkgin.py b/salt/modules/pkgin.py index 921143e88c..c09dbe3da8 100644 --- a/salt/modules/pkgin.py +++ b/salt/modules/pkgin.py @@ -181,7 +181,9 @@ def latest_version(*names, **kwargs): out = __salt__['cmd.run'](cmd, output_loglevel='trace') for line in out.splitlines(): - p = line.split(',' if _supports_parsing() else None) + if line.startswith('No results found for'): + return pkglist + p = line.split(';' if _supports_parsing() else None) if p and p[0] in ('=:', '<:', '>:', ''): # These are explanation comments @@ -190,7 +192,7 @@ def latest_version(*names, **kwargs): s = _splitpkg(p[0]) if s: if not s[0] in pkglist: - if len(p) > 1 and p[1] == '<': + if len(p) > 1 and p[1] == '<' or p[1] == '': pkglist[s[0]] = s[1] else: pkglist[s[0]] = '' @@ -669,7 +671,6 @@ def file_dict(*packages): for package in packages: cmd = ['pkg_info', '-qL', package] ret = __salt__['cmd.run_all'](cmd, output_loglevel='trace') - files[package] = [] for line in ret['stderr'].splitlines(): errors.append(line) @@ -681,7 +682,7 @@ def file_dict(*packages): continue # unexpected string ret = {'errors': errors, 'files': files} - for field in ret: + for field in list(ret): if not ret[field] or ret[field] == '': del ret[field] return ret diff --git a/tests/unit/modules/test_pkgin.py b/tests/unit/modules/test_pkgin.py new file mode 100755 index 0000000000..05fe330654 --- /dev/null +++ b/tests/unit/modules/test_pkgin.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- + +# Import Python Libs +from __future__ import absolute_import +import os + +# Import Salt Testing Libs +from tests.support.mixins import LoaderModuleMockMixin +from tests.support.unit import TestCase, skipIf +from tests.support.mock import ( + MagicMock, + patch, + NO_MOCK, + NO_MOCK_REASON +) + +# Import Salt Libs +import salt.modules.pkgin as pkgin + +@skipIf(NO_MOCK, NO_MOCK_REASON) +class PkginTestCase(TestCase, LoaderModuleMockMixin): + ''' + Test cases for salt.modules.pkgin + ''' + def setup_loader_modules(self): + return { + pkgin: { + '__opts__': { + 'cachedir': '/tmp' + } + } + } + + def test_search(self): + ''' + Test searching for an available and uninstalled package + ''' + pkgin_out = [ + 'somepkg-1.0 Some package description here', + '', + '=: package is installed and up-to-date', + '<: package is installed but newer version is available', + '>: installed package has a greater version than available package' + ] + + pkgin__get_version_mock = MagicMock(return_value=['0', '9', '0']) + pkgin__check_pkgin_mock = MagicMock(return_value='/opt/pkg/bin/pkgin') + pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out)) + + with patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertDictEqual(pkgin.search('somepkg'), {'somepkg': '1.0'}) + + ''' + Test searching for an available and installed package + ''' + pkgin_out = [ + 'somepkg-1.0 = Some package description here', + '', + '=: package is installed and up-to-date', + '<: package is installed but newer version is available', + '>: installed package has a greater version than available package' + ] + + pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out)) + + with patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertDictEqual(pkgin.search('somepkg'), {'somepkg': '1.0'}) + + def test_latest_version(self): + ''' + Test getting the latest version of an uninstalled package + ''' + pkgin_out = [ + 'somepkg-1.0;;Some package description here', + '', + '=: package is installed and up-to-date', + '<: package is installed but newer version is available', + '>: installed package has a greater version than available package' + ] + + pkgin__get_version_mock = MagicMock(return_value=['0', '9', '0']) + pkgin__check_pkgin_mock = MagicMock(return_value='/opt/pkg/bin/pkgin') + pkgin_refresh_db_mock = MagicMock(return_value=True) + pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out)) + + with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \ + patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertEqual(pkgin.latest_version('somepkg'), '1.0') + + ''' + Test getting the latest version of an ininstalled package + ''' + pkgin_out = [ + 'somepkg-1.1;<;Some package description here', + '', + '=: package is installed and up-to-date', + '<: package is installed but newer version is available', + '>: installed package has a greater version than available package' + ] + + pkgin_refresh_db_mock = MagicMock(return_value=True) + pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out)) + + with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \ + patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertEqual(pkgin.latest_version('somepkg'), '1.1') + + ''' + Test getting the latest version of a bogus package + ''' + pkgin_out = 'No results found for ^boguspkg$' + + pkgin_refresh_db_mock = MagicMock(return_value=True) + pkgin_search_cmd = MagicMock(return_value=pkgin_out) + + with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \ + patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertEqual(pkgin.latest_version('boguspkg'), {}) + + def test_file_dict(self): + ''' + Test that file_dict doesn't crash + ''' + pkg_info_stdout = [ + '/opt/pkg/bin/pkgin', + '/opt/pkg/man/man1/pkgin.1', + '/opt/pkg/share/examples/pkgin/preferred.conf.example', + '/opt/pkg/share/examples/pkgin/repositories.conf.example' + ] + + pkg_info_out = { + 'pid': 1234, + 'retcode': 0, + 'stderr': '', + 'stdout': os.linesep.join(pkg_info_stdout) + } + + pkg_info_cmd = MagicMock(return_value=pkg_info_out) + + with patch.dict(pkgin.__salt__, {'cmd.run_all': pkg_info_cmd}): + self.assertDictEqual(pkgin.file_dict('pkgin'), { + 'files': { + 'pkgin': [ + '/opt/pkg/bin/pkgin', + '/opt/pkg/man/man1/pkgin.1', + '/opt/pkg/share/examples/pkgin/preferred.conf.example', + '/opt/pkg/share/examples/pkgin/repositories.conf.example' + ] + } + }) From 4dac0b4a310b88ad1180a7735bc0d09ba8bc5d24 Mon Sep 17 00:00:00 2001 From: Travis Paul Date: Thu, 24 May 2018 15:27:28 +0800 Subject: [PATCH 50/66] pkgin latest_version bugfix Handle case where the currently installed package is the latest --- salt/modules/pkgin.py | 2 +- tests/unit/modules/test_pkgin.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/salt/modules/pkgin.py b/salt/modules/pkgin.py index c09dbe3da8..a8ba9a481a 100644 --- a/salt/modules/pkgin.py +++ b/salt/modules/pkgin.py @@ -192,7 +192,7 @@ def latest_version(*names, **kwargs): s = _splitpkg(p[0]) if s: if not s[0] in pkglist: - if len(p) > 1 and p[1] == '<' or p[1] == '': + if len(p) > 1 and p[1] in ('<', '', '='): pkglist[s[0]] = s[1] else: pkglist[s[0]] = '' diff --git a/tests/unit/modules/test_pkgin.py b/tests/unit/modules/test_pkgin.py index 05fe330654..37ac47860a 100755 --- a/tests/unit/modules/test_pkgin.py +++ b/tests/unit/modules/test_pkgin.py @@ -113,6 +113,26 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): self.assertEqual(pkgin.latest_version('somepkg'), '1.1') + ''' + Test getting the latest version of an installed package that is the latest version + ''' + pkgin_out = [ + 'somepkg-1.2;=;Some package description here', + '', + '=: package is installed and up-to-date', + '<: package is installed but newer version is available', + '>: installed package has a greater version than available package' + ] + + pkgin_refresh_db_mock = MagicMock(return_value=True) + pkgin_search_cmd = MagicMock(return_value=os.linesep.join(pkgin_out)) + + with patch('salt.modules.pkgin.refresh_db', pkgin_refresh_db_mock), \ + patch('salt.modules.pkgin._get_version', pkgin__get_version_mock), \ + patch('salt.modules.pkgin._check_pkgin', pkgin__check_pkgin_mock), \ + patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): + self.assertEqual(pkgin.latest_version('somepkg'), '1.2') + ''' Test getting the latest version of a bogus package ''' From d50c0ab96b311019db20f8dba7b2ee720cbee566 Mon Sep 17 00:00:00 2001 From: Travis Paul Date: Fri, 25 May 2018 00:58:12 +0800 Subject: [PATCH 51/66] Lint test_pkgin.py --- tests/unit/modules/test_pkgin.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) mode change 100755 => 100644 tests/unit/modules/test_pkgin.py diff --git a/tests/unit/modules/test_pkgin.py b/tests/unit/modules/test_pkgin.py old mode 100755 new mode 100644 index 37ac47860a..4cc7167d15 --- a/tests/unit/modules/test_pkgin.py +++ b/tests/unit/modules/test_pkgin.py @@ -17,6 +17,7 @@ from tests.support.mock import ( # Import Salt Libs import salt.modules.pkgin as pkgin + @skipIf(NO_MOCK, NO_MOCK_REASON) class PkginTestCase(TestCase, LoaderModuleMockMixin): ''' @@ -33,8 +34,10 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): def test_search(self): ''' - Test searching for an available and uninstalled package + Test searching for a package ''' + + # Test searching for an available and uninstalled package pkgin_out = [ 'somepkg-1.0 Some package description here', '', @@ -52,9 +55,7 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): self.assertDictEqual(pkgin.search('somepkg'), {'somepkg': '1.0'}) - ''' - Test searching for an available and installed package - ''' + # Test searching for an available and installed package pkgin_out = [ 'somepkg-1.0 = Some package description here', '', @@ -72,8 +73,10 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): def test_latest_version(self): ''' - Test getting the latest version of an uninstalled package + Test getting the latest version of a package ''' + + # Test getting the latest version of an uninstalled package pkgin_out = [ 'somepkg-1.0;;Some package description here', '', @@ -93,9 +96,7 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): self.assertEqual(pkgin.latest_version('somepkg'), '1.0') - ''' - Test getting the latest version of an ininstalled package - ''' + # Test getting the latest version of an installed package pkgin_out = [ 'somepkg-1.1;<;Some package description here', '', @@ -113,9 +114,8 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): self.assertEqual(pkgin.latest_version('somepkg'), '1.1') - ''' - Test getting the latest version of an installed package that is the latest version - ''' + # Test getting the latest version of a package that is already installed + # and is already at the latest version pkgin_out = [ 'somepkg-1.2;=;Some package description here', '', @@ -133,9 +133,7 @@ class PkginTestCase(TestCase, LoaderModuleMockMixin): patch.dict(pkgin.__salt__, {'cmd.run': pkgin_search_cmd}): self.assertEqual(pkgin.latest_version('somepkg'), '1.2') - ''' - Test getting the latest version of a bogus package - ''' + # Test getting the latest version of a bogus package pkgin_out = 'No results found for ^boguspkg$' pkgin_refresh_db_mock = MagicMock(return_value=True) From 120ee16b707efe49669f0c45e27e18dbae145711 Mon Sep 17 00:00:00 2001 From: rallytime Date: Tue, 29 May 2018 11:19:34 -0400 Subject: [PATCH 52/66] Replace old utils paths with new utils paths --- tests/integration/modules/test_service.py | 2 +- tests/integration/modules/test_win_dns_client.py | 4 ++-- tests/integration/modules/test_win_servermanager.py | 4 ++-- tests/support/helpers.py | 2 +- tests/unit/grains/test_core.py | 12 ++++++------ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/integration/modules/test_service.py b/tests/integration/modules/test_service.py index 8deb3d93de..5efbbb2e0f 100644 --- a/tests/integration/modules/test_service.py +++ b/tests/integration/modules/test_service.py @@ -117,7 +117,7 @@ class ServiceModuleTest(ModuleCase): systemd = salt.utils.systemd.booted() # check service was not enabled - if systemd or salt.utils.is_windows(): + if systemd or salt.utils.platform.is_windows(): self.assertIn('ERROR', enable) else: self.assertFalse(enable) diff --git a/tests/integration/modules/test_win_dns_client.py b/tests/integration/modules/test_win_dns_client.py index 421443e5d2..33997d6ab4 100644 --- a/tests/integration/modules/test_win_dns_client.py +++ b/tests/integration/modules/test_win_dns_client.py @@ -9,10 +9,10 @@ from tests.support.unit import skipIf from tests.support.helpers import destructiveTest # Import Salt libs -import salt.utils +import salt.utils.platform -@skipIf(not salt.utils.is_windows(), 'windows test only') +@skipIf(not salt.utils.platform.is_windows(), 'windows test only') class WinDNSTest(ModuleCase): ''' Test for salt.modules.win_dns_client diff --git a/tests/integration/modules/test_win_servermanager.py b/tests/integration/modules/test_win_servermanager.py index d9591bb3ed..c3290f80cd 100644 --- a/tests/integration/modules/test_win_servermanager.py +++ b/tests/integration/modules/test_win_servermanager.py @@ -8,10 +8,10 @@ from tests.support.case import ModuleCase from tests.support.unit import skipIf # Import Salt libs -import salt.utils +import salt.utils.platform -@skipIf(not salt.utils.is_windows(), 'windows test only') +@skipIf(not salt.utils.platform.is_windows(), 'windows test only') class WinServermanagerTest(ModuleCase): ''' Test for salt.modules.win_servermanager diff --git a/tests/support/helpers.py b/tests/support/helpers.py index 63bd721f5f..de07144ef4 100644 --- a/tests/support/helpers.py +++ b/tests/support/helpers.py @@ -1601,6 +1601,6 @@ def this_user(): ''' Get the user associated with the current process. ''' - if salt.utils.is_windows(): + if salt.utils.platform.is_windows(): return salt.utils.win_functions.get_current_user() return pwd.getpwuid(os.getuid())[0] diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 1e1dd42782..40ed48ae47 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -886,7 +886,7 @@ SwapTotal: 4789244 kB''' 'productname': 'SPARC S7-2', 'product': 'SPARC S7-2', } - with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtconf.s7-zone')) as sparc_return_data: + with salt.utils.files.fopen(os.path.join(SOLARIS_DIR, 'prtconf.s7-zone')) as sparc_return_data: this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) @@ -899,7 +899,7 @@ SwapTotal: 4789244 kB''' 'productname': 'SPARC S7-2', 'product': 'SPARC S7-2', } - with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.s7')) as sparc_return_data: + with salt.utils.files.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.s7')) as sparc_return_data: this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) @@ -912,7 +912,7 @@ SwapTotal: 4789244 kB''' 'productname': 'SPARC Enterprise T5220', 'product': 'SPARC Enterprise T5220', } - with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220')) as sparc_return_data: + with salt.utils.files.fopen(os.path.join(SOLARIS_DIR, 'prtdiag.t5220')) as sparc_return_data: this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) @@ -925,7 +925,7 @@ SwapTotal: 4789244 kB''' 'productname': 'SPARC Enterprise T5220', 'product': 'SPARC Enterprise T5220', } - with salt.utils.fopen(os.path.join(SOLARIS_DIR, 'prtconf.t5220-zone')) as sparc_return_data: + with salt.utils.files.fopen(os.path.join(SOLARIS_DIR, 'prtconf.t5220-zone')) as sparc_return_data: this_sparc_return_data = '\n'.join(sparc_return_data.readlines()) this_sparc_return_data += '\n' self._check_solaris_sparc_productname_grains(this_sparc_return_data, expectation) @@ -949,9 +949,9 @@ SwapTotal: 4789244 kB''' with patch.object(salt.utils, 'which_bin', MagicMock(return_value=None)): with patch.object(os.path, 'isfile', path_isfile_mock): - with salt.utils.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: + with salt.utils.files.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: os_release_content = os_release_file.readlines() - with patch("salt.utils.fopen", mock_open()) as os_release_file: + with patch("salt.utils.files.fopen", mock_open()) as os_release_file: os_release_file.return_value.__iter__.return_value = os_release_content with patch.object(core, '_sunos_cpudata', MagicMock(return_value={'cpuarch': 'sparcv9', From 267f09c1a047319375bfce3f9f9c4e01e117a600 Mon Sep 17 00:00:00 2001 From: rallytime Date: Tue, 29 May 2018 13:56:15 -0400 Subject: [PATCH 53/66] Lint: Remove unused import --- tests/unit/fileserver/test_gitfs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/fileserver/test_gitfs.py b/tests/unit/fileserver/test_gitfs.py index 50c0cc9dbd..751c871dea 100644 --- a/tests/unit/fileserver/test_gitfs.py +++ b/tests/unit/fileserver/test_gitfs.py @@ -24,7 +24,6 @@ from tests.support.mixins import LoaderModuleMockMixin from tests.support.unit import TestCase, skipIf from tests.support.mock import NO_MOCK, NO_MOCK_REASON, patch from tests.support.paths import TMP, FILES -from tests.support.helpers import this_user # Import salt libs import salt.fileserver.gitfs as gitfs From aeacd2b749774857880821c0586e6fe0f46bafbd Mon Sep 17 00:00:00 2001 From: Daniel Wallace Date: Tue, 29 May 2018 13:56:37 -0500 Subject: [PATCH 54/66] allow tornado 5.0 to be installed only for python2 --- doc/topics/releases/2017.7.6.rst | 10 ++++++++++ requirements/base.txt | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/topics/releases/2017.7.6.rst b/doc/topics/releases/2017.7.6.rst index 8ec6370842..1754d0ac97 100644 --- a/doc/topics/releases/2017.7.6.rst +++ b/doc/topics/releases/2017.7.6.rst @@ -5,6 +5,16 @@ In Progress: Salt 2017.7.6 Release Notes Version 2017.7.6 is an **unreleased** bugfix release for :ref:`2017.7.0 `. This release is still in progress and has not been released yet. +Tornado 5.0 Support for Python 2 Only +------------------------------------- + +Tornado 5.0 moves to using asyncio for all python3 versions. Because of this +and changes in asyncio between python 3.4 and 3.5 to only be able to use one +ioloop, which requires some rearchitecting, support for tornado 5.0 and python3 +versions of salt has been delayed to a later release. + +For now, to use tornado 5.0, the python 2 version of salt must be used. + Option to Return to Previous Pillar Include Behavior ---------------------------------------------------- diff --git a/requirements/base.txt b/requirements/base.txt index d5d5d2926f..d016693674 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -5,6 +5,8 @@ msgpack>=0.5,!=0.5.5 PyYAML MarkupSafe requests>=1.0.0 -tornado>=4.2.1,<6.0 +tornado>=4.2.1,<6.0; python_version < 3 +tornado>=4.2.1,<5.0; python_version >= 3.4 + # Required by Tornado to handle threads stuff. futures>=2.0 From 13f920415ad9d6ff1ece8c805b96ab87b2812c27 Mon Sep 17 00:00:00 2001 From: Daniel Wallace Date: Tue, 29 May 2018 14:01:54 -0500 Subject: [PATCH 55/66] add tornado5 note to 2018.3.1 --- doc/topics/releases/2018.3.1.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/topics/releases/2018.3.1.rst b/doc/topics/releases/2018.3.1.rst index 1fbc59a85b..ba982aeed9 100644 --- a/doc/topics/releases/2018.3.1.rst +++ b/doc/topics/releases/2018.3.1.rst @@ -5,6 +5,16 @@ In Progress: Salt 2018.3.1 Release Notes Version 2018.3.1 is an **unreleased** bugfix release for :ref:`2018.3.0 `. This release is still in progress and has not been released yet. +Tornado 5.0 Support for Python 2 Only +------------------------------------- + +Tornado 5.0 moves to using asyncio for all python3 versions. Because of this +and changes in asyncio between python 3.4 and 3.5 to only be able to use one +ioloop, which requires some rearchitecting, support for tornado 5.0 and python3 +versions of salt has been delayed to a later release. + +For now, to use tornado 5.0, the python 2 version of salt must be used. + Changes to Slack Engine pillars ------------------------------- From 98facf8dc825548e3977499506c209f90a68ceb3 Mon Sep 17 00:00:00 2001 From: twangboy Date: Tue, 29 May 2018 13:21:12 -0600 Subject: [PATCH 56/66] Remove log.debug statement in __virtual__ --- salt/modules/win_lgpo.py | 1 - 1 file changed, 1 deletion(-) diff --git a/salt/modules/win_lgpo.py b/salt/modules/win_lgpo.py index ebe7452348..3690640e98 100644 --- a/salt/modules/win_lgpo.py +++ b/salt/modules/win_lgpo.py @@ -2676,7 +2676,6 @@ def __virtual__(): return False, 'win_lgpo: Not a Windows System' if not HAS_WINDOWS_MODULES: return False, 'win_lgpo: Required modules failed to load' - log.debug('win_lgpo: LGPO module loaded successfully') return __virtualname__ From 3884c2cf5f70f55ee9d3ac9f39e7b74dd5a1d38f Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Tue, 29 May 2018 13:52:25 -0700 Subject: [PATCH 57/66] Fix ami role usage warts #47269 Removing 3 un-needed encode calls. Requests Response.text is unicode, now that this file uses unicode_literals Response.text can by used without having to encode it. --- salt/utils/aws.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/salt/utils/aws.py b/salt/utils/aws.py index 059450e7ca..a96da3e115 100644 --- a/salt/utils/aws.py +++ b/salt/utils/aws.py @@ -89,9 +89,7 @@ def creds(provider): proxies={'http': ''}, timeout=AWS_METADATA_TIMEOUT, ) result.raise_for_status() - role = result.text.encode( - result.encoding if result.encoding else 'utf-8' - ) + role = result.text except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError): return provider['id'], provider['key'], '' @@ -451,7 +449,7 @@ def query(params=None, setname=None, requesturl=None, location=None, log.debug('AWS Response Status Code: %s', result.status_code) log.trace( 'AWS Response Text: %s', - result.text.encode(result.encoding if result.encoding else 'utf-8') + result.text ) result.raise_for_status() break @@ -488,11 +486,7 @@ def query(params=None, setname=None, requesturl=None, location=None, return {'error': data}, requesturl return {'error': data} - response = result.text.encode( - result.encoding if result.encoding else 'utf-8' - ) - - root = ET.fromstring(response) + root = ET.fromstring(result.text) items = root[1] if return_root is True: items = root From 3d874b5529e060f429a791b4047c7ff226ffdd84 Mon Sep 17 00:00:00 2001 From: Daniel Wallace Date: Tue, 29 May 2018 16:07:47 -0500 Subject: [PATCH 58/66] quote python_version in requirements.txt --- requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index d016693674..9b3eb10e62 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -5,8 +5,8 @@ msgpack>=0.5,!=0.5.5 PyYAML MarkupSafe requests>=1.0.0 -tornado>=4.2.1,<6.0; python_version < 3 -tornado>=4.2.1,<5.0; python_version >= 3.4 +tornado>=4.2.1,<6.0; python_version < '3' +tornado>=4.2.1,<5.0; python_version >= '3.4' # Required by Tornado to handle threads stuff. futures>=2.0 From 61e56d275d0f186c7cd7dbc8dfa466a5ee4a130c Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Wed, 30 May 2018 10:49:30 -0400 Subject: [PATCH 59/66] Add changelog to 2018.3.1 release notes --- doc/topics/releases/2018.3.1.rst | 4737 +++++++++++++++++++++++++++++- 1 file changed, 4732 insertions(+), 5 deletions(-) diff --git a/doc/topics/releases/2018.3.1.rst b/doc/topics/releases/2018.3.1.rst index ba982aeed9..fb194c0db5 100644 --- a/doc/topics/releases/2018.3.1.rst +++ b/doc/topics/releases/2018.3.1.rst @@ -1,12 +1,22 @@ -=========================== +======================================== In Progress: Salt 2018.3.1 Release Notes -=========================== +======================================== Version 2018.3.1 is an **unreleased** bugfix release for :ref:`2018.3.0 `. This release is still in progress and has not been released yet. +Statistics +========== + +- Total Merges: **525** +- Total Issue References: **74** +- Total PR References: **255** + +- Contributors: **55** (`Ch3LL`_, `DmitryKuzmenko`_, `Giandom`_, `Kimol`_, `L4rS6`_, `LukeCarrier`_, `OrlandoArcapix`_, `TamCore`_, `The-Loeki`_, `UtahDave`_, `aesposito91`_, `bbinet`_, `bdrung`_, `boltronics`_, `bosatsu`_, `clan`_, `corywright`_, `damon-atkins`_, `dincamihai`_, `dmurphy18`_, `dnABic`_, `douglasjreynolds`_, `dwoz`_, `edgan`_, `ejparker12`_, `esell`_, `ezh`_, `femnad`_, `folti`_, `garethgreenaway`_, `gtmanfred`_, `isbm`_, `jasperla`_, `johnj`_, `mateiw`_, `mcalmer`_, `mirceaulinic`_, `morganwillcock`_, `opdude`_, `pcn`_, `pruiz`_, `psagers`_, `psyer`_, `rallytime`_, `robinro`_, `s0undt3ch`_, `samodid`_, `shengis`_, `skjaro`_, `tankywoo`_, `terminalmage`_, `twangboy`_, `vutny`_, `yannj-fr`_, `zmedico`_) + + Tornado 5.0 Support for Python 2 Only -------------------------------------- +===================================== Tornado 5.0 moves to using asyncio for all python3 versions. Because of this and changes in asyncio between python 3.4 and 3.5 to only be able to use one @@ -16,7 +26,7 @@ versions of salt has been delayed to a later release. For now, to use tornado 5.0, the python 2 version of salt must be used. Changes to Slack Engine pillars -------------------------------- +=============================== When using ``groups_pillar_name`` for the slack engine, the engine should be used as part of a salt-minion process running on the master. This will allow @@ -25,7 +35,7 @@ create a LocalClient connection to the master ipc sockets to control environments. Changes to Automatically Updating the Roster File -------------------------------------------------- +================================================= In ``2018.3.0`` salt-ssh was configured to automatically update the flat roster file if a minion was not found for salt-ssh. This was decided to be @@ -33,3 +43,4720 @@ undesireable as a default. The ``--skip-roster`` flag has been removed and replaced with ``--update-roster``, which will enable salt-ssh to add minions to the flat roster file. This behavior can also be enabled by setting ``ssh_update_roster: True`` in the master config file. + +Changelog for v2018.3.0..v2018.3.1 +================================================================= + +*Generated at: 2018-05-30 14:09:03 UTC* + +* **ISSUE** `#47784`_: (`jpsv`_) win_lgpo.py line 5368; AttributeError: 'OrderedDict' object has no attribute 'lower' (refs: `#47848`_) + +* **PR** `#47848`_: (`twangboy`_) Fix some major issues with the LGPO module + @ *2018-05-30 13:37:32 UTC* + + * f15e636d5e Merge pull request `#47848`_ from twangboy/fix_47784 + + * 98facf8dc8 Remove log.debug statement in __virtual__ + + * f037fa4064 Fix some major issues with the LGPO module + +* **PR** `#47881`_: (`gtmanfred`_) quote python_version in requirements.txt + @ *2018-05-29 21:12:05 UTC* + + * 92b8c4c08e Merge pull request `#47881`_ from gtmanfred/2018.3.1 + + * 3d874b5529 quote python_version in requirements.txt + +* **PR** `#47874`_: (`gtmanfred`_) Tornado 5.0 is only supported on python 2 for now + @ *2018-05-29 19:45:44 UTC* + + * 705bf8172d Merge pull request `#47874`_ from gtmanfred/2018.3.1 + + * 13f920415a add tornado5 note to 2018.3.1 + + * aeacd2b749 allow tornado 5.0 to be installed only for python2 + +* **PR** `#47820`_: (`Ch3LL`_) Remove output_loglevel in mac_system module + @ *2018-05-25 13:10:36 UTC* + + * 09e8c5f0cd Merge pull request `#47820`_ from Ch3LL/mac_system + + * 362414e53b Remove output_loglevel in mac_system module + +* **PR** `#47798`_: (`rallytime`_) Back-port `#47776`_ to 2018.3.1 + @ *2018-05-23 15:10:43 UTC* + + * **PR** `#47776`_: (`garethgreenaway`_) [2018.3] Fixes to failing _before_connect tests (refs: `#47798`_) + + * 7e314c26c8 Merge pull request `#47798`_ from rallytime/bp-47776 + + * ae881547d2 Fixing unit.test_minion.MinionTestCase.test_beacons_before_connect and unit.test_minion.MinionTestCase.test_scheduler_before_connect. + +* **PR** `#47782`_: (`rallytime`_) Back-port `#47775`_ to 2018.3.1 + @ *2018-05-22 20:56:37 UTC* + + * **PR** `#47775`_: (`gtmanfred`_) catch UnsupportedOperation with AssertionError (refs: `#47782`_) + + * 9c610da0bc Merge pull request `#47782`_ from rallytime/bp-47775 + + * bab9c966c5 catch UnsupportedOperation with AssertionError + +* **PR** `#47770`_: (`rallytime`_) Back-port `#47769`_ to 2018.3.1 + @ *2018-05-22 17:27:20 UTC* + + * **PR** `#47769`_: (`gtmanfred`_) skip test that breaks test suite (refs: `#47770`_) + + * 4adf10b20b Merge pull request `#47770`_ from rallytime/bp-47769 + + * 3cfb95c7bc skip test that breaks test suite + +* **PR** `#47724`_: (`terminalmage`_) 2 master_tops/ext_nodes fixes + @ *2018-05-21 15:59:04 UTC* + + * bbe8e62a98 Merge pull request `#47724`_ from terminalmage/master_tops_fixes + + * 48b8c5acd1 Merge branch '2018.3.1' into master_tops_fixes + + * 89b3070d4c Change deprecation warning to debug logging + + * ceb6e10f87 Fix spurious "Malformed request" error + +* **ISSUE** `#47484`_: (`whytewolf`_) Windows: pkg.latest state not updating packages. (refs: `#47702`_) + +* **PR** `#47739`_: (`rallytime`_) Back-port `#47702`_ to 2018.3.1 + @ *2018-05-21 15:37:03 UTC* + + * **PR** `#47702`_: (`damon-atkins`_) State pkg.latest called win pkg.install with list of pkgs and the required versions (refs: `#47739`_) + + * 97d6fe7434 Merge pull request `#47739`_ from rallytime/bp-47702 + + * f79da64bb0 Update is_windows path to use `platform` + + * f04b19b5b6 Ensure targeted_pkgs always contains value for non-windows. + + * 14659f9cad Adjusted based on feed back. + + * 9f18f7cdf5 Whitespace lint issues + + * 2a29b28ee6 pkg.install execution module on windows ensures the software package is installed when no version is specified, it does not upgrade the software to the latest. This is per the design. pkg.latest must provide the versions to install to pkg.install + +* **PR** `#47730`_: (`rallytime`_) Back-port `#47700`_ to 2018.3.1 + @ *2018-05-21 15:36:16 UTC* + + * **PR** `#47700`_: (`yannj-fr`_) fix roots modification time check (refs: `#47730`_) + + * cfbe0ba73e Merge pull request `#47730`_ from rallytime/bp-47700 + + * 9bc35b88ea fix roots modification time check + +* **PR** `#47727`_: (`Ch3LL`_) Fix salt.utils.versions.warn_until spelling + @ *2018-05-21 13:41:00 UTC* + + * 3614d3d83a Merge pull request `#47727`_ from Ch3LL/spelling + + * 47a8de5b73 Fix salt.utils.versions.warn_until spelling + +* **PR** `#47736`_: (`Ch3LL`_) mac_utils test: patch __salt__['cmd.run*'] + @ *2018-05-21 13:38:59 UTC* + + * bb45cdaefe Merge pull request `#47736`_ from Ch3LL/fix_util_mac_test + + * ee90c779a8 mac_utils test: patch __salt__['cmd.run*'] + +* **PR** `#47641`_: (`gtmanfred`_) fix _create_stream and tornado 5.0 + @ *2018-05-18 14:25:36 UTC* + + * 43930f8bac Merge pull request `#47641`_ from gtmanfred/2018.3.1 + + * 037fd92f59 fix pylint + + * 75d42d8963 Fix last test for tornado + + * a046512287 allow using tornado 5.0 + + * 05e651f038 fix _create_stream and tornado 5.0 + +* **ISSUE** `#47532`_: (`edgan`_) roster auto-add feature in salt-ssh-2018.3.0 (refs: `#47541`_) + +* **PR** `#47541`_: (`gtmanfred`_) switch skip-roster to update-roster + @ *2018-05-18 13:29:50 UTC* + + * 9f926bcd1a Merge pull request `#47541`_ from gtmanfred/2018.3 + + * 8c5c780292 switch skip-roster to update-roster + +* **PR** `#47719`_: (`rallytime`_) Back-port `#47692`_ to 2018.3.1 + @ *2018-05-18 13:22:02 UTC* + + * **PR** `#47692`_: (`dwoz`_) Default windows to m1.small for ec2-classic (refs: `#47719`_) + + * a963f1b558 Merge pull request `#47719`_ from rallytime/bp-47692 + + * 1d9f247fb7 Default windows to m1.small for ec2-classic + +* **PR** `#47706`_: (`Ch3LL`_) Add cmd._run_all_quiet to mac_utils and __utils__ in mac_service + @ *2018-05-18 01:11:46 UTC* + + * c9108893ab Merge pull request `#47706`_ from Ch3LL/mac_service_util + + * 3611af699f remove added space + + * 9921caa143 fix pylint + + * 317e41d3c0 use cmd._run_quiet and cmd._run_all_quiet instead of importing minion_mods in __salt__ + + * a78652515a Add __salt__ to mac_utils and __utils__ in mac_service + +* **PR** `#47664`_: (`rallytime`_) Back-port `#47645`_ to 2018.3.1 + @ *2018-05-15 18:25:27 UTC* + + * **PR** `#47645`_: (`Ch3LL`_) query the pip path for test test_issue_2087_missing_pip (refs: `#47664`_) + + * fb3bf1ff3e Merge pull request `#47664`_ from rallytime/bp-47645 + + * 0a732d8e66 query the pip path for test test_issue_2087_missing_pip + +* **PR** `#47647`_: (`rallytime`_) Back-port `#47601`_ and `#47643`_ to 2018.3.1 + @ *2018-05-15 14:07:54 UTC* + + * **PR** `#47643`_: (`dwoz`_) Remove unwanted file (refs: `#47647`_) + + * **PR** `#47601`_: (`dwoz`_) Skip tests when we can not use runas (refs: `#47647`_) + + * 9039fee104 Merge pull request `#47647`_ from rallytime/bp-47601-and-47643-2018.3.1 + + * 7214fe17c8 Fix typo + + * 506dceed17 Remove unwanted file + + * b6a21dfda3 use ignore-undefined-variable + + * 2429f9fe8a Ignore pylint WindowsError + + * 2d63682fea Better doc string + + * ec2adff699 Skip tests when we can not use runas + +* **PR** `#47596`_: (`rallytime`_) Back-port `#47568`_ to 2018.3.1 + @ *2018-05-10 22:09:09 UTC* + + * **PR** `#47568`_: (`terminalmage`_) salt.serializers.yaml/yamlex: remove invalid multi_constructor (refs: `#47596`_) + + * 17b5265d95 Merge pull request `#47596`_ from rallytime/bp-47568 + + * ecf5dc8b9f Add exception logging on serialize/deserialize exceptions + + * 9659b19819 salt.serializers.yaml/yamlex: remove invalid multi_constructor + +* **PR** `#47595`_: (`rallytime`_) Back-port `#47569`_ to 2018.3.1 + @ *2018-05-10 22:08:53 UTC* + + * **PR** `#47569`_: (`Ch3LL`_) Update salt.utils.path mock in virtual core test (refs: `#47595`_) + + * c4c400f3e9 Merge pull request `#47595`_ from rallytime/bp-47569 + + * 0763f96458 update salt.utils.platform path for virt core test + + * 718252c1ef Update salt.utils.path mock in virtual core test + +* **PR** `#47599`_: (`rallytime`_) Back-port `#47570`_ to 2018.3.1 + @ *2018-05-10 22:06:44 UTC* + + * **PR** `#47570`_: (`gtmanfred`_) Update dependency to msgpack (refs: `#47599`_) + + * ec7de14be0 Merge pull request `#47599`_ from rallytime/bp-47570 + + * 9334c03da9 Update dependency to msgpack + +* **PR** `#47571`_: (`rallytime`_) [2018.3.1] Update man pages + @ *2018-05-10 16:21:57 UTC* + + * 2a10d92669 Merge pull request `#47571`_ from rallytime/man-pages + + * ade5e9f664 [2018.3.1] Update man pages + +* **PR** `#47550`_: (`pcn`_) Fixes a bad deletion I did that only surfaced in 2018.3 + @ *2018-05-09 13:36:33 UTC* + + * 85284caaf9 Merge pull request `#47550`_ from pcn/fix-disable-term-protect-in-2018.3 + + * d58a56877c Fixes a bad deletion I did that only surfaced in 2018.3 + +* **ISSUE** `#47553`_: (`douglasjreynolds`_) Unicode version error in lxc (refs: `#47554`_) + +* **PR** `#47554`_: (`douglasjreynolds`_) Converted unicode str version to a LooseVersion; matching line 2080. + @ *2018-05-09 13:34:13 UTC* + + * f9083ff77e Merge pull request `#47554`_ from douglasjreynolds/lxc_unicode_fix + + * e6bce581c6 Converted unicode str version to _LooseVersion to match line 2080. + +* **PR** `#47518`_: (`Ch3LL`_) Fix 47364: ensure we are not caching zfs.is_supported + @ *2018-05-09 13:29:07 UTC* + + * fe4e79f1de Merge pull request `#47518`_ from Ch3LL/zfs_support + + * d19fef963e remove unnecessary patch in zfs.is_supported test + + * 58c4f29f96 Fix 47364: ensure we are not caching zfs.is_supported + +* **PR** `#47159`_: (`terminalmage`_) Fix for whitelist/blacklist checking for non-list iterables + @ *2018-05-08 20:43:51 UTC* + + * 332e9f13a6 Merge pull request `#47159`_ from terminalmage/whitelist_blacklist-iter-fix + + * ca936de372 Treat empty whitelist/blacklist as no whitelist/blacklist + + * bcccaf2621 Raise a TypeError when invalid input passed to check_whitelist_blacklist + + * 2ae510ff2b Fix comment in test + + * 17398efcf7 Fix for whitelist/blacklist checking for non-list iterables + +* **PR** `#47514`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-05-08 18:36:54 UTC* + + * 21809ddc02 Merge pull request `#47514`_ from rallytime/merge-2018.3 + + * e2616b605f Update the pip tests to use the parsing syntax generated in PR `#47196`_ + + * b13b59791f Remove double instance of adding `--format=json` in pip module + + * 2ad60c7e81 Lint: remove duplicate function in helpers.py + + * 75480158b3 Lint: cur_version should just be pip_version + + * 5565d5e9b1 Update old utils paths with new utils paths + + * 786076ac03 Merge branch '2017.7' into '2018.3' + + * 611ca1fc03 Merge pull request `#47476`_ from gtmanfred/2017.7 + + * 1f91a85587 specify cache dir for pip install + + * 99e150e09c check for kitchen-vagrant gem before loading windows tests + + * 7c3f2c56da Merge pull request `#47412`_ from twangboy/fix_47125 + + * c9bab0b8e3 Merge branch '2017.7' into fix_47125 + + * 2600e404d5 Fix overly long line + + * 5c8db05769 Fix issue where the cwd was being removed + + * 4846e957c4 Merge pull request `#47467`_ from twangboy/cleanup_settings + + * 9d498293b1 Remove unused settings, update NSIS + + * da9871d36b Merge pull request `#47196`_ from twangboy/fix_47024 + + * 14ee5537b9 Add @with_tempdir helper + + * 6c3b5fa6fa Fix typo + + * f031710af2 Merge branch '2017.7' into fix_47024 + + * 7c46d9d0d4 Fix integration.modules.test_pip + + * 22ac81df63 Fix integration.modules.test_pip + + * 57d98224d4 Merge pull request #9 from terminalmage/twangboy/fix_47024 + + * 37a13d8004 Update pip unit tests to reflect changes + + * 7f86779be0 Lint fix + + * c48d8f4f61 DRY and other fixes in pip module + + * b1117896a0 Change from global variable to __context__`` + + * 3e6e524eca Fix some tests`` + + * c94f0f20e4 Fix lint error + + * fd47b21530 Fix merge conflict + + * e8c4524bae Merge pull request `#47455`_ from Ch3LL/unreleased_rn + + * b6d0cc2ab7 Add In Progress Warning for 2017.7.6 Release Notes + + * 2c7a4b6179 Merge pull request `#47459`_ from gtmanfred/2017.7 + + * d228e72477 update ubuntu-rolling to 18.04 + + * 64a64c0ed7 Merge pull request `#47462`_ from terminalmage/docs + + * 6d7803ece0 Fix docs build on Sphinx 1.7+ + + * 6cd0d31c03 Merge pull request `#47438`_ from lomeroe/double_admx_test + + * 4902f1e2ba check if a policy has either an enabled value or enabled list entry or a disabled value or disabled list entry when determining the state of the policy + + * ed69821d19 Merge pull request `#47433`_ from s0undt3ch/2017.7 + + * 5abadf25d6 Add missing requirements files not commited in `#47106`_ + +* **ISSUE** `#47443`_: (`skylerberg`_) Input validation does not raise SaltInvocationError in win_dsc.py (refs: `#47505`_) + +* **PR** `#47516`_: (`rallytime`_) Back-port `#47505`_ to 2018.3 + @ *2018-05-08 13:32:33 UTC* + + * **PR** `#47505`_: (`dwoz`_) Raise proper invocation errors (refs: `#47516`_) + + * 9559ac7679 Merge pull request `#47516`_ from rallytime/bp-47505 + + * 7c60e4071e Raise proper invocation errors + +* **ISSUE** `#47502`_: (`psagers`_) service.enable (and .disable) destroys /etc/rc.conf on FreeBSD (refs: `#47503`_) + +* **PR** `#47515`_: (`rallytime`_) Back-port `#47503`_ to 2018.3 + @ *2018-05-08 13:32:03 UTC* + + * **PR** `#47503`_: (`psagers`_) Fix `#47502`_: Remove an extraneous (accidentally introduced?) call to rstrip() (refs: `#47515`_) + + * bf79acfbc8 Merge pull request `#47515`_ from rallytime/bp-47503 + + * 821dbb88a0 Fix `#47502`_: Remove an extraneous (accidentally introduced?) call to rstrip. + +* **ISSUE** `#47511`_: (`joesusecom`_) sshconfig salt-ssh roster is missing in the documentation (refs: `#47531`_) + +* **PR** `#47531`_: (`gtmanfred`_) add ssh config doc for rosters + @ *2018-05-07 22:26:30 UTC* + + * 779b3ed056 Merge pull request `#47531`_ from gtmanfred/2018.3 + + * 92ded7162c add ssh config doc for rosters + +* **PR** `#47520`_: (`rallytime`_) Cleanup weird spaces + @ *2018-05-07 19:50:58 UTC* + + * 95b2f9db30 Merge pull request `#47520`_ from rallytime/cleanup-spaces + + * e9cb080a00 Cleanup weird spaces + +* **PR** `#47495`_: (`dwoz`_) Fix crufty nssm.exe reference + @ *2018-05-07 19:12:49 UTC* + + * 05fc52f124 Merge pull request `#47495`_ from dwoz/uninstall_wart + + * caa36c9064 Merge branch '2018.3' into uninstall_wart + +* **ISSUE** `#47322`_: (`masau`_) lxc clone not working (refs: `#47494`_) + +* **PR** `#47494`_: (`ejparker12`_) Fixed lxc.clone unhandled exception in salt/modules/lxc.py + @ *2018-05-07 19:03:58 UTC* + + * 3cc7d3ae7c Merge pull request `#47494`_ from ejparker12/fix-lxc-clone + + * e0e2c9782d Fixed lxc.clone unhandled exception in salt/modules/lxc.py + +* **ISSUE** `#47496`_: (`mateiw`_) salt-ssh --extra-filerefs doesn't include any files if no refs in state files (refs: `#47497`_) + +* **PR** `#47497`_: (`mateiw`_) Fix salt-ssh --extra-filerefs to include files even if no refs in states to apply + @ *2018-05-07 19:02:50 UTC* + + * adde83f639 Merge pull request `#47497`_ from mateiw/2018.3-fix-ssh-extra-files-refs-issue-47496 + + * d67239aae7 --extra-filerefs include files even if no refs in states to apply + +* **ISSUE** `#47404`_: (`shengis`_) Localized version of yum breaks pkg.install (refs: `#47441`_) + +* **PR** `#47441`_: (`shengis`_) Fix _run to reset LANGUAGE env variable + @ *2018-05-07 18:29:25 UTC* + + * 34b1b1ee53 Merge pull request `#47441`_ from shengis/fix-run-env-reset + + * 62fc16b721 Merge branch '2018.3' into fix-run-env-reset + + * 3b02b0bdc1 Merge branch '2018.3' into fix-run-env-reset + + * ee2ab38c8c Fix _run to reset LANGUAGE env variable + +* **ISSUE** `#47479`_: (`whytewolf`_) win_task.info on py3 throwing error, but works in py2 (refs: `#47507`_) + +* **PR** `#47507`_: (`gtmanfred`_) fix win_task for py3 + @ *2018-05-07 17:41:21 UTC* + + * 17cfd4f7cf Merge pull request `#47507`_ from gtmanfred/2018.3 + + * 19db39f402 fix win_task for py3 + +* **PR** `#47472`_: (`terminalmage`_) salt.utils.hashutils: Fix UnicodeEncodeError in several funcs + @ *2018-05-07 13:31:07 UTC* + + * a4c2df8fb2 Merge pull request `#47472`_ from terminalmage/hashutils + + * 7266c9984d salt.utils.hashutils: Fix UnicodeEncodeError in several funcs + +* **PR** `#47485`_: (`gtmanfred`_) add openstack modules to doc index.rst + @ *2018-05-07 13:11:42 UTC* + + * 8b0a370189 Merge pull request `#47485`_ from gtmanfred/2018.3 + + * c86163d79f add openstack modules to doc index.rst + + * 3557fc5fa6 Fix crufty nssm.exe reference + +* **PR** `#47482`_: (`gtmanfred`_) add all autodoc for new salt openstack modules + @ *2018-05-04 21:03:38 UTC* + + * 8df37f734a Merge pull request `#47482`_ from gtmanfred/2018.3 + + * 1f65d5cb73 add all autodoc for new salt openstack modules + +* **PR** `#47447`_: (`dwoz`_) Fix failing test due to windows console encoding + @ *2018-05-04 16:41:29 UTC* + + * d20ca15c5d Merge pull request `#47447`_ from dwoz/strv + + * 8c01773833 Use the same non decodable bytes for all tests + + * 983881a2a1 Add bytes that will not decode using cp1252 + +* **PR** `#47466`_: (`dwoz`_) bytes file that decodes the same utf-8 and cp1252 + @ *2018-05-04 15:54:24 UTC* + + * 8c5b30b541 Merge pull request `#47466`_ from dwoz/randbytes + + * fd9bc06aab bytes file that decodes the same utf-8 and cp1252 + +* **ISSUE** `#46660`_: (`mruepp`_) top file merging same does produce conflicting ids with gitfs (refs: `#46751`_, `#47354`_) + +* **PR** `#47465`_: (`rallytime`_) Back-port `#47354`_ to 2018.3 + @ *2018-05-04 13:06:04 UTC* + + * **PR** `#47354`_: (`folti`_) fix forward port of `#46751`_ (refs: `#47465`_) + + * **PR** `#46751`_: (`folti`_) top file merging strategy 'same' works again (refs: `#47354`_) + + * 3658604c43 Merge pull request `#47465`_ from rallytime/bp-47354 + + * 3df6fa7990 fix forward port of `#46751`_ + +* **PR** `#47435`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-05-04 13:05:32 UTC* + + * fa293f8fac Merge pull request `#47435`_ from rallytime/merge-2018.3 + + * be0731da5f Add skipIfs back in for rest_tornado tests + + * fd98ee3dc1 Lint: Add missing blank line + + * 561718b20b Update old is_windows utils path to new utils path + + * a94cdf8a0d Merge branch '2017.7' into '2018.3' + + * 7ae3497b0c Merge pull request `#47429`_ from gtmanfred/2017.7 + + * 8ae32033cc server_list_min should use state, not status + + * 2f5fc4ecc5 Merge pull request `#47399`_ from isbm/isbm-zeromq17-deprecationwarning-2017.7.2-v2 + + * a36e49fd27 fix pylint + + * 98b5629b36 Fix imports + + * d94c0f0152 Remove unnecessary variable + + * 8e377b5653 Lintfix: E0203 and attribute access + + * 2aab70b1b8 Install ZMQ handler if <15 version + + * 296c589f4b Use ZMQ switch utility in the integration tests + + * ab5fa34d7c Use ZMQ_VERSION_INFO constant everywhere + + * 43b5558b82 Add trace logging on ZMQ sockets communication + + * 164204a9fe Remove duplicate code for ZMQ monitor handling + + * 834b1e4ff0 Remove obsolete ZMQIOLoop direct instance + + * 1c90cbdb3c Remove an empty line + + * ef2e0acd66 Add logging on ZMQ socket exception + + * 38ceed371d Lintfix: ident + + * 1ece6a5f52 Lintfix: line too long + + * 4e650c0b44 Remove code duplicate by reusing utilities functions + + * 57da54b676 Fix imports + + * 948368e9a1 Add libzmq version info builder + + * 0b4a17b859 Update log exception message + + * 116e1809fc Put a message alongside the exception to the logs + + * 4bc43124b7 Remove unnecessary ZMQ import and check for its presence + + * 05f4d40269 Use utility for ZMQ import handling in SSH client + + * 457ef7d9a5 Use utility for ZMQ import handling in flo/zero + + * 08dee6f5bd Use utility for ZMQ import handling + + * e2a353cfb0 Remove unnecessary ZMQ extra-check for cache utils + + * c8f2cc271d Remove unnecessary ZMQ extra-check for master utils + + * 3940667bb9 Remove old ZMQ import handling + + * f34a53e029 Use ZMQ utility for version check + + * cbb26dcb28 Use ZMQ installer for master + + * 453e83210a Add ZMQ version build + + * af9601e21d Use ZMQ importer utility in async + + * d50b2b2023 Incorporate tornado-5 fixes + + * 1fd9af0655 Add ZMQ backward-compatibility tornado installer for older versions + + * ad4b40415c Add one place for handling various ZMQ versions and IOLoop classes + + * b14e974b5f Merge pull request `#47343`_ from Ch3LL/win_srv_test + + * 2173b6f549 ensure we are enabling/disabling before test + + * d58be06751 Add additionatl service module integration tests and enable for windows + + * b0f3fb577f Merge pull request `#47375`_ from terminalmage/issue47310 + + * fa2bea52bb Remove extra blank line to appease linter + + * f8ab2be81c Add debug logging if we fail to detect virtual packages + + * 67c4fc56ac Warn on use of virtual packages in pkg.installed state + + * 56235032f4 Merge pull request `#47415`_ from kstreee/fix-local-client-tgt-bug + + * b8d37e0a1e To add a test case for the syndic environment, copies the test case which was written by @mattp- that was already merged into develop branch, related pr is `#46692`_. + + * 4627bad1fd Realizes 'tgt' field into actual minions using ckminions to subscribe results of the minions before publishing a payload. + + * d65ceaee03 Merge pull request `#47286`_ from baniobloom/vpc_peering_connection_name_fix + + * a968965087 Merge branch '2017.7' into vpc_peering_connection_name_fix + + * 8a5d4437bb Merge pull request `#47270`_ from meaksh/2017.7-fix-retcode-on-schedule-utils + + * d299cf3385 Merge branch '2017.7' into 2017.7-fix-retcode-on-schedule-utils + + * b6da600fff Initialize __context__ retcode for functions handled via schedule util module + + * 5b51075384 Merge pull request `#47371`_ from rallytime/fix-47264 + + * a43485b49c Fix "of pass" typo in grains.delval docs: change to "or pass" + + * a86e53be66 Merge pull request `#47389`_ from dwoz/moregittestfix + + * 67745c1362 Older GitPython versions will not have close + + * a5367eaf63 Merge pull request `#47388`_ from dwoz/test_pip_fix + + * eb26321e8b Fix missing import + + * 9b59b991c2 Merge pull request `#47380`_ from gtmanfred/2017.7 + + * 93d1445ec1 add io_loop handling to runtests engine + + * 37822c0cbb Merge pull request `#47384`_ from dwoz/test_pip_fix + + * a37a9da1fb Fix py2 version of pip test + + * eefd96732e Merge pull request `#47382`_ from dwoz/gitfs_tests + + * 1570708fac Close the repo and fix multiple tests + + * 57c75ff660 Merge pull request `#47369`_ from terminalmage/ldap_pillar + + * 085883ae2d Return an empty dict if no search_order in ldap ext_pillar config file + + * bcc66dd9bf Merge pull request `#47363`_ from DSRCorporation/bugs/replace_exc_info_with_exception + + * 3f7b93a23c Tornado5.0: Future.exc_info is dropped + + * bcef34f7e1 Merge pull request `#47334`_ from terminalmage/ldap_pillar + + * 0175a8687c pillar_ldap: Fix cryptic errors when config file fails to load + + * 65c3ba7ff1 Remove useless documentation + + * 5d67cb27de Remove unncessary commented line + + * 8de3d41adb fixed vpc_peering_connection_name option + +* **PR** `#47464`_: (`dwoz`_) Skip tests not applicable to windows + @ *2018-05-04 13:04:38 UTC* + + * 51d21afd4f Merge pull request `#47464`_ from dwoz/skiP_syslog_tests + + * ca9393b7fb Skip tests not applicable to windows + +* **PR** `#47456`_: (`dwoz`_) Sysname returns text type + @ *2018-05-04 02:57:50 UTC* + + * 3219430dcc Merge pull request `#47456`_ from dwoz/sysname + + * 559ee1961f Sysname returns text type + +* **PR** `#47458`_: (`Ch3LL`_) Add In Progress Warning for 2018.3.1 Release Notes + @ *2018-05-03 20:40:46 UTC* + + * f3918514a7 Merge pull request `#47458`_ from Ch3LL/unreleased_rn_2018 + + * 6a261e5e3a Add In Progress Warning for 2018.3.1 Release Notes + +* **PR** `#47448`_: (`dwoz`_) Fix missing import in test suite + @ *2018-05-03 14:30:23 UTC* + + * 9fbdcbe994 Merge pull request `#47448`_ from dwoz/transport_import + + * 7e04eb82e1 Fix missing import in test suite + +* **ISSUE** `#47260`_: (`mew1033`_) disable_saltenv_mapping not working as expected (refs: `#47410`_) + +* **PR** `#47410`_: (`terminalmage`_) gitfs: Fix identification of base env when saltenv mapping is disabled + @ *2018-05-03 14:12:27 UTC* + + * 157a32af7f Merge pull request `#47410`_ from terminalmage/issue47260 + + * 3ab332ad0e Update tests to reflect bugfix + + * 7b8127f336 gitfs: Fix identification of base env when saltenv mapping is disabled + +* **PR** `#47413`_: (`dmurphy18`_) Repobuild improvements for Ubuntu 18.04 lack of gpg2 and better error checking + @ *2018-05-02 16:21:31 UTC* + + * 091e4cf9a6 Merge pull request `#47413`_ from saltstack/repobuild_improv + + * c064032110 Removed extra spaces for pylint + + * 20c50b3331 Minor cleanup due to review comments + + * c143b359e9 Update for Ubuntu 18.04 lack of gpg2 and enhanced error checking + +* **PR** `#47216`_: (`twangboy`_) Reg docs + @ *2018-05-02 13:33:27 UTC* + + * 5e5774fd37 Merge pull request `#47216`_ from twangboy/reg_docs + + * 0beeb58b16 Fix lint, add bytes + + * bad441f8dc Fix some lint` + + * af5139c2ff Add additional examples + + * 24df6ec1b7 Additional docs formatting + + * ff46b27a60 Update reg docs, fix formatting issues + +* **PR** `#47417`_: (`gtmanfred`_) revert instantiating a Caller Client in the engine + @ *2018-05-01 18:58:06 UTC* + + * 63baf4c4f8 Merge pull request `#47417`_ from gtmanfred/slack + + * 5c8ea7f506 Update slack.py + + * ee8a5eeb10 revert instantiating a Caller Client in the engine + +* **ISSUE** `#45790`_: (`bdarnell`_) Test with Tornado 5.0b1 (refs: `#46066`_, `#47106`_, `#47433`_) + +* **PR** `#47368`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-05-01 18:56:20 UTC* + + * **PR** `#47106`_: (`DmitryKuzmenko`_) Tornado50 compatibility fixes (refs: `#47368`_, `#47374`_, `#47433`_) + + * **PR** `#46002`_: (`isbm`_) Pyzmq 17.0.0 proper handling (refs: `#47368`_, `#47374`_) + + * 0bdfaa5ffe Merge pull request `#47368`_ from rallytime/merge-2018.3 + + * 46806e595b Update test assertion comment for pip pkgs + + * d9d24de49e Lint: Add missing import + + * c7b73d132e Merge branch '2017.7' into '2018.3' + + * 31db8ca7ad Merge pull request `#47347`_ from dwoz/test_mysql_fix_again + + * add78fb618 Fix linter warnings + + * 2644cc7553 Fix linter nits + + * 799c601184 Proper fix for mysql tests + + * fefc0cc3ca Update old utils paths to use new utils paths + + * 13e8124031 Merge branch '2017.7' into '2018.3' + + * e573236848 Merge pull request `#47359`_ from gtmanfred/2017.7 + + * 6214ed8133 add mention of the formulas channel to the formulas docs + + * 629503b2a8 Merge pull request `#47317`_ from dwoz/threadshutdown + + * 6db2a0e4d3 Log exceptions at exception level + + * d4ae787595 Do not join a thread that is stopped + + * aacd5cefe3 Merge pull request `#47304`_ from cachedout/test_cli_timeout_arg + + * 85025af83c Pass timeout to salt CLI for tests + + * 55534fb659 Merge pull request `#47311`_ from Ch3LL/firewall_windows + + * 4e16c18c16 Add firewall module windows tests to whitelist + + * 4b2fc4ec66 Add windows firewall execution modules integration tests + + * 1667375a80 Merge pull request `#47348`_ from dwoz/no_symlinks + + * 94a70e847a Ignore gitfs tests when symlinks not enabled + + * dac04261b5 Merge pull request `#47342`_ from dwoz/test_mysql_fix + + * 7496f4c5a8 Fix mysql test cases + + * 34e78ef564 Merge pull request `#47341`_ from dwoz/inet_pton_fix + + * 85451f48d4 Fix python 3 support for inet_pton function + + * e4779f3246 Merge pull request `#47339`_ from dwoz/ssh_key_test_fix + + * e37a93a1ca Remove redundent close call + + * b2ae5889b7 Close the temporary file handle + + * 9f7f83a975 Use salt.utils.fopen for line ending consistancy + + * b221860151 Merge pull request `#47335`_ from dwoz/pip_test_fix + + * dcb6a22c00 Remove un-needed string-escape + + * 1c527bfd3a Merge pull request `#47331`_ from dwoz/py3_wingroup_fix + + * cc154ef857 Do not encode usernames + + * 708078b152 Merge pull request `#47329`_ from cachedout/frank_credit + + * 33c0644ac4 Credit Frank Spierings + + * a545e55543 Merge pull request `#47281`_ from Ch3LL/system_test + + * c9181a75a6 Add destructivetest decorator on tests + + * 0d0c8987fc Add win_system integration module tests + + * b64d930df0 Merge pull request `#47283`_ from Ch3LL/ntp_test + + * ced7f86546 Add windows ntp integration module tests + + * 910aff910f Merge pull request `#47314`_ from Ch3LL/net_mac_test + + * 67beb1451c Skip netstat test on macosx as its not supported + + * 0549ef7c16 Merge pull request `#47307`_ from rallytime/bp-47257 + + * 6c5b2f92bc Role is not a list but a dictionary + + * d6ff4689f6 Merge pull request `#47312`_ from rallytime/update-bootstrap-release + + * 765cce06a2 Update bootstrap script to latest release: 2018.04.25 + + * e0765f5719 Merge pull request `#47279`_ from dwoz/py3_build_fix + + * 21dc1bab91 Pep-8 line endings + + * 717abedaf7 Fix comman wart + + * 4100dcd64c Close might get called more than once + + * dbe671f943 Stop socket before queue on delete + + * 9587f5c69e Silence pylint import-error for six.moves + + * 4b0c7d3b34 Fix typo + + * 05adf7c2b1 Use six.moves for queue import + + * fe340778fa Gracefully shutdown worker threads + + * 44f19b2f94 Merge pull request `#47113`_ from jfindlay/iptables_state + + * 8bd08012ee modules,states.iptables support proto for policy ext + + * b7a6206330 Merge pull request `#47302`_ from Ch3LL/dead_code + + * daa68b4877 Add virtual grains test for core grains + + * a59dd2785d Remove dead code in core grains file for virt-what + + * e29362acfc Merge pull request `#47303`_ from baniobloom/bug_fix_doc + + * b97c9df5f3 added clarity on how to figure out what is the oldest supported main release branch + + * 0d9d55e013 Merge pull request `#47106`_ from DSRCorporation/bugs/tornado50 + + * 39e403b18d Merge branch '2017.7' into bugs/tornado50 + + * 6706b3a2d1 Run off of a temporary config + + * d6873800d5 Allow running pytest>=3.5.0 + + * 2da3983740 Tornado 5.0 compatibility fixes + + * 2e014f4746 Merge pull request `#47271`_ from gtmanfred/amazon + + * 8a53908908 Do not load rh_service module when booted with systemd + + * e4d1d5bf11 Revert "support amazon linux 2 for service module" + + * 599b0ed1e9 Merge pull request `#47246`_ from cloudflare/fix-44847-2017.7 + + * ad80028104 This way, we can pass flags such as ``debug`` into the state, but also ``test``. + + * 4e2e1f0719 Merge pull request `#47220`_ from benediktwerner/fix-pip-2017.7 + + * 0197c3e973 Fix pip test + + * 34bf66c09f Fix pip.installed with pip>=10.0.0 + + * 92e606251f Merge pull request `#47272`_ from rallytime/reg-windows-codeowners + + * 9445af0185 Add windows tests and reg module/state to CODEOWNERS file for team-windows + + * 9dca5c0221 Merge pull request `#47252`_ from rallytime/codeowners-fixes + + * 204b6af92b Fix the matching patterns in the CODEOWNERS file to use fnmatch patterns + + * 3de1bb49c8 Merge pull request `#47177`_ from fpicot/fix_47173_pkg_normalize + + * 149f846f34 fix normalize parameter in pkg.installed + + * 10e30515dc Merge pull request `#47251`_ from Ch3LL/pub_fix_rn + + * fa4c2e6575 Update Docs to remove unnecessary + sign + + * bb7850a431 Merge pull request `#47249`_ from Ch3LL/pub_fix_rn + + * 24dea24b7e Add CVE number to 2016.3.6 Release + + * 56933eb0b2 Merge pull request `#47227`_ from pruiz/pruiz/zfs-dataset-present-slow-2017.7 + + * fded61f19b Fix issue `#47225`_: avoid zfs.filesystem_present slowdown when dataset has lots of snapshots + + * 9825065048 Merge pull request `#47167`_ from smitty42/vbox-skd-fix + + * 5de53139cd Merge branch '2017.7' into vbox-skd-fix + + * 976f031170 Merge pull request `#47213`_ from dwoz/py3win + + * ad9c7f63f0 Fix coverate on py3 windows builds + + * 91252bac95 Adding updates for python3 compatibility and new virtualbox SDK version support. + + * cebcd6d069 Merge pull request `#47197`_ from dwoz/testfix + + * 25803c9176 Move process target to top level module namespace + + * d4269c2b70 Merge pull request `#47193`_ from Ch3LL/network_test + + * bbf9987c19 Add network module integration tests + + * c777248a78 Merge pull request `#47189`_ from Ch3LL/autoruns + + * 6a88bedb7a Add autoruns to windows whitelist + + * e9e4d4af70 Add autoruns.list integration test for Windows + +* **PR** `#47403`_: (`rallytime`_) Back-port `#47356`_ to 2018.3 + @ *2018-05-01 15:19:06 UTC* + + * **PR** `#47356`_: (`robinro`_) Fix sysctl translate (refs: `#47403`_) + + * 4e6870305c Merge pull request `#47403`_ from rallytime/bp-47356 + + * 9b682bc48e Fix sysctl translate + +* **PR** `#47407`_: (`terminalmage`_) Reduce severity of missing X_update_interval key + @ *2018-05-01 15:18:46 UTC* + + * 7e0cdd6145 Merge pull request `#47407`_ from terminalmage/update-interval-log + + * abc592bfff Reduce severity of missing X_update_interval key + +* **ISSUE** `#47042`_: (`valentin2105`_) [ERROR] Unable to manage file: 'utf8' codec can't decode byte (refs: `#47061`_) + +* **PR** `#47405`_: (`terminalmage`_) Fix file.get_diff regression in 2018.3 branch + @ *2018-05-01 15:16:46 UTC* + + * **PR** `#47061`_: (`terminalmage`_) Fix diffing binary files in file.get_diff (refs: `#47405`_) + + * 1377942bcc Merge pull request `#47405`_ from terminalmage/binary-diff + + * 89ddb08026 Use a lambda instead of defining a one-line function + + * b79ff04fda Remove no-longer-used enumerate + + * e03b865359 Add unit test for file.get_diff + + * 5bdc9e9bd5 Fix UnboundLocalError in file.get_diff + +* **ISSUE** `#47325`_: (`robertodocampo`_) docker_container.running creates containers using the image ID as the image name (refs: `#47367`_) + +* **PR** `#47367`_: (`terminalmage`_) Start docker containers with image name instead of ID + @ *2018-04-30 18:46:13 UTC* + + * c267e6083e Merge pull request `#47367`_ from terminalmage/issue47325 + + * 798134caa3 Add regression test for creating images with image name insead of ID + + * 4ed47e839c Start docker containers with image name instead of ID + +* **ISSUE** `#47006`_: (`cedwards`_) marathon & fx2 grain modules cause master and minion failure (refs: `#47401`_) + +* **PR** `#47401`_: (`gtmanfred`_) fix proxy virtual checks for marathon and fx2 + @ *2018-04-30 18:44:46 UTC* + + * 3bb00cbb55 Merge pull request `#47401`_ from gtmanfred/proxy + + * 99f9231759 fix proxy virtual checks for marathon and fx2 + +* **PR** `#47397`_: (`rallytime`_) Add 2018.3.1 Release Notes + @ *2018-04-30 14:44:38 UTC* + + * c160fe36ce Merge pull request `#47397`_ from rallytime/2018.3.1-release-notes + + * 3b40cdad2a Add 2018.3.1 Release Notes + +* **ISSUE** `#45790`_: (`bdarnell`_) Test with Tornado 5.0b1 (refs: `#46066`_, `#47106`_, `#47433`_) + +* **PR** `#47374`_: (`DmitryKuzmenko`_) tornado50 merge forward for 2018.3 + @ *2018-04-29 16:29:12 UTC* + + * **PR** `#47106`_: (`DmitryKuzmenko`_) Tornado50 compatibility fixes (refs: `#47368`_, `#47374`_, `#47433`_) + + * **PR** `#46002`_: (`isbm`_) Pyzmq 17.0.0 proper handling (refs: `#47368`_, `#47374`_) + + * 3400f829c4 Merge pull request `#47374`_ from DSRCorporation/bugs/tornado50-2018.3 + + * 400999c54f fix pylint + + * 47b6d409d1 add io_loop handling to runtests engine + + * fd074fdb7d use salt.utils.zeromq + + * 4ae33c5d9a Run off of a temporary config + + * 7938b4906e Allow running pytest>=3.5.0 + + * 34058c181e Tornado 5.0 compatibility fixes + +* **ISSUE** `#47124`_: (`mchugh19`_) Vault module problem in 2018.3.0 (refs: `#47379`_) + +* **PR** `#47379`_: (`dwoz`_) Properly encode messages when creating/validating signatures with m2crypto + @ *2018-04-28 08:38:23 UTC* + + * 2afe4bee95 Merge pull request `#47379`_ from dwoz/m2crypto_regression + + * 068f2d430d Always sign and verify bytes + + * 7810ebaba9 Add sign regression tests + + * f4441c3a1c Adding regression test for 47124 + +* **PR** `#47277`_: (`morganwillcock`_) Fix minion crash on NetBSD + @ *2018-04-27 15:02:21 UTC* + + * 7390b72808 Merge pull request `#47277`_ from morganwillcock/netbsdswap + + * 0bcb1a079a Merge branch '2018.3' into netbsdswap + + * 30478e8c9c Use swapctl for NetBSD + +* **PR** `#47320`_: (`twangboy`_) Change from NSSM to SSM + @ *2018-04-27 14:37:50 UTC* + + * 2b7c7ef704 Merge pull request `#47320`_ from twangboy/win_ssm + + * 5549d83aae Use ssm instead of nssm + +* **PR** `#47308`_: (`rallytime`_) Back-port `#47287`_ to 2018.3 + @ *2018-04-27 13:50:49 UTC* + + * **PR** `#47287`_: (`esell`_) convert unicode ssh pass to str for azure (refs: `#47308`_) + + * b6df5facce Merge pull request `#47308`_ from rallytime/bp-47287 + + * 5f392a23fe convert unicode ssh pass to str for azure + +* **ISSUE** `#47324`_: (`rlschilperoort`_) archive.extracted keep and/or keep_source not working (refs: `#47332`_) + +* **PR** `#47332`_: (`garethgreenaway`_) [2018.3] Removing duplicate code from state/archive.py + @ *2018-04-27 13:12:51 UTC* + + * efa3aab800 Merge pull request `#47332`_ from garethgreenaway/47324_archive_extracted_keep_keep_source + + * cc10bfec6b Removing redundant code which is prevening keep & keep_source from being set. + +* **PR** `#47326`_: (`The-Loeki`_) Some Redis fixes + @ *2018-04-26 17:12:47 UTC* + + * 245d62ca16 Merge pull request `#47326`_ from The-Loeki/redis-cache-sockets + + * d86fbe5bdd redis_return: add unix_socket_path to docs + + * ee9f533765 redis_cache: document UNIX socket access + + * 5337558a5a redis_return: Let redis handle pool creation, add UNIX socket support + + * c90f83b0f9 redis_return: cluster_mode default to False in __virtual__ to prevent KeyError stacktraces + + * 71e3286829 redis_return: Fix code blocks in docs + + * e6605f1c78 redis_cache fix code blox in docs + + * 40e67747ee redis_cache: add socket to options + +* **PR** `#47319`_: (`dwoz`_) Skip unix group tests on windows. + @ *2018-04-26 15:59:35 UTC* + + * 27a438f0ff Merge pull request `#47319`_ from dwoz/skip_tests + + * d9442d043e Skip tests not applicable to windows + +* **PR** `#47293`_: (`dwoz`_) The grp module is not available on windows + @ *2018-04-25 20:22:34 UTC* + + * 057f668788 Merge pull request `#47293`_ from dwoz/win_build_fix + + * 0386216005 Fix sneaky indention + + * 082b8d0b3d Use salt.utils.platform + + * cc2538e08f The grp modules is not available on windows + +* **ISSUE** `#46862`_: (`kivoli`_) Setting locale.system fails in 2018.3 (refs: `#46869`_, `#47280`_) + +* **PR** `#47280`_: (`gtmanfred`_) make sure not to send invalid information + @ *2018-04-25 17:46:45 UTC* + + * fff4f8c1a5 Merge pull request `#47280`_ from gtmanfred/localectl + + * 7c212cbb2d fix pylint + + * 6754787e8e update localemod tests + + * 9075070573 make sure not to send invalid information + +* **ISSUE** `#46977`_: (`gtmanfred`_) [2018.3.0] Backwards compatibilty breaking change in 2018.3.0 (refs: `#47038`_) + +* **PR** `#47038`_: (`garethgreenaway`_) [2018.3] fix to fileclient.py + @ *2018-04-25 14:57:04 UTC* + + * 205701dcbe Merge pull request `#47038`_ from garethgreenaway/46977_fixing_fileclient_forward_compatibilty + + * ba01d2133a Updating version.py to include Magnesium. + + * 10c823dd79 The _ext_nodes master function has been renamed to _master_tops. To ensure compatibility when using older Salt masters we continue to pass the function as _ext_nodes until the Magnesium release. + +* **ISSUE** `#47059`_: (`OrlandoArcapix`_) Some states incorrectly return None instead of an empty dict when there are no changes (refs: `#47060`_) + +* **ISSUE** `#46985`_: (`OrlandoArcapix`_) grafana4_user.present and grafana4_org.present states not working in 2018.3.0 (refs: `#47048`_) + +* **PR** `#47060`_: (`OrlandoArcapix`_) Return an empty dict for 'changes' instead of 'None' + @ *2018-04-25 14:55:24 UTC* + + * **PR** `#47048`_: (`OrlandoArcapix`_) Issue46985 fix grafana4 state (refs: `#47060`_) + + * 89daf4fdc7 Merge pull request `#47060`_ from OrlandoArcapix/Issue47059-return_dict_from_state + + * 5378e4fd07 Update grafana_datasource test to check for empty dict being returned on no changes, rather than None + + * f115452653 Return an empty dict for 'changes' instead of 'None' + +* **ISSUE** `#47089`_: (`syphernl`_) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 404: ordinal not in range(128) (refs: `#47153`_) + +* **PR** `#47153`_: (`terminalmage`_) salt.modules.ssh: properly encode/decode I/O + @ *2018-04-25 14:53:51 UTC* + + * 10cc0d312b Merge pull request `#47153`_ from terminalmage/issue47089 + + * bdb52797f8 salt.modules.ssh: properly encode/decode I/O + +* **ISSUE** `#47199`_: (`tkaehn`_) Targeting by list (-L) broken for minions behind syndic? (refs: `#47275`_) + +* **PR** `#47275`_: (`terminalmage`_) Fix false failure events sent when using syndic + @ *2018-04-25 13:56:47 UTC* + + * b5d64f1a70 Merge pull request `#47275`_ from terminalmage/issue47199 + + * 8012ad12f8 Fix false failure events sent when using syndic + +* **ISSUE** `#47267`_: (`skjaro`_) Problem with beacon diskusage on windows platform in 2018.3 (refs: `#47284`_) + +* **PR** `#47284`_: (`skjaro`_) Fix beacon diskusage documentation for the new beahavior mentioned in issue `#47267`_ + @ *2018-04-25 13:52:30 UTC* + + * 6215a995d8 Merge pull request `#47284`_ from skjaro/beacon_diskusage_doc_fix + + * fcc042aa5f Fix beacon documentation for the new beahavior mentioned in issue `#47267`_ + +* **PR** `#47291`_: (`bosatsu`_) Fix proxy minion beacon doc + @ *2018-04-25 13:42:36 UTC* + + * 3ef4fe6ed2 Merge pull request `#47291`_ from bosatsu/fix-proxy-minion-beacon-doc + + * 01980b4c43 Fix topics/releases/2018.3.0.rst to include correct example of proxy_example beacon yaml configuration. + + * 9682e26eec Fix topics/proxyminion/beacon.rst to include correct example of salt_proxy beacon yaml configuration. + +* **ISSUE** `#47239`_: (`bosatsu`_) Unable to load salt_proxy beacon on minion in 2018.3.0 (refs: `#47255`_) + +* **PR** `#47255`_: (`garethgreenaway`_) [2018.3] Fixes to salt_proxy beacon and beacon tests + @ *2018-04-25 13:41:51 UTC* + + * ea2d68b865 Merge pull request `#47255`_ from garethgreenaway/47239_fixes_to_salt_proxy_beacon + + * a2a8d78cb0 Fixing status beacon tests. + + * c87d6cae23 Ensure the salt_proxy is returning the correct tuple when the configuration is valid. Update various beacon unit tests to ensure they are testing the results of the validate function for a True result. + +* **PR** `#47292`_: (`dwoz`_) Fix decorator wart + @ *2018-04-25 04:25:23 UTC* + + * **PR** `#47290`_: (`dwoz`_) Run cache_master test in tmp dir (refs: `#47292`_) + + * 19f9e8258f Merge pull request `#47292`_ from dwoz/cp_fix_again + + * 7d045eb235 Fix decorator wart + +* **PR** `#47285`_: (`dwoz`_) Fix reg grains test + @ *2018-04-25 00:16:56 UTC* + + * da532aa1ac Merge pull request `#47285`_ from dwoz/core_test_fix + + * 884f4c1829 Fix extra space + + * 8a9027c0c9 Fix reg grains test + +* **PR** `#47290`_: (`dwoz`_) Run cache_master test in tmp dir (refs: `#47292`_) + @ *2018-04-24 23:37:21 UTC* + + * f591cff643 Merge pull request `#47290`_ from dwoz/test_cp_fix + + * 5ff51affbd Run cache_master test in tmp dir + +* **ISSUE** `#47092`_: (`syphernl`_) [2018.3.0] pkg.installed breaks with virtual packages (refs: `#47250`_) + +* **ISSUE** `#38838`_: (`Zorlin`_) Failing to remove nginx (refs: `#44455`_) + +* **PR** `#47250`_: (`terminalmage`_) Fix virtual package detection + @ *2018-04-24 19:22:24 UTC* + + * **PR** `#44455`_: (`samodid`_) Fix for `#38838`_ (refs: `#47250`_) + + * 6d323aa8f0 Merge pull request `#47250`_ from terminalmage/issue47092 + + * b8630a70be Fix virtual package detection + +* **ISSUE** `#47225`_: (`pruiz`_) zfs.filesystem_present takes forever on a dataset with lots (10k+) of snapshots (refs: `#47226`_, `#47227`_, `#47228`_) + +* **PR** `#47228`_: (`pruiz`_) Fix issue `#47225`_: avoid zfs.filesystem_present slowdown when dataset has lots of snapshots (2018.3 branch) + @ *2018-04-24 13:35:21 UTC* + + * **PR** `#47226`_: (`pruiz`_) Fix issue `#47225`_: avoid zfs.filesystem_present slowdown when dataset has lots of snapshots (refs: `#47227`_, `#47228`_) + + * 428e915d6a Merge pull request `#47228`_ from pruiz/pruiz/zfs-dataset-present-slow-2018.3 + + * cfbf136ab2 Fix issue `#47225`_: avoid zfs.filesystem_present slowdown when dataset has lots of snapshots + +* **ISSUE** `#46943`_: (`Auha`_) Slack.Engine could not start (refs: `#47109`_, `#47262`_) + +* **PR** `#47262`_: (`garethgreenaway`_) [2018.3] Fixes to targeting in Slack engine + @ *2018-04-24 13:18:36 UTC* + + * 0b836106b9 Merge pull request `#47262`_ from garethgreenaway/slack_engine_target_fix + + * bcdef641e8 Removing target and tgt_type from the cmdline that is passed along to Salt, the target is used else where and including it in the cmdline causes problem when it is passed along. Adding an additional test to ensure we are getting the right targt. + +* **ISSUE** `#47047`_: (`Giandom`_) Pillars aren't evaluated when alias is passed in Slack Engine (refs: `#47142`_) + +* **PR** `#47142`_: (`garethgreenaway`_) [2018.3] pillar and output formatting fixes to Slack engine + @ *2018-04-23 19:55:07 UTC* + + * 2ed4b38b02 Merge pull request `#47142`_ from garethgreenaway/47047_passing_pillar_to_slack_aliases + + * 6f183e1d80 Initial commmit for unit/engines/test_slack_engine + + * a2840fc230 Only include the rest of the cmdline if the cmd is an alias. + + * e846df7409 Fixing a bug when passing pillar values to aliases for the Slack engine. Cleaned up the formatting of the results, color codes don't translate well into Slack output. For any state runs, eg. highstate. apply, sls, we run the output through the highstate formater. For anything else run it though the yaml outputer. Running it though highstate causes errors when the output does match what the highstate output is expecting. + +* **PR** `#47245`_: (`terminalmage`_) Ensure we pass hexid as bytes when zmq_filtering enabled + @ *2018-04-23 16:54:57 UTC* + + * 42a0e655dc Merge pull request `#47245`_ from terminalmage/zeromq-bytes + + * a7accc0548 Ensure we pass hexid as bytes when zmq_filtering enabled + +* **PR** `#47242`_: (`aesposito91`_) PY3 fix for zeromq setsockopt + @ *2018-04-23 16:38:09 UTC* + + * 73525d1460 Merge pull request `#47242`_ from aesposito91/2018.3 + + * b225351e6d Update napalm_syslog.py + +* **ISSUE** `#47117`_: (`prashanthtuttu`_) Napalm / Capirca Issue (refs: `#47241`_) + +* **PR** `#47241`_: (`mirceaulinic`_) Fix the imports into the netacl execution and state modules + @ *2018-04-23 14:56:32 UTC* + + * b78295aee9 Merge pull request `#47241`_ from cloudflare/fix-47117 + + * 26c5583264 `#47117`_: fix the napalm imports in the netacl state module + + * 48396467c1 `#47117`_: fix the napalm imports in the netacl execution module + +* **PR** `#47219`_: (`garethgreenaway`_) [2018.3] Fixing a backward compatibility issue with vault module & runner + @ *2018-04-23 14:10:19 UTC* + + * 88557ea991 Merge pull request `#47219`_ from garethgreenaway/vault_backward_compatibility + + * 1758081ffe When using the vault module on a 2018.3 minion against a 2017.7 master, the 2018.3 minion is expecting a verify element in the results from the Salt runner on the master. The runner in 2017.7 did not include a verify element, which results in an error. This change accounts for this by using the default in 2018.3 which is not to verify if not configured. + +* **PR** `#47186`_: (`dmurphy18`_) backport of issue 46933, updated ZFS handling to Salt 2018.3.x + @ *2018-04-23 14:07:06 UTC* + + * 370feadbd2 Merge pull request `#47186`_ from dmurphy18/zfs_backport_46933 + + * 283359d315 Corrected typo in comma-seprated and 2018.3.0 -> 2018.3.1 + + * b7f8d5a22f Replace use of Fluorine with 2018.3.0 for comma-separated warnings + + * 3f30ab2ed6 ZFS backport of 46933 to 2018.3.1 + +* **PR** `#47217`_: (`twangboy`_) Remove installation of pywin32 from setup.py + @ *2018-04-23 13:32:54 UTC* + + * bf3a67d11b Merge pull request `#47217`_ from twangboy/fix_setup + + * eb3d45bb08 Remove installation of pywin32 from setup.py + +* **PR** `#47195`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-20 19:25:30 UTC* + + * 8e21703f13 Merge pull request `#47195`_ from rallytime/merge-2018.3 + + * f90fd8c663 Test fix: file strings must be unicode in master config + + * bee4948df1 Lint: use full path for event utils function + + * 120c5446b7 Update old utils paths to new utils paths + + * 4718d31e53 Merge branch '2017.7' into '2018.3' + + * 65f344e371 Merge pull request `#47184`_ from Ch3LL/status_test + + * 25a84428b8 Add status module integration modules tests for Windows + + * 965600ad6c Merge pull request `#47163`_ from rallytime/jenkins-autodoc + + * 0039395017 Updage jenkins module autodocs to use jenkinsmod name instead + + * 0a43dde5fc Merge pull request `#47185`_ from twangboy/add_tests + + * 345daa0423 Add additional integration tests to whitelist + + * 1a600bb9a4 Merge pull request `#47172`_ from dwoz/cover_without_admin + + * cadd759727 Use warnings to warn user + + * 144c68e214 Allow non admin name based runs on windows + + * d5997d2301 Merge pull request `#47110`_ from kstreee/fix-misusing-of-timeout + + * 0624aee0ed Fixes misusing of the timeout option. + + * 87ca2b4003 Merge pull request `#40961`_ from terminalmage/issue40948 + + * 6ba66cca41 Fix incorrect logic in exception check + + * fed5041c5f Make error more specific to aid in troubleshooting + + * 8c67ab53b4 Fix path in log message + + * 3198ca8b19 Make error more explicit when PKI dir not present for salt-call + + * f5e63584d4 Merge pull request `#47134`_ from Ch3LL/user_win_test + + * e7c9bc4038 Add user integration tests for windows OS + + * da2f6a3fac Merge pull request `#47131`_ from gtmanfred/cli + + * 1b1c29bf62 add __cli for master processes + + * 9b8e6ffb8c Merge pull request `#47129`_ from rallytime/bp-47121 + + * 11da526b21 add ImportError + + * bd0c23396c fix pip.req import error in pip 10.0.0 + + * eb5ac51a48 Merge pull request `#47102`_ from gtmanfred/2017.7 + + * 3dc93b310b fix tests + + * 8497e08f8e fix pip module for 10.0.0 + + * 4c07a3d1e9 fix other tests + + * b71e3d8a04 dont allow using no_use_wheel for pip 10.0.0 or newer + + * c1dc42e67e Merge pull request `#47037`_ from twangboy/fix_dev_scripts + + * 990a24d7ed Fix build_env scripts + +* **ISSUE** `#46906`_: (`whytewolf`_) Windows failure with PR 46541 (refs: `#47168`_) + +* **PR** `#47168`_: (`gtmanfred`_) fix metadata grain for py3 and windows + @ *2018-04-20 19:07:50 UTC* + + * a56eb7e05d Merge pull request `#47168`_ from gtmanfred/metadata + + * 396f7906e3 fix metadata grain for py3 and windows + +* **ISSUE** `#46918`_: (`AmbicaY`_) napalm/capirca issue (refs: `#47202`_) + +* **PR** `#47202`_: (`mirceaulinic`_) Fix `#46918`_: add the TTL field + @ *2018-04-20 14:34:09 UTC* + + * 6135b76e2c Merge pull request `#47202`_ from cloudflare/fix-46918 + + * 1e74141cc0 Fix `#46918`_ + +* **ISSUE** `#47150`_: (`srkunze`_) [Regression] ip_to_host and SSH._expand_target require missing reverse-lookup (refs: `#47191`_) + +* **PR** `#47191`_: (`terminalmage`_) salt-ssh: Do not attempt to match host/ip to minion ID if reverse lookup fails + @ *2018-04-20 14:20:05 UTC* + + * 7f1115e611 Merge pull request `#47191`_ from terminalmage/issue47150 + + * 95a6f075cb Add debug logging when ip_to_host fails + + * 45696e622b salt-ssh: Do not attempt to match host/ip to minion ID if reverse lookup fails + +* **PR** `#47122`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-19 20:44:18 UTC* + + * 1947ffdf56 Merge pull request `#47122`_ from rallytime/merge-2018.3 + + * 878fa06134 Test fix: remove tornado testing lib from class + + * a40f007962 lint: get_context is in stringutils.py now + + * 3416e398c6 Update old utils paths references to use new paths + + * 94c2a12be6 Merge branch '2017.7' into '2018.3' + + * 6a4c0b8a1a Merge pull request `#47108`_ from dwoz/async_test_fix + + * 3d85e30ce5 AsyncTestCase is required for AsyncEventPublisher + + * 03892eaf0b Merge pull request `#47068`_ from cachedout/catch_value_error_socket_test + + * 7db5625632 Catch an operation on a closed socket in a test + + * 1ea2885ec2 Merge pull request `#47065`_ from dwoz/jinja_test_fix + + * 673cd31c65 Merge branch '2017.7' into jinja_test_fix + + * 5293b5b5ca Merge pull request `#47077`_ from dwoz/test_state_fix + + * 444da3f893 Fix py3 wart (chr vs bytesstring) + + * e8acca01c2 Fix failing state test by normalizing line endings + + * ca967de5da Merge pull request `#47067`_ from gtmanfred/2017.7 + + * f913a7859c use the recommended opennebula lookup method + + * 7fddad6cd9 Merge pull request `#47064`_ from dwoz/roots_tests_fix + + * 25fd7c0694 fix py3 wart, encode os.linesep + + * d79f1a1961 Fix fileserver roots tests + + * 977c6939c4 Merge pull request `#47069`_ from cachedout/match_timeout_arg + + * b8990f5258 Pass the timeout variable to the CLI when calling salt in tests + + * 2c4c19c622 Merge pull request `#47074`_ from dwoz/ignore_artifacts + + * c3941efad0 Kitchn should ignore artifacts directory + + * c484c0bd71 Merge pull request `#47055`_ from bloomberg/GH-47000 + + * 8af3f5b874 GH-47000: add proper handling of full_return in cmd_subset + + * f3496030cc Merge pull request `#47039`_ from twangboy/win_fix_winrm_script + + * 6635b9003f Fix winrm powershell script + + * 46fa2c04de Fix py3 os.linesep wart + + * 3c565d7e54 Use salt.utils.fopen + + * aa965310f1 Clean up cruft + + * efc9866580 Jinja test fixes + +* **PR** `#47162`_: (`terminalmage`_) Partial backport of `#47161`_ to 2018.3 branch + @ *2018-04-19 19:28:47 UTC* + + * **PR** `#47161`_: (`terminalmage`_) Fix failing pillar unit test (refs: `#47162`_) + + * 291cca7ed8 Merge pull request `#47162`_ from terminalmage/bp-47161 + + * d185f97a47 mocked file_roots and pillar_roots should be dicts + +* **ISSUE** `#47081`_: (`sjorge`_) file.directory with recursion fails if there are non-ascii characters in the path (refs: `#47165`_) + +* **PR** `#47165`_: (`terminalmage`_) Make sure a str type is passed to os.walk + @ *2018-04-19 14:59:16 UTC* + + * 2ee8006da3 Merge pull request `#47165`_ from terminalmage/issue47081 + + * 9e29acb477 Make sure a str type is passed to os.walk + +* **PR** `#47070`_: (`terminalmage`_) Use decorators for temp files/dirs in test suite + @ *2018-04-19 14:01:48 UTC* + + * 6257862bbb Merge pull request `#47070`_ from terminalmage/with_tempdir + + * 048728d2b7 Remove unused imports + + * 879c557264 Use decorators for temp files/dirs in test suite + +* **PR** `#47155`_: (`mcalmer`_) Fix patchinstall for yumpkg + @ *2018-04-18 19:24:17 UTC* + + * b46365614b Merge pull request `#47155`_ from mcalmer/fix-patchinstall + + * 382afba457 fix invalid string compare + + * 8c19368938 provide kwargs to pkg_resource.parse_targets required to detect advisory type + +* **ISSUE** `#47042`_: (`valentin2105`_) [ERROR] Unable to manage file: 'utf8' codec can't decode byte (refs: `#47061`_) + +* **PR** `#47061`_: (`terminalmage`_) Fix diffing binary files in file.get_diff (refs: `#47405`_) + @ *2018-04-18 18:52:10 UTC* + + * 13ae1a2413 Merge pull request `#47061`_ from terminalmage/issue47042 + + * 87f6cefea3 Rewrite flaky utf8 state to make it easier to troubleshoot + + * df6e535f05 Fix diffing binary files in file.get_diff + +* **PR** `#47058`_: (`terminalmage`_) Fix calls to file.lsattr when lsattr is not installed + @ *2018-04-18 16:30:12 UTC* + + * cba0f13cd9 Merge pull request `#47058`_ from terminalmage/lsattr + + * eeb067e910 Fix calls to file.lsattr when lsattr is not installed + +* **ISSUE** `#46929`_: (`noelmcloughlin`_) 2018.3 regression file.managed.context parsing (refs: `#47104`_) + +* **PR** `#47104`_: (`terminalmage`_) yamlloader: Properly handle colons in inline dicts + @ *2018-04-18 16:22:47 UTC* + + * b96ce23b3f Merge pull request `#47104`_ from terminalmage/issue46929 + + * 33bf6643cd Add additional test for plain scalars + + * 508659b682 yamlloader: Properly handle colons in inline dicts + +* **ISSUE** `#46887`_: (`julientravelaer`_) ldap.managed broken with 2018.3.0 (refs: `#47029`_) + +* **ISSUE** `#46859`_: (`cheribral`_) pillar_ldap causing TypeError exceptions in python-ldap with unicode objects (refs: `#47029`_) + +* **PR** `#47076`_: (`terminalmage`_) pillar_ldap: Load config options as str types + @ *2018-04-18 16:16:22 UTC* + + * **PR** `#47029`_: (`terminalmage`_) ldapmod.py/ldap3.py: Force modlist for search/modify/etc. to be str types (refs: `#47076`_) + + * c12697b173 Merge pull request `#47076`_ from terminalmage/issue46859 + + * c06c859caf pillar_ldap: Load config options as str types + +* **PR** `#47107`_: (`twangboy`_) Fix issues with reg state, add tests + @ *2018-04-18 15:53:02 UTC* + + * 50bd885ec7 Merge pull request `#47107`_ from twangboy/fix_46932 + + * ae8ab2ab1a Fix tests for py3, enable tearDown + + * 3cf4ac1475 Add integration tests for reg state + + * cc259b146f Cast vdata to appropriate type in reg state + +* **ISSUE** `#46909`_: (`epelc`_) Binary `contents_pillar` with file.managed raises UnicodeDecodeError (refs: `#47041`_) + +* **PR** `#47041`_: (`terminalmage`_) Force null bytes to be str types + @ *2018-04-18 14:08:25 UTC* + + * d6c59696be Merge pull request `#47041`_ from terminalmage/issue46909 + + * e4182715be Special check specifically for bytes types + + * ee90dd5d95 Merge branch '2018.3' into issue46909 + + * 0e99343a7f Use the same way of defining contents in both file.managed states + + * 5741d287b5 Move back to using null byte check for contents + + * 8e214c9fa9 file.managed: Add test to ensure binary contents work + + * 7b7dc94610 Use salt.utils.stringutils.is_binary to check if contents are binary + + * e3c969da81 PY3: Ensure binary contents work with file.managed + + * 5d98a8bedd Make salt.utils.stringutils.to_binary work for bytestrings + + * 1024000369 Force null bytes to be str types + +* **PR** `#47007`_: (`twangboy`_) Fix some issues with the win_servermanager module + @ *2018-04-17 20:57:04 UTC* + + * 9a9f6524f8 Merge pull request `#47007`_ from twangboy/fix_46968 + + * 432db7c6ec Lint: Remove unused import + + * 10341e8f8b Remove erroneous pop statement + + * 56582f293a Remove redundant try/except block from state` + + * 6ad2427279 Remove unnecessary try/except blocks + + * 92eeaa51bd Put some error checking in the shell command + +* **ISSUE** `#46943`_: (`Auha`_) Slack.Engine could not start (refs: `#47109`_, `#47262`_) + +* **PR** `#47109`_: (`garethgreenaway`_) [2018.3] fixes to Slack engine + @ *2018-04-17 13:56:27 UTC* + + * a52137ee36 Merge pull request `#47109`_ from garethgreenaway/46943_slack_engine_fixes + + * 02baa76595 Fixing a bug that occured when a comment was added to a message sent to Slack by Salt. Also making `slack_engine:groups_pillar` optional. + +* **PR** `#47045`_: (`tankywoo`_) Fix ba7d00f5 for gentoo pkg.installed method + @ *2018-04-17 13:55:45 UTC* + + * 6c16a34c44 Merge pull request `#47045`_ from tankywoo/fix-gentoo-pkg-installed + + * 551f4e10cf Fix ba7d00f5 for gentoo pkg.installed + +* **PR** `#47053`_: (`clan`_) handle jinja error in level + @ *2018-04-16 22:47:54 UTC* + + * 86c7cfef56 Merge pull request `#47053`_ from clan/jinja-error + + * a847466946 handle jinja error in level + +* **PR** `#47062`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-16 19:58:32 UTC* + + * 7bfa608e9f Merge pull request `#47062`_ from rallytime/merge-2018.3 + + * 59f5880e72 lint fix + + * 1ddf8c584b Update old utils files to new new utils files path + + * 28a79ebba4 Merge branch '2017.7' into '2018.3' + + * 1700a10ebe Merge pull request `#46326`_ from kstreee/fix-client-local + + * 0f358a9c9e Fixes a timing bug of saltnado's client local. + + * c3c00316c5 Merge pull request `#46913`_ from lomeroe/2017_7-fix46877 + + * 369a0645ed move exception for clarity + + * 32ce5bfda5 Use configparser serializer object to read psscript.ini and script.ini startup/shutdown script files. + + * 9e37cfc9d6 Merge pull request `#47025`_ from terminalmage/fix-server_id-windows + + * cb0cf89ed3 Fix server_id grain in PY3 on Windows + + * 2e193cfb45 Merge pull request `#47027`_ from rallytime/bp-44508 + + * 8e72f362f4 Add priority field to support the latest capirca. + + * 112f92baab Add priority field to support the latest capirca. + + * 385fe2bc1e Merge pull request `#47020`_ from rallytime/bp-46970 + + * 9373dff52b Update test_pkgrepo.py + + * 13cf9eb5b1 Removing debugging. + + * a61a8593e5 Removing suse from pkgrepo comments tests. the pkgrepo functions in SUSE pkg module do not support comments. + +* **PR** `#47066`_: (`terminalmage`_) Fix regression in handling of environment/saltenv + @ *2018-04-16 19:57:12 UTC* + + * fa27e64a33 Merge pull request `#47066`_ from terminalmage/issue46979 + + * 5c4c0468ad Fix regression in handling of environment/saltenv + +* **PR** `#47051`_: (`rallytime`_) Simplify LooseVersion check in `__virtual__` check in mac_assistive module + @ *2018-04-13 19:43:33 UTC* + + * 8761b81a69 Merge pull request `#47051`_ from rallytime/fix-lint + + * d52b3689d9 Simplify LooseVersion check in `__virtual__` check in mac_assistive module + +* **PR** `#47057`_: (`corywright`_) Fix copy/paste typo in minionfs tutorial + @ *2018-04-13 19:43:01 UTC* + + * bbb8018b55 Merge pull request `#47057`_ from corywright/fix-minionfs-whitelist-docs + + * 9b7ee97d12 Fix copy/paste typo in minionfs tutorial + +* **ISSUE** `#46931`_: (`anlutro`_) file.managed diff is switched when using template in salt-ssh 2018.3 (refs: `#47046`_) + +* **PR** `#47046`_: (`clan`_) switch order of file to be diffed + @ *2018-04-13 13:40:13 UTC* + + * d5afa4a2c5 Merge pull request `#47046`_ from clan/file_diff + + * bb58605c54 switch order of file to be diffed + +* **ISSUE** `#46985`_: (`OrlandoArcapix`_) grafana4_user.present and grafana4_org.present states not working in 2018.3.0 (refs: `#47048`_) + +* **PR** `#47048`_: (`OrlandoArcapix`_) Issue46985 fix grafana4 state (refs: `#47060`_) + @ *2018-04-13 13:34:29 UTC* + + * ec9251ecd3 Merge pull request `#47048`_ from OrlandoArcapix/Issue46985-fix-grafana4-state + + * 259d747414 Remove accidentally added copy of a file + + * 6c8c3da74d Return an empty dict instead of 'None' from grafana4 states + +* **PR** `#47017`_: (`opdude`_) Don’t encode a unicode string + @ *2018-04-13 13:31:33 UTC* + + * d8c4c221cf Merge pull request `#47017`_ from Unity-Technologies/hotfix/pip_windows + + * 838670f626 Don’t encode a unicode string + +* **ISSUE** `#46917`_: (`boltronics`_) mysql_grants.present broken with `database: somedatabase.*` (refs: `#46919`_) + +* **PR** `#47019`_: (`rallytime`_) Back-port `#46919`_ to 2018.3 + @ *2018-04-12 19:43:01 UTC* + + * **PR** `#46919`_: (`boltronics`_) Replace failing is and is not tests with == and != (refs: `#47019`_) + + * 5b7544eaa0 Merge pull request `#47019`_ from rallytime/bp-46919 + + * 6837d6c138 Replace failing is and is not tests with == and != + +* **ISSUE** `#46887`_: (`julientravelaer`_) ldap.managed broken with 2018.3.0 (refs: `#47029`_) + +* **ISSUE** `#46859`_: (`cheribral`_) pillar_ldap causing TypeError exceptions in python-ldap with unicode objects (refs: `#47029`_) + +* **PR** `#47029`_: (`terminalmage`_) ldapmod.py/ldap3.py: Force modlist for search/modify/etc. to be str types (refs: `#47076`_) + @ *2018-04-12 19:41:29 UTC* + + * ac2d54d78a Merge pull request `#47029`_ from terminalmage/issue46859 + + * ab6314247b ldapmod.py/ldap3.py: Force modlist for search/modify/etc. to be str types + + * 7691dee4ed Add to_str option to decode funcs + +* **ISSUE** `#46868`_: (`tjyang`_) 2017.7.4 to 2018.3.0 upgrade issue: Salt request timed out. The master is not responding (refs: `#46930`_) + +* **PR** `#46930`_: (`dwoz`_) Clean up bad public key headers + @ *2018-04-12 18:57:37 UTC* + + * e6e07720fa Merge pull request `#46930`_ from dwoz/crptodomekeyfix + + * f2e484ed54 Merge branch '2018.3' into crptodomekeyfix + + * e1995a92ee Fix verify signature test + + * 0ba32118d9 Add test for bad public key without m2crypto + + * a44c356233 Clean up bad public key headers + +* **ISSUE** `#46951`_: (`Giandom`_) Slack engine error using aliases: TypeError unhashable type (refs: `#47008`_) + +* **PR** `#47008`_: (`garethgreenaway`_) [2018.3] Fixing aliases in slack engine + @ *2018-04-12 15:24:40 UTC* + + * 0e43becc12 Merge pull request `#47008`_ from garethgreenaway/46951_fixing_slack_engine_aliases + + * dc2a72d44f Fixing aliases in slack engine + +* **ISSUE** `#46947`_: (`Giandom`_) Slack engine groups error (refs: `#47009`_) + +* **PR** `#47009`_: (`garethgreenaway`_) [2018.3] fixes to slack engine documentation + @ *2018-04-12 15:20:54 UTC* + + * c33de7c82d Merge pull request `#47009`_ from garethgreenaway/46947_slack_documentation_update_catch_non_dicts + + * f0fadbb4ce Fixing indention for slack documention. Updating try..except to ensure we catch when groups aren't dicts. + +* **PR** `#47023`_: (`rallytime`_) Back-port `#46997`_ to 2018.3 + @ *2018-04-12 15:05:24 UTC* + + * **PR** `#46997`_: (`LukeCarrier`_) Fix respository (=> repository) typo in sls_build (refs: `#47023`_) + + * **PR** `#44638`_: (`terminalmage`_) Many improvements to docker network and container states (refs: `#46997`_) + + * 68d17c71f1 Merge pull request `#47023`_ from rallytime/bp-46997 + + * c2c60f4ffc Fix respository (=> repository) typo in sls_build + +* **PR** `#47026`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-12 14:39:41 UTC* + + * 9cf3c6406a Merge pull request `#47026`_ from rallytime/merge-2018.3 + + * ba70df9d62 Use msgpack utils for loads call, import msgpack for UnpackValueError + + * 34a478dfe5 Update old fopen path with new utils files path + + * 590c7fc13f Merge branch '2017.7' into '2018.3' + + * 8f994e7cf9 Merge pull request `#46539`_ from jfoboss/patch-1 + + * 6890122e41 Merge pull request `#1`_ from twangboy/pull_46539 + + * 19c3fadbe5 Fix unit test for win_ntp + + * 826a8d3099 Fixing `#46504`_ + + * 74d70e95a5 Merge pull request `#46999`_ from gtmanfred/2017.7 + + * 791af8f6ce switch pip test package + + * 8adaf7f526 Merge pull request `#46023`_ from bloomberg/parallel-orch + + * 0ac0b3ca29 Merge branch '2017.7' into parallel-orch + + * 39d65a39cf Merge pull request `#46613`_ from myinitialsarepm/fix_puppet.fact_and_puppet.facts + + * 44ecd13abc Update tests to use cmd.run_all + + * 7d7d40f541 Merge branch '2017.7' into fix_puppet.fact_and_puppet.facts + + * 0ce1520bd0 Merge branch '2017.7' into fix_puppet.fact_and_puppet.facts + + * 69e1f6f681 Fix puppet.fact and puppet.facts to use stdout. + + * 3d5e69600b address lint issues raised by @isbm + + * a9866c7a03 fix parallel mode py3 compatibility + + * 6d7730864a removing prereq from test orch + + * 6c8a25778f add integration test to runners/test_state to exercise parallel + + * 2c86f16b39 cherry-pick cdata KeyError prevention from `#39832`_ + + * 26a96e8933 record start/stop duration for parallel processes separately + + * e4844bdf2b revisit previous join() behavior in check_requisites + + * f00a359cdf join() parallel process instead of a recursive sleep + + * 6e7007a4dc add parallel support for orchestrations + +* **PR** `#47021`_: (`garethgreenaway`_) [2018.3] Fixing integration.modules.test_state_jinja_filters.StateModuleJinjaFiltersTest.test_path_which + @ *2018-04-12 13:12:39 UTC* + + * d3be828696 Merge pull request `#47021`_ from garethgreenaway/920_state_module_jinja_filters_test_test_path_which + + * 2ccf2c5fe0 Fixing test_path_which to check that the filter is available rather than results. + +* **PR** `#47022`_: (`corywright`_) Add auth.file module to auth documentation page + @ *2018-04-11 21:11:10 UTC* + + * 66e8445b82 Merge pull request `#47022`_ from corywright/add-auth-file-module-to-docs + + * bd0918fc40 Add auth.file module to auth documentation page + +* **PR** `#45774`_: (`twangboy`_) Fix __virtual__ issue in mac_system.py + @ *2018-04-11 14:26:13 UTC* + + * 12ecfdee93 Merge pull request `#45774`_ from twangboy/mac_add_service_util + + * 5796696617 Fix tests for Py3 + + * 7b40218790 Fix lint, remove sentence from docstring + + * 781880f0fc Add _available_services function for testing + + * 6080633613 Add assert_called_with + + * 1bf70b2033 Add more tests for available_services + + * b429fc3e74 Add tests for mac_utils + + * b5f67130cc Used *args and **kwargs + + * ed061617a2 Fix unicode_literal issue in mac_assistive + + * 82e17e5fc8 Fix args/kwargs + + * 455146500a Move some functions into mac_utils + + * 125586264b Add utils\mac_service.py + +* **ISSUE** `#46953`_: (`cskowronnek`_) salt-cloud azurearm [ERROR ] There was a profile error: Parameter 'subscription_id' must be str. (refs: `#47012`_) + +* **PR** `#47012`_: (`terminalmage`_) Azure: ensure subscription_id is a str type + @ *2018-04-11 13:57:08 UTC* + + * 79347f108a Merge pull request `#47012`_ from terminalmage/issue46953 + + * 5192622a32 Azure: ensure subscription_id is a str type + +* **PR** `#46526`_: (`Ch3LL`_) Add tests for new source_* minion options + @ *2018-04-10 19:56:45 UTC* + + * 6503bf8dfa Merge pull request `#46526`_ from Ch3LL/ip_conf + + * c01180ff47 Patch ZMQ versions for master_uri test + + * da38f332a5 Change comment and salt.utils.network import + + * e972ebdf1a Add for new source_* minion options + +* **PR** `#46993`_: (`L4rS6`_) Fix: tuple instead of string + @ *2018-04-10 17:07:59 UTC* + + * 03907d3fce Merge pull request `#46993`_ from L4rS6/fix-broken-keystone-auth/2018.3 + + * e33ba1b3d5 Fix: tuple instead of string + +* **PR** `#46990`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-10 17:07:33 UTC* + + * ffaee26540 Merge pull request `#46990`_ from rallytime/merge-2018.3 + + * ccc5bad2df Merge branch '2017.7' into merge-2018.3 + + * ba5421d988 Merge pull request `#46991`_ from gtmanfred/windows + + * 98588c1dc5 use saltstack salt-jenkins + + * 2f1cf3e511 Merge branch '2017.7' into '2018.3' + + * 00c4067585 Merge pull request `#46975`_ from gtmanfred/windows + + * 1f69c0d7f8 make sure windows outputs xml junit files + + * 4a2ec1bbb3 support new versions of winrm-fs + + * b9efec8526 remove libnacl on windows + + * 2edd5eaf9e fix path + + * b03e272e44 windows work + + * 3cf2353e41 Merge pull request `#46945`_ from vutny/doc-faq-fix-jinja + + * bfdf54e61d [DOC] Fix Jinja block in FAQ page + + * fc2f728665 Merge pull request `#46925`_ from terminalmage/fix-file.patch-docstring + + * 97695657f0 Remove reference to directory support in file.patch state + + * eef6c518e1 Merge pull request `#46900`_ from rallytime/bp-46801 + + * 6a41e8b457 rename jenkins to jenkinsmod + + * 71839b0303 Merge pull request `#46899`_ from rallytime/bp-45116 + + * b92f908da4 fix adding parameters to http.query from sdb yaml + +* **PR** `#46339`_: (`DmitryKuzmenko`_) SSH State test failures + @ *2018-04-10 17:06:51 UTC* + + * a34b92ae82 Merge pull request `#46339`_ from DSRCorporation/bugs/ssh_state_test_failures + + * bd98c49dc7 Merge branch '2018.3' into bugs/ssh_state_test_failures + + * 6fdc458a7f Increase timeout for run_run in ShellCase + + * 8e60cccdfb Give background task more chance to start. + + * e0b6878fac One more useful assert for better test results. + + * 92a6c43c73 More logging and assertion fixes. Extended ssh ops timeout. + + * 6ebdd17ac4 Advanced logging in the failing SSH State tests. + +* **PR** `#46989`_: (`Ch3LL`_) Fix redis cache log debug line + @ *2018-04-10 16:35:12 UTC* + + * 9924100c44 Merge pull request `#46989`_ from Ch3LL/redis_log + + * 6160bc06c6 Fix redis cache log debug line + +* **ISSUE** `#46834`_: (`oeuftete`_) strftime filter not found in 2018.3.0 (refs: `#46848`_) + +* **ISSUE** `#46668`_: (`anlutro`_) Jinja2 filter strftime stopped working in salt-ssh 2018.3 (refs: `#46744`_, `#46848`_) + +* **PR** `#46848`_: (`garethgreenaway`_) [2018.8] salt-ssh jinja filters tests + @ *2018-04-10 16:19:51 UTC* + + * c6431936cb Merge pull request `#46848`_ from garethgreenaway/testing_jinja_filters_avaiable_via_salt_ssh + + * 5fcda3eff8 Merge branch '2018.3' into testing_jinja_filters_avaiable_via_salt_ssh + + * 0adfee9b11 Updating a couple tests. Fixing check_whitelist_blacklist to work with PY3 when non-iterables are passed. Adding warning about lst_avg results being wrong and future updates in Neon. + + * f3f42146ca Removing expected from strftime and hashsum tests since the results are always different and we are only concerned about the filter being available. + + * 860234c045 Fixing lint. + + * 0891c6b580 fixing docstring + + * c8945e4b2e cleaning up some imports. + + * 0599759e5b cleaning up some test doc strings. + + * dceda5eb88 Moving all jinja filter tests into support/jinja_filters.py. Updaitng integration/ssh/test_jinja_filters.py to use those tests. Adding integration/modules/test_state_jinja_filters.py to also use the common jinja filter tests. + + * 07d7e3ca01 Adding a new integration test and corresponding state files to test availabilty of jinja filters when using salt-ssh. + +* **ISSUE** `#46880`_: (`liquidgecka`_) rabbitmq_policy broken in 2018.3.0 (refs: `#46973`_) + +* **PR** `#46973`_: (`rallytime`_) New "apply_to" kwarg in rabbitmq module should be added at the end + @ *2018-04-10 14:42:32 UTC* + + * **PR** `#41233`_: (`dnABic`_) added parameter apply_to for rabbitmq policy (refs: `#46973`_) + + * fbbcb7584c Merge pull request `#46973`_ from rallytime/fix-46880 + + * 8ce21f982c New "apply_to" kwarg in rabbitmq module should be added at the end + +* **ISSUE** `#46934`_: (`d601`_) GPG encrypted binary data in pillars breaks in 2018.3.0 (refs: `#46966`_) + +* **PR** `#46966`_: (`terminalmage`_) Fix traceback when attempting to decode binary data to unicode + @ *2018-04-10 14:08:35 UTC* + + * 58f59cfbff Merge pull request `#46966`_ from terminalmage/issue46934 + + * df43ffdb8f salt.payload.Serial: fix traceback when unpacking binary blob + + * 40a49358c9 gpg renderer: fix tranceback when decrypted ciphertext contains binary data + + * 17a88f6a71 Include exc_info in pillar render errors to aid in troubleshooting + +* **ISSUE** `#46881`_: (`SynPrime`_) Cron.file - source file not found (refs: `#46944`_) + +* **PR** `#46944`_: (`garethgreenaway`_) [2018.3] cron.file with salt source URL + @ *2018-04-10 13:34:03 UTC* + + * e33e792e2a Merge pull request `#46944`_ from garethgreenaway/46881_Cron_file_source_file_not_found + + * 438aafeb03 Adding kwargs to calls into file module functions + + * 14d12b1d6b Remove unused imports. Gating tests so they do not run on Windows + + * 623d96f21a Adding dummy cron file for integration/states/test_cron + + * c8e01871d6 Adding an integration test to test cron.file. + + * ddc55d8f9b Fixing bug that made cron.file unable to use a file via a Salt URL. + +* **PR** `#46937`_: (`gtmanfred`_) enable_ssh_minions does not work with subset yet + @ *2018-04-07 02:54:56 UTC* + + * 08e8782f76 Merge pull request `#46937`_ from gtmanfred/2018.3 + + * 3fb75e903c enable_ssh_minions does not work with subset yet + +* **PR** `#46936`_: (`gtmanfred`_) don't copy __pycache__ or .pyc files for kitchen + @ *2018-04-06 19:15:46 UTC* + + * ac4e7cd73f Merge pull request `#46936`_ from gtmanfred/2018.3 + + * 91474878fa don't copy __pycache__ or .pyc files for kitchen + +* **ISSUE** `#46659`_: (`stamak`_) [salt-cloud] [new oxygen openstack driver ] no public_ips and floating_ips in salt-cloud output (refs: `#46912`_) + +* **PR** `#46912`_: (`gtmanfred`_) pull latest vm data after building for openstack shade driver + @ *2018-04-06 13:46:42 UTC* + + * 8105fd9715 Merge pull request `#46912`_ from gtmanfred/openstack + + * 5ef538f8ad pull latest vm data after building for openstack shade driver + +* **PR** `#46908`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-05 21:27:03 UTC* + + * 735ea12960 Merge pull request `#46908`_ from rallytime/merge-2018.3 + + * 102e966512 Remove redundant section in log setup + + * 177c686b52 Update old utils paths to new utils paths + + * 0a297e7319 Merge branch '2017.7' into '2018.3' + + * d0f5b43753 Merge pull request `#44926`_ from frogunder/whitelisted_acl + + * 18e460fc30 Merge branch '2017.7' into whitelisted_acl + + * 1ad4d7d988 fix assert errors + + * e6a56016df update test + + * 19a2244cb7 whitelist_acl_test + + * 7d822f9cec Merge pull request `#46464`_ from gtmanfred/orchestration + + * 637cdc6b7b fix pylint + + * 0151013ddb document `cli` option for cmd_subset + + * 4a3ed6607d add test for subset in orchestration + + * 3112359dd6 fix salt subset in orchestrator + + * 805ed1c964 Merge pull request `#46879`_ from dwoz/cloudtestfix + + * dc54fc53c3 Fix multiple typos causing tests to fail + + * f70f6de282 Merge pull request `#46647`_ from twangboy/win_fix_test_grains + + * c179388b0e Fix the tear down function in integration.modules.test_grains.GrainsAppendTestCase + + * 91c078ce12 Merge pull request `#46756`_ from nages13/bugfix-grain-virtual_subtype + + * 781f5030a4 Merge branch 'bugfix-grain-virtual_subtype' of https://github.com/nages13/salt into bugfix-grain-virtual_subtype + + * cd1ac4b7f9 Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * 0ace76c0e7 Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * 9eb6f5c0d0 Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * 73d6d9d365 Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * a4a17eba6a Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * bf5034dbdb Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * 8d12770951 Merge branch '2017.7' into bugfix-grain-virtual_subtype + + * 7e704c0e81 Moved down container check code below hypervisors to validate containers type running in virtual environment. Fixes `#46754`_ & `#43405`_ + + * 710f74c4a6 fix grains['virtual_subtype'] to show Docker on xen kernels + + * 058bbed221 Merge pull request `#46799`_ from garethgreenaway/46762_prereq_shenanigans_tests + + * 13875e78cf Fixing documention string for test. + + * 3d288c44d4 Fixing test documentation + + * 6cff02ef6a Adding tests for `#46788`_ + + * d9770bf3f8 Merge pull request `#46867`_ from terminalmage/unicode-logging-normalization + + * 7652688e83 Backport string arg normalization to 2017.7 branch + + * 9eb98b1f6e Merge pull request `#46770`_ from twangboy/fix_46433 + + * 89af0a6222 Merge branch '2017.7' into fix_46433 + + * 67b4697578 Remove unused import (ling) + + * 9302fa5ab0 Clean up code comments + + * b383b9b330 Change the order of SID Lookup + + * 9c776cffb7 Merge pull request `#46839`_ from gtmanfred/tupletarget + + * 3b7208ce27 match tuple for targets as well + + * 7db251dc11 Merge pull request `#46845`_ from rallytime/bp-46817 + + * 36a0f6d8ca address filehandle/event leak in async run_job invocations + + * e3d17ab7bc Merge pull request `#46847`_ from dwoz/missing-strdup + + * 55845f4846 strdup from libc is not available on windows + + * f2dd79f9c4 Merge pull request `#46776`_ from gtmanfred/2017.7 + + * edc1059ee0 fix shrinking list in for loop bug + +* **PR** `#46853`_: (`terminalmage`_) Add back date_format filter + @ *2018-04-05 20:33:50 UTC* + + * 9a47afc33b Merge pull request `#46853`_ from terminalmage/date_format_filter + + * 266d13a665 Add back date_format filter + +* **PR** `#46882`_: (`jasperla`_) Backport `#46280`_ `#46849`_ `#46852`_ to 2018.3 + @ *2018-04-05 14:29:12 UTC* + + * **PR** `#46852`_: (`jasperla`_) fix creating a nic tag on a link with double 0 in the MAC (refs: `#46882`_) + + * **PR** `#46849`_: (`jasperla`_) Unbreak creating etherstubs on SmartOS (refs: `#46882`_) + + * **PR** `#46280`_: (`jasperla`_) Remove unneeded checks for binaries in SmartOS modules (refs: `#46882`_) + + * a064a3e695 Merge pull request `#46882`_ from jasperla/smartos/backports + + * 47a66975ff fix creating a nic tag on a link with double 0 in the MAC + + * a3cb0e576e Unbreak creating etherstubs on SmartOS + + * e703254990 Remove unneeded checks for binaries in SmartOS modules + +* **PR** `#46873`_: (`terminalmage`_) Attempt UTF-8 first when decoding/encoding + @ *2018-04-05 14:16:28 UTC* + + * 4e5e291c99 Merge pull request `#46873`_ from terminalmage/utf8-first + + * cf28eb74aa Don't log command when output_loglevel == 'quiet' + + * f59cee28db Remove hacky workarounds to get encode/decode tests to pass on Windows + + * 76e5d81bb4 Remove hacky workaround to get Windows to decode deserialized data properly + + * 0b5729e58a Remove hacky workaround to get git state/exec module to work properly on Windows + + * 22ff48518f Attempt UTF-8 first when decoding/encoding + +* **ISSUE** `#43499`_: (`tyeapple`_) zmq setsockopt need to adapt python3 (refs: `#46874`_) + +* **PR** `#46878`_: (`terminalmage`_) Backport `#46874`_ to 2018.3 + @ *2018-04-05 13:26:04 UTC* + + * **PR** `#46874`_: (`johnj`_) Use bytestrings for PY3 compatibility when running setsockopt for zmq.SUBSCRIBE (refs: `#46878`_) + + * 1518762465 Merge pull request `#46878`_ from terminalmage/bp-46874 + + * d9511d04d4 `#43499`_, zmq setsockopt need to adapt python3 + +* **ISSUE** `#46862`_: (`kivoli`_) Setting locale.system fails in 2018.3 (refs: `#46869`_, `#47280`_) + +* **PR** `#46869`_: (`gtmanfred`_) Always return dictionary for _localectl_status + @ *2018-04-05 13:25:14 UTC* + + * 67894e3ee9 Merge pull request `#46869`_ from gtmanfred/2018.3 + + * 1496e985f7 fix pylint + + * 75425dfd20 fix tests for localemod + + * 2d7c7b5e33 Always return dictionary for _localectl_status + +* **PR** `#46870`_: (`mirceaulinic`_) Correct the documentation for two new proxy modules + @ *2018-04-04 21:48:41 UTC* + + * 58c8ff18e2 Merge pull request `#46870`_ from cloudflare/proxy-doc + + * f4b6184476 Corect and add the cimc proxy module to autodoc + + * a99bc202b9 Correct & add Panos to autodoc + +* **PR** `#46729`_: (`terminalmage`_) Performance improvement/error catching in expr_match + @ *2018-04-04 20:25:57 UTC* + + * d7e4b9d755 Merge pull request `#46729`_ from terminalmage/expr_match + + * 70cfafe299 Add test case + + * 250039b11f Restore original variable name + + * ae0f112a49 Log an exception when non-string val/expr passed to expr_match + + * dac42a672b Performance improvement/error catching in expr_match + +* **PR** `#46872`_: (`terminalmage`_) Backport `#46863`_ to 2018.3 + @ *2018-04-04 19:04:40 UTC* + + * **PR** `#46863`_: (`TamCore`_) fixed top function which was broken since commit 002aa88a97e (refs: `#46872`_) + + * e0b383afb5 Merge pull request `#46872`_ from terminalmage/bp-46863 + + * be284e5b99 Add skipIf when older mock present + + * db8faaee56 Add unit tests for ext_nodes master_tops module + + * ee437f7cbf fixed top function which was broken since commit 002aa88a97e + +* **PR** `#46850`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-04-04 18:07:44 UTC* + + * 5c76d98d1a Merge pull request `#46850`_ from rallytime/merge-2018.3 + + * a0fcd5c053 Fix test_cp failure: forgot to add tgt to test when @with_tempfile is present + + * d0202cab72 Resolve bad merge: there should only be one test_get_file_from_env_in_url test + + * e28f71b418 Lint: use full salt utils path + + * 4ad50bbdee Update old utils paths to new paths + + * 893196d3e6 Merge branch '2017.7' into '2018.3' + + * 1941426218 Merge pull request `#46838`_ from gtmanfred/npm + + * bff61dd291 use http registry for npm + + * e544254e7b Merge pull request `#46823`_ from rallytime/fix-42312 + + * dafa820f93 Improve __virtual__ checks in sensehat module + + * 37f6d2de35 Merge pull request `#46641`_ from skizunov/develop3 + + * c624aa4827 Make LazyLoader thread safe + + * 989508b100 Merge pull request `#46837`_ from rallytime/merge-2017.7 + + * 8522c1d634 Merge branch '2016.11' into '2017.7' + + * 3e844ed1df Merge pull request `#46739`_ from rallytime/2016.11_update_version_doc + + * 4d9fc5cc0f Update release versions for the 2016.11 branch + + * 307e7f35f9 Merge pull request `#46740`_ from rallytime/2017.7_update_version_doc + + * 7edf98d224 Update 2018.3.0 information and move branch from "latest" to "previous" + + * 5336e866ac Update release versions for the 2017.7 branch + + * ebf5dd276f Merge pull request `#46783`_ from twangboy/fix_46680 + + * da5ce25ef3 Fix unit tests on Linux + + * b7f4f377cd Add space I removed + + * f1c68a09b5 Fix network.managed test=True on Windows + + * f652f25cc1 Merge pull request `#46821`_ from rallytime/fix-mantest-failures + + * 209a8029c3 Fix the new test failures from the mantest changes + + * c460f62081 Merge pull request `#46800`_ from lomeroe/2017_7-46627 + + * 2bee383e9d correct create list item value names if the valuePrefix attribute does not exist on the list item, the value is the value name, other wise, the valuename a number with the valuePrefix prepended to it + + * df26f2641e Merge pull request `#46675`_ from dwoz/inspectlib-tests + + * d39f4852d8 Handle non-zero status exception + + * 83c005802b Handle cases where git can not be found + + * 628b87d5c4 Skip test when git symlinks are not configured + + * 4083e7c460 Merge pull request `#46815`_ from terminalmage/bp-46809 + + * 71d5601507 Fix sharedsecret authentication + + * 3bac9717f4 Merge pull request `#46769`_ from dwoz/wincloudtest + + * eabc234e5d Fix config override name + + * 5c22a0f88d Use aboslute imports + + * 810042710d Set default cloud test timeout back to 500 seconds + + * 5ac89ad307 Use winrm_verify_ssl option causing tests to pass + + * 71858a709c allow not verifying ssl winrm saltcloud + + * ba5f11476c Adding windows minion tests for salt cloud + + * f1be939763 Merge pull request `#46786`_ from twangboy/fix_46757 + + * b0053250ff Remove int(), just return -1 + + * 7d56126d74 Fixes some lint + + * 49b3e937da Return int(-1) when pidfile contains invalid data + + * 89bf24b15c Merge pull request `#46814`_ from terminalmage/bp-46772 + + * a9f26f2ab8 avoid breaking if AutoRemove is not found + + * 97779c965d fix container removal if auto_remove was enabled + + * 5ea4ffbdb6 Merge pull request `#46813`_ from terminalmage/event-debug-log + + * 5d6de3a2eb Get rid of confusing debug logging + + * e533b7182d Merge pull request `#46766`_ from twangboy/win_fix_test_git + + * 5afc66452c Remove unused/redundant imports + + * 88fd72c52c Use with_tempfile decorator where possible + + * 69d450db84 Merge pull request `#46778`_ from terminalmage/salt-jenkins-906 + + * bbfd35d3ea Replace flaky SPM man test + + * c935ffb740 Merge pull request `#46788`_ from garethgreenaway/46762_prereq_shenanigans + + * fa7aed6424 Ensure failed tags are added to self.pre. + + * 395b7f8fdc Merge pull request `#46655`_ from dwoz/pyobjects-46350 + + * 5aabd442f2 Fix up import and docstring syntax + + * 62d64c9230 Fix missing import + + * 18b1730320 Skip test that requires pywin32 on *nix platforms + + * 45dce1a485 Add reg module to globals + + * 09f9322981 Fix pep8 wart + + * 73d06f664b Fix linter error + + * 009a8f56ea Fix up environ state tests for Windows + + * b4be10b8fc Fixing cleanUp method to restore environment + + * af45c49c42 Merge pull request `#46632`_ from dwoz/file-recurse-36802 + + * 44db77ae79 Fix lint errors and typo + + * cb5619537f Only change what is essential for test fix + + * eb822f5a12 Fix file.recurse w/ clean=True `#36802`_ + + * 6e9f504ed1 Merge pull request `#46751`_ from folti/2017.7 + + * 7058f10381 same top merging strategy works again + + * d3623e0815 Merge pull request `#46691`_ from Ch3LL/win_group_test + + * 7cda825e90 Add groupadd module integration tests for Windows + + * 14ab50d3f4 Merge pull request `#46696`_ from dwoz/win_test_client + + * ec4634fc06 Better explanation in doc strings + + * d9ae2abb34 Fix splling in docstring + + * b40efc5db8 Windows test client fixes + +* **PR** `#46851`_: (`rallytime`_) Back-port `#46844`_ to 2018.3 + @ *2018-04-04 18:04:59 UTC* + + * **PR** `#46844`_: (`UtahDave`_) Fix warning format in 2018.3.0 release notes (refs: `#46851`_) + + * b808ba7049 Merge pull request `#46851`_ from rallytime/bp-46844 + + * ab2ccea1af Quick grammar fix in 2018.3.0 release notes + + * af7bad3c7f Fix warning format in 2018.3.0 release notes + +* **ISSUE** `#46864`_: (`femnad`_) Attribute Error When Invoking Vault Module Method (refs: `#46865`_) + +* **PR** `#46865`_: (`femnad`_) Fix Log Line for Vault Token Generation Debug Line + @ *2018-04-04 14:52:00 UTC* + + * ea56778e03 Merge pull request `#46865`_ from femnad/fix-log-in-vault-runner + + * 01a5b88e7b Fix Log Line for Vault Token Generation Debug Line + +* **PR** `#46836`_: (`rallytime`_) [2018.3] Merge forward from 2018.3.0rc1 to 2018.3 + @ *2018-04-03 16:54:53 UTC* + + * a0e168ccee Merge pull request `#46836`_ from rallytime/merge-2018.3 + + * e75ba1f502 Merge branch '2018.3.0rc1' into '2018.3' + + * 39235715e6 Merge pull request `#46792`_ from damon-atkins/patch-1 + + * db5b9464e6 provided an example + + * 41e3e1e253 Update windows information in release notes + + * 99447fbf49 Added more windows information + + * d4241006f2 Update 2018.3.0.rst Windows Items, Group topics + +* **ISSUE** `#46808`_: (`ezh`_) Sharedsecret authentication is broken (refs: `#46809`_) + +* **PR** `#46809`_: (`ezh`_) Fix sharedsecret authentication (refs: `#46815`_) + @ *2018-04-03 16:53:24 UTC* + + * 4a358217a0 Merge pull request `#46809`_ from ezh/2018.3-sharedsecret + + * 20db8f03f7 Merge branch '2018.3' into 2018.3-sharedsecret + + * 9df6d18ec7 Fix sharedsecret authentication + +* **PR** `#46820`_: (`rallytime`_) [2018.3] Update the latest release information for docs + @ *2018-04-03 14:36:31 UTC* + + * 1519d7d895 Merge pull request `#46820`_ from rallytime/2018.3_update_version_doc + + * 274f8ee0dd [2018.3] Update the latest release information for docs + +* **PR** `#46731`_: (`rallytime`_) Back-port `#46024`_ to 2018.3 + @ *2018-04-02 19:00:42 UTC* + + * **PR** `#46024`_: (`zmedico`_) Trivial bug fixes for tagify and fire_args functions (refs: `#46731`_) + + * 07f1141722 Merge pull request `#46731`_ from rallytime/bp-46024 + + * ee4ee5b619 fire_args: fix UnboundLocalError: local variable 'tag' + + * 4ce2c21824 tagify: handle integer suffix list + +* **ISSUE** `#46779`_: (`anlutro`_) salt-ssh 2018.3 states with "runas" fail with "Environment could not be retrieved for User" (refs: `#46796`_) + +* **PR** `#46796`_: (`terminalmage`_) Fix regression introduced in merge-forward + @ *2018-04-02 18:10:22 UTC* + + * **PR** `#46503`_: (`psyer`_) Fixes stdout user environment corruption (refs: `#46796`_) + + * 4f31c1062d Merge pull request `#46796`_ from terminalmage/issue46779 + + * f8f9d045ac Add regression test + + * e0e4e19ba3 Include extra troubleshooting information + + * dcb0c67309 Fix regression introduced in merge-forward + +* **PR** `#46690`_: (`dincamihai`_) Fix unicode handling in pkg.info_installed + @ *2018-03-29 14:10:48 UTC* + + * 4609a7dd85 Merge pull request `#46690`_ from dincamihai/2018.3 + + * 980adf8253 Fix unicode handling in pkg.info_installed + +* **PR** `#46746`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-03-28 21:13:07 UTC* + + * e5b3c8fa91 Merge pull request `#46746`_ from rallytime/merge-2018.3 + + * e8864b7b0b Merge branch '2017.7' into '2018.3' + + * 1222bdbc00 Merge pull request `#46732`_ from rallytime/bp-46032 + + * bf0b962dc0 Workaroung python bug in traceback.format_exc() + + * 50fe1e9480 Merge pull request `#46749`_ from vutny/doc-deprecate-copr + + * a1cc55da3d [DOC] Remove mentions of COPR repo from RHEL installation page + + * bd1e8bcc7d Merge pull request `#46734`_ from terminalmage/busybox + + * 6502b6b4ff Make busybox image builder work with newer busybox releases + + * c09c6f819c Merge pull request `#46742`_ from gtmanfred/2017.7 + + * fd0e649d1e only use npm test work around on newer versions + + * 3b6d5eca88 Merge pull request `#46743`_ from Ch3LL/mac_auth + + * 4f1c42c0e3 Workaround getpwnam in auth test for MacOSX + + * d0278345fc Update old utils paths to new utils paths + + * e312efb5e7 Merge branch '2017.7' into '2018.3' + + * b548a3e742 Merge pull request `#46171`_ from amaclean199/fix_mysql_grants_comparison + + * 97db3d9766 Merge branch '2017.7' into fix_mysql_grants_comparison + + * 0565b3980e Merge branch '2017.7' into fix_mysql_grants_comparison + + * 8af407173d Merge branch '2017.7' into fix_mysql_grants_comparison + + * 00d13f05c4 Fix mysql grant comparisons by stripping both of escape characters and quotes. Fixes `#26920`_ + + * 554400e067 Merge pull request `#46709`_ from vutny/doc-faq-minion-master-restart + + * d0929280fc [DOC] Update FAQ about Salt self-restarting + + * 3f21e9cc65 Merge pull request `#46503`_ from psyer/fix-cmd-run-env-corrupt + + * e8582e80f2 Python 3-compatibility fix to unit test + + * 27f651906d Merge pull request `#1`_ from terminalmage/fix-cmd-run-env-corrupt + + * 172d3b2e04 Allow cases where no marker was found to proceed without raising exception + + * 35ad828ab8 Simplify the marker parsing logic + + * a09f20ab45 fix repr for the linter + + * 4ee723ac0f Rework how errors are output + + * dc283940e0 Merge branch '2017.7' into fix-cmd-run-env-corrupt + + * a91926561f Fix linting problems + + * e8d3d017f9 fix bytes or str in find command + + * 0877cfc38f Merge branch '2017.7' into fix-cmd-run-env-corrupt + + * 86176d1252 Merge branch '2017.7' into fix-cmd-run-env-corrupt + + * 3a7cc44ade Add python3 support for byte encoded markers + + * 09048139c7 Do not show whole env in error + + * ed94700255 fix missing raise statement + + * 15868bc88c Fixes stdout user environment corruption + + * ac2a6616a7 Merge pull request `#46432`_ from twangboy/win_locales_utf8 + + * affa35c30d Revert passing encoding + + * a0ab27ef15 Merge remote-tracking branch 'dw/win_locales_utf8' into win_locales_utf8 + + * 9f95c50061 Use default SLS encoding, fall back to system encoding + + * 6548d550d0 Use salt.utils.to_unicode + + * 8c0164fb63 Add ability to specify encoding in sdecode + + * 2e7985a81c Default to utf-8 on Windows + + * 8017860dcc Use salt.utils.to_unicode + + * c10ed26eab Add ability to specify encoding in sdecode + + * 8d7e2d0058 Default to utf-8 on Windows + + * fadc5e4ba4 Merge pull request `#46669`_ from terminalmage/pillar-merge-order + + * b4a1d34b47 Add option to return to pre-2017.7.3 pillar include merge order + + * b90f0d1364 Merge pull request `#46711`_ from terminalmage/wildcard-versions-info + + * fc7d16f1af Add performance reminder for wildcard versions + + * 6c80d90bb6 Merge pull request `#46693`_ from dwoz/test_smtp_return + + * 5bf850c67f File and Pillar roots are dictionaries + + * 9a6bc1418c Merge pull request `#46543`_ from dafenko/fix-add-saltenv-pillarenv-to-pillar-item + + * 6d5b2068aa Merge branch '2017.7' into fix-add-saltenv-pillarenv-to-pillar-item + + * 5219377313 Merge branch '2017.7' into fix-add-saltenv-pillarenv-to-pillar-item + + * b7d39caa86 Merge branch '2017.7' into fix-add-saltenv-pillarenv-to-pillar-item + + * 25f1074a85 Add docstring for added parameters + + * 973bc13955 Merge branch '2017.7' into fix-add-saltenv-pillarenv-to-pillar-item + + * 164314a859 Merge branch '2017.7' into fix-add-saltenv-pillarenv-to-pillar-item + + * 267ae9f633 Fix missing saltenv and pillarenv in pillar.item + + * f776040e25 Merge pull request `#46679`_ from vutny/doc-state-pkg + + * 4a730383bf [DOC] Correct examples in `pkg` state module + + * 47409eaa6e Merge pull request `#46646`_ from twangboy/win_fix_test_local_cache + + * 8d93156604 Fix `unit.returners.test_local_cache` for Windows + + * 0c2dce0416 Merge pull request `#46649`_ from terminalmage/issue46595 + + * e82a1aa1ec Make server_id consistent on Python 3 + + * 4e7466a21c Merge pull request `#46588`_ from UtahDave/no_crash_winshell + + * b7842a1777 Update error message. + + * 95dfdb91ca Don't stacktrace when salt-ssh w/o saltwinshell + + * 33af3cfc7c Merge pull request `#46631`_ from rallytime/update-pillar-unit-tests + + * 0f728186aa Fix pillar unit test failures: file_roots and pillar_roots environments should be lists + + * d329e7af78 Merge pull request `#46640`_ from terminalmage/file.copy-docs + + * 480c5f8faa Clarify the docs for the file.copy state + + * ff40590c06 Merge pull request `#46642`_ from vutny/doc-cloud-index + + * 51e6aa54a1 [DOC] Unify cloud modules index header + + * 83ed40c06a Merge pull request `#46619`_ from rallytime/merge-2017.7 + + * bcbddf5d07 Merge branch '2017.7.5' into '2017.7' + + * 19bb725698 Merge pull request `#46612`_ from Ch3LL/7.5_rn + + * 6076bfa2ee Add changelog to 2017.7.5 release + + * 31c78aef11 Merge pull request `#46572`_ from dmurphy18/update_xxxbuild + + * c87511570d Merge branch '2017.7.5' into update_xxxbuild + + * cdd768fa4d Merge pull request `#46577`_ from gtmanfred/2017.7.5 + + * 78cbf7b5cd Fix npm issue + + * c76f7eb028 enable debug logging on the minionlog + + * e6682c660c Merge pull request `#46551`_ from terminalmage/salt-jenkins-885 + + * 703b5e7e65 Change versionadded to show that 2018.3.0 will not have this function + + * 010d260d06 Rewrite failing Suse pkg integration test + + * f3f5dec239 zypper.py: fix version argument being ignored + + * 214f2d6ad3 Add pkg.list_repo_pkgs to zypper.py + + * 0a541613f2 Additon of -sa flag to allow for revision numbers other than -0 or -1 + + * bd62699ccb Merge pull request `#46563`_ from gtmanfred/2017.7.5 + + * 8d5ab72983 virtualenv version too old for python3.6 + + * 2916708124 Merge pull request `#46561`_ from gtmanfred/2017.7.5 + + * 2c39ac6dfb disable verbose + + * ee3bff6e32 Merge pull request `#46537`_ from rallytime/bp-46529 + + * 289c7a228f retry if there is a segfault + + * 1271536a89 Merge pull request `#46519`_ from rallytime/man-pages-2017.7.5 + + * 782a5584f5 Update man pages for 2017.7.5 + + * df12135439 Merge pull request `#46584`_ from twangboy/lgpo-46568 + + * 661017104b Detect disabled reg_multi_sz elements properly + + * 2fd3aa487c Merge pull request `#46624`_ from twangboy/win_fix_installer + + * fa0b0efe46 Fix some installer script inconsistencies + + * f038e3c452 Merge pull request `#46571`_ from garethgreenaway/46552_onfail_and_require + + * 152c43c843 Accounting for a case when multiple onfails are used along with requires. Previously if you have multiple states using 'onfail' and two of those states using a 'require' against the first one state, the last two will run even if the 'onfail' isn't met because the 'require' is met because the first state returns true even though it didn't excute. This change adds an additional hidden variable that is used when checking requisities to determine if the state actually ran. + + * 2677330e19 Merge pull request `#46520`_ from gtmanfred/2017.7 + + * caefedc095 make sure utils is empty for pickling for windows + + * 2883548e6b pass utils to the scheduler for reloading in modules + + * 7bc3c2e588 Merge pull request `#46531`_ from terminalmage/issue44299 + + * b70c3389da Fix case where no comments specified + + * ce391c53f4 Add regression test for `#44299`_ + + * c3e36a6c94 Fix regression in yumpkg._parse_repo_file() + + * f0c79e3da3 Slight modification to salt.utils.pkg.rpm.combine_comments() + + * b80edb5d26 Merge pull request `#46567`_ from dwoz/runtest-n-wart + + * 3b6901e19d Honor named tests when running integration suites + + * 1dcd22e767 Merge pull request `#46580`_ from twangboy/win_update_docs_dism + + * d52b99d7a3 Clarify some issues with msu files in win_dism.py + + * 0a68c22332 Merge pull request `#46541`_ from gtmanfred/metadata + + * 19bd1d9db5 handle user-data for metadata grains + +* **ISSUE** `#46668`_: (`anlutro`_) Jinja2 filter strftime stopped working in salt-ssh 2018.3 (refs: `#46744`_, `#46848`_) + +* **PR** `#46744`_: (`garethgreenaway`_) [2018.3] Ensure salt.utils.dateutils is available for templates via salt-ssh + @ *2018-03-28 21:09:46 UTC* + + * ef68df7f3a Merge pull request `#46744`_ from garethgreenaway/46668_jinja2_filter_strftime_unavailable + + * 0b30955c00 Including salt.utils.dateutils so various jinja_filters are available when using salt-ssh. + +* **ISSUE** `#46334`_: (`sjorge`_) [2018.3.0rc1] Stacktrace on call to nacl.dec (refs: `#46426`_) + +* **PR** `#46720`_: (`rallytime`_) Bump deprecation notices in nacl module & runner to Neon + @ *2018-03-27 21:15:46 UTC* + + * **PR** `#46426`_: (`garethgreenaway`_) [2018.3.0rc1] fixes to nacl module & runner (refs: `#46639`_, `#46720`_) + + * 65bb37effd Merge pull request `#46720`_ from rallytime/bump-nacl-deprecation + + * 5102c0310c Bump deprecation notices in nacl module & runner to Neon + +* **PR** `#46733`_: (`rallytime`_) [2018.3] Merge forward from 2018.3.0rc1 to 2018.3 + @ *2018-03-27 18:46:43 UTC* + + * c83d9e66fe Merge pull request `#46733`_ from rallytime/merge-2018.3 + + * 00d4eb26f3 Merge branch '2018.3.0rc1' into '2018.3' + +* **PR** `#46565`_: (`twangboy`_) Create reg salt util (2018.3) + @ *2018-03-26 22:03:33 UTC* + + * 0faced1d54 Merge pull request `#46565`_ from twangboy/win_fix_cmd_powershell_2018.3 + + * 5ee64e9b0e Fix lint (spelling error) + + * 0de54ed953 Additional tests + + * fc9ecd75e2 Skip unit.state.test_reg unless on Windows + + * aa98bdf250 Fix some lint + + * e0d201a96f Make sure the docs are correct for the tests + + * f15f92318d Add tests for salt.utils.win_reg + + * f7112b19a2 Submit `#46527`_ agains 2018.3 + +* **ISSUE** `#46334`_: (`sjorge`_) [2018.3.0rc1] Stacktrace on call to nacl.dec (refs: `#46426`_) + +* **PR** `#46639`_: (`terminalmage`_) Use the correct path for nacl certificates in Windows + @ *2018-03-26 19:20:10 UTC* + + * **PR** `#46426`_: (`garethgreenaway`_) [2018.3.0rc1] fixes to nacl module & runner (refs: `#46639`_, `#46720`_) + + * dd52368f90 Merge pull request `#46639`_ from terminalmage/nacl-default-path + + * 2f7660fe35 Use the correct path for nacl certificates in Windows + +* **PR** `#46416`_: (`dincamihai`_) Fix cp.push empty file + @ *2018-03-26 17:52:47 UTC* + + * 2efef52a3e Merge pull request `#46416`_ from dincamihai/fix-cp.push-empty-file + + * 536ba0fa1e Fix cp.push empty file + +* **PR** `#46643`_: (`mcalmer`_) fix docker return + @ *2018-03-26 15:52:31 UTC* + + * 84579e7652 Merge pull request `#46643`_ from mcalmer/fix-docker-return + + * 3ceb63f607 fix checking test results + + * af64632bf3 add unit test for failed login + + * 0fc7989236 make it possible to use login, pull and push from module.run and detect errors + +* **PR** `#46650`_: (`Ch3LL`_) Mirror libnacl imports in test from the nacl module + @ *2018-03-26 14:48:40 UTC* + + * c67afbeb36 Merge pull request `#46650`_ from Ch3LL/nacl_test + + * 9fef8bc431 Mirror libnacl imports in test from the nacl runner + + * f11d58a8e9 Mirror libnacl imports in test from the nacl module + +* **PR** `#46645`_: (`terminalmage`_) Add Unicode / Python 3 update to 2018.3.0 release notes + @ *2018-03-26 14:43:53 UTC* + + * 03b58a01cf Merge pull request `#46645`_ from terminalmage/release-notes + + * 986c7bcdae Rewrite unicode/py3 section + + * 064bc83276 Add Unicode / Python 3 update to 2018.3.0 release notes + +* **ISSUE** `#46150`_: (`whytewolf`_) With chocolately.version some packages don't work with check_remote=True (refs: `#46661`_) + +* **PR** `#46661`_: (`Kimol`_) Chocolatey - Lowered name of local and remote packages before comparing versions. + @ *2018-03-26 14:35:39 UTC* + + * 308c9ddfc3 Merge pull request `#46661`_ from Kimol/2018.3-fix_chocolatey_check_remote_packages + + * 52581e7918 Removed trailing whitespace + + * 123a86947c Chocolatey - Added lowering local packages for unifing both local and remote names to lowercase for comparison. + + * 4be1a991c2 Lowered name of available packages before comparing with local packages + +* **PR** `#46569`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 (refs: `#46631`_) + @ *2018-03-21 20:57:04 UTC* + + * 2e1f7c37f7 Merge pull request `#46569`_ from rallytime/merge-2018.3 + + * 46ba72fb1c Fix pillar unit test failures: file_roots and pillar_roots environments should be lists + + * fe2d46dd0c Better merge conflict resolution for setup.py windows changes + + * 8886b61576 Update old utils paths to new paths + + * 8d1e1e7f94 Merge branch '2017.7' into '2018.3' + + * 048b2ba3f6 Merge pull request `#46547`_ from garethgreenaway/46427_service_module_cumulus + + * edd0b11447 Merge branch '2017.7' into 46427_service_module_cumulus + + * ea3c16080e Disable the `service` module on Cumulus since it is using systemd. + + * 98e3260b9a Merge pull request `#46548`_ from Ch3LL/profit_test + + * db96c4e72e check for foo,bar username,password set in profitbrick config + + * 79f2a76609 Merge pull request `#46549`_ from Ch3LL/dimension_test + + * bb338c464c Fix dimensionsdata test random_name call + + * 083846fe0e Merge pull request `#46529`_ from gtmanfred/kitchen + + * 50d6e2c7be retry if there is a segfault + + * 5cc11129f1 Merge pull request `#46511`_ from rallytime/bp-45769 + + * a8ffceda53 Surpress boto WARNING during decode, reference: https://github.com/boto/boto/issues/2965 + + * 0e90c8ca6f Merge pull request `#46493`_ from terminalmage/issue46207 + + * f06ff68f10 salt-call: don't re-use initial pillar if CLI overrides passed + + * b11a8fc8e0 Merge pull request `#46450`_ from gtmanfred/salt_runner + + * 7974ff7264 load grains for salt.cmd runner + + * 22d753364b Merge pull request `#46337`_ from gtmanfred/2017.7 + + * d6d9e36359 add tests for names and listen/listen_in + + * 3f8e0db572 let listen_in work with names + + * 7161f4d4df fix listen to be able to handle names + + * b7191b8782 Merge pull request `#46413`_ from meaksh/2017.7-explore-result-in-depth + + * 885751634e Add new unit test to check state.apply within module.run + + * 9f19ad5264 Rename and fix recursive method + + * 1476ace558 Fix Python3 and pylint issue + + * 726ca3044d Explore 'module.run' response to catch the 'result' in depth + + * 02a79a2014 Merge pull request `#46496`_ from gtmanfred/kitchen + + * da002f78d0 include virtualenv path for py3 windows + + * fe2efe03ea remove duplicate setup + + * 5c4c182d75 Merge pull request `#46330`_ from bdrung/fix_kubernetes_test_create_deployments + + * 5008c53c44 Fix ValueError for template in AppsV1beta1DeploymentSpec + + * c7e05d3ff4 Merge pull request `#46482`_ from rongshengfang/fix-keyerror-in-instance_present + + * ed8c83e89a Fix KeyError in salt/states/boto_ec2.py when an EIP is being associated to an existing instance with the instance_present state. + + * 573d51afec Merge pull request `#46463`_ from terminalmage/mock-2.0 + + * b958b4699c Update requirements files to depend on mock>=2.0.0 + + * a154d35fc7 Merge pull request `#46422`_ from rallytime/bp-46300 + + * 829dfde8e8 Change stringutils path to old utils path for 2017.7 + + * 91db2e0782 Python 3 support + + * 2afaca17a1 Merge pull request `#46320`_ from mcalmer/warn-kubernetes + + * c493ced415 add warning about future config option change + + * c7f95581e3 Merge pull request `#46449`_ from bdrung/make-doc-theme-configurable + + * 4a5da2d144 Make documentation theme configurable + + * 10ce0e9e20 Merge pull request `#46162`_ from rallytime/team-suse-zypper-owner + + * 13a295a3b7 Add *pkg* and *snapper* to team-suse + + * 35c7b7b0d3 Add btrfs, xfs, yumpkg, and kubernetes file to team-suse + + * 485d777ac0 Add team-suse to CODEOWNERS file for zypper files + + * cac096b311 Merge pull request `#46434`_ from gtmanfred/highstate_return + + * d18f1a55a7 fix pylint + + * 9e2c3f7991 split return key value correctly + + * 7dd71101ce Merge pull request `#46455`_ from whytewolf/Issue_44452_unicode_cloud + + * 5fe474b1a8 .format remove fix for `#44452`_ + + * 4c8d9026d3 Merge pull request `#46428`_ from twangboy/win_fix_reqs + + * e7ab97cc17 Remove six as a hard dep for Salt + + * cc67e5c2ef Set six to 1.11.0 + + * e834d9a63b Merge pull request `#46454`_ from gtmanfred/kitchen + + * b8ab8434a5 fix windows for kitchen + + * 2886dca88f Merge pull request `#46452`_ from gtmanfred/spm_cache_dir + + * 169cf7a4e2 make spm cache_dir instead of all cachedirs + + * a188984cd9 Merge pull request `#46446`_ from bdrung/fix-typos + + * 7e6e80be87 heat: Fix spelling mistake of environment + + * a3c54b50f6 Fix various spelling mistakes + + * e35fc5263c Merge pull request `#46309`_ from bdrung/dynamic-pillarenv + + * 584b451fd1 Support dynamic pillar_root environment + + * 35fe9827fe Merge pull request `#46430`_ from terminalmage/issue44032 + + * f9f187e915 Improve reliability/idempotence of file.blockreplace state + + * 2bad0a21c0 Merge pull request `#46429`_ from twangboy/win_fix_snmp + + * 8995a9b8de Fix problem with __virtual__ in win_snmp + + * 93a572f229 Merge pull request `#46100`_ from jfindlay/resolv_scope + + * d5561bedaf tests.unit.grains.core add scoped IPv6 nameserver + + * 4e2e62d508 salt.utils.dns parse scope param for ipv6 servers + + * 5acc1d5c54 Merge pull request `#46420`_ from bdrung/2017.7 + + * e48c13d9e0 Fix SSH client exception if SSH is not found + + * ca6a76e317 Merge pull request `#46379`_ from angeloudy/2017.7 + + * 3acb59c74c Merge branch '2017.7' into 2017.7 + + * d971e0c08b Fix indent + + * 269514683f Update http.py + + * 908c040ac3 Update http.py + + * 51ba3c135b Update http.py + + * 14aba24111 fix bytes-object required error in python 3 + + * 73f9233557 Merge pull request `#46404`_ from gtmanfred/kitchen + + * c56baa95a8 clone .git for the version tests + + * 3620611b5b fix unhold package for debian + + * 5219f7d2ba fix minion log path + + * ca28cfd4e4 Merge pull request `#46310`_ from twangboy/win_update_installer_build + + * bcf8b19566 Update the installer build + + * decccbeca3 Merge pull request `#46316`_ from twangboy/win_fix_dsc + + * 2042d33d59 Fix issues with the DSC module + +* **PR** `#46620`_: (`rallytime`_) [2018.3] Merge 2018.3.0rc1 into 2018.3 + @ *2018-03-20 22:45:00 UTC* + + * 8cdd56b9dc Merge pull request `#46620`_ from rallytime/merge-2018.3.0rc1-into-2018.3 + + * b03cda3cea Merge branch '2018.3.0rc1' into '2018.3' + +* **PR** `#46606`_: (`Ch3LL`_) add autodoc topics for infoblox state modules + @ *2018-03-19 21:35:46 UTC* + + * 2d2fe22ae2 Merge pull request `#46606`_ from Ch3LL/infoblox_docs + + * 6eab6a7dc4 add autodoc topics for infoblox state modules + +* **PR** `#46540`_: (`s0undt3ch`_) Some missing `isinstance` checks. + @ *2018-03-15 16:17:19 UTC* + + * 1191d5b379 Merge pull request `#46540`_ from s0undt3ch/2018.3 + + * fa1d668774 Some missing `isinstance` checks. Committed again through a PR. + +* **PR** `#46513`_: (`rallytime`_) [2018.3] Merge forward from 2018.3.0rc1 to 2018.3 + @ *2018-03-15 15:58:59 UTC* + + * 5429438e4b Merge pull request `#46513`_ from rallytime/merge-2018.3 + + * aa760334a1 Merge branch '2018.3.0rc1' into '2018.3' + +* **ISSUE** `#43208`_: (`mitar`_) Prevent user.present to change uid and gid of existing user (refs: `#46502`_) + +* **PR** `#46502`_: (`terminalmage`_) user.present: don't change uid/gid unless explicitly told to + @ *2018-03-13 14:25:20 UTC* + + * 3e073c7e8a Merge pull request `#46502`_ from terminalmage/issue43208 + + * 4106840deb user.present: don't change uid/gid unless explicitly told to + +* **PR** `#46398`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-03-12 20:25:19 UTC* + + * 7cdb00ca9c Merge pull request `#46398`_ from rallytime/merge-2018.3 + + * d22e5ba442 Merge fix: return back `wb+` mode in `crypt.gen_keys`. + + * c7dddaf8ce Lint: Use log variable, not logger. + + * ca1860cd91 Use new get_umask function in mask calls in virt.py + + * 19ec7b6de1 Update old utils paths with new utils paths + + * d83727fdf9 Merge branch '2017.7' into '2018.3' + + * 95586678c3 Merge pull request `#46394`_ from Ch3LL/mac_doc + + * 158add6661 change oxdownload to oxdownload-{python_version} + + * 21aa848c89 Add mac py2 and py3 packages to mac installation docs + + * 07b5d09ac1 Merge pull request `#46338`_ from rallytime/fix-44831 + + * 90771da999 Remove cmd.wait deprecation reference in docs + + * 3849e7a085 Merge pull request `#46333`_ from danlsgiga/issue-42438 + + * 3b13f37b44 Revert changes in the code and change docs instead + + * 38114a65d8 Fixes color parameter mismatch and handles 204 responses correctly + + * a8f2f1b063 Merge pull request `#46322`_ from terminalmage/issue44935 + + * 85ac6a9893 yamlify_arg: don't treat leading dashes as lists + + * da5c282cb2 Merge pull request `#46327`_ from samilaine/fix-vmware-cloud-fqdn + + * 4b8dfb326f Modify the way a FQDN is handled in the vmware cloud provider. + + * 78c45d3786 Merge pull request `#46318`_ from terminalmage/squelch-warnings + + * 5889b36646 Skip type-checking for several gitfs/git_pillar/winrepo params + + * bb0d6fc263 Merge pull request `#46312`_ from gtmanfred/2017.7 + + * 749ae580ed add module_dirs to salt ssh thin tarball + + * 88b5f7383d Merge pull request `#46242`_ from redbaron4/fix-46127 + + * 06dba51617 Make changes from review + + * 727ebe1056 Merge branch '2017.7' into fix-46127 + + * 08d1ee8baf Fix Python3 test errors + + * aa9d709015 Pass env_vars to pip.freeze + + * a0716643e4 Merge pull request `#46265`_ from Ch3LL/profit_cloud + + * d4893eab4c Add username/password to profitbricks conf for cloud tests + + * ed7bffa7e0 Merge pull request `#46306`_ from rallytime/bp-46256 + + * 6439bce4a8 Don't install msgpack 0.5.5 + + * 8c2c4e3316 Merge pull request `#46208`_ from terminalmage/audit-umask-usage + + * 9c92aadce8 Disable blacklisted-function check for legitimate uses + + * 58a11aaa26 Disable pylint check in salt-ssh shim + + * ecadf67659 Blacklist os.umask + + * 31b1d98fcb Replace direct use of os.umask with use of existing context manager + + * 82ce546e18 Prevent failed os.makedirs from leaving modified umask in place + + * 978e869490 Merge pull request `#46293`_ from eliasp/2017.7-44624-py3-compat + + * 2e08b0d9c8 Fix Python3 comparison `TypeError` in `salt.modules.upstart` + + * bee4a66d0c Merge pull request `#46264`_ from terminalmage/issue46128 + + * 68000b7211 Fix incorrect merge conflict resolution + + * 1e0b3aa348 Merge pull request `#46296`_ from vutny/doc-pillar-get + + * 1faa8331e1 [DOC] Add missing params to `pillar.get` docstring + + * c490a50452 Merge pull request `#45874`_ from GwiYeong/2017.7-local-client-hotfix + + * 949aefc82b Merge branch '2017.7' into 2017.7-local-client-hotfix + + * 45d663f435 fix for local client timeout bug + + * 8e8a3a2897 Merge pull request `#46261`_ from rallytime/merge-2017.7 + + * 8256ae5ee5 Merge branch '2016.11' into '2017.7' + + * 140ef4d6b9 Merge pull request `#46253`_ from rallytime/doc-banners + + * 07ed8c7db3 Update docbanner for SaltConf18 + + * 9fe86ee520 Merge pull request `#46179`_ from wedge-jarrad/cifs-remount-fix + + * 9ca25c4313 Add credentials and secretfile to mount.mounted mount_invisible_keys + +* **PR** `#46421`_: (`bdrung`_) Skip SSHPasswordTests if ssh binary is not found + @ *2018-03-09 16:21:02 UTC* + + * 9c089aa4de Merge pull request `#46421`_ from bdrung/skip-ssh-tests-if-ssh-is-missing + + * 3d6f658309 Skip SSHPasswordTests if ssh binary is not found + +* **PR** `#46453`_: (`bdrung`_) Fix various spelling mistakes in 2018.3 + @ *2018-03-09 14:48:33 UTC* + + * **PR** `#46446`_: (`bdrung`_) Fix various typos (refs: `#46453`_) + + * 4cbfde5839 Merge pull request `#46453`_ from bdrung/fix-typos-2018.3 + + * 3d37eca847 Fix various spelling mistakes + +* **ISSUE** `#44032`_: (`PhilippeAB`_) blockreplace marker_end isn't applied with newline (refs: `#46430`_) + +* **PR** `#46437`_: (`terminalmage`_) Improve reliability/idempotence of file.blockreplace state (2018.3 branch) + @ *2018-03-08 15:38:53 UTC* + + * **PR** `#46430`_: (`terminalmage`_) Improve reliability/idempotence of file.blockreplace state (refs: `#46437`_) + + * a43d999fb8 Merge pull request `#46437`_ from terminalmage/issue44032-2018.3 + + * 4798187035 Improve reliability/idempotence of file.blockreplace state (2018.3 branch) + +* **PR** `#46328`_: (`dincamihai`_) Fix openscap push + @ *2018-03-07 17:51:41 UTC* + + * 0c66507aff Merge pull request `#46328`_ from dincamihai/2018.3.0rc1 + + * b5e508f339 Fix openscap push + +* **PR** `#46174`_: (`twangboy`_) Fix a unicode issue with the git module on Windows + @ *2018-03-06 18:53:53 UTC* + + * 82cb2ea5a0 Merge pull request `#46174`_ from twangboy/win_fix_test_git_2 + + * 80e3a47dd4 Add output_encoding argument to git state, and add docs + + * 661a0687ec Fix git utf-8 issues for Windows + +* **PR** `#46235`_: (`twangboy`_) Fix `unit.modules.test_ssh` for Windows + @ *2018-03-05 20:39:44 UTC* + + * 7690cf8564 Merge pull request `#46235`_ from twangboy/win_fix_test_ssh + + * 9ea02d7045 Use write instead of writelines for Windows + +* **PR** `#46332`_: (`terminalmage`_) Update the merge-forward docs to reference the 2018.3 branch + @ *2018-03-05 19:39:56 UTC* + + * c4f366cdd9 Merge pull request `#46332`_ from terminalmage/merge-forward-docs + + * 0411845cec Update the merge-forward docs to reference the 2018.3 branch + +* **PR** `#46307`_: (`rallytime`_) [2018.3] Merge forward from 2018.3.0rc1 to 2018.3 + @ *2018-03-03 12:56:07 UTC* + + * 241611aca5 Merge pull request `#46307`_ from rallytime/merge-2018.3 + + * c9fa21f62c Merge branch '2018.3.0rc1' into '2018.3' + +* **PR** `#46314`_: (`terminalmage`_) Merge 2017.7 branch into 2018.3 + @ *2018-03-03 12:54:27 UTC* + + * 30c34f0c62 Merge pull request `#46314`_ from terminalmage/merge-2017.7-2018.3 + + * 61ab47ee70 Merge branch '2017.7' into merge-2017.7-2018.3 + + * 88a3166589 Merge pull request `#46276`_ from terminalmage/issue44046 + + * a14d4daf8c salt.utils.docker.translate_input: operate on deepcopy of kwargs + + * da60399b8f Merge pull request `#46183`_ from oeuftete/fix-docker-container-running-host-config-ulimits + + * 5b09644429 Sort lists from Ulimits before comparing + + * 0b80f02226 Update old dockerng doc ref + + * 509429f08c Merge pull request `#46260`_ from terminalmage/git_pillar + + * b1ce2501fd Normalize global git_pillar/winrepo config items + + * a97a3e6fb0 Merge pull request `#46101`_ from jfindlay/openrc_ret + + * 2eef3c65a6 tests.unit.modules.gentoo_service add retcode arg + + * 81ec66fd8b modules.gentoo_service handle stopped retcode + + * 1a17593c05 Merge pull request `#46254`_ from rallytime/enterprise-banner + + * f5fae3dedf Update enterprise banner + + * 8c50ff32bd Merge pull request `#46250`_ from terminalmage/runner-docs + + * 91b4895087 Add documentation to the fileserver runner + + * 53067cca43 Merge pull request `#46243`_ from racker-markh/fix-openstack-private-network-issue + + * 50c1e140f0 Don't check deny private_ips already in the original list of private_ips + + * 15405c8760 Merge pull request `#46239`_ from terminalmage/issue46109 + + * 586d8b0dcf archive.extracted: don't check source file when if_missing path exists + +* **ISSUE** `#33177`_: (`robnagler`_) pillar.stack should not continue after errors (refs: `#46287`_) + +* **PR** `#46287`_: (`bbinet`_) Update PillarStack stack.py to latest upstream version + @ *2018-03-02 21:39:52 UTC* + + * 194b0317ac Merge pull request `#46287`_ from bbinet/upstream-pillarstack + + * b14b6f2c95 Update PillarStack stack.py to latest upstream version + +* **PR** `#46227`_: (`Ch3LL`_) Mock file_client call in smtp return test + @ *2018-02-28 22:12:22 UTC* + + * 7382654c70 Merge pull request `#46227`_ from Ch3LL/smtp_file_client + + * 280dc9a2b6 Mock file_client call in smtp return test + +* **PR** `#46232`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-02-28 19:16:37 UTC* + + * 123625213e Merge pull request `#46232`_ from rallytime/merge-2018.3 + + * 04f24c1794 Lint: fix from a bad merge + + * aad61c77bd Update old utils paths to new paths + + * 7243baf2c0 Merge branch '2017.7' into '2018.3' + + * 633e1208e4 Merge pull request `#46221`_ from terminalmage/salt-jenkins-854 + + * 0eb012659c Fix hanging tests in integration suite + + * 7917277345 Merge pull request `#46214`_ from vutny/formulas-readme-formatting + + * d702846961 [DOC] Replace `note` rST block for GitHub + + * a2e099b744 Merge pull request `#46203`_ from Ch3LL/7.5_release + + * 6ddf3246ce Add 2017.7.5 Release Notes File + + * 973b227818 Merge pull request `#46201`_ from rallytime/merge-2017.7 + + * 9ac2101baa Merge branch '2016.11' into '2017.7' + + * a4c5417d23 Merge pull request `#46132`_ from rallytime/2016.11_update_version_doc + + * d2196b6df3 Update release versions for the 2016.11 branch + + * 89cf2e5061 Merge pull request `#46139`_ from bdrung/os-grains + + * 0b445f2a37 tests: Add unit tests for _parse_os_release() + + * f6069b77ed Fix osfinger grain on Debian + + * 8dde55a761 tests: Add os_grains test cases for Debian + + * ff02ab9937 tests: Add Ubuntu 17.10 (artful) os_grains test case + + * 77d5356aba Fix incorrect oscodename grain on Ubuntu + + * 7e62dc9fd2 tests: Support reading os-release files from disk + + * a92ec0db1b Make _parse_os_release() always callable + + * eee1fe5b38 tests: Dissolve _run_ubuntu_os_grains_tests + + * 1d6ef731fe tests: Deduplicate _run_os_grains_tests() + + * c8c71e75ca Merge pull request `#46133`_ from rallytime/2017.7_update_version_doc + + * 0ed338e643 Update release versions for the 2017.7 branch + + * 390d592aa6 Merge pull request `#46185`_ from terminalmage/issue46124 + + * 3b58dd0da0 gitfs: Fix detection of base env when its ref is also mapped to a different env + + * 705caa8cca Merge pull request `#46148`_ from rallytime/merge-2017.7 + + * 25deebf7a6 Merge branch '2017.7.3' into '2017.7' + + * b5b083fd26 Merge pull request `#46074`_ from Ch3LL/update-7.4 + + * 8d0eeeb059 Update 2017.7.4 Release Notes with new fixes + + * 32f3d00e44 Merge pull request `#46066`_ from rallytime/pin-tornado + + * 6dc1a3b9dc Pin tornado version in requirements file + + * 85761ee650 Merge pull request `#46036`_ from terminalmage/issue43769 + + * e2140d9a84 Mock the ssh.key_is_encrypted utils func + + * 169924b3fe Move ssh.key_is_encrypted to a utils module temporarily + + * 54f4d78f7a Only keep ssh.py in the Windows installer + + * 5f04531e1b Keep ssh state and execution modules in the installer + + * f2b69f703d git.latest: Fix regression with identity file usage + + * 10a47dcbc4 Merge pull request `#46137`_ from damon-atkins/2017.7_fix_ec2_pillar2 + + * 99e7f6a7d3 update ec2 pillar arguments with better names + + * d74cb14557 Merge pull request `#46145`_ from terminalmage/issue46004 + + * 467ff841cd pillarenv argument should default to None and not the value from opts + + * 2a185855ea Better solution for fixing the opts munging in pillar.show_pillar runner + + * e2c4702e0c Update tests to reflect changes to the SaltCacheLoader + + * f9301fcc34 Document behavior when orchestration runnner invoked with non-orch states + + * 9644579cd0 Instantiate the SaltCacheLoader's fileclient in the __init__ + + * f9a6c86e21 salt.runners.pillar.show_pillar: don't modify master opts + + * e0940a9fc4 Properly detect use of the state.orch alias and add orch jid to kwargs + +* **ISSUE** `#42932`_: (`bobrik`_) cmd.run with bg: true doesn't fail properly (refs: `#45932`_, `#46172`_) + +* **PR** `#46172`_: (`The-Loeki`_) cmdmod: reimplementation of `#45932`_ for Oxygen + @ *2018-02-28 19:14:26 UTC* + + * **PR** `#45932`_: (`The-Loeki`_) Fix cmd run_all bg error (refs: `#46172`_) + + * **PR** `#39980`_: (`vutny`_) [2016.3] Allow to use `bg` kwarg for `cmd.run` state function (refs: `#45932`_, `#46172`_) + + * 20d869c228 Merge pull request `#46172`_ from The-Loeki/fix_cmd_run_all_bg_oxygen + + * 3ecf5018d0 Merge branch '2018.3' into fix_cmd_run_all_bg_oxygen + + * b5315e817b Merge branch '2018.3' into fix_cmd_run_all_bg_oxygen + + * beabf4f06b cmdmod: reimplementation of `#45932`_ for Oxygen + +* **PR** `#46238`_: (`terminalmage`_) Don't allow salt.utils.files.fopen() to open stdin/stdout/stderr + @ *2018-02-28 19:08:23 UTC* + + * 687575b582 Merge pull request `#46238`_ from terminalmage/fds-in-fopen + + * fe1527a3c4 Don't allow salt.utils.files.fopen() to open stdin/stdout/stderr + +* **PR** `#46219`_: (`twangboy`_) Fix `unit.modules.test_network` for Windows + @ *2018-02-28 15:45:02 UTC* + + * 3da5dcb313 Merge pull request `#46219`_ from twangboy/win_fix_inet_pton + + * 46f1d2cc09 Use six.text_type instead of six.u + +* **PR** `#46228`_: (`twangboy`_) Fix `unit.modules.test_pip` for Windows + @ *2018-02-28 15:37:49 UTC* + + * 44343f8063 Merge pull request `#46228`_ from twangboy/win_fix_test_pip + + * 415821eee9 Fix encoding issue + +* **PR** `#46198`_: (`rallytime`_) [2018.3] Merge forward from 2018.3.0rc1 to 2018.3 + @ *2018-02-27 15:17:51 UTC* + + * adc8950bbe Merge pull request `#46198`_ from rallytime/merge-2018.3 + + * 1b4dc71930 Lint fix + + * 776f2ea5d7 Merge branch '2018.3.0rc1' into '2018.3' + +* **ISSUE** `#45849`_: (`Epiclemonaid`_) XenServer Provisioning errors out on this line. removing it succeeds. (refs: `#46168`_) + +* **PR** `#46168`_: (`gtmanfred`_) driver and provider should be specified + @ *2018-02-26 16:17:13 UTC* + + * 06d2dff3ac Merge pull request `#46168`_ from gtmanfred/2018.3 + + * ac99bd26db driver and provider should be specified + +* **PR** `#46161`_: (`rallytime`_) [2018.3] Merge forward from 2017.7 to 2018.3 + @ *2018-02-26 15:29:39 UTC* + + * 605e5eff73 Merge pull request `#46161`_ from rallytime/merge-2018.3 + + * 69ac94baca Update utils paths + + * cffbf52c10 Lint fix: remove extra line + + * 79bed6cff1 Merge branch '2017.7' into '2018.3' + + * 0398ce0482 Merge pull request `#46135`_ from rallytime/bp-46088 + + * 57a60f62a3 fix kernel subpackages install bug + + * 1fcbbd1e02 Merge pull request `#46136`_ from rallytime/bp-46115 + + * 0a481d707f update digitalocean salt-cloud driver + + * 11e5e8eb86 Merge pull request `#45911`_ from twangboy/win_fix_lgpo_unicode + + * bcde5cc625 Update log statement + + * e9fa53d3b7 Change the Invalid Data Message + + * c818d4b791 Convert reg values to unicode for debug + + * 524a6a72a0 Merge pull request `#46123`_ from gtmanfred/2017.7 + + * 8d36730ef7 If no pubkey is passed in openmode fail + + * e48fa58012 Merge pull request `#46131`_ from vutny/doc-formula-formatting + + * d8fb051e44 [DOC] Fix code-blocks for reStructuredText + + * 6cea44ee95 Merge pull request `#46118`_ from rallytime/bp-44603 + + * 2a2c23c66b Fix acme state to correctly return on test + + * 16c382b55b Merge pull request `#46121`_ from rallytime/merge-2017.7 + + * 4c2f504a85 Merge branch '2016.11' into '2017.7' + + * e197a0fbc5 Merge pull request `#46076`_ from rallytime/bp-46066 + + * b94d73c53e Pin tornado version in requirements file + + * c72c1bde5f Merge pull request `#46093`_ from wedge-jarrad/contributing-doc-typo + + * 5a0fe104f7 Fix contributing doc typo + + * 3cb83ea87e Merge pull request `#45992`_ from bgridley/fix-routes-present-state + + * 679787699c Add vpc_peering_connection_id to describe_route_tables route_keys + + * 8a60635da0 Merge pull request `#46000`_ from terminalmage/issue45910 + + * 8cf13325ee salt.states.reg.present: Prevent traceback when reg data is binary + + * 1f44e285dc Merge pull request `#46011`_ from terminalmage/fix-solaris-runas + + * 8ee0a3a28b Move Solaris USER workaround up a bit + + * 13cdb52690 cmdmod.py: runas workaround for platforms that don't set a USER env var + + * 30fb8f7be0 Merge pull request `#45467`_ from twangboy/win_exclude_hidden + + * ea41215646 Make the regex pattern less greedy + + * 6d223cffa7 Add tip about passing bogus saltenv + + * 1282ae3a93 Skip hidden first + + * 437a457911 Skip hidden dirs in genrepo + + * 87dc554dc3 Add final updates to docs + + * 3646d5c897 Fix some docs formatting, add some warnings + + * 35c81faf5a Log the source_dir when caching the files + + * 91c3da8dfd Improve docs for pkg.refresh_db + + * 4803d92707 Add some documentation + + * 08b82e0875 Fix lint error, use raw + + * 2f712691cf Exclude hidden directories in pkg.refresh_db + + * b92346645b Merge pull request `#46107`_ from amendlik/yumpkg-assumeyes + + * 8d9a432fb2 Add --assumeyes to yum/dnf commands in yumpkg.refresh_db + + * 14fe423e0c Merge pull request `#46094`_ from kstreee/fix-memory-leak + + * 48080a1bae Fixes memory leak, saltclients should be cleaned after used. + + * aba00805f4 Adds set_close_callback function to removes stream instance after closed from a set streams. + + * 320c2037e1 Merge pull request `#46097`_ from vutny/fix-https-link + + * 2062fd0e5c [DOC] Put https link to the formulas doc page + + * 0eb137fb4e Merge pull request `#46103`_ from bdrung/2017.7 + + * dd3f936557 Fix skipping Kubernetes tests if client is not installed + + * c3a938e994 Merge pull request `#46070`_ from Ch3LL/fix-doc-dns + + * 2a5d855d97 add required arg to dns_check jinja doc example + + * 01042e9d77 Merge pull request `#46067`_ from rallytime/bp-45994 + + * a07bb48726 Correct formatting for lint + + * e8678f633d Fix Comment being None not '' and inject quotes into the TXT ChangeRecords + + * 5e0e2a30e2 Merge pull request `#45932`_ from The-Loeki/fix_cmd_run_all_bg + + * f83da27ca5 Merge branch '2017.7' into fix_cmd_run_all_bg + + * 771758fbca Merge branch '2017.7' into fix_cmd_run_all_bg + + * c54fcf7a2d cmd: move separate DRY logging blocks into _run, prevent logging on bg=True, don't use_vt on bg + + * ebb1f81a9b cmd run: when running in bg, force ignore_retcode=True + + * 45ace39961 Merge pull request `#46062`_ from vutny/pg-user-state-fix-typo + + * a5fbe4e95e Fix typo in postgres_user.present state function + + * edcb64de76 Merge pull request `#45763`_ from twangboy/win_fix_path_rehash + + * b9a2bc7b29 Fix hyperlinks + + * 29912adc15 Move the test_rehash test to test_win_functions + + * adc594c183 Remove duplicate link + + * e84628c1eb Add some comments to the code + + * d50d5f582f Add additional info to docs for `broadcast_setting_change` + + * 3a54e09cd9 Rename setting to message + + * a3f9e99bc0 Change to a generic function to broadcast change + + * 79299361c3 Create refresh_environment salt util + + * 967b83940c Fix rehash function + + * a46fbc546c Merge pull request `#46042`_ from jfindlay/file_tree_doc + + * 0ba4954a4b salt.pillar.file_tree revise module documentation + + * 3c6a5bf967 salt.pillar.file_tree provide better debug info + + * bb1cdc451e salt.pillar.file_tree no stack trace when nodegroups undefined + + * de86126dd8 Merge pull request `#46013`_ from rallytime/bp-45598 + + * 2ea3fef543 No lazy logging + + * f427b0febc Change formatting style of logging lines per review + + * ebb244396b Patch around ResourceRecords needing to be present for AliasTarget entries to work + +* **PR** `#46160`_: (`rallytime`_) Mark 2 tests as flaky + @ *2018-02-23 19:10:06 UTC* + + * 05b771bfd7 Merge pull request `#46160`_ from rallytime/flaky-tests + + * 49e49ae51b Mark 2 tests as flaky + +* **PR** `#46006`_: (`dincamihai`_) Remove obsolete unicode handling in pkg.info_installed + @ *2018-02-22 19:22:36 UTC* + + * 9b2bc1982c Merge pull request `#46006`_ from dincamihai/oxygen.rc1 + + * 99079fc442 Remove obsolete unicode handling in pkg.info_installed + +* **PR** `#46078`_: (`rallytime`_) [oxygen] Merge forward from oxygen.rc1 to oxygen + @ *2018-02-20 21:49:04 UTC* + + * 93dab45307 Merge pull request `#46078`_ from rallytime/merge-oxygen + + * 2d0f81fd1b Merge branch 'oxygen.rc1' into 'oxygen' + +* **ISSUE** `#45938`_: (`edgan`_) zookeeper.present state doesn't deal with an existing zode with no ACL specified (refs: `#46043`_) + +* **PR** `#46071`_: (`rallytime`_) Back-port `#46043`_ to oxygen + @ *2018-02-16 19:56:36 UTC* + + * **PR** `#46043`_: (`edgan`_) Allow zookeeper znode creation to not require an ACL (refs: `#46071`_) + + * 8d99c3b8fe Merge pull request `#46071`_ from rallytime/bp-46043 + + * b82c8bd630 Allow zookeeper znode creation to not require an ACL + +* **PR** `#46056`_: (`Ch3LL`_) Fix mac_assistive module not loading + @ *2018-02-16 14:57:46 UTC* + + * 5a31422432 Merge pull request `#46056`_ from Ch3LL/ver_mac + + * e44f5133c5 Fix mac_assistive module not loading + +* **PR** `#46041`_: (`rallytime`_) [oxygen] Merge forward from 2017.7 to oxygen + @ *2018-02-16 14:55:51 UTC* + + * cdca28f5da Merge pull request `#46041`_ from rallytime/merge-oxygen + + * e060a74fd8 Merge branch '2017.7' into 'oxygen' + + * 07e5735471 Merge pull request `#46016`_ from rallytime/bp-45826 + + * 1916e5c4a4 Fix selinux.fcontext_policy_present for Centos 6 + + * a1f4092811 Merge pull request `#46015`_ from rallytime/bp-45785 + + * ef6ffb1492 Resolve linting errors + + * 8047066c46 Remove unused import + + * 8f7c45935a Add tests for salt.modules.selinux.fcontext_get_policy + + * bafb7b4e6e Ensure parsed fields are stripped + + * a830a6e819 m/selinux.fcontext_get_policy allow long filespecs + + * 96097c037e Merge pull request `#46012`_ from rallytime/bp-45462 + + * 9f76836a6c emit port cli version, variants as separate args + + * 1279924f5f Merge pull request `#45991`_ from terminalmage/fix-duplicate-extra-opts + + * 916766f651 yumpkg: Fix a couple issues with _get_extra_opts + + * 8b9adc258e Merge pull request `#46017`_ from rallytime/merge-2017.7 + + * a06645ce71 Merge branch '2017.7.3' into '2017.7' + + * 6d534c6e7e Merge pull request `#46009`_ from Ch3LL/rn_7.4 + + * ac0baf4b34 Add 2017.7.4 Release Notes with PRs + + * ca76a0b328 Merge pull request `#45981`_ from gtmanfred/2017.7.3 + + * 0d448457dc apparently local is not set by default + + * 2a92f4bc16 use local config for vault when masterless + + * 6530649dbc Merge pull request `#45953`_ from rallytime/bp-45928-2017.7.3 + + * 85363189d1 Fixing vault when used with pillar over salt-ssh + + * fb378cebb0 Merge pull request `#45934`_ from rallytime/bp-45902 + + * bb83e8b345 Add regression test for issue 45893 + + * cdda66d759 Remove duplicated section in docstring and fix example + + * 4b6351cda6 Check the effective saltenv for cached archive + + * 0d74151c71 Merge pull request `#45935`_ from rallytime/bp-45742 + + * 6a0b5f7af3 Removed the chained copy + + * ad1150fad4 list.copy() is not compatible with python 2.7 + + * d20ff89414 Merge pull request `#45988`_ from rallytime/bp-45797 + + * 953a400d79 follow symlinks + + * b18087cee0 Merge pull request `#45711`_ from bdrung/fix-unicode-tests + + * b6181b5ed6 Fix Unicode tests when run with LC_ALL=POSIX + + * 5271fb1d40 Merge pull request `#45878`_ from damon-atkins/2017.7_fix_ec2_pillar + + * 0e74025714 Merge branch '2017.7' into 2017.7_fix_ec2_pillar + + * b4d0b23891 py3 fix + + * 75d9e20d8a Add ignoring 'terminated', 'stopped' instances, to improve changes of a single match + + * 0093472a37 added tag_key_list and tag_key_sep to create ec2_tags_list + + * afb3968aa7 ec2_pillar could not find instance-id, resolved. add support to use any tag to compare minion id against. + + * cf367dbd04 Merge pull request `#45942`_ from terminalmage/issue45679-2017.7 + + * 89cbd72a0d Don't try to sort ports when translating docker input + + * 9cd47b39dd Fix incorrect translation of docker port_bindings -> ports + + * dae41de7a8 Merge pull request `#45959`_ from rallytime/state-doc-update + + * 6f781cb95d A couple of grammar updates for the state compiler docs + + * 007214f7bf Merge pull request `#45908`_ from DimensionDataResearch/fix/issue/45884 + + * 1a75786b5a Fix linter warnings. + + * 82ec0b589c Revert to using salt.utils.cloud.is_public_ip. + + * 9b6b01873b Fix violations reported by flake8. + + * a2bc155c73 Use __utils__['cloud.'] instead of salt.cloud.utils. + + * 98907a32cb Ensure 'auth' parameter is correctly passed to dimensiondata driver. + + * de26b03e2c Fix copy/paste bug in dimensiondata provider integration test. + + * 6b1b6be427 Add integration tests for dimensiondata cloud provider. + + * f6ea9fed7d Ensure that event data provided by the dimensiondata driver is serialisable. + + * efcbfa868c Merge pull request `#45985`_ from garethgreenaway/2017_7_fixing_mac_tests_again + + * 7b8dc14433 Missing `format` in the call to write. + + * bf03abd07c Merge pull request `#45958`_ from garethgreenaway/backport-fixing_mactests_queue_full + + * 25dffaae91 Backporting `#45935`_ + + * bab365d6c6 Merge pull request `#45949`_ from rallytime/merge-2017.7 + + * f51687e903 Merge branch '2016.11' into '2017.7' + + * 7779fea7ba Merge pull request `#45940`_ from dmurphy18/fix_aix_cmdmod + + * dd2788419b Fix use of 'su' for AIX to use '-' + + * 7fd00ec752 Merge pull request `#45928`_ from garethgreenaway/45915_fixing_vault_pillar_for_salt_ssh + + * 259e60e5d4 Fixing vault when used with pillar over salt-ssh + + * 9d14ad9ccf Merge pull request `#45925`_ from terminalmage/fix-spelling + + * 7a143fe454 Fix spelling error in docstring + +* **PR** `#45972`_: (`mcalmer`_) move log_file option to changeable defaults + @ *2018-02-15 18:57:24 UTC* + + * 057e895faf Merge pull request `#45972`_ from mcalmer/allow-salt-ssh-define-log_file + + * f89a20bf3e move log_file option to changeable defaults + +* **PR** `#46007`_: (`rallytime`_) [oxygen] Merge forward from oxygen.rc1 to oxygen + @ *2018-02-13 18:50:09 UTC* + + * d4377d4678 Merge pull request `#46007`_ from rallytime/merge-oxygen + + * d6c2d0693a Merge branch 'oxygen.rc1' into 'oxygen' + +* **PR** `#45944`_: (`mirceaulinic`_) Add NetBox module autodoc + @ *2018-02-13 00:01:48 UTC* + + * 069f790b3c Merge pull request `#45944`_ from cloudflare/netbox-autodoc + + * ed69b987cf Add NetBox module autodoc + +* **PR** `#45984`_: (`garethgreenaway`_) [oxygen] Missing `format` in the call to write. + @ *2018-02-12 19:06:04 UTC* + + * 2a6285d313 Merge pull request `#45984`_ from garethgreenaway/fixing_mac_tests_again + + * ae7791d30b Missing `format` in the call to write. + +* **PR** `#45922`_: (`rallytime`_) [oxygen] Merge forward from 2017.7 to oxygen + @ *2018-02-09 20:24:26 UTC* + + * 88f481a3df Merge pull request `#45922`_ from rallytime/merge-oxygen + + * 9c49c8d47c Remove extra patch + + * b96f4cf8ad Remove duplicate import in cmdmod.py + + * 34ecdffa71 Replace old utils paths with new paths + + * d80547e0b8 Merge branch '2017.7' into 'oxygen' + + * 0cbe93cd69 Merge pull request `#45920`_ from rallytime/merge-2017.7 + + * e4e4744218 Merge branch '2016.11' into '2017.7' + + * 27ff82f996 Merge pull request `#45864`_ from rallytime/release-note-fix + + * 104a24f244 Remove extraneous ] in release notes for 2016.11.9 + + * 5fa010de2b Merge pull request `#45787`_ from rallytime/2016.11.9_docs + + * a38d4d44fa [2016.11] Bump latest and previous versions + + * 643a8a5278 Merge pull request `#45814`_ from gtmanfred/2017.7 + + * d8eec9aa97 fix cookies dict size changing in http.query + + * 3a3f87c16d Merge pull request `#45877`_ from rallytime/new-release-notes + + * f937e8ba81 Add release notes file for 2017.7.4 release + + * 1c3cc00670 Merge pull request `#45904`_ from rallytime/bp-41017 + + * 80c56cdcea Fixed typo in pkg state documentation + + * 317d35bd15 Merge pull request `#45907`_ from terminalmage/fix-grains-backport + + * 6cf7e50cc4 Fix backport of grains fix + + * dade5f0cab Merge pull request `#45906`_ from rallytime/bp-45548 + + * 1befa7386c Update x509.py + + * 82c473a1fe Merge pull request `#45902`_ from terminalmage/issue45893 + + * 9d200efc26 Add regression test for issue 45893 + + * 1468f1d0ff Remove duplicated section in docstring and fix example + + * 6cc5cd9b8a Check the effective saltenv for cached archive + + * fdedde3cfb Merge pull request `#45862`_ from rallytime/bp-45830 + + * 1024856f9a Wrapping the put_nowait in a try...except and catching the exception when the multiprocessing queue is full. This situation is happening when running the full testing suite on MacOS where the queue limit is 32767 vs on Linux where the queue limit is unlimited. + + * 43a45b42c3 Merge pull request `#45779`_ from The-Loeki/patch-3 + + * 8575ae3d52 Merge branch '2017.7' into patch-3 + + * 47cf00d88e SSH shell shim: Don't use $() for optimal support + + * cca997d0da Merge pull request `#45788`_ from rallytime/2017.7.3_docs + + * d5faf6126b [2017.7] Bump latest and previous versions + + * 746206cebe Merge pull request `#45842`_ from rallytime/bp-45827 + + * c631598a87 Fix traceback in disks grains when /sys/block not available + + * 900aadcd67 Merge pull request `#45721`_ from garethgreenaway/44978_show_duration_when_no_state_run + + * 359265869f Adding a couple tests to ensure that duration is included in state run results even when states do not run. + + * 912347abc3 Include the duration when a state does not run, for example when the `onchanges` requisite is not met. + + * 80a2d009b4 Merge pull request `#45517`_ from kstreee/fix-mkdir + + * 24d41f2451 Fixes base dir making logic to ensure not raising the exception when base directory already exists. + + * 7a4b1b2e77 Merge pull request `#45835`_ from kstreee/fix-missing-return-statement + + * 68c7f3dcba Adds a missing return statement. + + * 0a04f118c2 Merge pull request `#45840`_ from rallytime/bp-45603 + + * 9653363131 Fix for duplicate entries with pkrepo.managed + + * bd2178cd5f Merge pull request `#45716`_ from ciiqr/fix_cmd_script_quoting + + * 217791079b some code cleanup (lint errors and escape_argument as _cmd_quote) + + * 1c29bc5a3d fixed quoting of script path in cmd.script + + * 272f912c7c Merge pull request `#45719`_ from bdrung/fix-python3-sphinx-build + + * 179e8fbe73 doc: Do not mock non-existing __qualname__ attribute + + * 971e59ebe2 Drop enforcing new-style object for SaltYamlSafeLoader + + * fc04336c3b Merge pull request `#45764`_ from mchugh19/2017.7 + + * 0a7f1a4d75 English better + + * 37e067c7b5 support amazon linux 2 for service module + +* **PR** `#45861`_: (`rallytime`_) [oxygen] Merge forward from oxygen.rc1 to oxygen + @ *2018-02-08 13:39:59 UTC* + + * 048c18ea42 Merge pull request `#45861`_ from rallytime/merge-oxygen + + * 6d812ac192 Merge branch 'oxygen.rc1' into 'oxygen' + +* **PR** `#45852`_: (`Giandom`_) fix-missing-highstate-module-import + @ *2018-02-05 15:02:39 UTC* + + * 1bd38fb3b7 Merge pull request `#45852`_ from Giandom/fix-missing-highstate-module-import + + * dc5a8f9233 fix-missing-highstate-module-import + +* **PR** `#45829`_: (`rallytime`_) [oxygen] Merge forward from 2017.7 to oxygen + @ *2018-02-02 20:20:32 UTC* + + * 5f54ce7b5f Merge pull request `#45829`_ from rallytime/merge-oxygen + + * 34a17819ca Add opts to salt.utils.jid.gen_jid call in minion.py + + * 79d071df9c Merge branch '2017.7' into 'oxygen' + + * f234bf52f4 Merge pull request `#45756`_ from roaldnefs/fix-grafana4-documentation + + * 92979c0b57 Fix grafana4 states documentation + + * 685b683db5 Merge pull request `#45801`_ from rallytime/merge-2017.7 + + * 26e992e011 Merge branch '2016.11' into '2017.7' + + * 746386d04c Merge pull request `#45794`_ from vutny/doc-file-state-examples + + * ddfeae6a29 [DOC] Fix code-block rST directive in file state module + + * abc9ece214 Merge pull request `#45780`_ from vutny/doc-pkgrepo-zypper + + * f80c7d8d69 [DOC] Add missing gpgautoimport for pkgrepo.managed + + * c7d319f3bc Merge pull request `#45802`_ from rallytime/merge-2017.7-from-2017.7.3 + + * eb48513ba0 Merge branch '2017.7.3' into '2017.7' + + * 1439da8d76 Merge pull request `#45755`_ from terminalmage/issue45743 + + * 8af1251c59 salt.crypt: Ensure message is encoded before signing + + * 96e9232cc2 Merge pull request `#45761`_ from gtmanfred/2017.7 + + * 280767ed57 generate a jid for cache_jobs on the minion + +* **PR** `#45819`_: (`Giandom`_) oxygen-added-highstate-output-to-slack-engine + @ *2018-02-01 18:38:42 UTC* + + * 3471796c51 Merge pull request `#45819`_ from Giandom/oxygen-added-highstate-output-to-slack-engine + + * 1af8899a9d oxygen-added-highstate-output-to-slack-engine + +.. _`#1`: https://github.com/saltstack/salt/issues/1 +.. _`#26920`: https://github.com/saltstack/salt/issues/26920 +.. _`#33177`: https://github.com/saltstack/salt/issues/33177 +.. _`#36802`: https://github.com/saltstack/salt/issues/36802 +.. _`#38838`: https://github.com/saltstack/salt/issues/38838 +.. _`#39832`: https://github.com/saltstack/salt/issues/39832 +.. _`#39980`: https://github.com/saltstack/salt/pull/39980 +.. _`#40961`: https://github.com/saltstack/salt/pull/40961 +.. _`#41233`: https://github.com/saltstack/salt/pull/41233 +.. _`#42932`: https://github.com/saltstack/salt/issues/42932 +.. _`#43208`: https://github.com/saltstack/salt/issues/43208 +.. _`#43405`: https://github.com/saltstack/salt/issues/43405 +.. _`#43499`: https://github.com/saltstack/salt/issues/43499 +.. _`#44032`: https://github.com/saltstack/salt/issues/44032 +.. _`#44299`: https://github.com/saltstack/salt/issues/44299 +.. _`#44452`: https://github.com/saltstack/salt/issues/44452 +.. _`#44455`: https://github.com/saltstack/salt/pull/44455 +.. _`#44638`: https://github.com/saltstack/salt/pull/44638 +.. _`#44926`: https://github.com/saltstack/salt/pull/44926 +.. _`#45467`: https://github.com/saltstack/salt/pull/45467 +.. _`#45517`: https://github.com/saltstack/salt/pull/45517 +.. _`#45711`: https://github.com/saltstack/salt/pull/45711 +.. _`#45716`: https://github.com/saltstack/salt/pull/45716 +.. _`#45719`: https://github.com/saltstack/salt/pull/45719 +.. _`#45721`: https://github.com/saltstack/salt/pull/45721 +.. _`#45755`: https://github.com/saltstack/salt/pull/45755 +.. _`#45756`: https://github.com/saltstack/salt/pull/45756 +.. _`#45761`: https://github.com/saltstack/salt/pull/45761 +.. _`#45763`: https://github.com/saltstack/salt/pull/45763 +.. _`#45764`: https://github.com/saltstack/salt/pull/45764 +.. _`#45774`: https://github.com/saltstack/salt/pull/45774 +.. _`#45779`: https://github.com/saltstack/salt/pull/45779 +.. _`#45780`: https://github.com/saltstack/salt/pull/45780 +.. _`#45787`: https://github.com/saltstack/salt/pull/45787 +.. _`#45788`: https://github.com/saltstack/salt/pull/45788 +.. _`#45790`: https://github.com/saltstack/salt/issues/45790 +.. _`#45794`: https://github.com/saltstack/salt/pull/45794 +.. _`#45801`: https://github.com/saltstack/salt/pull/45801 +.. _`#45802`: https://github.com/saltstack/salt/pull/45802 +.. _`#45814`: https://github.com/saltstack/salt/pull/45814 +.. _`#45819`: https://github.com/saltstack/salt/pull/45819 +.. _`#45829`: https://github.com/saltstack/salt/pull/45829 +.. _`#45835`: https://github.com/saltstack/salt/pull/45835 +.. _`#45840`: https://github.com/saltstack/salt/pull/45840 +.. _`#45842`: https://github.com/saltstack/salt/pull/45842 +.. _`#45849`: https://github.com/saltstack/salt/issues/45849 +.. _`#45852`: https://github.com/saltstack/salt/pull/45852 +.. _`#45861`: https://github.com/saltstack/salt/pull/45861 +.. _`#45862`: https://github.com/saltstack/salt/pull/45862 +.. _`#45864`: https://github.com/saltstack/salt/pull/45864 +.. _`#45874`: https://github.com/saltstack/salt/pull/45874 +.. _`#45877`: https://github.com/saltstack/salt/pull/45877 +.. _`#45878`: https://github.com/saltstack/salt/pull/45878 +.. _`#45902`: https://github.com/saltstack/salt/pull/45902 +.. _`#45904`: https://github.com/saltstack/salt/pull/45904 +.. _`#45906`: https://github.com/saltstack/salt/pull/45906 +.. _`#45907`: https://github.com/saltstack/salt/pull/45907 +.. _`#45908`: https://github.com/saltstack/salt/pull/45908 +.. _`#45911`: https://github.com/saltstack/salt/pull/45911 +.. _`#45920`: https://github.com/saltstack/salt/pull/45920 +.. _`#45922`: https://github.com/saltstack/salt/pull/45922 +.. _`#45925`: https://github.com/saltstack/salt/pull/45925 +.. _`#45928`: https://github.com/saltstack/salt/pull/45928 +.. _`#45932`: https://github.com/saltstack/salt/pull/45932 +.. _`#45934`: https://github.com/saltstack/salt/pull/45934 +.. _`#45935`: https://github.com/saltstack/salt/pull/45935 +.. _`#45938`: https://github.com/saltstack/salt/issues/45938 +.. _`#45940`: https://github.com/saltstack/salt/pull/45940 +.. _`#45942`: https://github.com/saltstack/salt/pull/45942 +.. _`#45944`: https://github.com/saltstack/salt/pull/45944 +.. _`#45949`: https://github.com/saltstack/salt/pull/45949 +.. _`#45953`: https://github.com/saltstack/salt/pull/45953 +.. _`#45958`: https://github.com/saltstack/salt/pull/45958 +.. _`#45959`: https://github.com/saltstack/salt/pull/45959 +.. _`#45972`: https://github.com/saltstack/salt/pull/45972 +.. _`#45981`: https://github.com/saltstack/salt/pull/45981 +.. _`#45984`: https://github.com/saltstack/salt/pull/45984 +.. _`#45985`: https://github.com/saltstack/salt/pull/45985 +.. _`#45988`: https://github.com/saltstack/salt/pull/45988 +.. _`#45991`: https://github.com/saltstack/salt/pull/45991 +.. _`#45992`: https://github.com/saltstack/salt/pull/45992 +.. _`#46000`: https://github.com/saltstack/salt/pull/46000 +.. _`#46002`: https://github.com/saltstack/salt/pull/46002 +.. _`#46006`: https://github.com/saltstack/salt/pull/46006 +.. _`#46007`: https://github.com/saltstack/salt/pull/46007 +.. _`#46009`: https://github.com/saltstack/salt/pull/46009 +.. _`#46011`: https://github.com/saltstack/salt/pull/46011 +.. _`#46012`: https://github.com/saltstack/salt/pull/46012 +.. _`#46013`: https://github.com/saltstack/salt/pull/46013 +.. _`#46015`: https://github.com/saltstack/salt/pull/46015 +.. _`#46016`: https://github.com/saltstack/salt/pull/46016 +.. _`#46017`: https://github.com/saltstack/salt/pull/46017 +.. _`#46023`: https://github.com/saltstack/salt/pull/46023 +.. _`#46024`: https://github.com/saltstack/salt/pull/46024 +.. _`#46036`: https://github.com/saltstack/salt/pull/46036 +.. _`#46041`: https://github.com/saltstack/salt/pull/46041 +.. _`#46042`: https://github.com/saltstack/salt/pull/46042 +.. _`#46043`: https://github.com/saltstack/salt/pull/46043 +.. _`#46056`: https://github.com/saltstack/salt/pull/46056 +.. _`#46062`: https://github.com/saltstack/salt/pull/46062 +.. _`#46066`: https://github.com/saltstack/salt/pull/46066 +.. _`#46067`: https://github.com/saltstack/salt/pull/46067 +.. _`#46070`: https://github.com/saltstack/salt/pull/46070 +.. _`#46071`: https://github.com/saltstack/salt/pull/46071 +.. _`#46074`: https://github.com/saltstack/salt/pull/46074 +.. _`#46076`: https://github.com/saltstack/salt/pull/46076 +.. _`#46078`: https://github.com/saltstack/salt/pull/46078 +.. _`#46093`: https://github.com/saltstack/salt/pull/46093 +.. _`#46094`: https://github.com/saltstack/salt/pull/46094 +.. _`#46097`: https://github.com/saltstack/salt/pull/46097 +.. _`#46100`: https://github.com/saltstack/salt/pull/46100 +.. _`#46101`: https://github.com/saltstack/salt/pull/46101 +.. _`#46103`: https://github.com/saltstack/salt/pull/46103 +.. _`#46107`: https://github.com/saltstack/salt/pull/46107 +.. _`#46118`: https://github.com/saltstack/salt/pull/46118 +.. _`#46121`: https://github.com/saltstack/salt/pull/46121 +.. _`#46123`: https://github.com/saltstack/salt/pull/46123 +.. _`#46131`: https://github.com/saltstack/salt/pull/46131 +.. _`#46132`: https://github.com/saltstack/salt/pull/46132 +.. _`#46133`: https://github.com/saltstack/salt/pull/46133 +.. _`#46135`: https://github.com/saltstack/salt/pull/46135 +.. _`#46136`: https://github.com/saltstack/salt/pull/46136 +.. _`#46137`: https://github.com/saltstack/salt/pull/46137 +.. _`#46139`: https://github.com/saltstack/salt/pull/46139 +.. _`#46145`: https://github.com/saltstack/salt/pull/46145 +.. _`#46148`: https://github.com/saltstack/salt/pull/46148 +.. _`#46150`: https://github.com/saltstack/salt/issues/46150 +.. _`#46160`: https://github.com/saltstack/salt/pull/46160 +.. _`#46161`: https://github.com/saltstack/salt/pull/46161 +.. _`#46162`: https://github.com/saltstack/salt/pull/46162 +.. _`#46168`: https://github.com/saltstack/salt/pull/46168 +.. _`#46171`: https://github.com/saltstack/salt/pull/46171 +.. _`#46172`: https://github.com/saltstack/salt/pull/46172 +.. _`#46174`: https://github.com/saltstack/salt/pull/46174 +.. _`#46179`: https://github.com/saltstack/salt/pull/46179 +.. _`#46183`: https://github.com/saltstack/salt/pull/46183 +.. _`#46185`: https://github.com/saltstack/salt/pull/46185 +.. _`#46198`: https://github.com/saltstack/salt/pull/46198 +.. _`#46201`: https://github.com/saltstack/salt/pull/46201 +.. _`#46203`: https://github.com/saltstack/salt/pull/46203 +.. _`#46208`: https://github.com/saltstack/salt/pull/46208 +.. _`#46214`: https://github.com/saltstack/salt/pull/46214 +.. _`#46219`: https://github.com/saltstack/salt/pull/46219 +.. _`#46221`: https://github.com/saltstack/salt/pull/46221 +.. _`#46227`: https://github.com/saltstack/salt/pull/46227 +.. _`#46228`: https://github.com/saltstack/salt/pull/46228 +.. _`#46232`: https://github.com/saltstack/salt/pull/46232 +.. _`#46235`: https://github.com/saltstack/salt/pull/46235 +.. _`#46238`: https://github.com/saltstack/salt/pull/46238 +.. _`#46239`: https://github.com/saltstack/salt/pull/46239 +.. _`#46242`: https://github.com/saltstack/salt/pull/46242 +.. _`#46243`: https://github.com/saltstack/salt/pull/46243 +.. _`#46250`: https://github.com/saltstack/salt/pull/46250 +.. _`#46253`: https://github.com/saltstack/salt/pull/46253 +.. _`#46254`: https://github.com/saltstack/salt/pull/46254 +.. _`#46260`: https://github.com/saltstack/salt/pull/46260 +.. _`#46261`: https://github.com/saltstack/salt/pull/46261 +.. _`#46264`: https://github.com/saltstack/salt/pull/46264 +.. _`#46265`: https://github.com/saltstack/salt/pull/46265 +.. _`#46276`: https://github.com/saltstack/salt/pull/46276 +.. _`#46280`: https://github.com/saltstack/salt/pull/46280 +.. _`#46287`: https://github.com/saltstack/salt/pull/46287 +.. _`#46293`: https://github.com/saltstack/salt/pull/46293 +.. _`#46296`: https://github.com/saltstack/salt/pull/46296 +.. _`#46306`: https://github.com/saltstack/salt/pull/46306 +.. _`#46307`: https://github.com/saltstack/salt/pull/46307 +.. _`#46309`: https://github.com/saltstack/salt/pull/46309 +.. _`#46310`: https://github.com/saltstack/salt/pull/46310 +.. _`#46312`: https://github.com/saltstack/salt/pull/46312 +.. _`#46314`: https://github.com/saltstack/salt/pull/46314 +.. _`#46316`: https://github.com/saltstack/salt/pull/46316 +.. _`#46318`: https://github.com/saltstack/salt/pull/46318 +.. _`#46320`: https://github.com/saltstack/salt/pull/46320 +.. _`#46322`: https://github.com/saltstack/salt/pull/46322 +.. _`#46326`: https://github.com/saltstack/salt/pull/46326 +.. _`#46327`: https://github.com/saltstack/salt/pull/46327 +.. _`#46328`: https://github.com/saltstack/salt/pull/46328 +.. _`#46330`: https://github.com/saltstack/salt/pull/46330 +.. _`#46332`: https://github.com/saltstack/salt/pull/46332 +.. _`#46333`: https://github.com/saltstack/salt/pull/46333 +.. _`#46334`: https://github.com/saltstack/salt/issues/46334 +.. _`#46337`: https://github.com/saltstack/salt/pull/46337 +.. _`#46338`: https://github.com/saltstack/salt/pull/46338 +.. _`#46339`: https://github.com/saltstack/salt/pull/46339 +.. _`#46379`: https://github.com/saltstack/salt/pull/46379 +.. _`#46394`: https://github.com/saltstack/salt/pull/46394 +.. _`#46398`: https://github.com/saltstack/salt/pull/46398 +.. _`#46404`: https://github.com/saltstack/salt/pull/46404 +.. _`#46413`: https://github.com/saltstack/salt/pull/46413 +.. _`#46416`: https://github.com/saltstack/salt/pull/46416 +.. _`#46420`: https://github.com/saltstack/salt/pull/46420 +.. _`#46421`: https://github.com/saltstack/salt/pull/46421 +.. _`#46422`: https://github.com/saltstack/salt/pull/46422 +.. _`#46426`: https://github.com/saltstack/salt/pull/46426 +.. _`#46428`: https://github.com/saltstack/salt/pull/46428 +.. _`#46429`: https://github.com/saltstack/salt/pull/46429 +.. _`#46430`: https://github.com/saltstack/salt/pull/46430 +.. _`#46432`: https://github.com/saltstack/salt/pull/46432 +.. _`#46434`: https://github.com/saltstack/salt/pull/46434 +.. _`#46437`: https://github.com/saltstack/salt/pull/46437 +.. _`#46446`: https://github.com/saltstack/salt/pull/46446 +.. _`#46449`: https://github.com/saltstack/salt/pull/46449 +.. _`#46450`: https://github.com/saltstack/salt/pull/46450 +.. _`#46452`: https://github.com/saltstack/salt/pull/46452 +.. _`#46453`: https://github.com/saltstack/salt/pull/46453 +.. _`#46454`: https://github.com/saltstack/salt/pull/46454 +.. _`#46455`: https://github.com/saltstack/salt/pull/46455 +.. _`#46463`: https://github.com/saltstack/salt/pull/46463 +.. _`#46464`: https://github.com/saltstack/salt/pull/46464 +.. _`#46482`: https://github.com/saltstack/salt/pull/46482 +.. _`#46493`: https://github.com/saltstack/salt/pull/46493 +.. _`#46496`: https://github.com/saltstack/salt/pull/46496 +.. _`#46502`: https://github.com/saltstack/salt/pull/46502 +.. _`#46503`: https://github.com/saltstack/salt/pull/46503 +.. _`#46504`: https://github.com/saltstack/salt/issues/46504 +.. _`#46511`: https://github.com/saltstack/salt/pull/46511 +.. _`#46513`: https://github.com/saltstack/salt/pull/46513 +.. _`#46519`: https://github.com/saltstack/salt/pull/46519 +.. _`#46520`: https://github.com/saltstack/salt/pull/46520 +.. _`#46526`: https://github.com/saltstack/salt/pull/46526 +.. _`#46527`: https://github.com/saltstack/salt/pull/46527 +.. _`#46529`: https://github.com/saltstack/salt/pull/46529 +.. _`#46531`: https://github.com/saltstack/salt/pull/46531 +.. _`#46537`: https://github.com/saltstack/salt/pull/46537 +.. _`#46539`: https://github.com/saltstack/salt/pull/46539 +.. _`#46540`: https://github.com/saltstack/salt/pull/46540 +.. _`#46541`: https://github.com/saltstack/salt/pull/46541 +.. _`#46543`: https://github.com/saltstack/salt/pull/46543 +.. _`#46547`: https://github.com/saltstack/salt/pull/46547 +.. _`#46548`: https://github.com/saltstack/salt/pull/46548 +.. _`#46549`: https://github.com/saltstack/salt/pull/46549 +.. _`#46551`: https://github.com/saltstack/salt/pull/46551 +.. _`#46561`: https://github.com/saltstack/salt/pull/46561 +.. _`#46563`: https://github.com/saltstack/salt/pull/46563 +.. _`#46565`: https://github.com/saltstack/salt/pull/46565 +.. _`#46567`: https://github.com/saltstack/salt/pull/46567 +.. _`#46569`: https://github.com/saltstack/salt/pull/46569 +.. _`#46571`: https://github.com/saltstack/salt/pull/46571 +.. _`#46572`: https://github.com/saltstack/salt/pull/46572 +.. _`#46577`: https://github.com/saltstack/salt/pull/46577 +.. _`#46580`: https://github.com/saltstack/salt/pull/46580 +.. _`#46584`: https://github.com/saltstack/salt/pull/46584 +.. _`#46588`: https://github.com/saltstack/salt/pull/46588 +.. _`#46606`: https://github.com/saltstack/salt/pull/46606 +.. _`#46612`: https://github.com/saltstack/salt/pull/46612 +.. _`#46613`: https://github.com/saltstack/salt/pull/46613 +.. _`#46619`: https://github.com/saltstack/salt/pull/46619 +.. _`#46620`: https://github.com/saltstack/salt/pull/46620 +.. _`#46624`: https://github.com/saltstack/salt/pull/46624 +.. _`#46631`: https://github.com/saltstack/salt/pull/46631 +.. _`#46632`: https://github.com/saltstack/salt/pull/46632 +.. _`#46639`: https://github.com/saltstack/salt/pull/46639 +.. _`#46640`: https://github.com/saltstack/salt/pull/46640 +.. _`#46641`: https://github.com/saltstack/salt/pull/46641 +.. _`#46642`: https://github.com/saltstack/salt/pull/46642 +.. _`#46643`: https://github.com/saltstack/salt/pull/46643 +.. _`#46645`: https://github.com/saltstack/salt/pull/46645 +.. _`#46646`: https://github.com/saltstack/salt/pull/46646 +.. _`#46647`: https://github.com/saltstack/salt/pull/46647 +.. _`#46649`: https://github.com/saltstack/salt/pull/46649 +.. _`#46650`: https://github.com/saltstack/salt/pull/46650 +.. _`#46655`: https://github.com/saltstack/salt/pull/46655 +.. _`#46659`: https://github.com/saltstack/salt/issues/46659 +.. _`#46660`: https://github.com/saltstack/salt/issues/46660 +.. _`#46661`: https://github.com/saltstack/salt/pull/46661 +.. _`#46668`: https://github.com/saltstack/salt/issues/46668 +.. _`#46669`: https://github.com/saltstack/salt/pull/46669 +.. _`#46675`: https://github.com/saltstack/salt/pull/46675 +.. _`#46679`: https://github.com/saltstack/salt/pull/46679 +.. _`#46690`: https://github.com/saltstack/salt/pull/46690 +.. _`#46691`: https://github.com/saltstack/salt/pull/46691 +.. _`#46692`: https://github.com/saltstack/salt/pull/46692 +.. _`#46693`: https://github.com/saltstack/salt/pull/46693 +.. _`#46696`: https://github.com/saltstack/salt/pull/46696 +.. _`#46709`: https://github.com/saltstack/salt/pull/46709 +.. _`#46711`: https://github.com/saltstack/salt/pull/46711 +.. _`#46720`: https://github.com/saltstack/salt/pull/46720 +.. _`#46729`: https://github.com/saltstack/salt/pull/46729 +.. _`#46731`: https://github.com/saltstack/salt/pull/46731 +.. _`#46732`: https://github.com/saltstack/salt/pull/46732 +.. _`#46733`: https://github.com/saltstack/salt/pull/46733 +.. _`#46734`: https://github.com/saltstack/salt/pull/46734 +.. _`#46739`: https://github.com/saltstack/salt/pull/46739 +.. _`#46740`: https://github.com/saltstack/salt/pull/46740 +.. _`#46742`: https://github.com/saltstack/salt/pull/46742 +.. _`#46743`: https://github.com/saltstack/salt/pull/46743 +.. _`#46744`: https://github.com/saltstack/salt/pull/46744 +.. _`#46746`: https://github.com/saltstack/salt/pull/46746 +.. _`#46749`: https://github.com/saltstack/salt/pull/46749 +.. _`#46751`: https://github.com/saltstack/salt/pull/46751 +.. _`#46754`: https://github.com/saltstack/salt/issues/46754 +.. _`#46756`: https://github.com/saltstack/salt/pull/46756 +.. _`#46766`: https://github.com/saltstack/salt/pull/46766 +.. _`#46769`: https://github.com/saltstack/salt/pull/46769 +.. _`#46770`: https://github.com/saltstack/salt/pull/46770 +.. _`#46776`: https://github.com/saltstack/salt/pull/46776 +.. _`#46778`: https://github.com/saltstack/salt/pull/46778 +.. _`#46779`: https://github.com/saltstack/salt/issues/46779 +.. _`#46783`: https://github.com/saltstack/salt/pull/46783 +.. _`#46786`: https://github.com/saltstack/salt/pull/46786 +.. _`#46788`: https://github.com/saltstack/salt/pull/46788 +.. _`#46792`: https://github.com/saltstack/salt/pull/46792 +.. _`#46796`: https://github.com/saltstack/salt/pull/46796 +.. _`#46799`: https://github.com/saltstack/salt/pull/46799 +.. _`#46800`: https://github.com/saltstack/salt/pull/46800 +.. _`#46808`: https://github.com/saltstack/salt/issues/46808 +.. _`#46809`: https://github.com/saltstack/salt/pull/46809 +.. _`#46813`: https://github.com/saltstack/salt/pull/46813 +.. _`#46814`: https://github.com/saltstack/salt/pull/46814 +.. _`#46815`: https://github.com/saltstack/salt/pull/46815 +.. _`#46820`: https://github.com/saltstack/salt/pull/46820 +.. _`#46821`: https://github.com/saltstack/salt/pull/46821 +.. _`#46823`: https://github.com/saltstack/salt/pull/46823 +.. _`#46834`: https://github.com/saltstack/salt/issues/46834 +.. _`#46836`: https://github.com/saltstack/salt/pull/46836 +.. _`#46837`: https://github.com/saltstack/salt/pull/46837 +.. _`#46838`: https://github.com/saltstack/salt/pull/46838 +.. _`#46839`: https://github.com/saltstack/salt/pull/46839 +.. _`#46844`: https://github.com/saltstack/salt/pull/46844 +.. _`#46845`: https://github.com/saltstack/salt/pull/46845 +.. _`#46847`: https://github.com/saltstack/salt/pull/46847 +.. _`#46848`: https://github.com/saltstack/salt/pull/46848 +.. _`#46849`: https://github.com/saltstack/salt/pull/46849 +.. _`#46850`: https://github.com/saltstack/salt/pull/46850 +.. _`#46851`: https://github.com/saltstack/salt/pull/46851 +.. _`#46852`: https://github.com/saltstack/salt/pull/46852 +.. _`#46853`: https://github.com/saltstack/salt/pull/46853 +.. _`#46859`: https://github.com/saltstack/salt/issues/46859 +.. _`#46862`: https://github.com/saltstack/salt/issues/46862 +.. _`#46863`: https://github.com/saltstack/salt/pull/46863 +.. _`#46864`: https://github.com/saltstack/salt/issues/46864 +.. _`#46865`: https://github.com/saltstack/salt/pull/46865 +.. _`#46867`: https://github.com/saltstack/salt/pull/46867 +.. _`#46868`: https://github.com/saltstack/salt/issues/46868 +.. _`#46869`: https://github.com/saltstack/salt/pull/46869 +.. _`#46870`: https://github.com/saltstack/salt/pull/46870 +.. _`#46872`: https://github.com/saltstack/salt/pull/46872 +.. _`#46873`: https://github.com/saltstack/salt/pull/46873 +.. _`#46874`: https://github.com/saltstack/salt/pull/46874 +.. _`#46878`: https://github.com/saltstack/salt/pull/46878 +.. _`#46879`: https://github.com/saltstack/salt/pull/46879 +.. _`#46880`: https://github.com/saltstack/salt/issues/46880 +.. _`#46881`: https://github.com/saltstack/salt/issues/46881 +.. _`#46882`: https://github.com/saltstack/salt/pull/46882 +.. _`#46887`: https://github.com/saltstack/salt/issues/46887 +.. _`#46899`: https://github.com/saltstack/salt/pull/46899 +.. _`#46900`: https://github.com/saltstack/salt/pull/46900 +.. _`#46906`: https://github.com/saltstack/salt/issues/46906 +.. _`#46908`: https://github.com/saltstack/salt/pull/46908 +.. _`#46909`: https://github.com/saltstack/salt/issues/46909 +.. _`#46912`: https://github.com/saltstack/salt/pull/46912 +.. _`#46913`: https://github.com/saltstack/salt/pull/46913 +.. _`#46917`: https://github.com/saltstack/salt/issues/46917 +.. _`#46918`: https://github.com/saltstack/salt/issues/46918 +.. _`#46919`: https://github.com/saltstack/salt/pull/46919 +.. _`#46925`: https://github.com/saltstack/salt/pull/46925 +.. _`#46929`: https://github.com/saltstack/salt/issues/46929 +.. _`#46930`: https://github.com/saltstack/salt/pull/46930 +.. _`#46931`: https://github.com/saltstack/salt/issues/46931 +.. _`#46934`: https://github.com/saltstack/salt/issues/46934 +.. _`#46936`: https://github.com/saltstack/salt/pull/46936 +.. _`#46937`: https://github.com/saltstack/salt/pull/46937 +.. _`#46943`: https://github.com/saltstack/salt/issues/46943 +.. _`#46944`: https://github.com/saltstack/salt/pull/46944 +.. _`#46945`: https://github.com/saltstack/salt/pull/46945 +.. _`#46947`: https://github.com/saltstack/salt/issues/46947 +.. _`#46951`: https://github.com/saltstack/salt/issues/46951 +.. _`#46953`: https://github.com/saltstack/salt/issues/46953 +.. _`#46966`: https://github.com/saltstack/salt/pull/46966 +.. _`#46973`: https://github.com/saltstack/salt/pull/46973 +.. _`#46975`: https://github.com/saltstack/salt/pull/46975 +.. _`#46977`: https://github.com/saltstack/salt/issues/46977 +.. _`#46985`: https://github.com/saltstack/salt/issues/46985 +.. _`#46989`: https://github.com/saltstack/salt/pull/46989 +.. _`#46990`: https://github.com/saltstack/salt/pull/46990 +.. _`#46991`: https://github.com/saltstack/salt/pull/46991 +.. _`#46993`: https://github.com/saltstack/salt/pull/46993 +.. _`#46997`: https://github.com/saltstack/salt/pull/46997 +.. _`#46999`: https://github.com/saltstack/salt/pull/46999 +.. _`#47006`: https://github.com/saltstack/salt/issues/47006 +.. _`#47007`: https://github.com/saltstack/salt/pull/47007 +.. _`#47008`: https://github.com/saltstack/salt/pull/47008 +.. _`#47009`: https://github.com/saltstack/salt/pull/47009 +.. _`#47012`: https://github.com/saltstack/salt/pull/47012 +.. _`#47017`: https://github.com/saltstack/salt/pull/47017 +.. _`#47019`: https://github.com/saltstack/salt/pull/47019 +.. _`#47020`: https://github.com/saltstack/salt/pull/47020 +.. _`#47021`: https://github.com/saltstack/salt/pull/47021 +.. _`#47022`: https://github.com/saltstack/salt/pull/47022 +.. _`#47023`: https://github.com/saltstack/salt/pull/47023 +.. _`#47025`: https://github.com/saltstack/salt/pull/47025 +.. _`#47026`: https://github.com/saltstack/salt/pull/47026 +.. _`#47027`: https://github.com/saltstack/salt/pull/47027 +.. _`#47029`: https://github.com/saltstack/salt/pull/47029 +.. _`#47037`: https://github.com/saltstack/salt/pull/47037 +.. _`#47038`: https://github.com/saltstack/salt/pull/47038 +.. _`#47039`: https://github.com/saltstack/salt/pull/47039 +.. _`#47041`: https://github.com/saltstack/salt/pull/47041 +.. _`#47042`: https://github.com/saltstack/salt/issues/47042 +.. _`#47045`: https://github.com/saltstack/salt/pull/47045 +.. _`#47046`: https://github.com/saltstack/salt/pull/47046 +.. _`#47047`: https://github.com/saltstack/salt/issues/47047 +.. _`#47048`: https://github.com/saltstack/salt/pull/47048 +.. _`#47051`: https://github.com/saltstack/salt/pull/47051 +.. _`#47053`: https://github.com/saltstack/salt/pull/47053 +.. _`#47055`: https://github.com/saltstack/salt/pull/47055 +.. _`#47057`: https://github.com/saltstack/salt/pull/47057 +.. _`#47058`: https://github.com/saltstack/salt/pull/47058 +.. _`#47059`: https://github.com/saltstack/salt/issues/47059 +.. _`#47060`: https://github.com/saltstack/salt/pull/47060 +.. _`#47061`: https://github.com/saltstack/salt/pull/47061 +.. _`#47062`: https://github.com/saltstack/salt/pull/47062 +.. _`#47064`: https://github.com/saltstack/salt/pull/47064 +.. _`#47065`: https://github.com/saltstack/salt/pull/47065 +.. _`#47066`: https://github.com/saltstack/salt/pull/47066 +.. _`#47067`: https://github.com/saltstack/salt/pull/47067 +.. _`#47068`: https://github.com/saltstack/salt/pull/47068 +.. _`#47069`: https://github.com/saltstack/salt/pull/47069 +.. _`#47070`: https://github.com/saltstack/salt/pull/47070 +.. _`#47074`: https://github.com/saltstack/salt/pull/47074 +.. _`#47076`: https://github.com/saltstack/salt/pull/47076 +.. _`#47077`: https://github.com/saltstack/salt/pull/47077 +.. _`#47081`: https://github.com/saltstack/salt/issues/47081 +.. _`#47089`: https://github.com/saltstack/salt/issues/47089 +.. _`#47092`: https://github.com/saltstack/salt/issues/47092 +.. _`#47102`: https://github.com/saltstack/salt/pull/47102 +.. _`#47104`: https://github.com/saltstack/salt/pull/47104 +.. _`#47106`: https://github.com/saltstack/salt/pull/47106 +.. _`#47107`: https://github.com/saltstack/salt/pull/47107 +.. _`#47108`: https://github.com/saltstack/salt/pull/47108 +.. _`#47109`: https://github.com/saltstack/salt/pull/47109 +.. _`#47110`: https://github.com/saltstack/salt/pull/47110 +.. _`#47113`: https://github.com/saltstack/salt/pull/47113 +.. _`#47117`: https://github.com/saltstack/salt/issues/47117 +.. _`#47122`: https://github.com/saltstack/salt/pull/47122 +.. _`#47124`: https://github.com/saltstack/salt/issues/47124 +.. _`#47129`: https://github.com/saltstack/salt/pull/47129 +.. _`#47131`: https://github.com/saltstack/salt/pull/47131 +.. _`#47134`: https://github.com/saltstack/salt/pull/47134 +.. _`#47142`: https://github.com/saltstack/salt/pull/47142 +.. _`#47150`: https://github.com/saltstack/salt/issues/47150 +.. _`#47153`: https://github.com/saltstack/salt/pull/47153 +.. _`#47155`: https://github.com/saltstack/salt/pull/47155 +.. _`#47159`: https://github.com/saltstack/salt/pull/47159 +.. _`#47161`: https://github.com/saltstack/salt/pull/47161 +.. _`#47162`: https://github.com/saltstack/salt/pull/47162 +.. _`#47163`: https://github.com/saltstack/salt/pull/47163 +.. _`#47165`: https://github.com/saltstack/salt/pull/47165 +.. _`#47167`: https://github.com/saltstack/salt/pull/47167 +.. _`#47168`: https://github.com/saltstack/salt/pull/47168 +.. _`#47172`: https://github.com/saltstack/salt/pull/47172 +.. _`#47177`: https://github.com/saltstack/salt/pull/47177 +.. _`#47184`: https://github.com/saltstack/salt/pull/47184 +.. _`#47185`: https://github.com/saltstack/salt/pull/47185 +.. _`#47186`: https://github.com/saltstack/salt/pull/47186 +.. _`#47189`: https://github.com/saltstack/salt/pull/47189 +.. _`#47191`: https://github.com/saltstack/salt/pull/47191 +.. _`#47193`: https://github.com/saltstack/salt/pull/47193 +.. _`#47195`: https://github.com/saltstack/salt/pull/47195 +.. _`#47196`: https://github.com/saltstack/salt/pull/47196 +.. _`#47197`: https://github.com/saltstack/salt/pull/47197 +.. _`#47199`: https://github.com/saltstack/salt/issues/47199 +.. _`#47202`: https://github.com/saltstack/salt/pull/47202 +.. _`#47213`: https://github.com/saltstack/salt/pull/47213 +.. _`#47216`: https://github.com/saltstack/salt/pull/47216 +.. _`#47217`: https://github.com/saltstack/salt/pull/47217 +.. _`#47219`: https://github.com/saltstack/salt/pull/47219 +.. _`#47220`: https://github.com/saltstack/salt/pull/47220 +.. _`#47225`: https://github.com/saltstack/salt/issues/47225 +.. _`#47226`: https://github.com/saltstack/salt/pull/47226 +.. _`#47227`: https://github.com/saltstack/salt/pull/47227 +.. _`#47228`: https://github.com/saltstack/salt/pull/47228 +.. _`#47239`: https://github.com/saltstack/salt/issues/47239 +.. _`#47241`: https://github.com/saltstack/salt/pull/47241 +.. _`#47242`: https://github.com/saltstack/salt/pull/47242 +.. _`#47245`: https://github.com/saltstack/salt/pull/47245 +.. _`#47246`: https://github.com/saltstack/salt/pull/47246 +.. _`#47249`: https://github.com/saltstack/salt/pull/47249 +.. _`#47250`: https://github.com/saltstack/salt/pull/47250 +.. _`#47251`: https://github.com/saltstack/salt/pull/47251 +.. _`#47252`: https://github.com/saltstack/salt/pull/47252 +.. _`#47255`: https://github.com/saltstack/salt/pull/47255 +.. _`#47260`: https://github.com/saltstack/salt/issues/47260 +.. _`#47262`: https://github.com/saltstack/salt/pull/47262 +.. _`#47267`: https://github.com/saltstack/salt/issues/47267 +.. _`#47270`: https://github.com/saltstack/salt/pull/47270 +.. _`#47271`: https://github.com/saltstack/salt/pull/47271 +.. _`#47272`: https://github.com/saltstack/salt/pull/47272 +.. _`#47275`: https://github.com/saltstack/salt/pull/47275 +.. _`#47277`: https://github.com/saltstack/salt/pull/47277 +.. _`#47279`: https://github.com/saltstack/salt/pull/47279 +.. _`#47280`: https://github.com/saltstack/salt/pull/47280 +.. _`#47281`: https://github.com/saltstack/salt/pull/47281 +.. _`#47283`: https://github.com/saltstack/salt/pull/47283 +.. _`#47284`: https://github.com/saltstack/salt/pull/47284 +.. _`#47285`: https://github.com/saltstack/salt/pull/47285 +.. _`#47286`: https://github.com/saltstack/salt/pull/47286 +.. _`#47287`: https://github.com/saltstack/salt/pull/47287 +.. _`#47290`: https://github.com/saltstack/salt/pull/47290 +.. _`#47291`: https://github.com/saltstack/salt/pull/47291 +.. _`#47292`: https://github.com/saltstack/salt/pull/47292 +.. _`#47293`: https://github.com/saltstack/salt/pull/47293 +.. _`#47302`: https://github.com/saltstack/salt/pull/47302 +.. _`#47303`: https://github.com/saltstack/salt/pull/47303 +.. _`#47304`: https://github.com/saltstack/salt/pull/47304 +.. _`#47307`: https://github.com/saltstack/salt/pull/47307 +.. _`#47308`: https://github.com/saltstack/salt/pull/47308 +.. _`#47311`: https://github.com/saltstack/salt/pull/47311 +.. _`#47312`: https://github.com/saltstack/salt/pull/47312 +.. _`#47314`: https://github.com/saltstack/salt/pull/47314 +.. _`#47317`: https://github.com/saltstack/salt/pull/47317 +.. _`#47319`: https://github.com/saltstack/salt/pull/47319 +.. _`#47320`: https://github.com/saltstack/salt/pull/47320 +.. _`#47322`: https://github.com/saltstack/salt/issues/47322 +.. _`#47324`: https://github.com/saltstack/salt/issues/47324 +.. _`#47325`: https://github.com/saltstack/salt/issues/47325 +.. _`#47326`: https://github.com/saltstack/salt/pull/47326 +.. _`#47329`: https://github.com/saltstack/salt/pull/47329 +.. _`#47331`: https://github.com/saltstack/salt/pull/47331 +.. _`#47332`: https://github.com/saltstack/salt/pull/47332 +.. _`#47334`: https://github.com/saltstack/salt/pull/47334 +.. _`#47335`: https://github.com/saltstack/salt/pull/47335 +.. _`#47339`: https://github.com/saltstack/salt/pull/47339 +.. _`#47341`: https://github.com/saltstack/salt/pull/47341 +.. _`#47342`: https://github.com/saltstack/salt/pull/47342 +.. _`#47343`: https://github.com/saltstack/salt/pull/47343 +.. _`#47347`: https://github.com/saltstack/salt/pull/47347 +.. _`#47348`: https://github.com/saltstack/salt/pull/47348 +.. _`#47354`: https://github.com/saltstack/salt/pull/47354 +.. _`#47356`: https://github.com/saltstack/salt/pull/47356 +.. _`#47359`: https://github.com/saltstack/salt/pull/47359 +.. _`#47363`: https://github.com/saltstack/salt/pull/47363 +.. _`#47367`: https://github.com/saltstack/salt/pull/47367 +.. _`#47368`: https://github.com/saltstack/salt/pull/47368 +.. _`#47369`: https://github.com/saltstack/salt/pull/47369 +.. _`#47371`: https://github.com/saltstack/salt/pull/47371 +.. _`#47374`: https://github.com/saltstack/salt/pull/47374 +.. _`#47375`: https://github.com/saltstack/salt/pull/47375 +.. _`#47379`: https://github.com/saltstack/salt/pull/47379 +.. _`#47380`: https://github.com/saltstack/salt/pull/47380 +.. _`#47382`: https://github.com/saltstack/salt/pull/47382 +.. _`#47384`: https://github.com/saltstack/salt/pull/47384 +.. _`#47388`: https://github.com/saltstack/salt/pull/47388 +.. _`#47389`: https://github.com/saltstack/salt/pull/47389 +.. _`#47397`: https://github.com/saltstack/salt/pull/47397 +.. _`#47399`: https://github.com/saltstack/salt/pull/47399 +.. _`#47401`: https://github.com/saltstack/salt/pull/47401 +.. _`#47403`: https://github.com/saltstack/salt/pull/47403 +.. _`#47404`: https://github.com/saltstack/salt/issues/47404 +.. _`#47405`: https://github.com/saltstack/salt/pull/47405 +.. _`#47407`: https://github.com/saltstack/salt/pull/47407 +.. _`#47410`: https://github.com/saltstack/salt/pull/47410 +.. _`#47412`: https://github.com/saltstack/salt/pull/47412 +.. _`#47413`: https://github.com/saltstack/salt/pull/47413 +.. _`#47415`: https://github.com/saltstack/salt/pull/47415 +.. _`#47417`: https://github.com/saltstack/salt/pull/47417 +.. _`#47429`: https://github.com/saltstack/salt/pull/47429 +.. _`#47433`: https://github.com/saltstack/salt/pull/47433 +.. _`#47435`: https://github.com/saltstack/salt/pull/47435 +.. _`#47438`: https://github.com/saltstack/salt/pull/47438 +.. _`#47441`: https://github.com/saltstack/salt/pull/47441 +.. _`#47443`: https://github.com/saltstack/salt/issues/47443 +.. _`#47447`: https://github.com/saltstack/salt/pull/47447 +.. _`#47448`: https://github.com/saltstack/salt/pull/47448 +.. _`#47455`: https://github.com/saltstack/salt/pull/47455 +.. _`#47456`: https://github.com/saltstack/salt/pull/47456 +.. _`#47458`: https://github.com/saltstack/salt/pull/47458 +.. _`#47459`: https://github.com/saltstack/salt/pull/47459 +.. _`#47462`: https://github.com/saltstack/salt/pull/47462 +.. _`#47464`: https://github.com/saltstack/salt/pull/47464 +.. _`#47465`: https://github.com/saltstack/salt/pull/47465 +.. _`#47466`: https://github.com/saltstack/salt/pull/47466 +.. _`#47467`: https://github.com/saltstack/salt/pull/47467 +.. _`#47472`: https://github.com/saltstack/salt/pull/47472 +.. _`#47476`: https://github.com/saltstack/salt/pull/47476 +.. _`#47479`: https://github.com/saltstack/salt/issues/47479 +.. _`#47482`: https://github.com/saltstack/salt/pull/47482 +.. _`#47484`: https://github.com/saltstack/salt/issues/47484 +.. _`#47485`: https://github.com/saltstack/salt/pull/47485 +.. _`#47494`: https://github.com/saltstack/salt/pull/47494 +.. _`#47495`: https://github.com/saltstack/salt/pull/47495 +.. _`#47496`: https://github.com/saltstack/salt/issues/47496 +.. _`#47497`: https://github.com/saltstack/salt/pull/47497 +.. _`#47502`: https://github.com/saltstack/salt/issues/47502 +.. _`#47503`: https://github.com/saltstack/salt/pull/47503 +.. _`#47505`: https://github.com/saltstack/salt/pull/47505 +.. _`#47507`: https://github.com/saltstack/salt/pull/47507 +.. _`#47511`: https://github.com/saltstack/salt/issues/47511 +.. _`#47514`: https://github.com/saltstack/salt/pull/47514 +.. _`#47515`: https://github.com/saltstack/salt/pull/47515 +.. _`#47516`: https://github.com/saltstack/salt/pull/47516 +.. _`#47518`: https://github.com/saltstack/salt/pull/47518 +.. _`#47520`: https://github.com/saltstack/salt/pull/47520 +.. _`#47531`: https://github.com/saltstack/salt/pull/47531 +.. _`#47532`: https://github.com/saltstack/salt/issues/47532 +.. _`#47541`: https://github.com/saltstack/salt/pull/47541 +.. _`#47550`: https://github.com/saltstack/salt/pull/47550 +.. _`#47553`: https://github.com/saltstack/salt/issues/47553 +.. _`#47554`: https://github.com/saltstack/salt/pull/47554 +.. _`#47568`: https://github.com/saltstack/salt/pull/47568 +.. _`#47569`: https://github.com/saltstack/salt/pull/47569 +.. _`#47570`: https://github.com/saltstack/salt/pull/47570 +.. _`#47571`: https://github.com/saltstack/salt/pull/47571 +.. _`#47595`: https://github.com/saltstack/salt/pull/47595 +.. _`#47596`: https://github.com/saltstack/salt/pull/47596 +.. _`#47599`: https://github.com/saltstack/salt/pull/47599 +.. _`#47601`: https://github.com/saltstack/salt/pull/47601 +.. _`#47641`: https://github.com/saltstack/salt/pull/47641 +.. _`#47643`: https://github.com/saltstack/salt/pull/47643 +.. _`#47645`: https://github.com/saltstack/salt/pull/47645 +.. _`#47647`: https://github.com/saltstack/salt/pull/47647 +.. _`#47664`: https://github.com/saltstack/salt/pull/47664 +.. _`#47692`: https://github.com/saltstack/salt/pull/47692 +.. _`#47700`: https://github.com/saltstack/salt/pull/47700 +.. _`#47702`: https://github.com/saltstack/salt/pull/47702 +.. _`#47706`: https://github.com/saltstack/salt/pull/47706 +.. _`#47719`: https://github.com/saltstack/salt/pull/47719 +.. _`#47724`: https://github.com/saltstack/salt/pull/47724 +.. _`#47727`: https://github.com/saltstack/salt/pull/47727 +.. _`#47730`: https://github.com/saltstack/salt/pull/47730 +.. _`#47736`: https://github.com/saltstack/salt/pull/47736 +.. _`#47739`: https://github.com/saltstack/salt/pull/47739 +.. _`#47769`: https://github.com/saltstack/salt/pull/47769 +.. _`#47770`: https://github.com/saltstack/salt/pull/47770 +.. _`#47775`: https://github.com/saltstack/salt/pull/47775 +.. _`#47776`: https://github.com/saltstack/salt/pull/47776 +.. _`#47782`: https://github.com/saltstack/salt/pull/47782 +.. _`#47784`: https://github.com/saltstack/salt/issues/47784 +.. _`#47798`: https://github.com/saltstack/salt/pull/47798 +.. _`#47820`: https://github.com/saltstack/salt/pull/47820 +.. _`#47848`: https://github.com/saltstack/salt/pull/47848 +.. _`#47874`: https://github.com/saltstack/salt/pull/47874 +.. _`#47881`: https://github.com/saltstack/salt/pull/47881 +.. _`AmbicaY`: https://github.com/AmbicaY +.. _`Auha`: https://github.com/Auha +.. _`Ch3LL`: https://github.com/Ch3LL +.. _`DmitryKuzmenko`: https://github.com/DmitryKuzmenko +.. _`Epiclemonaid`: https://github.com/Epiclemonaid +.. _`Giandom`: https://github.com/Giandom +.. _`Kimol`: https://github.com/Kimol +.. _`L4rS6`: https://github.com/L4rS6 +.. _`LukeCarrier`: https://github.com/LukeCarrier +.. _`OrlandoArcapix`: https://github.com/OrlandoArcapix +.. _`PhilippeAB`: https://github.com/PhilippeAB +.. _`SynPrime`: https://github.com/SynPrime +.. _`TamCore`: https://github.com/TamCore +.. _`The-Loeki`: https://github.com/The-Loeki +.. _`UtahDave`: https://github.com/UtahDave +.. _`Zorlin`: https://github.com/Zorlin +.. _`aesposito91`: https://github.com/aesposito91 +.. _`anlutro`: https://github.com/anlutro +.. _`bbinet`: https://github.com/bbinet +.. _`bdarnell`: https://github.com/bdarnell +.. _`bdrung`: https://github.com/bdrung +.. _`bobrik`: https://github.com/bobrik +.. _`boltronics`: https://github.com/boltronics +.. _`bosatsu`: https://github.com/bosatsu +.. _`cedwards`: https://github.com/cedwards +.. _`cheribral`: https://github.com/cheribral +.. _`clan`: https://github.com/clan +.. _`corywright`: https://github.com/corywright +.. _`cskowronnek`: https://github.com/cskowronnek +.. _`d601`: https://github.com/d601 +.. _`damon-atkins`: https://github.com/damon-atkins +.. _`dincamihai`: https://github.com/dincamihai +.. _`dmurphy18`: https://github.com/dmurphy18 +.. _`dnABic`: https://github.com/dnABic +.. _`douglasjreynolds`: https://github.com/douglasjreynolds +.. _`dwoz`: https://github.com/dwoz +.. _`edgan`: https://github.com/edgan +.. _`ejparker12`: https://github.com/ejparker12 +.. _`epelc`: https://github.com/epelc +.. _`esell`: https://github.com/esell +.. _`ezh`: https://github.com/ezh +.. _`femnad`: https://github.com/femnad +.. _`folti`: https://github.com/folti +.. _`garethgreenaway`: https://github.com/garethgreenaway +.. _`gtmanfred`: https://github.com/gtmanfred +.. _`isbm`: https://github.com/isbm +.. _`jasperla`: https://github.com/jasperla +.. _`joesusecom`: https://github.com/joesusecom +.. _`johnj`: https://github.com/johnj +.. _`jpsv`: https://github.com/jpsv +.. _`julientravelaer`: https://github.com/julientravelaer +.. _`kivoli`: https://github.com/kivoli +.. _`liquidgecka`: https://github.com/liquidgecka +.. _`masau`: https://github.com/masau +.. _`mateiw`: https://github.com/mateiw +.. _`mcalmer`: https://github.com/mcalmer +.. _`mchugh19`: https://github.com/mchugh19 +.. _`mew1033`: https://github.com/mew1033 +.. _`mirceaulinic`: https://github.com/mirceaulinic +.. _`mitar`: https://github.com/mitar +.. _`morganwillcock`: https://github.com/morganwillcock +.. _`mruepp`: https://github.com/mruepp +.. _`noelmcloughlin`: https://github.com/noelmcloughlin +.. _`oeuftete`: https://github.com/oeuftete +.. _`opdude`: https://github.com/opdude +.. _`pcn`: https://github.com/pcn +.. _`prashanthtuttu`: https://github.com/prashanthtuttu +.. _`pruiz`: https://github.com/pruiz +.. _`psagers`: https://github.com/psagers +.. _`psyer`: https://github.com/psyer +.. _`rallytime`: https://github.com/rallytime +.. _`rlschilperoort`: https://github.com/rlschilperoort +.. _`robertodocampo`: https://github.com/robertodocampo +.. _`robinro`: https://github.com/robinro +.. _`robnagler`: https://github.com/robnagler +.. _`s0undt3ch`: https://github.com/s0undt3ch +.. _`samodid`: https://github.com/samodid +.. _`shengis`: https://github.com/shengis +.. _`sjorge`: https://github.com/sjorge +.. _`skjaro`: https://github.com/skjaro +.. _`skylerberg`: https://github.com/skylerberg +.. _`srkunze`: https://github.com/srkunze +.. _`stamak`: https://github.com/stamak +.. _`syphernl`: https://github.com/syphernl +.. _`tankywoo`: https://github.com/tankywoo +.. _`terminalmage`: https://github.com/terminalmage +.. _`tjyang`: https://github.com/tjyang +.. _`tkaehn`: https://github.com/tkaehn +.. _`twangboy`: https://github.com/twangboy +.. _`tyeapple`: https://github.com/tyeapple +.. _`valentin2105`: https://github.com/valentin2105 +.. _`vutny`: https://github.com/vutny +.. _`whytewolf`: https://github.com/whytewolf +.. _`yannj-fr`: https://github.com/yannj-fr +.. _`zmedico`: https://github.com/zmedico From e27ee273a7e88a154474a9430cf9bfe2257817cf Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Wed, 30 May 2018 10:51:12 -0400 Subject: [PATCH 60/66] Add == line to changelog line for release notes --- doc/topics/releases/2018.3.1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/topics/releases/2018.3.1.rst b/doc/topics/releases/2018.3.1.rst index fb194c0db5..dea3a4f67e 100644 --- a/doc/topics/releases/2018.3.1.rst +++ b/doc/topics/releases/2018.3.1.rst @@ -45,7 +45,7 @@ to the flat roster file. This behavior can also be enabled by setting ``ssh_update_roster: True`` in the master config file. Changelog for v2018.3.0..v2018.3.1 -================================================================= +================================== *Generated at: 2018-05-30 14:09:03 UTC* From 25afc932f720ea7ce1c3c4f9a95d651388ba1335 Mon Sep 17 00:00:00 2001 From: Erik Johnson Date: Wed, 30 May 2018 10:01:14 -0500 Subject: [PATCH 61/66] WIP salt-jenkins issue 1000 This adds logging of the output and retcode when the output file fails to be created. As I have thus far been unable to reproduce this locally, this is the best shot at seeing what is causing the issue, since ShellCase's run_script is rather opaque about what happens in the script itself. We do know from the salt-runtests.log that the `salt-call -g` is successfully returning, what we don't know is what happened after that data was returned, and this should provide that insight. --- tests/integration/shell/test_call.py | 17 +++++++++++++++-- tests/support/case.py | 7 ++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/integration/shell/test_call.py b/tests/integration/shell/test_call.py index c712f04d84..f1f084cc50 100644 --- a/tests/integration/shell/test_call.py +++ b/tests/integration/shell/test_call.py @@ -408,7 +408,7 @@ class CallTest(ShellCase, testprogram.TestProgramCase, ShellCaseCommonTestsMixin with salt.utils.files.set_umask(0o077): try: # Let's create an initial output file with some data - self.run_script( + stdout, stderr, retcode = self.run_script( 'salt-call', '-c {0} --output-file={1} -g'.format( self.get_config_dir(), @@ -417,7 +417,20 @@ class CallTest(ShellCase, testprogram.TestProgramCase, ShellCaseCommonTestsMixin catch_stderr=True, with_retcode=True ) - stat1 = os.stat(output_file) + try: + stat1 = os.stat(output_file) + except OSError: + log.error( + 'run_script failed to generate output file:\n' + 'return code %d\n' + 'stdout:\n' + '%s\n\n' + 'stderr\n' + '%s', + retcode, stdout, stderr + ) + self.fail( + 'Failed to generate output file, see log for details') # Let's change umask os.umask(0o777) # pylint: disable=blacklisted-function diff --git a/tests/support/case.py b/tests/support/case.py index 5a175fab6c..4a073e0121 100644 --- a/tests/support/case.py +++ b/tests/support/case.py @@ -98,10 +98,15 @@ class ShellTestCase(TestCase, AdaptedConfigurationTestCaseMixin): script_name ) ) - sfh.write( + contents = ( '#!{0}\n'.format(sys.executable) + '\n'.join(script_template).format(script_name.replace('salt-', '')) ) + sfh.write(contents) + log.debug( + 'Wrote the following contents to temp script %s:\n%s', + script_path, contents + ) st = os.stat(script_path) os.chmod(script_path, st.st_mode | stat.S_IEXEC) From e5d386e91cf9a9f6fa7820e8593799d8550d7852 Mon Sep 17 00:00:00 2001 From: rallytime Date: Wed, 30 May 2018 13:50:22 -0400 Subject: [PATCH 62/66] Update solaris core grains test The check for zpool grains was moved out of core grains and into zfs grains. The mock for the call to zpool grains function was failing. We also need to update any calls to the salt.utils file to use the new paths. --- tests/unit/grains/test_core.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 40ed48ae47..f5de18831e 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -27,6 +27,7 @@ from tests.support.mock import ( # Import Salt Libs import salt.utils.files import salt.utils.platform +import salt.utils.path import salt.grains.core as core # Import 3rd-party libs @@ -938,15 +939,15 @@ SwapTotal: 4789244 kB''' path_isfile_mock = MagicMock(side_effect=lambda x: x in ['/etc/release']) with patch.object(platform, 'uname', MagicMock(return_value=('SunOS', 'testsystem', '5.11', '11.3', 'sunv4', 'sparc'))): - with patch.object(salt.utils, 'is_proxy', + with patch.object(salt.utils.platform, 'is_proxy', MagicMock(return_value=False)): - with patch.object(salt.utils, 'is_linux', + with patch.object(salt.utils.platform, 'is_linux', MagicMock(return_value=False)): - with patch.object(salt.utils, 'is_windows', + with patch.object(salt.utils.platform, 'is_windows', MagicMock(return_value=False)): - with patch.object(salt.utils, 'is_smartos', + with patch.object(salt.utils.platform, 'is_smartos', MagicMock(return_value=False)): - with patch.object(salt.utils, 'which_bin', + with patch.object(salt.utils.path, 'which_bin', MagicMock(return_value=None)): with patch.object(os.path, 'isfile', path_isfile_mock): with salt.utils.files.fopen(os.path.join(OS_RELEASE_DIR, "solaris-11.3")) as os_release_file: @@ -960,17 +961,15 @@ SwapTotal: 4789244 kB''' 'cpu_flags': []})): with patch.object(core, '_memdata', MagicMock(return_value={'mem_total': 16384})): - with patch.object(core, '_zpool_data', + with patch.object(core, '_virtual', MagicMock(return_value={})): - with patch.object(core, '_virtual', + with patch.object(core, '_ps', MagicMock(return_value={})): - with patch.object(core, '_ps', - MagicMock(return_value={})): - with patch.object(salt.utils, 'which', - MagicMock(return_value=True)): - sparc_return_mock = MagicMock(return_value=prtdata) - with patch.dict(core.__salt__, {'cmd.run': sparc_return_mock}): - os_grains = core.os_data() + with patch.object(salt.utils.path, 'which', + MagicMock(return_value=True)): + sparc_return_mock = MagicMock(return_value=prtdata) + with patch.dict(core.__salt__, {'cmd.run': sparc_return_mock}): + os_grains = core.os_data() grains = {k: v for k, v in os_grains.items() if k in set(['product', 'productname'])} self.assertEqual(grains, expectation) From e15e6749554e40933e9c55434119e4b8a9b1e99d Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Mon, 21 May 2018 14:23:58 -0400 Subject: [PATCH 63/66] Add stderr launchctl helper class and fix service mac tests --- salt/utils/mac_utils.py | 15 ++++++++++++++- tests/integration/modules/test_mac_service.py | 2 ++ tests/integration/states/test_service.py | 7 ++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/salt/utils/mac_utils.py b/salt/utils/mac_utils.py index 14bf99f9f2..9e307d7f8f 100644 --- a/salt/utils/mac_utils.py +++ b/salt/utils/mac_utils.py @@ -119,6 +119,18 @@ def _run_all(cmd): return ret +def _check_launchctl_stderr(ret): + ''' + helper class to check the launchctl stderr. + launchctl does not always return bad exit code + if there is a failure + ''' + err = ret['stderr'].lower() + if 'service is disabled' in err: + return True + return False + + def execute_return_success(cmd): ''' Executes the passed command. Returns True if successful @@ -274,9 +286,10 @@ def launchctl(sub_cmd, *args, **kwargs): kwargs['python_shell'] = False kwargs = salt.utils.args.clean_kwargs(**kwargs) ret = __salt__['cmd.run_all'](cmd, **kwargs) + error = _check_launchctl_stderr(ret) # Raise an error or return successful result - if ret['retcode']: + if ret['retcode'] or error: out = 'Failed to {0} service:\n'.format(sub_cmd) out += 'stdout: {0}\n'.format(ret['stdout']) out += 'stderr: {0}\n'.format(ret['stderr']) diff --git a/tests/integration/modules/test_mac_service.py b/tests/integration/modules/test_mac_service.py index 486a5d3f51..34ffa9d109 100644 --- a/tests/integration/modules/test_mac_service.py +++ b/tests/integration/modules/test_mac_service.py @@ -40,8 +40,10 @@ class MacServiceModuleTest(ModuleCase): ''' if self.SERVICE_ENABLED: self.run_function('service.start', [self.SERVICE_NAME]) + self.run_function('service.enable', [self.SERVICE_NAME]) else: self.run_function('service.stop', [self.SERVICE_NAME]) + self.run_function('service.disable', [self.SERVICE_NAME]) def test_show(self): ''' diff --git a/tests/integration/states/test_service.py b/tests/integration/states/test_service.py index f0d11813ad..81db538427 100644 --- a/tests/integration/states/test_service.py +++ b/tests/integration/states/test_service.py @@ -13,6 +13,7 @@ from tests.support.mixins import SaltReturnAssertsMixin # Import salt libs import salt.utils.path +import salt.utils.platform INIT_DELAY = 5 @@ -62,10 +63,14 @@ class ServiceTest(ModuleCase, SaltReturnAssertsMixin): ''' test service.running state module ''' - stop_service = self.run_function('service.stop', self.service_name) + stop_service = self.run_function('service.stop', name=self.service_name) self.assertTrue(stop_service) self.check_service_status(self.stopped) + if salt.utils.platform.is_darwin(): + # make sure the service is enabled on macosx + enable = self.run_function('service.enable', name=self.service_name) + start_service = self.run_state('service.running', name=self.service_name) self.assertTrue(start_service) From 185c9e9ae2519fd51658d142e7d45ea46e0df0ed Mon Sep 17 00:00:00 2001 From: Ch3LL Date: Wed, 30 May 2018 15:35:05 -0400 Subject: [PATCH 64/66] only stop service if its running --- tests/integration/states/test_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/integration/states/test_service.py b/tests/integration/states/test_service.py index 81db538427..ef01627efe 100644 --- a/tests/integration/states/test_service.py +++ b/tests/integration/states/test_service.py @@ -63,8 +63,9 @@ class ServiceTest(ModuleCase, SaltReturnAssertsMixin): ''' test service.running state module ''' - stop_service = self.run_function('service.stop', name=self.service_name) - self.assertTrue(stop_service) + if self.run_function('service.status', name=self.service_name): + stop_service = self.run_function('service.stop', name=self.service_name) + self.assertTrue(stop_service) self.check_service_status(self.stopped) if salt.utils.platform.is_darwin(): From 9e612ec9e705f89c3f4237af3ec3568e3a059e90 Mon Sep 17 00:00:00 2001 From: twangboy Date: Wed, 30 May 2018 16:10:26 -0600 Subject: [PATCH 65/66] Fix markup in release notes --- doc/topics/releases/2018.3.2.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/topics/releases/2018.3.2.rst b/doc/topics/releases/2018.3.2.rst index 723a595437..1a10c32ad9 100644 --- a/doc/topics/releases/2018.3.2.rst +++ b/doc/topics/releases/2018.3.2.rst @@ -1,12 +1,12 @@ -=========================== +======================================== In Progress: Salt 2018.3.2 Release Notes -=========================== +======================================== Version 2018.3.2 is an **unreleased** bugfix release for :ref:`2018.3.0 `. This release is still in progress and has not been released yet. Changes to win_timezone ------------------------ +======================= Improves timezone detection by using the pytz module. From efe308013a0c14a469c0dafce5334074e2fda27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= Date: Thu, 31 May 2018 10:58:16 +0100 Subject: [PATCH 66/66] Align SUSE salt-master.service 'LimitNOFILES' limit with upstream Salt --- pkg/suse/salt-master.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/suse/salt-master.service b/pkg/suse/salt-master.service index c0ea4606d8..b31c1a1373 100644 --- a/pkg/suse/salt-master.service +++ b/pkg/suse/salt-master.service @@ -4,7 +4,7 @@ Documentation=man:salt-master(1) file:///usr/share/doc/salt/html/contents.html h After=network.target [Service] -LimitNOFILE=16384 +LimitNOFILE=100000 Type=simple ExecStart=/usr/bin/salt-master TasksMax=infinity