File fix-refresh-of-osrelease-and-related-grains-on-pytho.patch of Package salt
From 722484c93995b253bc61e93867a521693d3ca0b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
<psuarezhernandez@suse.com>
Date: Wed, 2 Apr 2025 13:29:27 +0100
Subject: [PATCH] Fix refresh of osrelease and related grains on Python
3.10+ (#712)
* Fix refresh of osrelease and related grains on Python 3.10+
* Add test__freedesktop_os_release_cache_is_invalidated unit test
---
changelog/67932.fixed.md | 1 +
salt/grains/core.py | 5 ++++
tests/pytests/unit/grains/test_core.py | 41 ++++++++++++++++++++++++++
3 files changed, 47 insertions(+)
create mode 100644 changelog/67932.fixed.md
diff --git a/changelog/67932.fixed.md b/changelog/67932.fixed.md
new file mode 100644
index 0000000000..255d61b502
--- /dev/null
+++ b/changelog/67932.fixed.md
@@ -0,0 +1 @@
+Fix refresh of osrelease and related grains on Python 3.10+
diff --git a/salt/grains/core.py b/salt/grains/core.py
index 94f58e8c4e..619969df9a 100644
--- a/salt/grains/core.py
+++ b/salt/grains/core.py
@@ -2170,6 +2170,11 @@ def _linux_distribution_data():
log.trace("Getting OS name, release, and codename from freedesktop_os_release")
try:
+ # If using platform.freedesktop_os_release we must invalidate
+ # the internal platform os_release cache to allow grains to be
+ # actually recalculated during grains_refresh
+ if hasattr(platform, "_os_release_cache"):
+ platform._os_release_cache = None
os_release = _freedesktop_os_release()
grains.update(_os_release_to_grains(os_release))
diff --git a/tests/pytests/unit/grains/test_core.py b/tests/pytests/unit/grains/test_core.py
index c3cf12c10f..c15a3b4360 100644
--- a/tests/pytests/unit/grains/test_core.py
+++ b/tests/pytests/unit/grains/test_core.py
@@ -406,6 +406,47 @@ def test__linux_lsb_distrib_data():
assert not has_error
+@pytest.mark.skip_unless_on_linux
+@pytest.mark.skipif(
+ sys.version_info < (3, 10),
+ reason="platform.freedesktop_os_release not available in Python < 3.10",
+)
+def test__freedesktop_os_release_cache_is_invalidated():
+ OS_RELEASE_DATA = {
+ "NAME": "openSUSE Leap",
+ "ID": "opensuse-leap",
+ "PRETTY_NAME": "openSUSE Leap 15.6",
+ "VERSION": "15.6",
+ "ID_LIKE": "suse opensuse",
+ "VERSION_ID": "15.6",
+ "ANSI_COLOR": "0;32",
+ "CPE_NAME": "cpe:/o:opensuse:leap:15.6",
+ "BUG_REPORT_URL": "https://bugs.opensuse.org",
+ "HOME_URL": "https://www.opensuse.org/",
+ "DOCUMENTATION_URL": "https://en.opensuse.org/Portal:Leap",
+ "LOGO": "distributor-logo-Leap",
+ }
+
+ class FreeDesktopOSReleaseMock:
+ def __call__(self):
+ if hasattr(platform, "_os_release_cache"):
+ assert platform._os_release_cache is None
+ return OS_RELEASE_DATA
+
+ with patch.object(
+ core, "_linux_lsb_distrib_data", MagicMock(return_value=({}, None))
+ ), patch.object(
+ core, "_freedesktop_os_release", FreeDesktopOSReleaseMock()
+ ), patch.object(
+ core,
+ "_legacy_linux_distribution_data",
+ MagicMock(return_value={"osrelease": "15.6"}),
+ ):
+ platform._os_release_cache = {"this-cache-should-be-invalidated": "foobar"}
+ ret = core._linux_distribution_data()
+ assert ret == {"osrelease": "15.6"}
+
+
@pytest.mark.skip_unless_on_linux
def test_gnu_slash_linux_in_os_name():
"""
--
2.49.0