diff --git a/supervisor/docker/addon.py b/supervisor/docker/addon.py index b80f5cce3..1018dd1c8 100644 --- a/supervisor/docker/addon.py +++ b/supervisor/docker/addon.py @@ -387,6 +387,7 @@ class DockerAddon(DockerInterface): source=self.sys_config.path_extern_share.as_posix(), target="/share", read_only=addon_mapping[MAP_SHARE], + propagation=PropagationMode.SLAVE.value, ) ) diff --git a/supervisor/docker/homeassistant.py b/supervisor/docker/homeassistant.py index fa87cede4..b08e175d4 100644 --- a/supervisor/docker/homeassistant.py +++ b/supervisor/docker/homeassistant.py @@ -97,6 +97,7 @@ class DockerHomeAssistant(DockerInterface): source=self.sys_config.path_extern_share.as_posix(), target="/share", read_only=False, + propagation=PropagationMode.SLAVE.value, ), Mount( type=MountType.BIND.value, diff --git a/supervisor/resolution/checks/docker_config.py b/supervisor/resolution/checks/docker_config.py index 9f8290d46..746720a58 100644 --- a/supervisor/resolution/checks/docker_config.py +++ b/supervisor/resolution/checks/docker_config.py @@ -14,7 +14,7 @@ def _check_container(container: DockerInterface) -> bool: return any( mount.get("Propagation") != PropagationMode.SLAVE.value for mount in container.meta_mounts - if mount.get("Destination") == "/media" + if mount.get("Destination") in ["/media", "/share"] ) diff --git a/tests/docker/test_addon.py b/tests/docker/test_addon.py index 5da414dd9..570ad357f 100644 --- a/tests/docker/test_addon.py +++ b/tests/docker/test_addon.py @@ -126,8 +126,20 @@ def test_addon_map_folder_defaults( in docker_addon.mounts ) - # Share not mapped - assert "/share" not in [mount["Target"] for mount in docker_addon.mounts] + # Share added and propagation set + assert ( + Mount( + type="bind", + source=coresys.config.path_extern_share.as_posix(), + target="/share", + read_only=True, + propagation="slave", + ) + in docker_addon.mounts + ) + + # Backup not added + assert "/backup" not in [mount["Target"] for mount in docker_addon.mounts] def test_journald_addon( diff --git a/tests/fixtures/basic-addon-config.json b/tests/fixtures/basic-addon-config.json index bb17bda3f..3244e9a49 100644 --- a/tests/fixtures/basic-addon-config.json +++ b/tests/fixtures/basic-addon-config.json @@ -7,7 +7,7 @@ "url": "https://www.home-assistant.io/", "startup": "application", "boot": "auto", - "map": ["config:rw", "ssl", "media"], + "map": ["config:rw", "ssl", "media", "share"], "options": {}, "schema": {}, "image": "test/{arch}-my-custom-addon" diff --git a/tests/resolution/check/test_check_docker_config.py b/tests/resolution/check/test_check_docker_config.py index 49ca2a01d..ec998ffc9 100644 --- a/tests/resolution/check/test_check_docker_config.py +++ b/tests/resolution/check/test_check_docker_config.py @@ -2,6 +2,8 @@ from unittest.mock import MagicMock, patch +import pytest + from supervisor.addons.addon import Addon from supervisor.const import CoreState from supervisor.coresys import CoreSys @@ -14,24 +16,23 @@ from supervisor.resolution.data import Issue, Suggestion from tests.conftest import mock_async_return_true -def _make_mock_container_get(bad_config_names: list[str]): +def _make_mock_container_get(bad_config_names: list[str], folder: str = "media"): """Make mock of container get.""" + mount = { + "Type": "bind", + "Source": f"/mnt/data/supervisor/{folder}", + "Destination": f"/{folder}", + "Mode": "rw", + "RW": True, + "Propagation": "rprivate", + } def mock_container_get(name): out = MagicMock() out.status = "running" out.attrs = {"State": {}, "Mounts": []} if name in bad_config_names: - out.attrs["Mounts"].append( - { - "Type": "bind", - "Source": "/mnt/data/supervisor/media", - "Destination": "/media", - "Mode": "rw", - "RW": True, - "Propagation": "rprivate", - } - ) + out.attrs["Mounts"].append(mount) return out @@ -45,10 +46,13 @@ async def test_base(coresys: CoreSys): assert docker_config.enabled -async def test_check(docker: DockerAPI, coresys: CoreSys, install_addon_ssh: Addon): +@pytest.mark.parametrize("folder", ["media", "share"]) +async def test_check( + docker: DockerAPI, coresys: CoreSys, install_addon_ssh: Addon, folder: str +): """Test check reports issue when containers have incorrect config.""" docker.containers.get = _make_mock_container_get( - ["homeassistant", "hassio_audio", "addon_local_ssh"] + ["homeassistant", "hassio_audio", "addon_local_ssh"], folder ) with patch.object(DockerInterface, "is_running", new=mock_async_return_true): await coresys.plugins.load()