Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/69502.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Change zypperpkg's parsing of rpm output to no longer crash if rpm returns warnings.
8 changes: 5 additions & 3 deletions salt/modules/zypperpkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,9 @@ def list_pkgs(versions_as_list=False, root=None, includes=None, **kwargs):
salt.utils.pkg.rpm.QUERYFORMAT.replace("%{REPOID}", "(none)") + "\n",
]
)
output = __salt__["cmd.run"](cmd, python_shell=False, output_loglevel="trace")
output = __salt__["cmd.run_all"](cmd, python_shell=False, output_loglevel="trace")[
"stdout"
]
for line in output.splitlines():
pkginfo = salt.utils.pkg.rpm.parse_pkginfo(line, osarch=__grains__["osarch"])
if pkginfo:
Expand Down Expand Up @@ -3065,9 +3067,9 @@ def list_provides(root=None, **kwargs):
cmd.extend(["--root", root])
cmd.extend(["-qa", "--queryformat", "%{PROVIDES}_|-%{NAME}\n"])
ret = dict()
for line in __salt__["cmd.run"](
for line in __salt__["cmd.run_all"](
cmd, output_loglevel="trace", python_shell=False
).splitlines():
)["stdout"].splitlines():
provide, realname = line.split("_|-")

if provide == realname:
Expand Down
135 changes: 131 additions & 4 deletions tests/unit/modules/test_zypperpkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,97 @@ def test_list_products(self):
)
cmd_run_all.assert_has_calls([mock_call])

def test_list_provides(self):
"""
Test if the PROVIDES query is correctly parsed
"""

rpm_stdout = [
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)_|-gpg-pubkey",
"libxkbcommon.so.0()(64bit)_|-libxkbcommon0",
"libmpfr.so.6()(64bit)_|-libmpfr6",
"ca-certificates-mozilla_|-ca-certificates-mozilla",
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)_|-gpg-pubkey",
"pacemaker-schemas_|-pacemaker-schemas",
"config(qemu-tools)_|-qemu-tools",
"suse-kernel-rpm-scriptlets_|-suse-module-tools",
"config(libsemanage-conf)_|-libsemanage-conf",
"python3-pycparser_|-python3-pycparser",
]

salt_out = {
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)": [
"gpg-pubkey",
"gpg-pubkey",
],
"libxkbcommon.so.0()(64bit)": ["libxkbcommon0"],
"libmpfr.so.6()(64bit)": ["libmpfr6"],
"config(qemu-tools)": ["qemu-tools"],
"suse-kernel-rpm-scriptlets": ["suse-module-tools"],
"config(libsemanage-conf)": ["libsemanage-conf"],
}

with patch.dict(
zypper.__salt__,
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "",
"stdout": os.linesep.join(rpm_stdout),
}
)
},
):
self.assertEqual(zypper.list_provides(), salt_out)

# TODO: fold into previous function using pytest.mark.parametrize, once available in the test class
def test_list_provides_with_warning(self):
"""
Test if the PROVIDES query is correctly parsed
"""

rpm_stdout = [
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)_|-gpg-pubkey",
"libxkbcommon.so.0()(64bit)_|-libxkbcommon0",
"libmpfr.so.6()(64bit)_|-libmpfr6",
"ca-certificates-mozilla_|-ca-certificates-mozilla",
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)_|-gpg-pubkey",
"pacemaker-schemas_|-pacemaker-schemas",
"config(qemu-tools)_|-qemu-tools",
"suse-kernel-rpm-scriptlets_|-suse-module-tools",
"config(libsemanage-conf)_|-libsemanage-conf",
"python3-pycparser_|-python3-pycparser",
]

salt_out = {
"gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)": [
"gpg-pubkey",
"gpg-pubkey",
],
"libxkbcommon.so.0()(64bit)": ["libxkbcommon0"],
"libmpfr.so.6()(64bit)": ["libmpfr6"],
"config(qemu-tools)": ["qemu-tools"],
"suse-kernel-rpm-scriptlets": ["suse-module-tools"],
"config(libsemanage-conf)": ["libsemanage-conf"],
}

with patch.dict(
zypper.__salt__,
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "warning: Found NDB Packages.db database while attempting bdb backend: using ndb backend.",
"stdout": os.linesep.join(rpm_stdout),
}
)
},
):
self.assertEqual(zypper.list_provides(), salt_out)

def test_refresh_db(self):
"""
Test if refresh DB handled correctly
Expand Down Expand Up @@ -708,7 +799,16 @@ def _add_data(data, key, value):
]
with patch.dict(zypper.__grains__, {"osarch": "x86_64"}), patch.dict(
zypper.__salt__,
{"cmd.run": MagicMock(return_value=os.linesep.join(rpm_out))},
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "",
"stdout": os.linesep.join(rpm_out),
}
)
},
), patch.dict(zypper.__salt__, {"pkg_resource.add_pkg": _add_data}), patch.dict(
zypper.__salt__,
{"pkg_resource.format_pkg_list": pkg_resource.format_pkg_list},
Expand Down Expand Up @@ -756,7 +856,16 @@ def _add_data(data, key, value):
]
with patch.dict(zypper.__grains__, {"osarch": "x86_64"}), patch.dict(
zypper.__salt__,
{"cmd.run": MagicMock(return_value=os.linesep.join(rpm_out))},
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "",
"stdout": os.linesep.join(rpm_out),
}
)
},
), patch.dict(zypper.__salt__, {"pkg_resource.add_pkg": _add_data}), patch.dict(
zypper.__salt__,
{"pkg_resource.format_pkg_list": pkg_resource.format_pkg_list},
Expand Down Expand Up @@ -798,7 +907,16 @@ def _add_data(data, key, value):
]
with patch.dict(
zypper.__salt__,
{"cmd.run": MagicMock(return_value=os.linesep.join(rpm_out))},
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "",
"stdout": os.linesep.join(rpm_out),
}
)
},
), patch.dict(zypper.__grains__, {"osarch": "x86_64"}), patch.dict(
zypper.__salt__, {"pkg_resource.add_pkg": _add_data}
), patch.dict(
Expand Down Expand Up @@ -917,7 +1035,16 @@ def _add_data(data, key, value):

with patch.dict(zypper.__grains__, {"osarch": "x86_64"}), patch.dict(
zypper.__salt__,
{"cmd.run": MagicMock(return_value=os.linesep.join(rpm_out))},
{
"cmd.run_all": MagicMock(
return_value={
"pid": 0,
"retcode": 0,
"stderr": "",
"stdout": os.linesep.join(rpm_out),
}
)
},
), patch.dict(zypper.__salt__, {"pkg_resource.add_pkg": _add_data}), patch.dict(
zypper.__salt__,
{"pkg_resource.format_pkg_list": pkg_resource.format_pkg_list},
Expand Down
Loading