From 96f4ba5d25cdf3d78bb9b6d44d392fc419753576 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Wed, 6 Dec 2023 10:46:47 +0100 Subject: [PATCH] Check/get ingress port on add-on load (#4744) Instead of setting the ingress port on install, make sure to set the port when the add-on gets loaded (on Supervisor startup and before installation). This is necessary since the dynamic ingress ports are not stored as part of the add-on data storage themself but in the ingress data store. So on every Supervisor start the port needs to be transferred to the add-on model. Note that we still need to check the port on add-on update since the add-on potentially added (dynamic) ingress on update. Same applies to add-on restore (the restored version might use a dynamic ingress port). --- supervisor/addons/addon.py | 4 +--- tests/addons/test_addon.py | 13 +++++++++++++ tests/fixtures/addons/local/example/config.yaml | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/supervisor/addons/addon.py b/supervisor/addons/addon.py index 32222d7d9..539a716fa 100644 --- a/supervisor/addons/addon.py +++ b/supervisor/addons/addon.py @@ -184,6 +184,7 @@ class Addon(AddonModel): ) ) + await self._check_ingress_port() with suppress(DockerError): await self.instance.attach(version=self.version) @@ -640,8 +641,6 @@ class Addon(AddonModel): self.sys_addons.data.uninstall(self) raise AddonsError() from err - await self._check_ingress_port() - # Add to addon manager self.sys_addons.local[self.slug] = self @@ -769,7 +768,6 @@ class Addon(AddonModel): raise AddonsError() from err self.sys_addons.data.update(self.addon_store) - await self._check_ingress_port() _LOGGER.info("Add-on '%s' successfully rebuilt", self.slug) finally: diff --git a/tests/addons/test_addon.py b/tests/addons/test_addon.py index 112bc445e..496eb5fd0 100644 --- a/tests/addons/test_addon.py +++ b/tests/addons/test_addon.py @@ -683,3 +683,16 @@ async def test_local_example_start( await install_addon_example.start() assert addon_config_dir.is_dir() + + +async def test_local_example_ingress_port_set( + coresys: CoreSys, + container: MagicMock, + tmp_supervisor_data: Path, + install_addon_example: Addon, +): + """Test start of an addon.""" + install_addon_example.path_data.mkdir() + await install_addon_example.load() + + assert install_addon_example.ingress_port != 0 diff --git a/tests/fixtures/addons/local/example/config.yaml b/tests/fixtures/addons/local/example/config.yaml index dc40ddd5c..0606593e5 100644 --- a/tests/fixtures/addons/local/example/config.yaml +++ b/tests/fixtures/addons/local/example/config.yaml @@ -18,3 +18,5 @@ options: message: "Hello world..." schema: message: "str?" +ingress: true +ingress_port: 0