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).
This commit is contained in:
Stefan Agner 2023-12-06 10:46:47 +01:00 committed by GitHub
parent 72e64676da
commit 96f4ba5d25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 3 deletions

View File

@ -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:

View File

@ -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

View File

@ -18,3 +18,5 @@ options:
message: "Hello world..."
schema:
message: "str?"
ingress: true
ingress_port: 0