From 059b161f4ff4fed0bc8c9ffbe17df7d90af4b895 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Tue, 5 Aug 2025 16:23:23 -0400 Subject: [PATCH] Use actual latest version of OS in os version check (#6067) --- supervisor/const.py | 1 + supervisor/os/manager.py | 5 +++++ supervisor/resolution/evaluations/os_version.py | 2 +- supervisor/updater.py | 7 +++++++ supervisor/validate.py | 2 ++ tests/resolution/evaluation/test_evaluate_os_version.py | 2 +- 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/supervisor/const.py b/supervisor/const.py index 797a58cf0..ba95aee06 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -197,6 +197,7 @@ ATTR_GPIO = "gpio" ATTR_HASSIO_API = "hassio_api" ATTR_HASSIO_ROLE = "hassio_role" ATTR_HASSOS = "hassos" +ATTR_HASSOS_UNRESTRICTED = "hassos_unrestricted" ATTR_HEALTHY = "healthy" ATTR_HEARTBEAT_LED = "heartbeat_led" ATTR_HOMEASSISTANT = "homeassistant" diff --git a/supervisor/os/manager.py b/supervisor/os/manager.py index dcf82665c..bb40c2f67 100644 --- a/supervisor/os/manager.py +++ b/supervisor/os/manager.py @@ -110,6 +110,11 @@ class OSManager(CoreSysAttributes): """Return version of HassOS.""" return self.sys_updater.version_hassos + @property + def latest_version_unrestricted(self) -> AwesomeVersion | None: + """Return current latest version of HassOS for board ignoring upgrade restrictions.""" + return self.sys_updater.version_hassos_unrestricted + @property def need_update(self) -> bool: """Return true if a HassOS update is available.""" diff --git a/supervisor/resolution/evaluations/os_version.py b/supervisor/resolution/evaluations/os_version.py index 80c0658df..0e4097436 100644 --- a/supervisor/resolution/evaluations/os_version.py +++ b/supervisor/resolution/evaluations/os_version.py @@ -38,7 +38,7 @@ class EvaluateOSVersion(EvaluateBase): if ( not self.sys_os.available or not (current := self.sys_os.version) - or not (latest := self.sys_os.latest_version) + or not (latest := self.sys_os.latest_version_unrestricted) or not latest.major ): return False diff --git a/supervisor/updater.py b/supervisor/updater.py index cb9389390..298dcb1a4 100644 --- a/supervisor/updater.py +++ b/supervisor/updater.py @@ -18,6 +18,7 @@ from .const import ( ATTR_CLI, ATTR_DNS, ATTR_HASSOS, + ATTR_HASSOS_UNRESTRICTED, ATTR_HOMEASSISTANT, ATTR_IMAGE, ATTR_MULTICAST, @@ -84,6 +85,11 @@ class Updater(FileConfiguration, CoreSysAttributes): """Return latest version of HassOS.""" return self._data.get(ATTR_HASSOS) + @property + def version_hassos_unrestricted(self) -> AwesomeVersion | None: + """Return latest version of HassOS ignoring upgrade restrictions.""" + return self._data.get(ATTR_HASSOS_UNRESTRICTED) + @property def version_cli(self) -> AwesomeVersion | None: """Return latest version of CLI.""" @@ -275,6 +281,7 @@ class Updater(FileConfiguration, CoreSysAttributes): if self.sys_os.board: self._data[ATTR_OTA] = data["ota"] if version := data["hassos"].get(self.sys_os.board): + self._data[ATTR_HASSOS_UNRESTRICTED] = version events.append("os") upgrade_map = data.get("hassos-upgrade", {}) if last_in_major := upgrade_map.get(str(self.sys_os.version.major)): diff --git a/supervisor/validate.py b/supervisor/validate.py index 47f62f4a1..394c2c008 100644 --- a/supervisor/validate.py +++ b/supervisor/validate.py @@ -23,6 +23,7 @@ from .const import ( ATTR_ENABLE_IPV6, ATTR_FORCE_SECURITY, ATTR_HASSOS, + ATTR_HASSOS_UNRESTRICTED, ATTR_HOMEASSISTANT, ATTR_ID, ATTR_IMAGE, @@ -126,6 +127,7 @@ SCHEMA_UPDATER_CONFIG = vol.Schema( vol.Optional(ATTR_HOMEASSISTANT): version_tag, vol.Optional(ATTR_SUPERVISOR): version_tag, vol.Optional(ATTR_HASSOS): version_tag, + vol.Optional(ATTR_HASSOS_UNRESTRICTED): version_tag, vol.Optional(ATTR_CLI): version_tag, vol.Optional(ATTR_DNS): version_tag, vol.Optional(ATTR_AUDIO): version_tag, diff --git a/tests/resolution/evaluation/test_evaluate_os_version.py b/tests/resolution/evaluation/test_evaluate_os_version.py index 5ddd45fce..0a4af9720 100644 --- a/tests/resolution/evaluation/test_evaluate_os_version.py +++ b/tests/resolution/evaluation/test_evaluate_os_version.py @@ -49,7 +49,7 @@ async def test_os_version_evaluation( ), patch.object( OSManager, - "latest_version", + "latest_version_unrestricted", new=PropertyMock(return_value=latest and AwesomeVersion(latest)), ), ):