From 2a892544c241a4630c1c4cc3577f308b285bf8ff Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 22 Mar 2021 17:04:20 +0100 Subject: [PATCH] Fix journald add-on option to work with default Debian (#2742) --- supervisor/const.py | 3 ++- supervisor/docker/addon.py | 12 +++++++++--- tests/docker/test_addon.py | 33 ++++++++++++++++++++++++++------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/supervisor/const.py b/supervisor/const.py index 8da10ad20..13d668496 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -27,7 +27,8 @@ MACHINE_ID = Path("/etc/machine-id") SOCKET_DBUS = Path("/run/dbus/system_bus_socket") SOCKET_DOCKER = Path("/run/docker.sock") RUN_SUPERVISOR_STATE = Path("/run/supervisor") -SYSTEMD_JOURNAL = Path("/var/logs/journal") +SYSTEMD_JOURNAL_PERSISTENT = Path("/var/logs/journal") +SYSTEMD_JOURNAL_VOLATILE = Path("/run/log/journal") DOCKER_NETWORK = "hassio" DOCKER_NETWORK_MASK = ip_network("172.30.32.0/23") diff --git a/supervisor/docker/addon.py b/supervisor/docker/addon.py index 608c4f57d..70e5c5a4c 100644 --- a/supervisor/docker/addon.py +++ b/supervisor/docker/addon.py @@ -26,7 +26,8 @@ from ..const import ( MAP_SSL, SECURITY_DISABLE, SECURITY_PROFILE, - SYSTEMD_JOURNAL, + SYSTEMD_JOURNAL_PERSISTENT, + SYSTEMD_JOURNAL_VOLATILE, ) from ..coresys import CoreSys from ..exceptions import CoreDNSError, DockerError, DockerNotFound, HardwareNotFound @@ -416,10 +417,15 @@ class DockerAddon(DockerInterface): # System Journal access if self.addon.with_journald: + # Systemd uses volatile by default, unless persistent location exists. + bind = SYSTEMD_JOURNAL_VOLATILE + if SYSTEMD_JOURNAL_PERSISTENT.exists(): + bind = SYSTEMD_JOURNAL_PERSISTENT + volumes.update( { - str(SYSTEMD_JOURNAL): { - "bind": str(SYSTEMD_JOURNAL), + str(SYSTEMD_JOURNAL_PERSISTENT): { + "bind": str(bind), "mode": "ro", } } diff --git a/tests/docker/test_addon.py b/tests/docker/test_addon.py index 269147aff..82054be25 100644 --- a/tests/docker/test_addon.py +++ b/tests/docker/test_addon.py @@ -7,7 +7,7 @@ import pytest from supervisor.addons import validate as vd from supervisor.addons.addon import Addon from supervisor.addons.model import Data -from supervisor.const import SYSTEMD_JOURNAL +from supervisor.const import SYSTEMD_JOURNAL_PERSISTENT, SYSTEMD_JOURNAL_VOLATILE from supervisor.coresys import CoreSys from supervisor.docker.addon import DockerAddon @@ -97,16 +97,35 @@ def test_addon_map_folder_defaults( assert str(docker_addon.sys_config.path_extern_share) not in volumes -def test_journald_addon(coresys: CoreSys, addonsdata_system: Dict[str, Data]): - """Validate volume for journald option.""" +def test_journald_addon_volatile(coresys: CoreSys, addonsdata_system: Dict[str, Data]): + """Validate volume for journald option, with volatile logs.""" docker_addon = get_docker_addon( coresys, addonsdata_system, "journald-addon-config.json" ) volumes = docker_addon.volumes - assert str(SYSTEMD_JOURNAL) in volumes - assert volumes.get(str(SYSTEMD_JOURNAL)).get("bind") == str(SYSTEMD_JOURNAL) - assert volumes.get(str(SYSTEMD_JOURNAL)).get("mode") == "ro" + assert str(SYSTEMD_JOURNAL_PERSISTENT) in volumes + assert volumes.get(str(SYSTEMD_JOURNAL_PERSISTENT)).get("bind") == str( + SYSTEMD_JOURNAL_VOLATILE + ) + assert volumes.get(str(SYSTEMD_JOURNAL_PERSISTENT)).get("mode") == "ro" + + +def test_journald_addon_persistent( + coresys: CoreSys, addonsdata_system: Dict[str, Data] +): + """Validate volume for journald option, with persistent logs.""" + with patch("pathlib.Path.exists", return_value=True): + docker_addon = get_docker_addon( + coresys, addonsdata_system, "journald-addon-config.json" + ) + volumes = docker_addon.volumes + + assert str(SYSTEMD_JOURNAL_PERSISTENT) in volumes + assert volumes.get(str(SYSTEMD_JOURNAL_PERSISTENT)).get("bind") == str( + SYSTEMD_JOURNAL_PERSISTENT + ) + assert volumes.get(str(SYSTEMD_JOURNAL_PERSISTENT)).get("mode") == "ro" def test_not_journald_addon(coresys: CoreSys, addonsdata_system: Dict[str, Data]): @@ -116,4 +135,4 @@ def test_not_journald_addon(coresys: CoreSys, addonsdata_system: Dict[str, Data] ) volumes = docker_addon.volumes - assert str(SYSTEMD_JOURNAL) not in volumes + assert str(SYSTEMD_JOURNAL_PERSISTENT) not in volumes