diff --git a/supervisor/misc/tasks.py b/supervisor/misc/tasks.py index 9e840da74..771ddded8 100644 --- a/supervisor/misc/tasks.py +++ b/supervisor/misc/tasks.py @@ -59,7 +59,7 @@ class Tasks(CoreSysAttributes): self.sys_scheduler.register_task(self._update_observer, RUN_UPDATE_OBSERVER) # Reload - self.sys_scheduler.register_task(self.sys_store.reload, RUN_RELOAD_ADDONS) + self.sys_scheduler.register_task(self._reload_store, RUN_RELOAD_ADDONS) self.sys_scheduler.register_task(self.sys_updater.reload, RUN_RELOAD_UPDATER) self.sys_scheduler.register_task(self.sys_backups.reload, RUN_RELOAD_BACKUPS) self.sys_scheduler.register_task(self.sys_host.reload, RUN_RELOAD_HOST) @@ -316,3 +316,8 @@ class Tasks(CoreSysAttributes): await self.sys_host.network.check_connectivity() finally: self._cache["connectivity"] = 0 + + @Job(conditions=[JobCondition.SUPERVISOR_UPDATED]) + async def _reload_store(self) -> None: + """Reload store and check for addon updates.""" + await self.sys_store.reload() diff --git a/supervisor/store/__init__.py b/supervisor/store/__init__.py index 172656cca..78a5a0c92 100644 --- a/supervisor/store/__init__.py +++ b/supervisor/store/__init__.py @@ -80,6 +80,7 @@ class StoreManager(CoreSysAttributes, FileConfiguration): self._data[ATTR_REPOSITORIES], add_with_errors=True ) + @Job(conditions=[JobCondition.SUPERVISOR_UPDATED], on_condition=StoreJobError) async def reload(self) -> None: """Update add-ons from repository and reload list.""" tasks = [repository.update() for repository in self.all] @@ -90,7 +91,10 @@ class StoreManager(CoreSysAttributes, FileConfiguration): await self.load() self._read_addons() - @Job(conditions=[JobCondition.INTERNET_SYSTEM]) + @Job( + conditions=[JobCondition.INTERNET_SYSTEM, JobCondition.SUPERVISOR_UPDATED], + on_condition=StoreJobError, + ) async def add_repository( self, url: str, *, persist: bool = True, add_with_errors: bool = False ): @@ -194,7 +198,6 @@ class StoreManager(CoreSysAttributes, FileConfiguration): await self.data.update() self._read_addons() - @Job(conditions=[JobCondition.INTERNET_SYSTEM]) async def update_repositories( self, list_repositories: list[str], diff --git a/tests/store/test_custom_repository.py b/tests/store/test_custom_repository.py index 54cc3a235..c96ddf0e0 100644 --- a/tests/store/test_custom_repository.py +++ b/tests/store/test_custom_repository.py @@ -1,6 +1,6 @@ """Test add custom repository.""" import json -from unittest.mock import patch +from unittest.mock import PropertyMock, patch import pytest @@ -10,6 +10,7 @@ from supervisor.exceptions import ( StoreError, StoreGitCloneError, StoreGitError, + StoreJobError, StoreNotFound, ) from supervisor.resolution.const import SuggestionType @@ -287,3 +288,22 @@ async def test_add_with_update_repositories( assert repository.source in coresys.store.repository_urls assert "http://example.com" in coresys.store.repository_urls + + +@pytest.mark.parametrize("use_update", [True, False]) +async def test_add_repository_fails_if_out_of_date( + coresys: CoreSys, store_manager: StoreManager, use_update: bool +): + """Test adding a repository fails when supervisor not updated.""" + with patch.object( + type(coresys.supervisor), "need_update", new=PropertyMock(return_value=True) + ), pytest.raises(StoreJobError): + if use_update: + await store_manager.update_repositories( + coresys.store.repository_urls + ["http://example.com"], + add_with_errors=True, + ) + else: + await store_manager.add_repository( + "http://example.com", add_with_errors=True + ) diff --git a/tests/store/test_store_manager.py b/tests/store/test_store_manager.py index 13482a2e9..d8e5ffe78 100644 --- a/tests/store/test_store_manager.py +++ b/tests/store/test_store_manager.py @@ -1,9 +1,12 @@ """Test store manager.""" -from unittest.mock import patch +from unittest.mock import PropertyMock, patch + +import pytest from supervisor.bootstrap import migrate_system_env from supervisor.const import ATTR_ADDONS_CUSTOM_LIST from supervisor.coresys import CoreSys +from supervisor.exceptions import StoreJobError from supervisor.store import StoreManager from supervisor.store.repository import Repository @@ -100,3 +103,11 @@ async def test_load_from_core_config(coresys: CoreSys): coresys.config.save_data.assert_called_once() coresys.store.save_data.assert_called_once() + + +async def test_reload_fails_if_out_of_date(coresys: CoreSys): + """Test reload fails when supervisor not updated.""" + with patch.object( + type(coresys.supervisor), "need_update", new=PropertyMock(return_value=True) + ), pytest.raises(StoreJobError): + await coresys.store.reload()