From 37ff2ab3a96f0d46ba2a8534edd6b3e16265589b Mon Sep 17 00:00:00 2001 From: nicholasmhughes Date: Tue, 28 Mar 2023 15:36:03 -0400 Subject: [PATCH] fixes saltstack/salt#63985 add pkg.installed show installable version in test mode --- changelog/63985.added.md | 1 + salt/states/pkg.py | 36 +++++++++++++++++++++++---- tests/pytests/unit/states/test_pkg.py | 4 ++- 3 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 changelog/63985.added.md diff --git a/changelog/63985.added.md b/changelog/63985.added.md new file mode 100644 index 000000000000..49b8114d7cbc --- /dev/null +++ b/changelog/63985.added.md @@ -0,0 +1 @@ +Add pkg.installed show installable version in test mode diff --git a/salt/states/pkg.py b/salt/states/pkg.py index c14cec9f7cc4..867bc1378f49 100644 --- a/salt/states/pkg.py +++ b/salt/states/pkg.py @@ -1007,6 +1007,8 @@ def installed( **kwargs ): """ + .. versionchanged:: 3007.0 + Ensure that the package is installed, and that it is the correct version (if specified). @@ -1804,12 +1806,36 @@ def installed( changes = {} if __opts__["test"]: if targets: - if sources: - _targets = targets - else: - _targets = [_get_desired_pkg(x, targets) for x in targets] + installable_versions = {} + if not sources: + latest_targets = [ + _get_desired_pkg(x, targets) for x, y in targets.items() if not y + ] + latest_versions = __salt__["pkg.latest_version"](*latest_targets) + # single pkg returns str + if isinstance(latest_versions, str): + installable_versions = {latest_targets[0]: latest_versions} + elif isinstance(latest_versions, dict): + installable_versions = latest_versions + explicit_targets = [ + _get_desired_pkg(x, targets) + for x in targets + if x not in latest_targets + ] + if explicit_targets: + explicit_versions = __salt__["pkg.list_repo_pkgs"]( + *explicit_targets + ) + for tgt, ver_list in explicit_versions.items(): + if ver_list: + installable_versions[tgt] = ver_list[0] summary = ", ".join(targets) - changes.update({x: {"new": "installed", "old": ""} for x in targets}) + changes.update( + { + x: {"new": installable_versions.get(x) or "installed", "old": ""} + for x in targets + } + ) comment.append( "The following packages would be installed/updated: {}".format(summary) ) diff --git a/tests/pytests/unit/states/test_pkg.py b/tests/pytests/unit/states/test_pkg.py index b852f27b008b..25a5dc0f34f7 100644 --- a/tests/pytests/unit/states/test_pkg.py +++ b/tests/pytests/unit/states/test_pkg.py @@ -546,16 +546,18 @@ def test_installed_with_changes_test_true(list_pkgs): Test pkg.installed with simulated changes """ + latest_pkgs = MagicMock(return_value="some version here") list_pkgs = MagicMock(return_value=list_pkgs) with patch.dict( pkg.__salt__, { + "pkg.latest_version": latest_pkgs, "pkg.list_pkgs": list_pkgs, }, ): - expected = {"dummy": {"new": "installed", "old": ""}} + expected = {"dummy": {"new": "some version here", "old": ""}} # Run state with test=true with patch.dict(pkg.__opts__, {"test": True}): ret = pkg.installed("dummy", test=True)