From f51113921a4a1ba6c37150e7ed5f1b206e96e18a Mon Sep 17 00:00:00 2001 From: David Murphy < dmurphy@saltstack.com> Date: Wed, 19 Jul 2023 18:13:57 -0600 Subject: [PATCH 01/11] Added support for dnf5 for Fedora --- salt/modules/yumpkg.py | 38 +++++++++++++++-------- tests/pytests/unit/modules/test_yumpkg.py | 14 +++++++-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index 413c0e12f77a..08a7d7d05860 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -145,7 +147,7 @@ def _get_hold(line, pattern=__HOLD_PATTERN, full=True): def _yum(): """ - Determine package manager name (yum or dnf), + Determine package manager name (yum or dnf[5]), depending on the executable existence in $PATH. """ @@ -168,7 +170,10 @@ def _check(file): contextkey = "yum_bin" if contextkey not in context: for dir in os.environ.get("PATH", os.defpath).split(os.pathsep): - if _check(os.path.join(dir, "dnf")): + if _check(os.path.join(dir, "dnf5")): + context[contextkey] = "dnf5" + break + elif _check(os.path.join(dir, "dnf")): context[contextkey] = "dnf" break elif _check(os.path.join(dir, "tdnf")): @@ -245,7 +250,8 @@ def _versionlock_pkg(grains=None): """ if grains is None: grains = __grains__ - if _yum() == "dnf": + + if _yum() == "dnf" or _yum() == "dnf5": if grains["os"].lower() == "fedora": return ( "python3-dnf-plugin-versionlock" @@ -272,10 +278,11 @@ def _check_versionlock(): def _get_options(**kwargs): """ - Returns a list of options to be used in the yum/dnf command, based on the + Returns a list of options to be used in the yum/dnf[5] command, based on the kwargs passed. """ # Get repo options from the kwargs + # dnf5 aliases dnf options, so no need to change fromrepo = kwargs.pop("fromrepo", "") repo = kwargs.pop("repo", "") disablerepo = kwargs.pop("disablerepo", "") @@ -1053,7 +1060,9 @@ def list_upgrades(refresh=True, **kwargs): cmd = ["--quiet"] cmd.extend(options) - cmd.extend(["list", "upgrades" if _yum() == "dnf" else "updates"]) + cmd.extend( + ["list", "upgrades" if (_yum() == "dnf" or _yum() == "dnf5") else "updates"] + ) out = _call_yum(cmd, ignore_retcode=True) if out["retcode"] != 0 and "Error:" in out: return {} @@ -1708,7 +1717,8 @@ def _add_common_args(cmd): if skip_verify: cmd.append("--nogpgcheck") if downloadonly: - cmd.append("--downloadonly") + if _yum() != "dnf5": + cmd.append("--downloadonly") try: holds = list_holds(full=False) @@ -1769,6 +1779,8 @@ def _temporarily_unhold(pkgs, targets): cmd.extend(["--best", "--allowerasing"]) _add_common_args(cmd) cmd.append("install" if pkg_type != "advisory" else "update") + if _yum() == "dnf5": + cmd.extend(["--best", "--allowerasing"]) cmd.extend(targets) out = _call_yum(cmd, ignore_retcode=False, redirect_stderr=True) if out["retcode"] != 0: @@ -2002,7 +2014,7 @@ def upgrade( salt '*' pkg.upgrade security=True exclude='kernel*' """ - if _yum() == "dnf" and not obsoletes: + if (_yum() == "dnf" or _yum() == "dnf5") and not obsoletes: # for dnf we can just disable obsoletes _setopt = [ opt @@ -2040,7 +2052,7 @@ def upgrade( cmd.append("upgrade" if not minimal else "upgrade-minimal") else: # do not force the removal of obsolete packages - if _yum() == "dnf": + if _yum() == "dnf" or _yum() == "dnf5": cmd.append("upgrade" if not minimal else "upgrade-minimal") else: # for yum we have to use update instead of upgrade @@ -2396,7 +2408,7 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W06 ret[target] = {"name": target, "changes": {}, "result": False, "comment": ""} - if _yum() == "dnf": + if _yum() == "dnf" or _yum() == "dnf5": search_locks = [x for x in current_locks if x == target] else: # To accommodate yum versionlock's lack of support for removing @@ -3032,7 +3044,7 @@ def mod_repo(repo, basedir=None, **kwargs): if use_copr: # Is copr plugin installed? copr_plugin_name = "" - if _yum() == "dnf": + if _yum() == "dnf" or _yum() == "dnf5": copr_plugin_name = "dnf-plugins-core" else: copr_plugin_name = "yum-plugin-copr" @@ -3493,7 +3505,7 @@ def services_need_restart(**kwargs): salt '*' pkg.services_need_restart """ - if _yum() != "dnf": + if _yum() == "dnf": raise CommandExecutionError("dnf is required to list outdated services.") if not salt.utils.systemd.booted(__context__): raise CommandExecutionError("systemd is required to list outdated services.") diff --git a/tests/pytests/unit/modules/test_yumpkg.py b/tests/pytests/unit/modules/test_yumpkg.py index 1354ee5d2d0d..1b1992daf475 100644 --- a/tests/pytests/unit/modules/test_yumpkg.py +++ b/tests/pytests/unit/modules/test_yumpkg.py @@ -72,7 +72,7 @@ def list_repos_var(): @pytest.fixture( - ids=["yum", "dnf"], + ids=["yum", "dnf", "dnf5"], params=[ { "context": {"yum_bin": "yum"}, @@ -84,6 +84,11 @@ def list_repos_var(): "grains": {"os": "Fedora", "osrelease": 27}, "cmd": ["dnf", "-y", "--best", "--allowerasing"], }, + { + "context": {"yum_bin": "dnf5"}, + "grains": {"os": "Fedora", "osrelease": 39}, + "cmd": ["dnf5", "-y"], + }, ], ) def yum_and_dnf(request): @@ -692,7 +697,7 @@ def test_list_repo_pkgs_with_options(list_repos_var): except AssertionError: continue else: - pytest.fail("repo '{}' not checked".format(repo)) + pytest.fail(f"repo '{repo}' not checked") def test_list_upgrades_dnf(): @@ -2085,7 +2090,10 @@ def test_59705_version_as_accidental_float_should_become_text( new, full_pkg_string, yum_and_dnf ): name = "fnord" - expected_cmd = yum_and_dnf + ["install", full_pkg_string] + expected_cmd = yum_and_dnf + ["install"] + if expected_cmd[0] == "dnf5": + expected_cmd += ["--best", "--allowerasing"] + expected_cmd += [full_pkg_string] cmd_mock = MagicMock( return_value={"pid": 12345, "retcode": 0, "stdout": "", "stderr": ""} ) From dd239d061003b7e9d9a0c22836204acd6df46320 Mon Sep 17 00:00:00 2001 From: David Murphy < dmurphy@saltstack.com> Date: Wed, 19 Jul 2023 18:29:51 -0600 Subject: [PATCH 02/11] Added changelog entry --- changelog/64532.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/64532.added.md diff --git a/changelog/64532.added.md b/changelog/64532.added.md new file mode 100644 index 000000000000..53595d69280d --- /dev/null +++ b/changelog/64532.added.md @@ -0,0 +1 @@ +Added support for dnf5 and its new command syntax From 0349df1f2cdfe396a648eda86639c76efabefc0e Mon Sep 17 00:00:00 2001 From: David Murphy Date: Thu, 20 Jul 2023 09:39:11 -0600 Subject: [PATCH 06/11] Update salt/modules/yumpkg.py Co-authored-by: Pedro Algarvio --- salt/modules/yumpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index 3ab033361c02..6d4ab469165d 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -1061,7 +1061,7 @@ def list_upgrades(refresh=True, **kwargs): cmd = ["--quiet"] cmd.extend(options) cmd.extend( - ["list", "upgrades" if (_yum() == "dnf" or _yum() == "dnf5") else "updates"] + ["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"] ) out = _call_yum(cmd, ignore_retcode=True) if out["retcode"] != 0 and "Error:" in out: From 3a5c478fa455fe8bba198728de304a09a76bb1db Mon Sep 17 00:00:00 2001 From: David Murphy Date: Thu, 20 Jul 2023 09:39:23 -0600 Subject: [PATCH 07/11] Update salt/modules/yumpkg.py Co-authored-by: Pedro Algarvio --- salt/modules/yumpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index 6d4ab469165d..6ebd9ce4acfb 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -2014,7 +2014,7 @@ def upgrade( salt '*' pkg.upgrade security=True exclude='kernel*' """ - if (_yum() == "dnf" or _yum() == "dnf5") and not obsoletes: + if _yum() in ("dnf", "dnf5") and not obsoletes: # for dnf we can just disable obsoletes _setopt = [ opt From 085e39acac36b839185fcef13d07ebcf9985ba6a Mon Sep 17 00:00:00 2001 From: David Murphy Date: Thu, 20 Jul 2023 09:39:41 -0600 Subject: [PATCH 08/11] Update salt/modules/yumpkg.py Co-authored-by: Pedro Algarvio --- salt/modules/yumpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index 6ebd9ce4acfb..c67c18d5b848 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -2052,7 +2052,7 @@ def upgrade( cmd.append("upgrade" if not minimal else "upgrade-minimal") else: # do not force the removal of obsolete packages - if _yum() == "dnf" or _yum() == "dnf5": + if _yum() in ("dnf", "dnf5"): cmd.append("upgrade" if not minimal else "upgrade-minimal") else: # for yum we have to use update instead of upgrade From 90162b872d25e31bc3cecc2c6f4c65d38de57481 Mon Sep 17 00:00:00 2001 From: David Murphy Date: Thu, 20 Jul 2023 09:39:48 -0600 Subject: [PATCH 09/11] Update salt/modules/yumpkg.py Co-authored-by: Pedro Algarvio --- salt/modules/yumpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index c67c18d5b848..c5725cdc8c4d 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -2408,7 +2408,7 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W06 ret[target] = {"name": target, "changes": {}, "result": False, "comment": ""} - if _yum() == "dnf" or _yum() == "dnf5": + if _yum() in ("dnf", "dnf5"): search_locks = [x for x in current_locks if x == target] else: # To accommodate yum versionlock's lack of support for removing From 1a89a642208fb4d59fd1fdfde9aa67ba737fa5ab Mon Sep 17 00:00:00 2001 From: David Murphy Date: Thu, 20 Jul 2023 09:39:59 -0600 Subject: [PATCH 10/11] Update salt/modules/yumpkg.py Co-authored-by: Pedro Algarvio --- salt/modules/yumpkg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index c5725cdc8c4d..a3688c8c57de 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -3044,7 +3044,7 @@ def mod_repo(repo, basedir=None, **kwargs): if use_copr: # Is copr plugin installed? copr_plugin_name = "" - if _yum() == "dnf" or _yum() == "dnf5": + if _yum() in ("dnf", "dnf5"): copr_plugin_name = "dnf-plugins-core" else: copr_plugin_name = "yum-plugin-copr" From 9d4f211b01cada23c66d714d5e58662fa382a9da Mon Sep 17 00:00:00 2001 From: David Murphy < dmurphy@saltstack.com> Date: Thu, 20 Jul 2023 09:46:20 -0600 Subject: [PATCH 11/11] Updates due to reviewer suggestions --- salt/modules/yumpkg.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index a3688c8c57de..31129855fc7a 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -1060,9 +1060,7 @@ def list_upgrades(refresh=True, **kwargs): cmd = ["--quiet"] cmd.extend(options) - cmd.extend( - ["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"] - ) + cmd.extend(["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"]) out = _call_yum(cmd, ignore_retcode=True) if out["retcode"] != 0 and "Error:" in out: return {} @@ -3505,7 +3503,7 @@ def services_need_restart(**kwargs): salt '*' pkg.services_need_restart """ - if _yum() == "dnf": + if _yum() != "dnf": raise CommandExecutionError("dnf is required to list outdated services.") if not salt.utils.systemd.booted(__context__): raise CommandExecutionError("systemd is required to list outdated services.") --- salt-3006.1/salt/modules/yumpkg.py~ 2023-07-21 11:04:34.563699567 -0500 +++ salt-3006.1/salt/modules/yumpkg.py 2023-07-21 11:15:32.708768955 -0500 @@ -124,12 +124,12 @@ dnf ==> vim-enhanced-2:7.4.827-1.fc22.* """ if full: - if _yum() == "dnf": + if _yum() in ("dnf", "dnf5"): lock_re = r"({}-\S+)".format(pattern) else: lock_re = r"(\d+:{}-\S+)".format(pattern) else: - if _yum() == "dnf": + if _yum() in ("dnf", "dnf5"): lock_re = r"({}-\S+)".format(pattern) else: lock_re = r"\d+:({}-\S+)".format(pattern)