Hello community, here is the log from the commit of package salt for openSUSE:Factory checked in at 2020-10-18 16:25:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/salt (Old) and /work/SRC/openSUSE:Factory/.salt.new.3486 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "salt" Sun Oct 18 16:25:11 2020 rev:110 rq:841799 version:3000.3 Changes: -------- --- /work/SRC/openSUSE:Factory/salt/salt.changes 2020-09-18 14:35:23.875680916 +0200 +++ /work/SRC/openSUSE:Factory/.salt.new.3486/salt.changes 2020-10-18 16:26:06.288615897 +0200 @@ -1,0 +2,58 @@ +Wed Oct 14 10:49:33 UTC 2020 - Pablo Suárez Hernández <pablo.suarezhernan...@suse.com> + +- Ensure virt.update stop_on_reboot is updated with its default value + +- Added: + * ensure-virt.update-stop_on_reboot-is-updated-with-it.patch + +------------------------------------------------------------------- +Tue Oct 13 15:26:05 UTC 2020 - Pablo Suárez Hernández <pablo.suarezhernan...@suse.com> + +- Do not break package building for systemd OSes + +------------------------------------------------------------------- +Tue Oct 13 11:10:06 UTC 2020 - Pablo Suárez Hernández <pablo.suarezhernan...@suse.com> + +- Drop wrong mock from chroot unit test + +- Added: + * drop-wrong-mock-from-chroot-unit-test.patch + +------------------------------------------------------------------- +Wed Oct 7 12:19:05 UTC 2020 - Jochen Breuer <jbre...@suse.de> + +- Support systemd versions with dot (bsc#1176294) + +------------------------------------------------------------------- +Tue Oct 6 12:52:51 UTC 2020 - Jochen Breuer <jbre...@suse.de> + +- Fix for grains.test_core unit test +- Fix file/directory user and group ownership containing UTF-8 + characters (bsc#1176024) +- Several changes to virtualization: +- - Fix virt update when cpu and memory are changed +- - Memory Tuning GSoC +- - Properly fix memory setting regression in virt.update +- - Expose libvirt on_reboot in virt states +- Support transactional systems (MicroOS) +- zypperpkg module ignores retcode 104 for search() (bsc#1159670) +- Xen disk fixes. No longer generates volumes for Xen disks, but the + corresponding file or block disk (bsc#1175987) + +- Added: + * fix-grains.test_core-unit-test-277.patch + * support-transactional-systems-microos-271.patch + * backport-a-few-virt-prs-272.patch + * xen-disk-fixes-264.patch + * zypperpkg-ignore-retcode-104-for-search-bsc-1176697-.patch + * bsc-1176024-fix-file-directory-user-and-group-owners.patch + +------------------------------------------------------------------- +Wed Sep 23 14:48:41 UTC 2020 - Pablo Suárez Hernández <pablo.suarezhernan...@suse.com> + +- Invalidate file list cache when cache file modified time is in the future (bsc#1176397) + +- Added: + * invalidate-file-list-cache-when-cache-file-modified-.patch + +------------------------------------------------------------------- New: ---- backport-a-few-virt-prs-272.patch bsc-1176024-fix-file-directory-user-and-group-owners.patch drop-wrong-mock-from-chroot-unit-test.patch ensure-virt.update-stop_on_reboot-is-updated-with-it.patch fix-grains.test_core-unit-test-277.patch invalidate-file-list-cache-when-cache-file-modified-.patch support-transactional-systems-microos-271.patch xen-disk-fixes-264.patch zypperpkg-ignore-retcode-104-for-search-bsc-1176697-.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ salt.spec ++++++ --- /var/tmp/diff_new_pack.yHxHch/_old 2020-10-18 16:26:13.884619278 +0200 +++ /var/tmp/diff_new_pack.yHxHch/_new 2020-10-18 16:26:13.888619280 +0200 @@ -345,6 +345,24 @@ Patch130: remove-msgpack-1.0.0-requirement-in-the-installed-me.patch # PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/bc20f38d0fa492af70321fef7fe2530937dfc86a Patch131: prevent-import-errors-when-running-test_btrfs-unit-t.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/58529 +Patch132: invalidate-file-list-cache-when-cache-file-modified-.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/58400 +Patch133: xen-disk-fixes-264.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/58552 +Patch134: zypperpkg-ignore-retcode-104-for-search-bsc-1176697-.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/58520 +Patch135: support-transactional-systems-microos-271.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/272 +Patch136: backport-a-few-virt-prs-272.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/275 +Patch137: bsc-1176024-fix-file-directory-user-and-group-owners.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/277 +Patch138: fix-grains.test_core-unit-test-277.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/e2c3b1cb72b796fe12f94af64baa2e64cbe5db0b +Patch139: drop-wrong-mock-from-chroot-unit-test.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/280 +Patch140: ensure-virt.update-stop_on_reboot-is-updated-with-it.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: logrotate @@ -690,6 +708,7 @@ %endif %if %{with systemd} %{?systemd_requires} +BuildRequires: systemd %else %if 0%{?suse_version} Requires(pre): %insserv_prereq @@ -982,6 +1001,15 @@ %patch129 -p1 %patch130 -p1 %patch131 -p1 +%patch132 -p1 +%patch133 -p1 +%patch134 -p1 +%patch135 -p1 +%patch136 -p1 +%patch137 -p1 +%patch138 -p1 +%patch139 -p1 +%patch140 -p1 %build # Putting /usr/bin at the front of $PATH is needed for RHEL/RES 7. Without this @@ -1357,7 +1385,8 @@ true fi %if %{with systemd} -if [ `rpm -q systemd --queryformat="%%{VERSION}"` -lt 228 ]; then +systemd_ver=$(rpm -q systemd --queryformat="%%{VERSION}") +if [ "${systemd_ver%%.*}" -lt 228 ]; then # On systemd < 228 the 'TasksTask' attribute is not available. # Removing TasksMax from salt-master.service on SLE12SP1 LTSS (bsc#985112) sed -i '/TasksMax=infinity/d' %{_unitdir}/salt-master.service ++++++ _lastrevision ++++++ --- /var/tmp/diff_new_pack.yHxHch/_old 2020-10-18 16:26:13.988619324 +0200 +++ /var/tmp/diff_new_pack.yHxHch/_new 2020-10-18 16:26:13.992619326 +0200 @@ -1 +1 @@ -8afd80f388d6e97b882f8564a8afa1acab63e014 \ No newline at end of file +3ce95a1b386927b6f8cb27d1a6421018bebccd9a \ No newline at end of file ++++++ backport-a-few-virt-prs-272.patch ++++++ ++++ 1272 lines (skipped) ++++++ bsc-1176024-fix-file-directory-user-and-group-owners.patch ++++++ >From 8973063f6ad24fd5b3788292aa8cc341221d7fb5 Mon Sep 17 00:00:00 2001 From: Victor Zhestkov <35733135+vzhest...@users.noreply.github.com> Date: Tue, 6 Oct 2020 12:36:41 +0300 Subject: [PATCH] bsc#1176024: Fix file/directory user and group ownership containing UTF-8 characters (#275) * Fix check_perm typos of file module * Fix UTF8 support for user/group ownership operations with file module and state * Fix UTF8 support for user/group ownership operations with file module and state Co-authored-by: Victor Zhestkov <vzhest...@vz-thinkpad.vzhestkov.net> --- salt/modules/file.py | 18 +++++++++--------- salt/states/file.py | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/salt/modules/file.py b/salt/modules/file.py index b5b70e2d4c..0b516aff05 100644 --- a/salt/modules/file.py +++ b/salt/modules/file.py @@ -256,7 +256,7 @@ def group_to_gid(group): try: if isinstance(group, int): return group - return grp.getgrnam(group).gr_gid + return grp.getgrnam(salt.utils.stringutils.to_str(group)).gr_gid except KeyError: return '' @@ -344,7 +344,7 @@ def user_to_uid(user): try: if isinstance(user, int): return user - return pwd.getpwnam(user).pw_uid + return pwd.getpwnam(salt.utils.stringutils.to_str(user)).pw_uid except KeyError: return '' @@ -4574,7 +4574,7 @@ def check_perms(name, ret, user, group, mode, attrs=None, follow_symlinks=False) if (salt.utils.platform.is_windows() and user_to_uid(user) != user_to_uid(perms['luser']) ) or ( - not salt.utils.platform.is_windows() and user != perms['luser'] + not salt.utils.platform.is_windows() and salt.utils.stringutils.to_str(user) != perms['luser'] ): perms['cuser'] = user @@ -4584,7 +4584,7 @@ def check_perms(name, ret, user, group, mode, attrs=None, follow_symlinks=False) if (salt.utils.platform.is_windows() and group_to_gid(group) != group_to_gid(perms['lgroup']) ) or ( - not salt.utils.platform.is_windows() and group != perms['lgroup'] + not salt.utils.platform.is_windows() and salt.utils.stringutils.to_str(group) != perms['lgroup'] ): perms['cgroup'] = group @@ -4615,7 +4615,7 @@ def check_perms(name, ret, user, group, mode, attrs=None, follow_symlinks=False) user != '' ) or ( not salt.utils.platform.is_windows() and - user != get_user(name, follow_symlinks=follow_symlinks) and + salt.utils.stringutils.to_str(user) != get_user(name, follow_symlinks=follow_symlinks) and user != '' ): if __opts__['test'] is True: @@ -4633,10 +4633,10 @@ def check_perms(name, ret, user, group, mode, attrs=None, follow_symlinks=False) if (salt.utils.platform.is_windows() and group_to_gid(group) != group_to_gid( get_group(name, follow_symlinks=follow_symlinks)) and - user != '') or ( + group != '') or ( not salt.utils.platform.is_windows() and - group != get_group(name, follow_symlinks=follow_symlinks) and - user != '' + salt.utils.stringutils.to_str(group) != get_group(name, follow_symlinks=follow_symlinks) and + group != '' ): if __opts__['test'] is True: ret['changes']['group'] = group @@ -4644,7 +4644,7 @@ def check_perms(name, ret, user, group, mode, attrs=None, follow_symlinks=False) ret['result'] = False ret['comment'].append('Failed to change group to {0}' .format(group)) - elif 'cgroup' in perms and user != '': + elif 'cgroup' in perms and group != '': ret['changes']['group'] = group # Mode changes if needed diff --git a/salt/states/file.py b/salt/states/file.py index 0e925bb2ed..f21e0d12fc 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -960,11 +960,11 @@ def _check_dir_meta(name, changes['directory'] = 'new' return changes if (user is not None - and user != stats['user'] + and salt.utils.stringutils.to_str(user) != stats['user'] and user != stats.get('uid')): changes['user'] = user if (group is not None - and group != stats['group'] + and salt.utils.stringutils.to_str(group) != stats['group'] and group != stats.get('gid')): changes['group'] = group # Normalize the dir mode -- 2.28.0 ++++++ drop-wrong-mock-from-chroot-unit-test.patch ++++++ >From e2c3b1cb72b796fe12f94af64baa2e64cbe5db0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <psuarezhernan...@suse.com> Date: Tue, 13 Oct 2020 12:02:00 +0100 Subject: [PATCH] Drop wrong mock from chroot unit test --- tests/unit/modules/test_chroot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/modules/test_chroot.py b/tests/unit/modules/test_chroot.py index 62808ed680..045d56c5b0 100644 --- a/tests/unit/modules/test_chroot.py +++ b/tests/unit/modules/test_chroot.py @@ -83,7 +83,6 @@ class ChrootTestCase(TestCase, LoaderModuleMockMixin): self.assertTrue(chroot.create('/chroot')) makedirs.assert_called() - @patch("salt.modules.chroot.exist") @patch("salt.utils.files.fopen") def test_in_chroot(self, fopen): """ -- 2.28.0 ++++++ ensure-virt.update-stop_on_reboot-is-updated-with-it.patch ++++++ >From 173444cecc1e7b4867570f1f8764db1b7f82061e Mon Sep 17 00:00:00 2001 From: Cedric Bosdonnat <cbosdon...@suse.com> Date: Wed, 14 Oct 2020 12:39:16 +0200 Subject: [PATCH] Ensure virt.update stop_on_reboot is updated with its default value (#280) While all virt.update properties default values should not be used when updating the XML definition, the stop_on_reboot default value (False) needs to be passed still or the user will never be able to update with this value. --- salt/modules/virt.py | 1 + tests/unit/modules/test_virt.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/salt/modules/virt.py b/salt/modules/virt.py index 87ab7ca12d..9bc7bc6093 100644 --- a/salt/modules/virt.py +++ b/salt/modules/virt.py @@ -2742,6 +2742,7 @@ def update( ] data = {k: v for k, v in six.iteritems(locals()) if bool(v)} + data["stop_on_reboot"] = stop_on_reboot if boot_dev: data["boot_dev"] = {i + 1: dev for i, dev in enumerate(boot_dev.split())} need_update = salt.utils.xmlutil.change_xml( diff --git a/tests/unit/modules/test_virt.py b/tests/unit/modules/test_virt.py index ca5e80d2d2..fbc03cf7a6 100644 --- a/tests/unit/modules/test_virt.py +++ b/tests/unit/modules/test_virt.py @@ -1778,6 +1778,7 @@ class VirtTestCase(TestCase, LoaderModuleMockMixin): <memory unit='KiB'>1048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> <vcpu placement='auto'>1</vcpu> + <on_reboot>restart</on_reboot> <os> <type arch='x86_64' machine='pc-i440fx-2.6'>hvm</type> <boot dev="hd"/> @@ -2350,6 +2351,7 @@ class VirtTestCase(TestCase, LoaderModuleMockMixin): <memory unit='KiB'>1048576</memory> <currentMemory unit='KiB'>1048576</currentMemory> <vcpu placement='auto'>1</vcpu> + <on_reboot>restart</on_reboot> <os> <type arch='x86_64' machine='pc-i440fx-2.6'>hvm</type> </os> -- 2.28.0 ++++++ fix-grains.test_core-unit-test-277.patch ++++++ >From 4998996a08db72a1b925b2c3f725c4fba4fe9622 Mon Sep 17 00:00:00 2001 From: Dominik Gedon <dge...@suse.de> Date: Tue, 6 Oct 2020 14:00:55 +0200 Subject: [PATCH] Fix grains.test_core unit test (#277) This reverts 63b94ae and fixes the grains test_core unit test. The changes are aligned with upstream. --- tests/unit/grains/test_core.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py index 36aa49f232..d3b6515d00 100644 --- a/tests/unit/grains/test_core.py +++ b/tests/unit/grains/test_core.py @@ -69,10 +69,11 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): def test_parse_etc_os_release(self, path_isfile_mock): path_isfile_mock.side_effect = lambda x: x == "/usr/lib/os-release" with salt.utils.files.fopen(os.path.join(OS_RELEASE_DIR, "ubuntu-17.10")) as os_release_file: - os_release_content = os_release_file.readlines() - with patch("salt.utils.files.fopen", mock_open()) as os_release_file: - os_release_file.return_value.__iter__.return_value = os_release_content - os_release = core._parse_os_release(["/etc/os-release", "/usr/lib/os-release"]) + os_release_content = os_release_file.read() + with patch("salt.utils.files.fopen", mock_open(read_data=os_release_content)): + os_release = core._parse_os_release( + "/etc/os-release", "/usr/lib/os-release" + ) self.assertEqual(os_release, { "NAME": "Ubuntu", "VERSION": "17.10 (Artful Aardvark)", @@ -134,7 +135,9 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin): def test_missing_os_release(self): with patch('salt.utils.files.fopen', mock_open(read_data={})): - os_release = core._parse_os_release(['/etc/os-release', '/usr/lib/os-release']) + os_release = core._parse_os_release( + "/etc/os-release", "/usr/lib/os-release" + ) self.assertEqual(os_release, {}) @skipIf(not salt.utils.platform.is_windows(), 'System is not Windows') -- 2.28.0 ++++++ invalidate-file-list-cache-when-cache-file-modified-.patch ++++++ >From 1ca1bb7c01b1e589147c32b16eda719537ab5b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= <psuarezhernan...@suse.com> Date: Tue, 22 Sep 2020 15:15:51 +0100 Subject: [PATCH] Invalidate file list cache when cache file modified time is in the future (bsc#1176397) Add test_future_file_list_cache_file_ignored unit test --- salt/fileserver/__init__.py | 2 +- tests/unit/test_fileserver.py | 47 +++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/salt/fileserver/__init__.py b/salt/fileserver/__init__.py index 919987e2fc..1b8de51bdc 100644 --- a/salt/fileserver/__init__.py +++ b/salt/fileserver/__init__.py @@ -142,7 +142,7 @@ def check_file_list_cache(opts, form, list_cache, w_lock): 'file=%s mtime=%s current_time=%s', list_cache, current_time, file_mtime ) - age = 0 + age = -1 else: age = current_time - file_mtime else: diff --git a/tests/unit/test_fileserver.py b/tests/unit/test_fileserver.py index d38e22c8e1..b92b32947b 100644 --- a/tests/unit/test_fileserver.py +++ b/tests/unit/test_fileserver.py @@ -6,11 +6,17 @@ # Import Python libs from __future__ import absolute_import, print_function, unicode_literals -# Import Salt Testing libs -from tests.support.unit import TestCase +import datetime +import os +import time +import salt.utils.files from salt import fileserver +# Import Salt Testing libs +from tests.support.helpers import with_tempdir +from tests.support.unit import TestCase + class MapDiffTestCase(TestCase): def test_diff_with_diffent_keys(self): @@ -28,3 +34,40 @@ class MapDiffTestCase(TestCase): map1 = {'file1': 12345} map2 = {'file1': 1234} assert fileserver.diff_mtime_map(map1, map2) is True + + +class VCSBackendWhitelistCase(TestCase): + def setup_loader_modules(self): + return {fileserver: {}} + + @with_tempdir() + def test_future_file_list_cache_file_ignored(self, cachedir): + opts = { + "fileserver_backend": ["roots"], + "cachedir": cachedir, + "extension_modules": "", + } + + back_cachedir = os.path.join(cachedir, "file_lists/roots") + os.makedirs(os.path.join(back_cachedir)) + + # Touch a couple files + for filename in ("base.p", "foo.txt"): + with salt.utils.files.fopen( + os.path.join(back_cachedir, filename), "wb" + ) as _f: + if filename == "base.p": + _f.write(b"\x80") + + # Set modification time to file list cache file to 1 year in the future + now = datetime.datetime.utcnow() + future = now + datetime.timedelta(days=365) + mod_time = time.mktime(future.timetuple()) + os.utime(os.path.join(back_cachedir, "base.p"), (mod_time, mod_time)) + + list_cache = os.path.join(back_cachedir, "base.p") + w_lock = os.path.join(back_cachedir, ".base.w") + ret = fileserver.check_file_list_cache(opts, "files", list_cache, w_lock) + assert ( + ret[1] is True + ), "Cache file list cache file is not refreshed when future modification time" -- 2.28.0 ++++++ support-transactional-systems-microos-271.patch ++++++ ++++ 3145 lines (skipped) ++++++ xen-disk-fixes-264.patch ++++++ ++++ 1120 lines (skipped) ++++++ zypperpkg-ignore-retcode-104-for-search-bsc-1176697-.patch ++++++ >From 76c38695fa663d55876902feda4a1c93211a1a9f Mon Sep 17 00:00:00 2001 From: Alberto Planas <apla...@suse.com> Date: Mon, 5 Oct 2020 16:24:16 +0200 Subject: [PATCH] zypperpkg: ignore retcode 104 for search() (bsc#1176697) (#270) --- salt/modules/zypperpkg.py | 38 ++++++++++-- tests/unit/modules/test_zypperpkg.py | 87 ++++++++++++++++++++++------ 2 files changed, 101 insertions(+), 24 deletions(-) diff --git a/salt/modules/zypperpkg.py b/salt/modules/zypperpkg.py index 96c3eed851..ad11da4ad1 100644 --- a/salt/modules/zypperpkg.py +++ b/salt/modules/zypperpkg.py @@ -98,6 +98,8 @@ class _Zypper(object): } LOCK_EXIT_CODE = 7 + NOT_FOUND_EXIT_CODE = 104 + XML_DIRECTIVES = ['-x', '--xmlout'] # ZYPPER_LOCK is not affected by --root ZYPPER_LOCK = '/var/run/zypp.pid' @@ -128,6 +130,7 @@ class _Zypper(object): self.__no_raise = False self.__refresh = False self.__ignore_repo_failure = False + self.__ignore_not_found = False self.__systemd_scope = False self.__root = None @@ -147,6 +150,9 @@ class _Zypper(object): # Ignore exit code for 106 (repo is not available) if 'no_repo_failure' in kwargs: self.__ignore_repo_failure = kwargs['no_repo_failure'] + # Ignore exit code for 104 (package not found) + if "ignore_not_found" in kwargs: + self.__ignore_not_found = kwargs["ignore_not_found"] if 'systemd_scope' in kwargs: self.__systemd_scope = kwargs['systemd_scope'] if 'root' in kwargs: @@ -296,6 +302,10 @@ class _Zypper(object): if self.__root: self.__cmd.extend(['--root', self.__root]) + # Do not consider 104 as a retcode error + if self.__ignore_not_found: + kwargs["success_retcodes"] = [_Zypper.NOT_FOUND_EXIT_CODE] + self.__cmd.extend(args) kwargs['output_loglevel'] = 'trace' kwargs['python_shell'] = False @@ -405,7 +415,11 @@ class Wildcard(object): Get available versions of the package. :return: ''' - solvables = self.zypper.nolock.xml.call('se', '-xv', self.name).getElementsByTagName('solvable') + solvables = ( + self.zypper(ignore_not_found=True) + .nolock.xml.call("se", "-v", self.name) + .getElementsByTagName("solvable") + ) if not solvables: raise CommandExecutionError('No packages found matching \'{0}\''.format(self.name)) @@ -983,7 +997,11 @@ def list_repo_pkgs(*args, **kwargs): return False root = kwargs.get('root') or None - for node in __zypper__(root=root).xml.call('se', '-s', *targets).getElementsByTagName('solvable'): + for node in ( + __zypper__(root=root, ignore_not_found=True) + .xml.call("se", "-s", *targets) + .getElementsByTagName("solvable") + ): pkginfo = dict(node.attributes.items()) try: if pkginfo['kind'] != 'package': @@ -2261,7 +2279,9 @@ def owner(*paths, **kwargs): def _get_visible_patterns(root=None): '''Get all available patterns in the repo that are visible.''' patterns = {} - search_patterns = __zypper__(root=root).nolock.xml.call('se', '-t', 'pattern') + search_patterns = __zypper__(root=root, ignore_not_found=True).nolock.xml.call( + "se", "-t", "pattern" + ) for element in search_patterns.getElementsByTagName('solvable'): installed = element.getAttribute('status') == 'installed' patterns[element.getAttribute('name')] = { @@ -2455,7 +2475,11 @@ def search(criteria, refresh=False, **kwargs): cmd.append(ALLOWED_SEARCH_OPTIONS.get(opt)) cmd.append(criteria) - solvables = __zypper__(root=root).nolock.noraise.xml.call(*cmd).getElementsByTagName('solvable') + solvables = ( + __zypper__(root=root, ignore_not_found=True) + .nolock.noraise.xml.call(*cmd) + .getElementsByTagName("solvable") + ) if not solvables: raise CommandExecutionError( 'No packages found matching \'{0}\''.format(criteria) @@ -2690,7 +2714,11 @@ def _get_patches(installed_only=False, root=None): List all known patches in repos. ''' patches = {} - for element in __zypper__(root=root).nolock.xml.call('se', '-t', 'patch').getElementsByTagName('solvable'): + for element in ( + __zypper__(root=root, ignore_not_found=True) + .nolock.xml.call("se", "-t", "patch") + .getElementsByTagName("solvable") + ): installed = element.getAttribute('status') == 'installed' if (installed_only and installed) or not installed_only: patches[element.getAttribute('name')] = { diff --git a/tests/unit/modules/test_zypperpkg.py b/tests/unit/modules/test_zypperpkg.py index 1fce3352c6..a3d20f66d5 100644 --- a/tests/unit/modules/test_zypperpkg.py +++ b/tests/unit/modules/test_zypperpkg.py @@ -39,7 +39,10 @@ class ZyppCallMock(object): def __call__(self, *args, **kwargs): # If the call is for a configuration modifier, we return self - if any(i in kwargs for i in ('no_repo_failure', 'systemd_scope', 'root')): + if any( + i in kwargs + for i in ("no_repo_failure", "ignore_not_found", "systemd_scope", "root") + ): return self return MagicMock(return_value=self.__return_value)() @@ -1303,8 +1306,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="installed" name="libzypp" kind="package" edition="16.2.4-19.5" arch="x86_64" repository="(System Packages)"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) wcard = zypper.Wildcard(_zpr) wcard.name, wcard.version = 'libzypp', '*' assert wcard._get_scope_versions(wcard._get_available_versions()) == ['16.2.4-19.5', '16.3.2-25.1', '16.5.2-27.9.1'] @@ -1322,8 +1326,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) wcard = zypper.Wildcard(_zpr) wcard.name, wcard.version = 'libzypp', '16.2.*-2*' assert wcard._get_scope_versions(wcard._get_available_versions()) == ['16.2.5-25.1', '16.2.6-27.9.1'] @@ -1341,8 +1346,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) wcard = zypper.Wildcard(_zpr) wcard.name, wcard.version = 'libzypp', '16.2.5*' assert wcard._get_scope_versions(wcard._get_available_versions()) == ['16.2.5-25.1'] @@ -1360,8 +1366,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) wcard = zypper.Wildcard(_zpr) wcard.name, wcard.version = 'libzypp', '*.1' assert wcard._get_scope_versions(wcard._get_available_versions()) == ['16.2.5-25.1', '17.2.6-27.9.1'] @@ -1379,8 +1386,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="other-version" name="libzypp" kind="package" edition="17.2.6-27.9.1" arch="x86_64" repository="foo"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) assert zypper.Wildcard(_zpr)('libzypp', '16.2.4*') == '16.2.4-19.5' assert zypper.Wildcard(_zpr)('libzypp', '16.2*') == '16.2.5-25.1' assert zypper.Wildcard(_zpr)('libzypp', '*6-*') == '17.2.6-27.9.1' @@ -1399,8 +1407,10 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="other-version" name="libzypp" kind="package" edition="17.2.6-27.9.1" arch="x86_64" repository="foo"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) + assert zypper.Wildcard(_zpr)('libzypp', None) is None def test_wildcard_to_query_typecheck(self): @@ -1416,8 +1426,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="other-version" name="libzypp" kind="package" edition="17.2.6-27.9.1" arch="x86_64" repository="foo"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) assert isinstance(zypper.Wildcard(_zpr)('libzypp', '*.1'), six.string_types) def test_wildcard_to_query_condition_preservation(self): @@ -1433,8 +1444,9 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="other-version" name="libzypp" kind="package" edition="17.2.6-27.9.1" arch="x86_64" repository="foo"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) for op in zypper.Wildcard.Z_OP: assert zypper.Wildcard(_zpr)('libzypp', '{0}*.1'.format(op)) == '{0}17.2.6-27.9.1'.format(op) @@ -1456,8 +1468,10 @@ Repository 'DUMMY' not found by its alias, number, or URI. <solvable status="other-version" name="libzypp" kind="package" edition="17.2.6-27.9.1" arch="x86_64" repository="foo"/> </solvable-list></search-result></stream> """ - _zpr = MagicMock() - _zpr.nolock.xml.call = MagicMock(return_value=minidom.parseString(xmldoc)) + __zpr = MagicMock() + __zpr.nolock.xml.call.return_value = minidom.parseString(xmldoc) + _zpr = MagicMock(return_value=__zpr) + with self.assertRaises(CommandExecutionError): for op in ['>>', '==', '<<', '+']: zypper.Wildcard(_zpr)('libzypp', '{0}*.1'.format(op)) @@ -1557,3 +1571,38 @@ pattern() = package-c""" with patch.dict(zypper.__context__, context): zypper._clean_cache() self.assertEqual(zypper.__context__, {'pkg.other_data': None}) + + def test_search(self): + """Test zypperpkg.search()""" + xml_mock = MagicMock(return_value=[]) + zypp_mock = MagicMock(return_value=xml_mock) + ZyppCallMock(return_value=xml_mock) + with patch("salt.modules.zypperpkg.__zypper__", zypp_mock): + zypper.search("emacs") + zypp_mock.assert_called_with(root=None, ignore_not_found=True) + xml_mock.nolock.noraise.xml.call.assert_called_with("search", "emacs") + + def test_search_not_found(self): + """Test zypperpkg.search()""" + ret = { + "stdout": "<?xml version='1.0'?><stream></stream>", + "stderr": None, + "retcode": 104, + } + run_all_mock = MagicMock(return_value=ret) + with patch.dict(zypper.__salt__, {"cmd.run_all": run_all_mock}): + self.assertRaises(CommandExecutionError, zypper.search, "vim") + run_all_mock.assert_called_with( + [ + "zypper", + "--non-interactive", + "--xmlout", + "--no-refresh", + "search", + "vim", + ], + success_retcodes=[104], + output_loglevel="trace", + python_shell=False, + env={"ZYPP_READONLY_HACK": "1"}, + ) -- 2.28.0