81ba992e3e
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=205
297 lines
9.9 KiB
Diff
297 lines
9.9 KiB
Diff
From f2dc43cf1db3fee41e328c68545ccac2576021ca Mon Sep 17 00:00:00 2001
|
|
From: Victor Zhestkov <vzhestkov@suse.com>
|
|
Date: Mon, 27 Jun 2022 18:01:21 +0300
|
|
Subject: [PATCH] Normalize package names once with pkg.installed/removed
|
|
using yum (bsc#1195895)
|
|
|
|
* Normalize the package names only once on install/remove
|
|
|
|
* Add test for checking pkg.installed/removed with only normalisation
|
|
|
|
* Fix split_arch conditions
|
|
|
|
* Fix test_pkg
|
|
---
|
|
salt/modules/yumpkg.py | 18 ++-
|
|
salt/states/pkg.py | 3 +-
|
|
tests/pytests/unit/states/test_pkg.py | 177 +++++++++++++++++++++++++-
|
|
3 files changed, 192 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py
|
|
index 46f0b1f613..f52e084346 100644
|
|
--- a/salt/modules/yumpkg.py
|
|
+++ b/salt/modules/yumpkg.py
|
|
@@ -1460,7 +1460,12 @@ def install(
|
|
|
|
try:
|
|
pkg_params, pkg_type = __salt__["pkg_resource.parse_targets"](
|
|
- name, pkgs, sources, saltenv=saltenv, normalize=normalize, **kwargs
|
|
+ name,
|
|
+ pkgs,
|
|
+ sources,
|
|
+ saltenv=saltenv,
|
|
+ normalize=normalize and kwargs.get("split_arch", True),
|
|
+ **kwargs
|
|
)
|
|
except MinionError as exc:
|
|
raise CommandExecutionError(exc)
|
|
@@ -1612,7 +1617,10 @@ def install(
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
- if archpart in salt.utils.pkg.rpm.ARCHES:
|
|
+ if archpart in salt.utils.pkg.rpm.ARCHES and (
|
|
+ archpart != __grains__["osarch"]
|
|
+ or kwargs.get("split_arch", True)
|
|
+ ):
|
|
arch = "." + archpart
|
|
pkgname = namepart
|
|
|
|
@@ -2143,11 +2151,13 @@ def remove(name=None, pkgs=None, **kwargs): # pylint: disable=W0613
|
|
arch = ""
|
|
pkgname = target
|
|
try:
|
|
- namepart, archpart = target.rsplit(".", 1)
|
|
+ namepart, archpart = pkgname.rsplit(".", 1)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
- if archpart in salt.utils.pkg.rpm.ARCHES:
|
|
+ if archpart in salt.utils.pkg.rpm.ARCHES and (
|
|
+ archpart != __grains__["osarch"] or kwargs.get("split_arch", True)
|
|
+ ):
|
|
arch = "." + archpart
|
|
pkgname = namepart
|
|
# Since we don't always have the arch info, epoch information has to parsed out. But
|
|
diff --git a/salt/states/pkg.py b/salt/states/pkg.py
|
|
index ef4e062145..cda966a1e8 100644
|
|
--- a/salt/states/pkg.py
|
|
+++ b/salt/states/pkg.py
|
|
@@ -1873,6 +1873,7 @@ def installed(
|
|
normalize=normalize,
|
|
update_holds=update_holds,
|
|
ignore_epoch=ignore_epoch,
|
|
+ split_arch=False,
|
|
**kwargs
|
|
)
|
|
except CommandExecutionError as exc:
|
|
@@ -2940,7 +2941,7 @@ def _uninstall(
|
|
}
|
|
|
|
changes = __salt__["pkg.{}".format(action)](
|
|
- name, pkgs=pkgs, version=version, **kwargs
|
|
+ name, pkgs=pkgs, version=version, split_arch=False, **kwargs
|
|
)
|
|
new = __salt__["pkg.list_pkgs"](versions_as_list=True, **kwargs)
|
|
failed = []
|
|
diff --git a/tests/pytests/unit/states/test_pkg.py b/tests/pytests/unit/states/test_pkg.py
|
|
index cba8201bda..ecb841e8ec 100644
|
|
--- a/tests/pytests/unit/states/test_pkg.py
|
|
+++ b/tests/pytests/unit/states/test_pkg.py
|
|
@@ -2,6 +2,8 @@ import logging
|
|
|
|
import pytest
|
|
import salt.modules.beacons as beaconmod
|
|
+import salt.modules.pkg_resource as pkg_resource
|
|
+import salt.modules.yumpkg as yumpkg
|
|
import salt.states.beacon as beaconstate
|
|
import salt.states.pkg as pkg
|
|
import salt.utils.state as state_utils
|
|
@@ -17,7 +19,7 @@ def configure_loader_modules():
|
|
pkg: {
|
|
"__env__": "base",
|
|
"__salt__": {},
|
|
- "__grains__": {"os": "CentOS"},
|
|
+ "__grains__": {"os": "CentOS", "os_family": "RedHat"},
|
|
"__opts__": {"test": False, "cachedir": ""},
|
|
"__instance_id__": "",
|
|
"__low__": {},
|
|
@@ -25,6 +27,15 @@ def configure_loader_modules():
|
|
},
|
|
beaconstate: {"__salt__": {}, "__opts__": {}},
|
|
beaconmod: {"__salt__": {}, "__opts__": {}},
|
|
+ pkg_resource: {
|
|
+ "__salt__": {},
|
|
+ "__grains__": {"os": "CentOS", "os_family": "RedHat"},
|
|
+ },
|
|
+ yumpkg: {
|
|
+ "__salt__": {},
|
|
+ "__grains__": {"osarch": "x86_64", "osmajorrelease": 7},
|
|
+ "__opts__": {},
|
|
+ },
|
|
}
|
|
|
|
|
|
@@ -726,3 +737,167 @@ def test_held_unheld(package_manager):
|
|
hold_mock.assert_not_called()
|
|
unhold_mock.assert_any_call(name="held-test", pkgs=["baz"])
|
|
unhold_mock.assert_any_call(name="held-test", pkgs=["bar"])
|
|
+
|
|
+
|
|
+def test_installed_with_single_normalize():
|
|
+ """
|
|
+ Test pkg.installed with preventing multiple package name normalisation
|
|
+ """
|
|
+
|
|
+ list_no_weird_installed = {
|
|
+ "pkga": "1.0.1",
|
|
+ "pkgb": "1.0.2",
|
|
+ "pkgc": "1.0.3",
|
|
+ }
|
|
+ list_no_weird_installed_ver_list = {
|
|
+ "pkga": ["1.0.1"],
|
|
+ "pkgb": ["1.0.2"],
|
|
+ "pkgc": ["1.0.3"],
|
|
+ }
|
|
+ list_with_weird_installed = {
|
|
+ "pkga": "1.0.1",
|
|
+ "pkgb": "1.0.2",
|
|
+ "pkgc": "1.0.3",
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": "20220214-2.1",
|
|
+ }
|
|
+ list_with_weird_installed_ver_list = {
|
|
+ "pkga": ["1.0.1"],
|
|
+ "pkgb": ["1.0.2"],
|
|
+ "pkgc": ["1.0.3"],
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": ["20220214-2.1"],
|
|
+ }
|
|
+ list_pkgs = MagicMock(
|
|
+ side_effect=[
|
|
+ # For the package with version specified
|
|
+ list_no_weird_installed_ver_list,
|
|
+ {},
|
|
+ list_no_weird_installed,
|
|
+ list_no_weird_installed_ver_list,
|
|
+ list_with_weird_installed,
|
|
+ list_with_weird_installed_ver_list,
|
|
+ # For the package with no version specified
|
|
+ list_no_weird_installed_ver_list,
|
|
+ {},
|
|
+ list_no_weird_installed,
|
|
+ list_no_weird_installed_ver_list,
|
|
+ list_with_weird_installed,
|
|
+ list_with_weird_installed_ver_list,
|
|
+ ]
|
|
+ )
|
|
+
|
|
+ salt_dict = {
|
|
+ "pkg.install": yumpkg.install,
|
|
+ "pkg.list_pkgs": list_pkgs,
|
|
+ "pkg.normalize_name": yumpkg.normalize_name,
|
|
+ "pkg_resource.version_clean": pkg_resource.version_clean,
|
|
+ "pkg_resource.parse_targets": pkg_resource.parse_targets,
|
|
+ }
|
|
+
|
|
+ with patch("salt.modules.yumpkg.list_pkgs", list_pkgs), patch(
|
|
+ "salt.modules.yumpkg.version_cmp", MagicMock(return_value=0)
|
|
+ ), patch(
|
|
+ "salt.modules.yumpkg._call_yum", MagicMock(return_value={"retcode": 0})
|
|
+ ) as call_yum_mock, patch.dict(
|
|
+ pkg.__salt__, salt_dict
|
|
+ ), patch.dict(
|
|
+ pkg_resource.__salt__, salt_dict
|
|
+ ), patch.dict(
|
|
+ yumpkg.__salt__, salt_dict
|
|
+ ), patch.dict(
|
|
+ yumpkg.__grains__, {"os": "CentOS", "osarch": "x86_64", "osmajorrelease": 7}
|
|
+ ), patch.object(
|
|
+ yumpkg, "list_holds", MagicMock()
|
|
+ ):
|
|
+
|
|
+ expected = {
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": {
|
|
+ "old": "",
|
|
+ "new": "20220214-2.1",
|
|
+ }
|
|
+ }
|
|
+ ret = pkg.installed(
|
|
+ "test_install",
|
|
+ pkgs=[{"weird-name-1.2.3-1234.5.6.test7tst.x86_64.noarch": "20220214-2.1"}],
|
|
+ )
|
|
+ call_yum_mock.assert_called_once()
|
|
+ assert (
|
|
+ call_yum_mock.mock_calls[0].args[0][2]
|
|
+ == "weird-name-1.2.3-1234.5.6.test7tst.x86_64-20220214-2.1"
|
|
+ )
|
|
+ assert ret["result"]
|
|
+ assert ret["changes"] == expected
|
|
+
|
|
+
|
|
+def test_removed_with_single_normalize():
|
|
+ """
|
|
+ Test pkg.removed with preventing multiple package name normalisation
|
|
+ """
|
|
+
|
|
+ list_no_weird_installed = {
|
|
+ "pkga": "1.0.1",
|
|
+ "pkgb": "1.0.2",
|
|
+ "pkgc": "1.0.3",
|
|
+ }
|
|
+ list_no_weird_installed_ver_list = {
|
|
+ "pkga": ["1.0.1"],
|
|
+ "pkgb": ["1.0.2"],
|
|
+ "pkgc": ["1.0.3"],
|
|
+ }
|
|
+ list_with_weird_installed = {
|
|
+ "pkga": "1.0.1",
|
|
+ "pkgb": "1.0.2",
|
|
+ "pkgc": "1.0.3",
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": "20220214-2.1",
|
|
+ }
|
|
+ list_with_weird_installed_ver_list = {
|
|
+ "pkga": ["1.0.1"],
|
|
+ "pkgb": ["1.0.2"],
|
|
+ "pkgc": ["1.0.3"],
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": ["20220214-2.1"],
|
|
+ }
|
|
+ list_pkgs = MagicMock(
|
|
+ side_effect=[
|
|
+ list_with_weird_installed_ver_list,
|
|
+ list_with_weird_installed,
|
|
+ list_no_weird_installed,
|
|
+ list_no_weird_installed_ver_list,
|
|
+ ]
|
|
+ )
|
|
+
|
|
+ salt_dict = {
|
|
+ "pkg.remove": yumpkg.remove,
|
|
+ "pkg.list_pkgs": list_pkgs,
|
|
+ "pkg.normalize_name": yumpkg.normalize_name,
|
|
+ "pkg_resource.parse_targets": pkg_resource.parse_targets,
|
|
+ "pkg_resource.version_clean": pkg_resource.version_clean,
|
|
+ }
|
|
+
|
|
+ with patch("salt.modules.yumpkg.list_pkgs", list_pkgs), patch(
|
|
+ "salt.modules.yumpkg.version_cmp", MagicMock(return_value=0)
|
|
+ ), patch(
|
|
+ "salt.modules.yumpkg._call_yum", MagicMock(return_value={"retcode": 0})
|
|
+ ) as call_yum_mock, patch.dict(
|
|
+ pkg.__salt__, salt_dict
|
|
+ ), patch.dict(
|
|
+ pkg_resource.__salt__, salt_dict
|
|
+ ), patch.dict(
|
|
+ yumpkg.__salt__, salt_dict
|
|
+ ):
|
|
+
|
|
+ expected = {
|
|
+ "weird-name-1.2.3-1234.5.6.test7tst.x86_64": {
|
|
+ "old": "20220214-2.1",
|
|
+ "new": "",
|
|
+ }
|
|
+ }
|
|
+ ret = pkg.removed(
|
|
+ "test_remove",
|
|
+ pkgs=[{"weird-name-1.2.3-1234.5.6.test7tst.x86_64.noarch": "20220214-2.1"}],
|
|
+ )
|
|
+ call_yum_mock.assert_called_once()
|
|
+ assert (
|
|
+ call_yum_mock.mock_calls[0].args[0][2]
|
|
+ == "weird-name-1.2.3-1234.5.6.test7tst.x86_64-20220214-2.1"
|
|
+ )
|
|
+ assert ret["result"]
|
|
+ assert ret["changes"] == expected
|
|
--
|
|
2.37.3
|
|
|
|
|