From 6aa440cf365eb3a3e0dd71d6cecad0612e08cc0a9f054cf076f3ff0a67d85d42 Mon Sep 17 00:00:00 2001 From: Jochen Breuer Date: Mon, 3 Feb 2020 13:30:18 +0000 Subject: [PATCH 1/3] osc copypac from project:systemsmanagement:saltstack:testing package:salt revision:320 OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=160 --- _lastrevision | 2 +- _service | 6 +- ...rains-to-start-event-based-on-start_.patch | 132 ++++++++++++++++++ ...rt_event_grains-only-to-the-start-ev.patch | 102 ++++++++++++++ salt.changes | 18 +++ salt.spec | 10 +- ...lgorithm-to-compute-string-checksums.patch | 14 +- v2019.2.2.tar.gz | 3 - v2019.2.3.tar.gz | 3 + 9 files changed, 274 insertions(+), 16 deletions(-) create mode 100644 enable-passing-grains-to-start-event-based-on-start_.patch create mode 100644 restrict-the-start_event_grains-only-to-the-start-ev.patch delete mode 100644 v2019.2.2.tar.gz create mode 100644 v2019.2.3.tar.gz diff --git a/_lastrevision b/_lastrevision index 75c84a1..76d18d0 100644 --- a/_lastrevision +++ b/_lastrevision @@ -1 +1 @@ -d3f65020201314619013243463c3fe8098529e3e \ No newline at end of file +e44665e8c48cfb6d2c3ef0189e3712e474ddbff6 \ No newline at end of file diff --git a/_service b/_service index a1e1834..6140808 100644 --- a/_service +++ b/_service @@ -3,7 +3,7 @@ https://github.com/openSUSE/salt-packaging.git salt package - 2019.2.2 + 2019.2.3 git @@ -12,8 +12,8 @@ codeload.github.com - openSUSE/salt/tar.gz/v2019.2.2-suse - v2019.2.2.tar.gz + openSUSE/salt/tar.gz/v2019.2.3-suse + v2019.2.3.tar.gz diff --git a/enable-passing-grains-to-start-event-based-on-start_.patch b/enable-passing-grains-to-start-event-based-on-start_.patch new file mode 100644 index 0000000..bbd6ebe --- /dev/null +++ b/enable-passing-grains-to-start-event-based-on-start_.patch @@ -0,0 +1,132 @@ +From 79f566ba99f48d60e4948c9b8df9c6b6f497eced Mon Sep 17 00:00:00 2001 +From: Abid Mehmood +Date: Thu, 1 Aug 2019 13:14:22 +0200 +Subject: [PATCH] enable passing grains to start event based on + 'start_event_grains' configuration parameter + +unit tests +--- + conf/minion | 5 +++++ + doc/ref/configuration/minion.rst | 15 +++++++++++++++ + salt/config/__init__.py | 1 + + salt/minion.py | 5 +++++ + tests/unit/test_minion.py | 32 ++++++++++++++++++++++++++++++++ + 5 files changed, 58 insertions(+) + +diff --git a/conf/minion b/conf/minion +index f2b6655932..cc7e962120 100644 +--- a/conf/minion ++++ b/conf/minion +@@ -548,6 +548,11 @@ + # - edit.vim + # - hyper + # ++# List of grains to pass in start event when minion starts up: ++#start_event_grains: ++# - machine_id ++# - uuid ++# + # Top file to execute if startup_states is 'top': + #top_file: '' + +diff --git a/doc/ref/configuration/minion.rst b/doc/ref/configuration/minion.rst +index 30343ebd8e..fe556ef9ce 100644 +--- a/doc/ref/configuration/minion.rst ++++ b/doc/ref/configuration/minion.rst +@@ -2000,6 +2000,21 @@ List of states to run when the minion starts up if ``startup_states`` is set to + - edit.vim + - hyper + ++.. conf_minion:: start_event_grains ++ ++``start_event_grains`` ++---------------------- ++ ++Default: ``[]`` ++ ++List of grains to pass in start event when minion starts up. ++ ++.. code-block:: yaml ++ ++ start_event_grains: ++ - machine_id ++ - uuid ++ + .. conf_minion:: top_file + + ``top_file`` +diff --git a/salt/config/__init__.py b/salt/config/__init__.py +index ee90eb3120..788128b903 100644 +--- a/salt/config/__init__.py ++++ b/salt/config/__init__.py +@@ -1283,6 +1283,7 @@ DEFAULT_MINION_OPTS = { + 'state_top_saltenv': None, + 'startup_states': '', + 'sls_list': [], ++ 'start_event_grains': [], + 'top_file': '', + 'thoriumenv': None, + 'thorium_top': 'top.sls', +diff --git a/salt/minion.py b/salt/minion.py +index 2c0a18604e..2b53da4f18 100644 +--- a/salt/minion.py ++++ b/salt/minion.py +@@ -1456,6 +1456,11 @@ class Minion(MinionBase): + else: + return + ++ if self.opts['start_event_grains']: ++ grains_to_add = dict( ++ [(k, v) for k, v in six.iteritems(self.opts.get('grains', {})) if k in self.opts['start_event_grains']]) ++ load['grains'] = grains_to_add ++ + if sync: + try: + self._send_req_sync(load, timeout) +diff --git a/tests/unit/test_minion.py b/tests/unit/test_minion.py +index b78e0f6abd..83215151ee 100644 +--- a/tests/unit/test_minion.py ++++ b/tests/unit/test_minion.py +@@ -305,6 +305,38 @@ class MinionTestCase(TestCase, AdaptedConfigurationTestCaseMixin): + finally: + minion.destroy() + ++ def test_when_passed_start_event_grains(self): ++ mock_opts = self.get_config('minion', from_scratch=True) ++ mock_opts['start_event_grains'] = ["os"] ++ io_loop = tornado.ioloop.IOLoop() ++ io_loop.make_current() ++ minion = salt.minion.Minion(mock_opts, io_loop=io_loop) ++ try: ++ minion.tok = MagicMock() ++ minion._send_req_sync = MagicMock() ++ minion._fire_master('Minion has started', 'minion_start') ++ load = minion._send_req_sync.call_args[0][0] ++ ++ self.assertTrue('grains' in load) ++ self.assertTrue('os' in load['grains']) ++ finally: ++ minion.destroy() ++ ++ def test_when_not_passed_start_event_grains(self): ++ mock_opts = self.get_config('minion', from_scratch=True) ++ io_loop = tornado.ioloop.IOLoop() ++ io_loop.make_current() ++ minion = salt.minion.Minion(mock_opts, io_loop=io_loop) ++ try: ++ minion.tok = MagicMock() ++ minion._send_req_sync = MagicMock() ++ minion._fire_master('Minion has started', 'minion_start') ++ load = minion._send_req_sync.call_args[0][0] ++ ++ self.assertTrue('grains' not in load) ++ finally: ++ minion.destroy() ++ + def test_minion_retry_dns_count(self): + ''' + Tests that the resolve_dns will retry dns look ups for a maximum of +-- +2.16.4 + + diff --git a/restrict-the-start_event_grains-only-to-the-start-ev.patch b/restrict-the-start_event_grains-only-to-the-start-ev.patch new file mode 100644 index 0000000..23bc679 --- /dev/null +++ b/restrict-the-start_event_grains-only-to-the-start-ev.patch @@ -0,0 +1,102 @@ +From 127f0fa48ed2e5f05320c6c82f928f0d59a94bd9 Mon Sep 17 00:00:00 2001 +From: Abid Mehmood +Date: Thu, 16 Jan 2020 11:28:04 +0100 +Subject: [PATCH] Restrict the 'start_event_grains' only to the start + events + +add test for custom events +--- + salt/minion.py | 11 ++++++++--- + tests/unit/test_minion.py | 18 +++++++++++++++++- + 2 files changed, 25 insertions(+), 4 deletions(-) + +diff --git a/salt/minion.py b/salt/minion.py +index 2b53da4f18..a2fb203bfe 100644 +--- a/salt/minion.py ++++ b/salt/minion.py +@@ -1437,7 +1437,7 @@ class Minion(MinionBase): + finally: + channel.close() + +- def _fire_master(self, data=None, tag=None, events=None, pretag=None, timeout=60, sync=True, timeout_handler=None): ++ def _fire_master(self, data=None, tag=None, events=None, pretag=None, timeout=60, sync=True, timeout_handler=None, include_startup_grains=False): + ''' + Fire an event on the master, or drop message if unable to send. + ''' +@@ -1456,7 +1456,7 @@ class Minion(MinionBase): + else: + return + +- if self.opts['start_event_grains']: ++ if include_startup_grains: + grains_to_add = dict( + [(k, v) for k, v in six.iteritems(self.opts.get('grains', {})) if k in self.opts['start_event_grains']]) + load['grains'] = grains_to_add +@@ -2149,6 +2149,9 @@ class Minion(MinionBase): + }) + + def _fire_master_minion_start(self): ++ include_grains = False ++ if self.opts['start_event_grains']: ++ include_grains = True + # Send an event to the master that the minion is live + if self.opts['enable_legacy_startup_events']: + # Old style event. Defaults to False in Sodium release. +@@ -2157,7 +2160,8 @@ class Minion(MinionBase): + self.opts['id'], + time.asctime() + ), +- 'minion_start' ++ 'minion_start', ++ include_startup_grains=include_grains + ) + # send name spaced event + self._fire_master( +@@ -2166,6 +2170,7 @@ class Minion(MinionBase): + time.asctime() + ), + tagify([self.opts['id'], 'start'], 'minion'), ++ include_startup_grains=include_grains + ) + + def module_refresh(self, force_refresh=False, notify=False): +diff --git a/tests/unit/test_minion.py b/tests/unit/test_minion.py +index 83215151ee..41dfab0f45 100644 +--- a/tests/unit/test_minion.py ++++ b/tests/unit/test_minion.py +@@ -314,7 +314,7 @@ class MinionTestCase(TestCase, AdaptedConfigurationTestCaseMixin): + try: + minion.tok = MagicMock() + minion._send_req_sync = MagicMock() +- minion._fire_master('Minion has started', 'minion_start') ++ minion._fire_master('Minion has started', 'minion_start', include_startup_grains=True) + load = minion._send_req_sync.call_args[0][0] + + self.assertTrue('grains' in load) +@@ -337,6 +337,22 @@ class MinionTestCase(TestCase, AdaptedConfigurationTestCaseMixin): + finally: + minion.destroy() + ++ def test_when_other_events_fired_and_start_event_grains_are_set(self): ++ mock_opts = self.get_config('minion', from_scratch=True) ++ mock_opts['start_event_grains'] = ["os"] ++ io_loop = tornado.ioloop.IOLoop() ++ io_loop.make_current() ++ minion = salt.minion.Minion(mock_opts, io_loop=io_loop) ++ try: ++ minion.tok = MagicMock() ++ minion._send_req_sync = MagicMock() ++ minion._fire_master('Custm_event_fired', 'custom_event') ++ load = minion._send_req_sync.call_args[0][0] ++ ++ self.assertTrue('grains' not in load) ++ finally: ++ minion.destroy() ++ + def test_minion_retry_dns_count(self): + ''' + Tests that the resolve_dns will retry dns look ups for a maximum of +-- +2.16.4 + + diff --git a/salt.changes b/salt.changes index fe25a62..5995296 100644 --- a/salt.changes +++ b/salt.changes @@ -1,3 +1,21 @@ +------------------------------------------------------------------- +Mon Feb 3 10:42:42 UTC 2020 - Jochen Breuer + +- Update to Salt version 2019.2.3 (CVE-2019-17361) + See release notes: https://docs.saltstack.com/en/latest/topics/releases/2019.2.3.html + +- Modified: + * use-adler32-algorithm-to-compute-string-checksums.patch + +------------------------------------------------------------------- +Wed Jan 29 15:38:36 UTC 2020 - Jochen Breuer + +- Enable passing grains to start event based on 'start_event_grains' configuration parameter + +- Added: + * restrict-the-start_event_grains-only-to-the-start-ev.patch + * enable-passing-grains-to-start-event-based-on-start_.patch + ------------------------------------------------------------------- Mon Jan 13 16:09:36 UTC 2020 - Jochen Breuer diff --git a/salt.spec b/salt.spec index a226a99..8dcfba8 100644 --- a/salt.spec +++ b/salt.spec @@ -58,7 +58,7 @@ %bcond_with builddocs Name: salt -Version: 2019.2.2 +Version: 2019.2.3 Release: 0 Summary: A parallel remote execution system License: Apache-2.0 @@ -288,6 +288,10 @@ Patch102: add-virt.network_get_xml-function.patch Patch103: list_downloaded-for-apt-module.patch # PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/200 Patch104: support-for-btrfs-and-xfs-in-parted-and-mkfs.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/204 +Patch105: enable-passing-grains-to-start-event-based-on-start_.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/205 +Patch106: restrict-the-start_event_grains-only-to-the-start-ev.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: logrotate @@ -801,7 +805,7 @@ This package adds the standalone configuration for the Salt master in order to m %prep # %setup -q -n salt-%{version} -%setup -q -n salt-2019.2.2-suse +%setup -q -n salt-2019.2.3-suse cp %{S:1} . cp %{S:5} ./.travis.yml %patch1 -p1 @@ -908,6 +912,8 @@ cp %{S:5} ./.travis.yml %patch102 -p1 %patch103 -p1 %patch104 -p1 +%patch105 -p1 +%patch106 -p1 %build %if 0%{?build_py2} diff --git a/use-adler32-algorithm-to-compute-string-checksums.patch b/use-adler32-algorithm-to-compute-string-checksums.patch index 6f21551..b35ebbd 100644 --- a/use-adler32-algorithm-to-compute-string-checksums.patch +++ b/use-adler32-algorithm-to-compute-string-checksums.patch @@ -1,4 +1,4 @@ -From 815042712007e3bc9e5326b3a13b2880534630b9 Mon Sep 17 00:00:00 2001 +From c1e2410749479940275a217d598b22b24eef8758 Mon Sep 17 00:00:00 2001 From: Bo Maryniuk Date: Sat, 28 Jul 2018 22:59:04 +0200 Subject: [PATCH] Use Adler32 algorithm to compute string checksums @@ -20,13 +20,13 @@ Add warning for Sodium. 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/salt/config/__init__.py b/salt/config/__init__.py -index b3dfc8e43d..ee90eb3120 100644 +index f4496f3a61..b272610fa4 100644 --- a/salt/config/__init__.py +++ b/salt/config/__init__.py -@@ -1217,6 +1217,10 @@ VALID_OPTS = { - - # Thorium top file location - 'thorium_top': six.string_types, +@@ -1221,6 +1221,10 @@ VALID_OPTS = { + # Allow raw_shell option when using the ssh + # client via the Salt API + 'netapi_allow_raw_shell': bool, + + # Use Adler32 hashing algorithm for server_id (default False until Sodium, "adler32" after) + # Possible values are: False, adler32, crc32 @@ -34,7 +34,7 @@ index b3dfc8e43d..ee90eb3120 100644 } # default configurations -@@ -1525,7 +1529,8 @@ DEFAULT_MINION_OPTS = { +@@ -1529,7 +1533,8 @@ DEFAULT_MINION_OPTS = { }, 'discovery': False, 'schedule': {}, diff --git a/v2019.2.2.tar.gz b/v2019.2.2.tar.gz deleted file mode 100644 index 0441085..0000000 --- a/v2019.2.2.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aced5a5a79def23af3d4bd7a77bd9cb3e14a1e5b2dd57a72a67c5242930fa2a4 -size 14656820 diff --git a/v2019.2.3.tar.gz b/v2019.2.3.tar.gz new file mode 100644 index 0000000..16281ec --- /dev/null +++ b/v2019.2.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76745e1d409f01004e9bdc677ecc5ac48edba5b532996a341499ad1bacd8007c +size 14661032 From dbae67e22a2c22f27e90e5c598d556155bcab51cea07fc6d499f681e3a8a9b6c Mon Sep 17 00:00:00 2001 From: Jochen Breuer Date: Tue, 18 Feb 2020 09:12:33 +0000 Subject: [PATCH 2/3] Adds bsc for 2019.2.3 update OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=161 --- salt.changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt.changes b/salt.changes index 5995296..4d830a0 100644 --- a/salt.changes +++ b/salt.changes @@ -1,7 +1,7 @@ ------------------------------------------------------------------- Mon Feb 3 10:42:42 UTC 2020 - Jochen Breuer -- Update to Salt version 2019.2.3 (CVE-2019-17361) +- Update to Salt version 2019.2.3 (CVE-2019-17361) (bsc#1163981) See release notes: https://docs.saltstack.com/en/latest/topics/releases/2019.2.3.html - Modified: From f6d75f9808e898d7c22febe1f3f122ccbd8cc5854cb4b4736e6213742f605beb Mon Sep 17 00:00:00 2001 From: Jochen Breuer Date: Thu, 5 Mar 2020 12:49:45 +0000 Subject: [PATCH 3/3] osc copypac from project:systemsmanagement:saltstack:testing package:salt revision:326 OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=162 --- _lastrevision | 2 +- ...common-edition-to-the-os-family-list.patch | 59 +++++ ...-from-upstream-to-support-python-3.8.patch | 128 ++++++++++ ...h-exceptions-and-safety-unregister-a.patch | 240 ++++++++++++++++++ ...oid-using-fnmatch-to-match-event-217.patch | 27 ++ ...tests-for-batch-async-after-refactor.patch | 52 ++++ salt.changes | 52 +++- salt.spec | 36 ++- ...name-instead-of-undocumented-abbrevi.patch | 27 ++ 9 files changed, 617 insertions(+), 6 deletions(-) create mode 100644 add-astra-linux-common-edition-to-the-os-family-list.patch create mode 100644 apply-patch-from-upstream-to-support-python-3.8.patch create mode 100644 batch-async-catch-exceptions-and-safety-unregister-a.patch create mode 100644 batch_async-avoid-using-fnmatch-to-match-event-217.patch create mode 100644 fix-unit-tests-for-batch-async-after-refactor.patch create mode 100644 use-full-option-name-instead-of-undocumented-abbrevi.patch diff --git a/_lastrevision b/_lastrevision index 76d18d0..b23f976 100644 --- a/_lastrevision +++ b/_lastrevision @@ -1 +1 @@ -e44665e8c48cfb6d2c3ef0189e3712e474ddbff6 \ No newline at end of file +d9f16c8fe9224267baa7b315699270521dda6162 \ No newline at end of file diff --git a/add-astra-linux-common-edition-to-the-os-family-list.patch b/add-astra-linux-common-edition-to-the-os-family-list.patch new file mode 100644 index 0000000..483868b --- /dev/null +++ b/add-astra-linux-common-edition-to-the-os-family-list.patch @@ -0,0 +1,59 @@ +From 27770ed415e010055fea3a2cf599b56cd4aedf5e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Julio=20Gonz=C3=A1lez=20Gil?= + +Date: Wed, 12 Feb 2020 10:05:45 +0100 +Subject: [PATCH] Add Astra Linux Common Edition to the OS Family list + (#209) + +--- + salt/grains/core.py | 1 + + tests/unit/grains/test_core.py | 20 ++++++++++++++++++++ + 2 files changed, 21 insertions(+) + +diff --git a/salt/grains/core.py b/salt/grains/core.py +index 31ed8a77aa..67e263d37b 100644 +--- a/salt/grains/core.py ++++ b/salt/grains/core.py +@@ -1508,6 +1508,7 @@ _OS_FAMILY_MAP = { + 'Funtoo': 'Gentoo', + 'AIX': 'AIX', + 'TurnKey': 'Debian', ++ 'AstraLinuxCE': 'Debian', + } + + # Matches any possible format: +diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py +index 09e197a2e4..700eac2b08 100644 +--- a/tests/unit/grains/test_core.py ++++ b/tests/unit/grains/test_core.py +@@ -605,6 +605,26 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): + } + self._run_os_grains_tests("ubuntu-17.10", _os_release_map, expectation) + ++ @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') ++ def test_astralinuxce_2_os_grains(self): ++ ''' ++ Test if OS grains are parsed correctly in Astra Linux CE 2.12.22 "orel" ++ ''' ++ _os_release_map = { ++ 'linux_distribution': ('AstraLinuxCE', '2.12.22', 'orel'), ++ } ++ expectation = { ++ 'os': 'AstraLinuxCE', ++ 'os_family': 'Debian', ++ 'oscodename': 'orel', ++ 'osfullname': 'AstraLinuxCE', ++ 'osrelease': '2.12.22', ++ 'osrelease_info': (2, 12, 22), ++ 'osmajorrelease': 2, ++ 'osfinger': 'AstraLinuxCE-2', ++ } ++ self._run_os_grains_tests("astralinuxce-2.12.22", _os_release_map, expectation) ++ + @skipIf(not salt.utils.platform.is_windows(), 'System is not Windows') + def test_windows_platform_data(self): + ''' +-- +2.23.0 + + diff --git a/apply-patch-from-upstream-to-support-python-3.8.patch b/apply-patch-from-upstream-to-support-python-3.8.patch new file mode 100644 index 0000000..382ff0d --- /dev/null +++ b/apply-patch-from-upstream-to-support-python-3.8.patch @@ -0,0 +1,128 @@ +From 41a0d937511356dc75f4f041a08c1458b4e0ccf4 Mon Sep 17 00:00:00 2001 +From: Steve Kowalik +Date: Mon, 17 Feb 2020 15:34:00 +1100 +Subject: [PATCH] Apply patch from upstream to support Python 3.8 + +Apply saltstack/salt#56031 to support Python 3.8, which removed a +deprecated module and changed some behaviour. Add a {Build,}Requires on +python-distro, since it is now required. +--- + pkg/suse/salt.spec | 2 ++ + salt/config/__init__.py | 4 +++- + salt/grains/core.py | 16 ++++++++-------- + salt/renderers/stateconf.py | 8 ++++---- + tests/unit/modules/test_virt.py | 2 +- + 5 files changed, 18 insertions(+), 14 deletions(-) + +diff --git a/pkg/suse/salt.spec b/pkg/suse/salt.spec +index e3e678af3b..0f6a9bc012 100644 +--- a/pkg/suse/salt.spec ++++ b/pkg/suse/salt.spec +@@ -62,6 +62,7 @@ BuildRequires: python-psutil + BuildRequires: python-requests >= 1.0.0 + BuildRequires: python-tornado >= 4.2.1 + BuildRequires: python-yaml ++BuildRequires: python-distro + # requirements/opt.txt (not all) + # BuildRequires: python-MySQL-python + # BuildRequires: python-timelib +@@ -112,6 +113,7 @@ Requires: python-psutil + Requires: python-requests >= 1.0.0 + Requires: python-tornado >= 4.2.1 + Requires: python-yaml ++Requires: python-distro + %if 0%{?suse_version} + # requirements/opt.txt (not all) + Recommends: python-MySQL-python +diff --git a/salt/config/__init__.py b/salt/config/__init__.py +index 658128dac0..a372200892 100644 +--- a/salt/config/__init__.py ++++ b/salt/config/__init__.py +@@ -3276,7 +3276,9 @@ def apply_cloud_providers_config(overrides, defaults=None): + # Merge provided extends + keep_looping = False + for alias, entries in six.iteritems(providers.copy()): +- for driver, details in six.iteritems(entries): ++ for driver in list(six.iterkeys(entries)): ++ # Don't use iteritems, because the values of the dictionary will be changed ++ details = entries[driver] + + if 'extends' not in details: + # Extends resolved or non existing, continue! +diff --git a/salt/grains/core.py b/salt/grains/core.py +index 67e263d37b..0017c0f472 100644 +--- a/salt/grains/core.py ++++ b/salt/grains/core.py +@@ -40,20 +40,20 @@ except ImportError: + __proxyenabled__ = ['*'] + __FQDN__ = None + +-# Extend the default list of supported distros. This will be used for the +-# /etc/DISTRO-release checking that is part of linux_distribution() +-from platform import _supported_dists +-_supported_dists += ('arch', 'mageia', 'meego', 'vmware', 'bluewhite64', +- 'slamd64', 'ovs', 'system', 'mint', 'oracle', 'void') +- + # linux_distribution deprecated in py3.7 + try: + from platform import linux_distribution as _deprecated_linux_distribution + ++ # Extend the default list of supported distros. This will be used for the ++ # /etc/DISTRO-release checking that is part of linux_distribution() ++ from platform import _supported_dists ++ _supported_dists += ('arch', 'mageia', 'meego', 'vmware', 'bluewhite64', ++ 'slamd64', 'ovs', 'system', 'mint', 'oracle', 'void') ++ + def linux_distribution(**kwargs): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") +- return _deprecated_linux_distribution(**kwargs) ++ return _deprecated_linux_distribution(supported_dists=_supported_dists, **kwargs) + except ImportError: + from distro import linux_distribution + +@@ -1961,7 +1961,7 @@ def os_data(): + ) + (osname, osrelease, oscodename) = \ + [x.strip('"').strip("'") for x in +- linux_distribution(supported_dists=_supported_dists)] ++ linux_distribution()] + # Try to assign these three names based on the lsb info, they tend to + # be more accurate than what python gets from /etc/DISTRO-release. + # It's worth noting that Ubuntu has patched their Python distribution +diff --git a/salt/renderers/stateconf.py b/salt/renderers/stateconf.py +index 8cd0235c99..2ce888d5f3 100644 +--- a/salt/renderers/stateconf.py ++++ b/salt/renderers/stateconf.py +@@ -224,10 +224,10 @@ def render(input, saltenv='base', sls='', argline='', **kws): + tmplctx = STATE_CONF.copy() + if tmplctx: + prefix = sls + '::' +- for k in six.iterkeys(tmplctx): # iterate over a copy of keys +- if k.startswith(prefix): +- tmplctx[k[len(prefix):]] = tmplctx[k] +- del tmplctx[k] ++ tmplctx = { ++ k[len(prefix):] if k.startswith(prefix) else k: v ++ for k, v in six.iteritems(tmplctx) ++ } + else: + tmplctx = {} + +diff --git a/tests/unit/modules/test_virt.py b/tests/unit/modules/test_virt.py +index 719f97a724..3079657a9b 100644 +--- a/tests/unit/modules/test_virt.py ++++ b/tests/unit/modules/test_virt.py +@@ -1256,7 +1256,7 @@ class VirtTestCase(TestCase, LoaderModuleMockMixin): + +
+ +- ++ + + +