mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Fix pkg.removed with multiple versions on Windows
This commit is contained in:
parent
cae94bca24
commit
63b9da8bde
4 changed files with 56 additions and 6 deletions
2
changelog/61001.fixed.md
Normal file
2
changelog/61001.fixed.md
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Fixed an issue uninstalling packages on Windows using pkg.removed where there
|
||||||
|
are multiple versions of the same software installed
|
|
@ -2884,7 +2884,7 @@ def _uninstall(
|
||||||
|
|
||||||
try:
|
try:
|
||||||
pkg_params = __salt__["pkg_resource.parse_targets"](
|
pkg_params = __salt__["pkg_resource.parse_targets"](
|
||||||
name, pkgs, normalize=normalize
|
name, pkgs, normalize=normalize, version=version, **kwargs
|
||||||
)[0]
|
)[0]
|
||||||
except MinionError as exc:
|
except MinionError as exc:
|
||||||
return {
|
return {
|
||||||
|
@ -2951,7 +2951,7 @@ def _uninstall(
|
||||||
new = __salt__["pkg.list_pkgs"](versions_as_list=True, **kwargs)
|
new = __salt__["pkg.list_pkgs"](versions_as_list=True, **kwargs)
|
||||||
failed = []
|
failed = []
|
||||||
for param in pkg_params:
|
for param in pkg_params:
|
||||||
if __grains__["os_family"] in ["Suse", "RedHat"]:
|
if __grains__["os_family"] in ["Suse", "RedHat", "Windows"]:
|
||||||
# Check if the package version set to be removed is actually removed:
|
# Check if the package version set to be removed is actually removed:
|
||||||
if param in new and not pkg_params[param]:
|
if param in new and not pkg_params[param]:
|
||||||
failed.append(param)
|
failed.append(param)
|
||||||
|
|
|
@ -4,6 +4,8 @@ import shutil
|
||||||
import pytest
|
import pytest
|
||||||
from saltfactories.utils.functional import Loaders
|
from saltfactories.utils.functional import Loaders
|
||||||
|
|
||||||
|
import salt.utils.platform
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,6 +72,17 @@ def minion_opts(
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if salt.utils.platform.is_windows():
|
||||||
|
# We need to setup winrepo on Windows
|
||||||
|
minion_config_overrides.update(
|
||||||
|
{
|
||||||
|
"winrepo_source_dir": "salt://winrepo_ng",
|
||||||
|
"winrepo_dir_ng": str(state_tree / "winrepo_ng"),
|
||||||
|
"winrepo_dir": str(state_tree / "winrepo"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
factory = salt_factories.salt_minion_daemon(
|
factory = salt_factories.salt_minion_daemon(
|
||||||
minion_id,
|
minion_id,
|
||||||
defaults=minion_config_defaults or None,
|
defaults=minion_config_defaults or None,
|
||||||
|
|
|
@ -20,12 +20,17 @@ pytestmark = [
|
||||||
pytest.mark.slow_test,
|
pytest.mark.slow_test,
|
||||||
pytest.mark.skip_if_not_root,
|
pytest.mark.skip_if_not_root,
|
||||||
pytest.mark.destructive_test,
|
pytest.mark.destructive_test,
|
||||||
|
pytest.mark.windows_whitelisted,
|
||||||
pytest.mark.timeout_unless_on_windows(240),
|
pytest.mark.timeout_unless_on_windows(240),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="module", autouse=True)
|
@pytest.fixture(scope="module", autouse=True)
|
||||||
def refresh_db(grains, modules):
|
def refresh_db(grains, modules):
|
||||||
|
|
||||||
|
if salt.utils.platform.is_windows():
|
||||||
|
modules.winrepo.update_git_repos()
|
||||||
|
|
||||||
modules.pkg.refresh_db()
|
modules.pkg.refresh_db()
|
||||||
|
|
||||||
# If this is Arch Linux, check if pacman is in use by another process
|
# If this is Arch Linux, check if pacman is in use by another process
|
||||||
|
@ -43,7 +48,7 @@ def refresh_db(grains, modules):
|
||||||
def refresh_keys(grains, modules):
|
def refresh_keys(grains, modules):
|
||||||
if grains["os_family"] == "Arch":
|
if grains["os_family"] == "Arch":
|
||||||
# We should be running this periodically when building new test runner
|
# We should be running this periodically when building new test runner
|
||||||
# images, otherwise this could take several minuets to complete.
|
# images, otherwise this could take several minutes to complete.
|
||||||
proc = subprocess.run(["pacman-key", "--refresh-keys"], check=False)
|
proc = subprocess.run(["pacman-key", "--refresh-keys"], check=False)
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
pytest.fail("pacman-key --refresh-keys command failed.")
|
pytest.fail("pacman-key --refresh-keys command failed.")
|
||||||
|
@ -53,7 +58,7 @@ def refresh_keys(grains, modules):
|
||||||
def PKG_TARGETS(grains):
|
def PKG_TARGETS(grains):
|
||||||
_PKG_TARGETS = ["figlet", "sl"]
|
_PKG_TARGETS = ["figlet", "sl"]
|
||||||
if grains["os"] == "Windows":
|
if grains["os"] == "Windows":
|
||||||
_PKG_TARGETS = ["vlc", "putty"]
|
_PKG_TARGETS = ["7zip", "putty"]
|
||||||
elif grains["os"] == "Amazon":
|
elif grains["os"] == "Amazon":
|
||||||
if grains["osfinger"] == "Amazon Linux-2023":
|
if grains["osfinger"] == "Amazon Linux-2023":
|
||||||
_PKG_TARGETS = ["lynx", "gnuplot-minimal"]
|
_PKG_TARGETS = ["lynx", "gnuplot-minimal"]
|
||||||
|
@ -106,7 +111,9 @@ def PKG_CAP_TARGETS(grains):
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def PKG_32_TARGETS(grains):
|
def PKG_32_TARGETS(grains):
|
||||||
_PKG_32_TARGETS = []
|
_PKG_32_TARGETS = []
|
||||||
if grains["os_family"] == "RedHat" and grains["oscodename"] != "Photon":
|
if grains["os"] == "Windows":
|
||||||
|
_PKG_32_TARGETS = ["npp", "nsis"]
|
||||||
|
elif grains["os_family"] == "RedHat" and grains["oscodename"] != "Photon":
|
||||||
if grains["os"] == "CentOS":
|
if grains["os"] == "CentOS":
|
||||||
if grains["osmajorrelease"] == 5:
|
if grains["osmajorrelease"] == 5:
|
||||||
_PKG_32_TARGETS = ["xz-devel.i386"]
|
_PKG_32_TARGETS = ["xz-devel.i386"]
|
||||||
|
@ -205,6 +212,19 @@ def latest_version(ctx, modules):
|
||||||
return run_command
|
return run_command
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="function")
|
||||||
|
def install_7zip(modules):
|
||||||
|
try:
|
||||||
|
modules.pkg.install(name="7zip", version="22.01.00.0")
|
||||||
|
modules.pkg.install(name="7zip", version="19.00.00.0")
|
||||||
|
assert modules.pkg.version("7zip") == "19.00.00.0,22.01.00.0"
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
modules.pkg.remove(name="7zip", version="19.00.00.0")
|
||||||
|
modules.pkg.remove(name="7zip", version="22.01.00.0")
|
||||||
|
assert modules.pkg.version("7zip") == ""
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.requires_salt_modules("pkg.version")
|
@pytest.mark.requires_salt_modules("pkg.version")
|
||||||
@pytest.mark.requires_salt_states("pkg.installed", "pkg.removed")
|
@pytest.mark.requires_salt_states("pkg.installed", "pkg.removed")
|
||||||
@pytest.mark.slow_test
|
@pytest.mark.slow_test
|
||||||
|
@ -268,7 +288,8 @@ def test_pkg_003_installed_multipkg(caplog, PKG_TARGETS, modules, states, grains
|
||||||
try:
|
try:
|
||||||
ret = states.pkg.installed(name=None, pkgs=PKG_TARGETS, refresh=False)
|
ret = states.pkg.installed(name=None, pkgs=PKG_TARGETS, refresh=False)
|
||||||
assert ret.result is True
|
assert ret.result is True
|
||||||
assert "WARNING" not in caplog.text
|
if not salt.utils.platform.is_windows():
|
||||||
|
assert "WARNING" not in caplog.text
|
||||||
finally:
|
finally:
|
||||||
ret = states.pkg.removed(name=None, pkgs=PKG_TARGETS)
|
ret = states.pkg.removed(name=None, pkgs=PKG_TARGETS)
|
||||||
assert ret.result is True
|
assert ret.result is True
|
||||||
|
@ -1091,3 +1112,17 @@ def test_pkg_purged_with_removed_pkg(grains, PKG_TARGETS, states, modules):
|
||||||
"installed": {},
|
"installed": {},
|
||||||
"removed": {target: {"new": "", "old": version}},
|
"removed": {target: {"new": "", "old": version}},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skip_unless_on_windows()
|
||||||
|
def test_pkg_removed_with_version_multiple(install_7zip, modules, states):
|
||||||
|
"""
|
||||||
|
This tests removing a specific version of a package when multiple versions
|
||||||
|
are installed. This is specific to Windows. The only version I could find
|
||||||
|
that allowed multiple installs of differing versions was 7zip, so we'll use
|
||||||
|
that.
|
||||||
|
"""
|
||||||
|
ret = states.pkg.removed(name="7zip", version="19.00.00.0")
|
||||||
|
assert ret.result is True
|
||||||
|
current = modules.pkg.version("7zip")
|
||||||
|
assert current == "22.01.00.0"
|
||||||
|
|
Loading…
Add table
Reference in a new issue