Hello community, here is the log from the commit of package salt for openSUSE:Factory checked in at 2019-11-07 23:12:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/salt (Old) and /work/SRC/openSUSE:Factory/.salt.new.2990 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "salt" Thu Nov 7 23:12:33 2019 rev:94 rq:742964 version:2019.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/salt/salt.changes 2019-10-14 12:30:51.836368560 +0200 +++ /work/SRC/openSUSE:Factory/.salt.new.2990/salt.changes 2019-11-07 23:12:52.020294280 +0100 @@ -1,0 +2,80 @@ +Fri Oct 25 14:39:23 UTC 2019 - Jochen Breuer <[email protected]> + +- Fix for aptpkg test with older mock modules + +- Added: + * fix-for-older-mock-module.patch + +------------------------------------------------------------------- +Fri Oct 25 13:52:01 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Remove wrong tests for core grain and improve debug logging +- Use rich RPM deps to get a compatible version of tornado into the + buildroot. + +- Added: + * fix-a-wrong-rebase-in-test_core.py-180.patch + +------------------------------------------------------------------- +Tue Oct 22 09:29:19 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- core.py: ignore wrong product_name files +- zypperpkg: understand product type + +- Added: + * accumulated-changes-from-yomi-167.patch + +------------------------------------------------------------------- +Mon Oct 21 15:10:37 UTC 2019 - Jochen Breuer <[email protected]> + +- Enable usage of downloadonly parameter for apt module + +- Added: + * adds-the-possibility-to-also-use-downloadonly-in-kwa.patch + +------------------------------------------------------------------- +Wed Oct 9 12:40:33 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Add missing 'fun' on events coming from salt-ssh wfunc executions (bsc#1151947) + +- Added: + * add-missing-fun-for-returns-from-wfunc-executions.patch + +------------------------------------------------------------------- +Fri Oct 4 14:35:10 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Fix failing unit tests for batch async + +- Added: + * fix-failing-unit-tests-for-batch-async.patch + +------------------------------------------------------------------- +Thu Oct 3 14:50:41 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Fix memory consumption problem on BatchAsync (bsc#1137642) + +- Added: + * use-current-ioloop-for-the-localclient-instance-of-b.patch + +------------------------------------------------------------------- +Tue Oct 1 13:17:58 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Fix dependencies for RHEL 8 + +------------------------------------------------------------------- +Mon Sep 30 11:15:32 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Prevent systemd-run description issue when running aptpkg (bsc#1152366) + +- Added: + * prevent-systemd-run-description-issue-when-running-a.patch + +------------------------------------------------------------------- +Thu Sep 26 15:17:59 UTC 2019 - Pablo Suárez Hernández <[email protected]> + +- Take checksums arg into account for postgres.datadir_init (bsc#1151650) + +- Added: + * take-checksums-arg-into-account-for-postgres.datadir.patch + +------------------------------------------------------------------- New: ---- accumulated-changes-from-yomi-167.patch add-missing-fun-for-returns-from-wfunc-executions.patch adds-the-possibility-to-also-use-downloadonly-in-kwa.patch fix-a-wrong-rebase-in-test_core.py-180.patch fix-failing-unit-tests-for-batch-async.patch fix-for-older-mock-module.patch prevent-systemd-run-description-issue-when-running-a.patch take-checksums-arg-into-account-for-postgres.datadir.patch use-current-ioloop-for-the-localclient-instance-of-b.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ salt.spec ++++++ --- /var/tmp/diff_new_pack.FMZxHr/_old 2019-11-07 23:12:53.448295844 +0100 +++ /var/tmp/diff_new_pack.FMZxHr/_new 2019-11-07 23:12:53.452295849 +0100 @@ -14,6 +14,7 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # +%global debug_package %{nil} %if 0%{?suse_version} >= 1320 # SLE15 @@ -243,8 +244,27 @@ Patch83: fix-virt.full_info-176.patch # PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/002543df392f65d95dbc127dc058ac897f2035ed Patch84: improve-batch_async-to-release-consumed-memory-bsc-1.patch +# PATCH_FIX_UPSTREAM: https://github.com/saltstack/salt/pull/54770 +Patch85: take-checksums-arg-into-account-for-postgres.datadir.patch +# PATCH_FIX_UPSTREAM: https://github.com/saltstack/salt/pull/54077 +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/44a91c2ce6df78d93ce0ef659dedb0e41b1c2e04 +Patch86: prevent-systemd-run-description-issue-when-running-a.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/55d8a777d6a9b19c959e14a4060e5579e92cd106 +Patch87: use-current-ioloop-for-the-localclient-instance-of-b.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/8378bb24a5a53973e8dba7658b8b3465d967329f +Patch88: fix-failing-unit-tests-for-batch-async.patch +# PATCH_FIX_UPSTREAM: https://github.com/saltstack/salt/pull/54935 +Patch89: add-missing-fun-for-returns-from-wfunc-executions.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/179 +Patch90: adds-the-possibility-to-also-use-downloadonly-in-kwa.patch +# PATCH_FIX_UPSTREAM: https://github.com/saltstack/salt/pull/53326 +# PATCH_FIX_UPSTREAM: https://github.com/saltstack/salt/pull/54954 +Patch91: accumulated-changes-from-yomi-167.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/180 +Patch92: fix-a-wrong-rebase-in-test_core.py-180.patch +# PATCH_FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/181 +Patch93: fix-for-older-mock-module.patch -# BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: logrotate %if 0%{?suse_version} > 1020 @@ -340,9 +360,15 @@ BuildRequires: python-msgpack-python > 0.3 BuildRequires: python-psutil BuildRequires: python-requests >= 1.0.0 +%if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 +# We can't cope with tornado 5.x and newer (boo#1101780); this is only relevant for SLE >= 15 and TW +# where tornado exists in multiple versions +BuildRequires: (python-tornado >= 4.2.1 with python-tornado < 5) +%else BuildRequires: python-tornado >= 4.2.1 # We can't cope with tornado 5.x and newer (boo#1101780) BuildConflicts: python3-tornado >= 5 +%endif # requirements/zeromq.txt BuildRequires: python-pycrypto >= 2.6.1 @@ -424,21 +450,31 @@ # requirements/base.txt %if 0%{?rhel} BuildRequires: python3-jinja2 +BuildRequires: python3-markupsafe +BuildRequires: python3-msgpack > 0.3 +BuildRequires: python3-zmq >= 2.2.0 +BuildRequires: python3-m2crypto %else BuildRequires: python3-Jinja2 -%endif BuildRequires: python3-MarkupSafe -BuildRequires: python3-PyYAML BuildRequires: python3-msgpack-python > 0.3 +BuildRequires: python3-pyzmq >= 2.2.0 +BuildRequires: python3-pycrypto >= 2.6.1 +%endif +BuildRequires: python3-PyYAML BuildRequires: python3-psutil BuildRequires: python3-requests >= 1.0.0 +%if 0%{?suse_version} >= 1500 || 0%{?rhel} >= 8 +# We can't cope with tornado 5.x and newer (boo#1101780); this is only relevant for SLE >= 15 and TW, +# where tornado exists in multiple versions +BuildRequires: (python3-tornado >= 4.2.1 with python3-tornado < 5) +%else BuildRequires: python3-tornado >= 4.2.1 # We can't cope with tornado 5.x and newer (boo#1101780) BuildConflicts: python3-tornado >= 5 +%endif # requirements/zeromq.txt -BuildRequires: python3-pycrypto >= 2.6.1 -BuildRequires: python3-pyzmq >= 2.2.0 %if %{with test} # requirements/dev_python27.txt BuildRequires: python3-boto >= 2.32.1 @@ -461,15 +497,24 @@ %if 0%{?rhel} Requires: python3-jinja2 Requires: yum +Requires: python3-markupsafe +Requires: python3-msgpack > 0.3 +Requires: python3-m2crypto +Requires: python3-zmq >= 2.2.0 +%if 0%{?rhel} == 8 +Requires: dnf +%endif %if 0%{?rhel} == 6 Requires: yum-plugin-security %endif %else Requires: python3-Jinja2 -%endif Requires: python3-MarkupSafe -Requires: python3-PyYAML Requires: python3-msgpack-python > 0.3 +Requires: python3-pycrypto >= 2.6.1 +Requires: python3-pyzmq >= 2.2.0 +%endif +Requires: python3-PyYAML Requires: python3-psutil Requires: python3-requests >= 1.0.0 Requires: python3-tornado >= 4.2.1 @@ -486,8 +531,6 @@ Suggests: python3-gnupg # requirements/zeromq.txt %endif -Requires: python3-pycrypto >= 2.6.1 -Requires: python3-pyzmq >= 2.2.0 # %if 0%{?suse_version} # python-xml is part of python-base in all rhel versions @@ -805,6 +848,15 @@ %patch82 -p1 %patch83 -p1 %patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +%patch93 -p1 %build %if 0%{?build_py2} @@ -1311,10 +1363,12 @@ %endif %endif +%if 0%{?build_py2} %posttrans -n python2-salt # force re-generate a new thin.tgz rm -f %{_localstatedir}/cache/salt/master/thin/version rm -f %{_localstatedir}/cache/salt/minion/thin/version +%endif %if 0%{?build_py3} %posttrans -n python3-salt @@ -1345,10 +1399,8 @@ %config(noreplace) %attr(0640, root, salt) %{_sysconfdir}/salt/cloud.providers %dir %attr(0750, root, salt) %{_localstatedir}/cache/salt/cloud %if 0%{?default_py3} -%{python3_sitelib}/salt/cloud/deploy/bootstrap-salt.sh %attr(755,root,root)%{python3_sitelib}/salt/cloud/deploy/bootstrap-salt.sh %else -%{python_sitelib}/salt/cloud/deploy/bootstrap-salt.sh %attr(755,root,root)%{python_sitelib}/salt/cloud/deploy/bootstrap-salt.sh %endif %{_mandir}/man1/salt-cloud.1.* @@ -1378,7 +1430,6 @@ %dir %attr(0750, root, root) %{_sysconfdir}/salt/minion.d/ %dir %attr(0750, root, root) %{_sysconfdir}/salt/pki/minion/ %dir %attr(0750, root, root) %{_localstatedir}/cache/salt/minion/ -#%dir %ghost %attr(0750, root, salt) %{_localstatedir}/run/salt/minion %{_sbindir}/rcsalt-minion # Install plugin only on SUSE machines @@ -1450,7 +1501,6 @@ %dir %attr(0750, salt, salt) %{_localstatedir}/cache/salt/master/roots/ %dir %attr(0750, salt, salt) %{_localstatedir}/cache/salt/master/syndics/ %dir %attr(0750, salt, salt) %{_localstatedir}/cache/salt/master/tokens/ -#%dir %ghost %attr(0750, salt, salt) %{_localstatedir}/run/salt/master/ %files %defattr(-,root,root,-) @@ -1473,7 +1523,6 @@ %dir %attr(0750, root, salt) %{_sysconfdir}/salt/pki %dir %attr(0750, salt, salt) %{_localstatedir}/log/salt %dir %attr(0750, root, salt) %{_localstatedir}/cache/salt -#%dir %ghost %attr(0750, root, salt) %{_localstatedir}/run/salt %dir %attr(0750, root, salt) /srv/spm %if %{with systemd} /usr/lib/tmpfiles.d/salt.conf ++++++ _lastrevision ++++++ --- /var/tmp/diff_new_pack.FMZxHr/_old 2019-11-07 23:12:53.516295919 +0100 +++ /var/tmp/diff_new_pack.FMZxHr/_new 2019-11-07 23:12:53.516295919 +0100 @@ -1 +1 @@ -6fdab5ecba96a2695eadd798abc2dcfe6ff2b99b \ No newline at end of file +b5b0d996824665d5e87b375b74a2bd22ff73cbb0 \ No newline at end of file ++++++ accumulated-changes-from-yomi-167.patch ++++++ >From 46a60d81604eaf6f9fc3712e02d1066e959c96e3 Mon Sep 17 00:00:00 2001 From: Alberto Planas <[email protected]> Date: Tue, 22 Oct 2019 11:02:33 +0200 Subject: [PATCH] Accumulated changes from Yomi (#167) * core.py: ignore wrong product_name files Some firmwares (like some NUC machines), do not provide valid /sys/class/dmi/id/product_name strings. In those cases an UnicodeDecodeError exception happens. This patch ignore this kind of issue during the grains creation. (cherry picked from commit 2d57d2a6063488ad9329a083219e3826e945aa2d) * zypperpkg: understand product type (cherry picked from commit b865491b74679140f7a71c5ba50d482db47b600f) --- salt/grains/core.py | 4 +++ salt/modules/zypperpkg.py | 30 +++++++++++++------ tests/unit/grains/test_core.py | 45 ++++++++++++++++++++++++++++ tests/unit/modules/test_zypperpkg.py | 26 ++++++++++++++++ 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index fa188a6ff7..fdabe484a8 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -986,6 +986,10 @@ def _virtual(osdata): grains['virtual'] = 'gce' elif 'BHYVE' in output: grains['virtual'] = 'bhyve' + except UnicodeDecodeError: + # Some firmwares provide non-valid 'product_name' + # files, ignore them + pass except IOError: pass elif osdata['kernel'] == 'FreeBSD': diff --git a/salt/modules/zypperpkg.py b/salt/modules/zypperpkg.py index da1953b2a5..a87041aa70 100644 --- a/salt/modules/zypperpkg.py +++ b/salt/modules/zypperpkg.py @@ -861,23 +861,35 @@ def list_pkgs(versions_as_list=False, root=None, includes=None, **kwargs): _ret[pkgname] = sorted(ret[pkgname], key=lambda d: d['version']) for include in includes: + if include == 'product': + products = list_products(all=False, root=root) + for product in products: + extended_name = '{}:{}'.format(include, product['name']) + _ret[extended_name] = [{ + 'epoch': product['epoch'], + 'version': product['version'], + 'release': product['release'], + 'arch': product['arch'], + 'install_date': None, + 'install_date_time_t': None, + }] if include in ('pattern', 'patch'): if include == 'pattern': - pkgs = list_installed_patterns(root=root) + elements = list_installed_patterns(root=root) elif include == 'patch': - pkgs = list_installed_patches(root=root) + elements = list_installed_patches(root=root) else: - pkgs = [] - for pkg in pkgs: - pkg_extended_name = '{}:{}'.format(include, pkg) - info = info_available(pkg_extended_name, + elements = [] + for element in elements: + extended_name = '{}:{}'.format(include, element) + info = info_available(extended_name, refresh=False, root=root) - _ret[pkg_extended_name] = [{ + _ret[extended_name] = [{ 'epoch': None, - 'version': info[pkg]['version'], + 'version': info[element]['version'], 'release': None, - 'arch': info[pkg]['arch'], + 'arch': info[element]['arch'], 'install_date': None, 'install_date_time_t': None, }] diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 889fb90074..aa04a7a7ac 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -1117,6 +1117,51 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): 'uuid': '' }) + @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') + def test_kernelparams_return(self): + expectations = [ + ('BOOT_IMAGE=/vmlinuz-3.10.0-693.2.2.el7.x86_64', + {'kernelparams': [('BOOT_IMAGE', '/vmlinuz-3.10.0-693.2.2.el7.x86_64')]}), + ('root=/dev/mapper/centos_daemon-root', + {'kernelparams': [('root', '/dev/mapper/centos_daemon-root')]}), + ('rhgb quiet ro', + {'kernelparams': [('rhgb', None), ('quiet', None), ('ro', None)]}), + ('param="value1"', + {'kernelparams': [('param', 'value1')]}), + ('param="value1 value2 value3"', + {'kernelparams': [('param', 'value1 value2 value3')]}), + ('param="value1 value2 value3" LANG="pl" ro', + {'kernelparams': [('param', 'value1 value2 value3'), ('LANG', 'pl'), ('ro', None)]}), + ('ipv6.disable=1', + {'kernelparams': [('ipv6.disable', '1')]}), + ('param="value1:value2:value3"', + {'kernelparams': [('param', 'value1:value2:value3')]}), + ('param="value1,value2,value3"', + {'kernelparams': [('param', 'value1,value2,value3')]}), + ('param="value1" param="value2" param="value3"', + {'kernelparams': [('param', 'value1'), ('param', 'value2'), ('param', 'value3')]}), + ] + + for cmdline, expectation in expectations: + with patch('salt.utils.files.fopen', mock_open(read_data=cmdline)): + self.assertEqual(core.kernelparams(), expectation) + + @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') + @patch('os.path.exists') + @patch('salt.utils.platform.is_proxy') + def test__hw_data_linux_empty(self, is_proxy, exists): + is_proxy.return_value = False + exists.return_value = True + with patch('salt.utils.files.fopen', mock_open(read_data='')): + self.assertEqual(core._hw_data({'kernel': 'Linux'}), { + 'biosreleasedate': '', + 'biosversion': '', + 'manufacturer': '', + 'productname': '', + 'serialnumber': '', + 'uuid': '' + }) + @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') @skipIf(six.PY2, 'UnicodeDecodeError is throw in Python 3') @patch('os.path.exists') diff --git a/tests/unit/modules/test_zypperpkg.py b/tests/unit/modules/test_zypperpkg.py index 695d982ca6..7617113401 100644 --- a/tests/unit/modules/test_zypperpkg.py +++ b/tests/unit/modules/test_zypperpkg.py @@ -943,6 +943,32 @@ Repository 'DUMMY' not found by its alias, number, or URI. with self.assertRaisesRegex(CommandExecutionError, '^Advisory id "SUSE-PATCH-XXX" not found$'): zypper.install(advisory_ids=['SUSE-PATCH-XXX']) + @patch('salt.modules.zypperpkg._systemd_scope', + MagicMock(return_value=False)) + @patch('salt.modules.zypperpkg.list_products', + MagicMock(return_value={'openSUSE': {'installed': False, 'summary': 'test'}})) + @patch('salt.modules.zypperpkg.list_pkgs', MagicMock(side_effect=[{"product:openSUSE": "15.2"}, + {"product:openSUSE": "15.3"}])) + def test_install_product_ok(self): + ''' + Test successfully product installation. + ''' + with patch.dict(zypper.__salt__, + { + 'pkg_resource.parse_targets': MagicMock( + return_value=(['product:openSUSE'], None)) + }): + with patch('salt.modules.zypperpkg.__zypper__.noraise.call', MagicMock()) as zypper_mock: + ret = zypper.install('product:openSUSE', includes=['product']) + zypper_mock.assert_called_once_with( + '--no-refresh', + 'install', + '--auto-agree-with-licenses', + '--name', + 'product:openSUSE' + ) + self.assertDictEqual(ret, {"product:openSUSE": {"old": "15.2", "new": "15.3"}}) + def test_remove_purge(self): ''' Test package removal -- 2.23.0 ++++++ add-missing-fun-for-returns-from-wfunc-executions.patch ++++++ >From fa957bcb842a29a340a980a03cd8e54b06e7e21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <[email protected]> Date: Wed, 9 Oct 2019 13:03:33 +0100 Subject: [PATCH] Add missing 'fun' for returns from wfunc executions --- salt/client/ssh/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py index 1453430e73..0df918d634 100644 --- a/salt/client/ssh/__init__.py +++ b/salt/client/ssh/__init__.py @@ -682,6 +682,8 @@ class SSH(object): data = {'return': data} if 'id' not in data: data['id'] = id_ + if 'fun' not in data: + data['fun'] = fun data['jid'] = jid # make the jid in the payload the same as the jid in the tag self.event.fire_event( data, @@ -797,6 +799,8 @@ class SSH(object): data = {'return': data} if 'id' not in data: data['id'] = id_ + if 'fun' not in data: + data['fun'] = fun data['jid'] = jid # make the jid in the payload the same as the jid in the tag self.event.fire_event( data, -- 2.22.0 ++++++ adds-the-possibility-to-also-use-downloadonly-in-kwa.patch ++++++ >From f9e7ace2f7c56a7fb4df60a048131dbd6887340b Mon Sep 17 00:00:00 2001 From: Jochen Breuer <[email protected]> Date: Fri, 27 Sep 2019 11:33:47 +0200 Subject: [PATCH] Adds the possibility to also use downloadonly in kwargs The download_only parameter in the apt module is not in line with the yum and zypper modules. Both of them use downloadonly without the underline. With this change apt now additionally supports the downloadonly parameter. Fixes #54790 --- salt/modules/aptpkg.py | 7 ++++--- tests/unit/modules/test_aptpkg.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/salt/modules/aptpkg.py b/salt/modules/aptpkg.py index a11bb51c16..1a60255a1d 100644 --- a/salt/modules/aptpkg.py +++ b/salt/modules/aptpkg.py @@ -1054,8 +1054,9 @@ def upgrade(refresh=True, dist_upgrade=False, **kwargs): Skip refreshing the package database if refresh has already occurred within <value> seconds - download_only - Only download the packages, don't unpack or install them + download_only (or downloadonly) + Only download the packages, don't unpack or install them. Use + downloadonly to be in line with yum and zypper module. .. versionadded:: 2018.3.0 @@ -1086,7 +1087,7 @@ def upgrade(refresh=True, dist_upgrade=False, **kwargs): cmd.append('--force-yes') if kwargs.get('skip_verify', False): cmd.append('--allow-unauthenticated') - if kwargs.get('download_only', False): + if kwargs.get('download_only', False) or kwargs.get('downloadonly', False): cmd.append('--download-only') cmd.append('dist-upgrade' if dist_upgrade else 'upgrade') diff --git a/tests/unit/modules/test_aptpkg.py b/tests/unit/modules/test_aptpkg.py index 85360da181..d3fac5902a 100644 --- a/tests/unit/modules/test_aptpkg.py +++ b/tests/unit/modules/test_aptpkg.py @@ -393,6 +393,36 @@ class AptPkgTestCase(TestCase, LoaderModuleMockMixin): with patch.multiple(aptpkg, **patch_kwargs): self.assertEqual(aptpkg.upgrade(), dict()) + def test_upgrade_downloadonly(self): + ''' + Tests the download-only options for upgrade. + ''' + with patch('salt.utils.pkg.clear_rtag', MagicMock()): + with patch('salt.modules.aptpkg.list_pkgs', + MagicMock(return_value=UNINSTALL)): + mock_cmd = MagicMock(return_value={ + 'retcode': 0, + 'stdout': UPGRADE + }) + patch_kwargs = { + '__salt__': { + 'config.get': MagicMock(return_value=True), + 'cmd.run_all': mock_cmd + }, + } + with patch.multiple(aptpkg, **patch_kwargs): + aptpkg.upgrade() + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + self.assertFalse(any(args_matching)) + + aptpkg.upgrade(downloadonly=True) + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + self.assertTrue(any(args_matching)) + + aptpkg.upgrade(download_only=True) + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + self.assertTrue(any(args_matching)) + def test_show(self): ''' Test that the pkg.show function properly parses apt-cache show output. -- 2.16.4 ++++++ fix-a-wrong-rebase-in-test_core.py-180.patch ++++++ >From 329f90fcde205237545cd623f55f0f6c228bf893 Mon Sep 17 00:00:00 2001 From: Alberto Planas <[email protected]> Date: Fri, 25 Oct 2019 15:43:16 +0200 Subject: [PATCH] Fix a wrong rebase in test_core.py (#180) * core: ignore wrong product_name files Some firmwares (like some NUC machines), do not provide valid /sys/class/dmi/id/product_name strings. In those cases an UnicodeDecodeError exception happens. This patch ignore this kind of issue during the grains creation. (cherry picked from commit 27b001bd5408359aa5dd219bfd900095ed592fe8) * core: remove duplicate dead code (cherry picked from commit bd0213bae00b737b24795bec3c030ebfe476e0d8) --- salt/grains/core.py | 4 +-- tests/unit/grains/test_core.py | 45 ---------------------------------- 2 files changed, 2 insertions(+), 47 deletions(-) diff --git a/salt/grains/core.py b/salt/grains/core.py index fdabe484a8..bf54c54553 100644 --- a/salt/grains/core.py +++ b/salt/grains/core.py @@ -989,7 +989,7 @@ def _virtual(osdata): except UnicodeDecodeError: # Some firmwares provide non-valid 'product_name' # files, ignore them - pass + log.debug('The content in /sys/devices/virtual/dmi/id/product_name is not valid') except IOError: pass elif osdata['kernel'] == 'FreeBSD': @@ -2490,7 +2490,7 @@ def _hw_data(osdata): except UnicodeDecodeError: # Some firmwares provide non-valid 'product_name' # files, ignore them - pass + log.debug('The content in /sys/devices/virtual/dmi/id/product_name is not valid') except (IOError, OSError) as err: # PermissionError is new to Python 3, but corresponds to the EACESS and # EPERM error numbers. Use those instead here for PY2 compatibility. diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index aa04a7a7ac..889fb90074 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -1117,51 +1117,6 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): 'uuid': '' }) - @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') - def test_kernelparams_return(self): - expectations = [ - ('BOOT_IMAGE=/vmlinuz-3.10.0-693.2.2.el7.x86_64', - {'kernelparams': [('BOOT_IMAGE', '/vmlinuz-3.10.0-693.2.2.el7.x86_64')]}), - ('root=/dev/mapper/centos_daemon-root', - {'kernelparams': [('root', '/dev/mapper/centos_daemon-root')]}), - ('rhgb quiet ro', - {'kernelparams': [('rhgb', None), ('quiet', None), ('ro', None)]}), - ('param="value1"', - {'kernelparams': [('param', 'value1')]}), - ('param="value1 value2 value3"', - {'kernelparams': [('param', 'value1 value2 value3')]}), - ('param="value1 value2 value3" LANG="pl" ro', - {'kernelparams': [('param', 'value1 value2 value3'), ('LANG', 'pl'), ('ro', None)]}), - ('ipv6.disable=1', - {'kernelparams': [('ipv6.disable', '1')]}), - ('param="value1:value2:value3"', - {'kernelparams': [('param', 'value1:value2:value3')]}), - ('param="value1,value2,value3"', - {'kernelparams': [('param', 'value1,value2,value3')]}), - ('param="value1" param="value2" param="value3"', - {'kernelparams': [('param', 'value1'), ('param', 'value2'), ('param', 'value3')]}), - ] - - for cmdline, expectation in expectations: - with patch('salt.utils.files.fopen', mock_open(read_data=cmdline)): - self.assertEqual(core.kernelparams(), expectation) - - @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') - @patch('os.path.exists') - @patch('salt.utils.platform.is_proxy') - def test__hw_data_linux_empty(self, is_proxy, exists): - is_proxy.return_value = False - exists.return_value = True - with patch('salt.utils.files.fopen', mock_open(read_data='')): - self.assertEqual(core._hw_data({'kernel': 'Linux'}), { - 'biosreleasedate': '', - 'biosversion': '', - 'manufacturer': '', - 'productname': '', - 'serialnumber': '', - 'uuid': '' - }) - @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux') @skipIf(six.PY2, 'UnicodeDecodeError is throw in Python 3') @patch('os.path.exists') -- 2.23.0 ++++++ fix-failing-unit-tests-for-batch-async.patch ++++++ >From 8378bb24a5a53973e8dba7658b8b3465d967329f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <[email protected]> Date: Fri, 4 Oct 2019 15:00:50 +0100 Subject: [PATCH] Fix failing unit tests for batch async --- salt/cli/batch_async.py | 2 +- tests/unit/cli/test_batch_async.py | 57 +++++++++++++++++------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/salt/cli/batch_async.py b/salt/cli/batch_async.py index f9e736f804..6d0dca1da5 100644 --- a/salt/cli/batch_async.py +++ b/salt/cli/batch_async.py @@ -88,7 +88,7 @@ class BatchAsync(object): io_loop=ioloop, keep_loop=True) self.scheduled = False - self.patterns = {} + self.patterns = set() def __set_event_handler(self): ping_return_pattern = 'salt/job/{0}/ret/*'.format(self.ping_jid) diff --git a/tests/unit/cli/test_batch_async.py b/tests/unit/cli/test_batch_async.py index 441f9c58b9..12dfe543bc 100644 --- a/tests/unit/cli/test_batch_async.py +++ b/tests/unit/cli/test_batch_async.py @@ -68,8 +68,8 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): ret = self.batch.start() # assert start_batch is called later with batch_presence_ping_timeout as param self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.batch_presence_ping_timeout, self.batch.start_batch)) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.start_batch,)) # assert test.ping called self.assertEqual( self.batch.local.run_job_async.call_args[0], @@ -88,8 +88,8 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): ret = self.batch.start() # assert start_batch is called later with gather_job_timeout as param self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.opts['gather_job_timeout'], self.batch.start_batch)) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.start_batch,)) def test_batch_fire_start_event(self): self.batch.minions = set(['foo', 'bar']) @@ -113,12 +113,11 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): def test_start_batch_calls_next(self): self.batch.run_next = MagicMock(return_value=MagicMock()) self.batch.event = MagicMock() - future = tornado.gen.Future() - future.set_result(None) - self.batch.run_next = MagicMock(return_value=future) self.batch.start_batch() self.assertEqual(self.batch.initialized, True) - self.assertEqual(len(self.batch.run_next.mock_calls), 1) + self.assertEqual( + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.run_next,)) def test_batch_fire_done_event(self): self.batch.targeted_minions = {'foo', 'baz', 'bar'} @@ -154,14 +153,14 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): future = tornado.gen.Future() future.set_result({'minions': ['foo', 'bar']}) self.batch.local.run_job_async.return_value = future - ret = self.batch.run_next().result() + self.batch.run_next() self.assertEqual( self.batch.local.run_job_async.call_args[0], ({'foo', 'bar'}, 'my.fun', [], 'list') ) self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.opts['timeout'], self.batch.find_job, {'foo', 'bar'}) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.find_job, {'foo', 'bar'}) ) self.assertEqual(self.batch.active, {'bar', 'foo'}) @@ -252,13 +251,14 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): self.assertEqual(self.batch.active, set()) self.assertEqual(self.batch.done_minions, {'foo'}) self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.batch_delay, self.batch.run_next)) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.schedule_next,)) def test_batch__event_handler_find_job_return(self): self.batch.event = MagicMock( - unpack=MagicMock(return_value=('salt/job/1236/ret/foo', {'id': 'foo'}))) + unpack=MagicMock(return_value=('salt/job/1236/ret/foo', {'id': 'foo', 'return': 'deadbeaf'}))) self.batch.start() + self.batch.patterns.add(('salt/job/1236/ret/*', 'find_job_return')) self.batch._BatchAsync__event_handler(MagicMock()) self.assertEqual(self.batch.find_job_returned, {'foo'}) @@ -275,10 +275,13 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): future = tornado.gen.Future() future.set_result({}) self.batch.local.run_job_async.return_value = future + self.batch.minions = set(['foo', 'bar']) + self.batch.jid_gen = MagicMock(return_value="1234") + tornado.gen.sleep = MagicMock(return_value=future) self.batch.find_job({'foo', 'bar'}) self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.opts['gather_job_timeout'], self.batch.check_find_job, {'foo', 'bar'}) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.check_find_job, {'foo', 'bar'}, "1234") ) @tornado.testing.gen_test @@ -288,17 +291,21 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): future = tornado.gen.Future() future.set_result({}) self.batch.local.run_job_async.return_value = future + self.batch.minions = set(['foo', 'bar']) + self.batch.jid_gen = MagicMock(return_value="1234") + tornado.gen.sleep = MagicMock(return_value=future) self.batch.find_job({'foo', 'bar'}) self.assertEqual( - self.batch.event.io_loop.call_later.call_args[0], - (self.batch.opts['gather_job_timeout'], self.batch.check_find_job, {'foo'}) + self.batch.event.io_loop.spawn_callback.call_args[0], + (self.batch.check_find_job, {'foo'}, "1234") ) def test_batch_check_find_job_did_not_return(self): self.batch.event = MagicMock() self.batch.active = {'foo'} self.batch.find_job_returned = set() - self.batch.check_find_job({'foo'}) + self.batch.patterns = { ('salt/job/1234/ret/*', 'find_job_return') } + self.batch.check_find_job({'foo'}, jid="1234") self.assertEqual(self.batch.find_job_returned, set()) self.assertEqual(self.batch.active, set()) self.assertEqual(len(self.batch.event.io_loop.add_callback.mock_calls), 0) @@ -306,9 +313,10 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): def test_batch_check_find_job_did_return(self): self.batch.event = MagicMock() self.batch.find_job_returned = {'foo'} - self.batch.check_find_job({'foo'}) + self.batch.patterns = { ('salt/job/1234/ret/*', 'find_job_return') } + self.batch.check_find_job({'foo'}, jid="1234") self.assertEqual( - self.batch.event.io_loop.add_callback.call_args[0], + self.batch.event.io_loop.spawn_callback.call_args[0], (self.batch.find_job, {'foo'}) ) @@ -329,7 +337,8 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): # both not yet done but only 'foo' responded to find_job not_done = {'foo', 'bar'} - self.batch.check_find_job(not_done) + self.batch.patterns = { ('salt/job/1234/ret/*', 'find_job_return') } + self.batch.check_find_job(not_done, jid="1234") # assert 'bar' removed from active self.assertEqual(self.batch.active, {'foo'}) @@ -339,7 +348,7 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): # assert 'find_job' schedueled again only for 'foo' self.assertEqual( - self.batch.event.io_loop.add_callback.call_args[0], + self.batch.event.io_loop.spawn_callback.call_args[0], (self.batch.find_job, {'foo'}) ) @@ -347,4 +356,4 @@ class AsyncBatchTestCase(AsyncTestCase, TestCase): self.batch.event = MagicMock() self.batch.scheduled = True self.batch.schedule_next() - self.assertEqual(len(self.batch.event.io_loop.call_later.mock_calls), 0) + self.assertEqual(len(self.batch.event.io_loop.spawn_callback.mock_calls), 0) -- 2.22.0 ++++++ fix-for-older-mock-module.patch ++++++ >From 7e4c53ab89927b6b700603a74131da318c93b957 Mon Sep 17 00:00:00 2001 From: Jochen Breuer <[email protected]> Date: Fri, 25 Oct 2019 16:18:58 +0200 Subject: [PATCH] Fix for older mock module Seems like args is not working with older mock modules. --- tests/unit/modules/test_aptpkg.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/modules/test_aptpkg.py b/tests/unit/modules/test_aptpkg.py index d3fac5902a..bc6b610d86 100644 --- a/tests/unit/modules/test_aptpkg.py +++ b/tests/unit/modules/test_aptpkg.py @@ -412,15 +412,15 @@ class AptPkgTestCase(TestCase, LoaderModuleMockMixin): } with patch.multiple(aptpkg, **patch_kwargs): aptpkg.upgrade() - args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args[0] if "--download-only" in args] self.assertFalse(any(args_matching)) aptpkg.upgrade(downloadonly=True) - args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args[0] if "--download-only" in args] self.assertTrue(any(args_matching)) aptpkg.upgrade(download_only=True) - args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args.args if "--download-only" in args] + args_matching = [True for args in patch_kwargs['__salt__']['cmd.run_all'].call_args[0] if "--download-only" in args] self.assertTrue(any(args_matching)) def test_show(self): -- 2.16.4 ++++++ prevent-systemd-run-description-issue-when-running-a.patch ++++++ >From 44a91c2ce6df78d93ce0ef659dedb0e41b1c2e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <[email protected]> Date: Mon, 30 Sep 2019 12:06:08 +0100 Subject: [PATCH] Prevent systemd-run description issue when running aptpkg (bsc#1152366) --- salt/modules/aptpkg.py | 2 +- tests/unit/modules/test_aptpkg.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/salt/modules/aptpkg.py b/salt/modules/aptpkg.py index d49a48310e..a11bb51c16 100644 --- a/salt/modules/aptpkg.py +++ b/salt/modules/aptpkg.py @@ -165,7 +165,7 @@ def _call_apt(args, scope=True, **kwargs): ''' cmd = [] if scope and salt.utils.systemd.has_scope(__context__) and __salt__['config.get']('systemd.scope', True): - cmd.extend(['systemd-run', '--scope', '--description "{0}"'.format(__name__)]) + cmd.extend(['systemd-run', '--scope', '--description', '"{0}"'.format(__name__)]) cmd.extend(args) params = {'output_loglevel': 'trace', diff --git a/tests/unit/modules/test_aptpkg.py b/tests/unit/modules/test_aptpkg.py index 06f3a9f6aa..85360da181 100644 --- a/tests/unit/modules/test_aptpkg.py +++ b/tests/unit/modules/test_aptpkg.py @@ -544,7 +544,7 @@ class AptUtilsTestCase(TestCase, LoaderModuleMockMixin): with patch.dict(aptpkg.__salt__, {'cmd.run_all': MagicMock(), 'config.get': MagicMock(return_value=True)}): aptpkg._call_apt(['apt-get', 'purge', 'vim']) # pylint: disable=W0106 aptpkg.__salt__['cmd.run_all'].assert_called_once_with( - ['systemd-run', '--scope', '--description "salt.modules.aptpkg"', 'apt-get', 'purge', 'vim'], env={}, + ['systemd-run', '--scope', '--description', '"salt.modules.aptpkg"', 'apt-get', 'purge', 'vim'], env={}, output_loglevel='trace', python_shell=False) def test_call_apt_with_kwargs(self): -- 2.22.0 ++++++ take-checksums-arg-into-account-for-postgres.datadir.patch ++++++ >From 7ed3e99a4979a13c7142ed5ba73c09a282e03147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <[email protected]> Date: Thu, 26 Sep 2019 15:57:58 +0100 Subject: [PATCH] Take checksums arg into account for postgres.datadir_init (bsc#1151650) Update unit test for postgres.datadir_init --- salt/modules/postgres.py | 1 + tests/unit/modules/test_postgres.py | 1 + 2 files changed, 2 insertions(+) diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index b6f7cbe5d4..f0d1b034b9 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -3151,6 +3151,7 @@ def datadir_init(name, password=password, encoding=encoding, locale=locale, + checksums=checksums, runas=runas) return ret['retcode'] == 0 diff --git a/tests/unit/modules/test_postgres.py b/tests/unit/modules/test_postgres.py index 03fb7fddfd..6f10fcf2e0 100644 --- a/tests/unit/modules/test_postgres.py +++ b/tests/unit/modules/test_postgres.py @@ -1467,6 +1467,7 @@ class PostgresTestCase(TestCase, LoaderModuleMockMixin): locale=None, password='test', runas='postgres', + checksums=False, user='postgres', ) self.assertTrue(ret) -- 2.22.0 ++++++ use-current-ioloop-for-the-localclient-instance-of-b.patch ++++++ >From 55d8a777d6a9b19c959e14a4060e5579e92cd106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <[email protected]> Date: Thu, 3 Oct 2019 15:19:02 +0100 Subject: [PATCH] Use current IOLoop for the LocalClient instance of BatchAsync (bsc#1137642) --- salt/cli/batch_async.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/salt/cli/batch_async.py b/salt/cli/batch_async.py index 2bb50459c8..f9e736f804 100644 --- a/salt/cli/batch_async.py +++ b/salt/cli/batch_async.py @@ -52,7 +52,7 @@ class BatchAsync(object): ''' def __init__(self, parent_opts, jid_gen, clear_load): ioloop = tornado.ioloop.IOLoop.current() - self.local = salt.client.get_local_client(parent_opts['conf_file']) + self.local = salt.client.get_local_client(parent_opts['conf_file'], io_loop=ioloop) if 'gather_job_timeout' in clear_load['kwargs']: clear_load['gather_job_timeout'] = clear_load['kwargs'].pop('gather_job_timeout') else: @@ -266,6 +266,7 @@ class BatchAsync(object): yield def __del__(self): + self.local = None self.event = None self.ioloop = None gc.collect() -- 2.22.0
