From 63fde3b4109310e95ebdcc8e3c23a04ff96ba592 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 27 May 2025 14:00:54 +0200 Subject: [PATCH] Do not backup add-on being uninstalled (#5917) --- supervisor/addons/addon.py | 7 +++++++ tests/addons/test_addon.py | 2 +- tests/conftest.py | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/supervisor/addons/addon.py b/supervisor/addons/addon.py index 2546a31f4..eb440b961 100644 --- a/supervisor/addons/addon.py +++ b/supervisor/addons/addon.py @@ -1335,6 +1335,13 @@ class Addon(AddonModel): wait_for_start: asyncio.Task | None = None + # Refuse to backup if add-on is unknown (e.g. has been uninstalled by the user + # since the backup got started). + if self.state == AddonState.UNKNOWN: + raise AddonsError( + f"Add-on {self.slug} is not installed, cannot backup!", _LOGGER.error + ) + data = { ATTR_USER: self.persist, ATTR_SYSTEM: self.data, diff --git a/tests/addons/test_addon.py b/tests/addons/test_addon.py index 8bf89fcc2..7fc406a1b 100644 --- a/tests/addons/test_addon.py +++ b/tests/addons/test_addon.py @@ -102,7 +102,7 @@ async def test_addon_state_listener(coresys: CoreSys, install_addon_ssh: Addon) with patch.object(DockerAddon, "attach"): await install_addon_ssh.load() - assert install_addon_ssh.state == AddonState.UNKNOWN + assert install_addon_ssh.state == AddonState.STOPPED with patch.object(Addon, "watchdog_container"): _fire_test_event(coresys, f"addon_{TEST_ADDON_SLUG}", ContainerState.RUNNING) diff --git a/tests/conftest.py b/tests/conftest.py index d954398e9..e8902e7cd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -40,6 +40,7 @@ from supervisor.const import ( ATTR_TYPE, ATTR_VERSION, REQUEST_FROM, + AddonState, CoreState, ) from supervisor.coresys import CoreSys @@ -615,6 +616,7 @@ async def install_addon_ssh(coresys: CoreSys, repository): coresys.addons.data._data = coresys.addons.data._schema(coresys.addons.data._data) addon = Addon(coresys, store.slug) + addon.state = AddonState.STOPPED coresys.addons.local[addon.slug] = addon yield addon @@ -627,6 +629,7 @@ async def install_addon_example(coresys: CoreSys, repository): coresys.addons.data._data = coresys.addons.data._schema(coresys.addons.data._data) addon = Addon(coresys, store.slug) + addon.state = AddonState.STOPPED coresys.addons.local[addon.slug] = addon yield addon