From 722484c93995b253bc61e93867a521693d3ca0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= 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