From 1f69cf0fe687efb324d46f9d61b10ce34777e6ed Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 22 Jun 2022 17:22:27 +0200 Subject: [PATCH] Verify the cgroup supported level (#3688) * Verify the cgroup supported level * add tests --- supervisor/docker/__init__.py | 6 +++- .../evaluations/docker_configuration.py | 29 ++++++++++++++----- .../test_evaluate_docker_configuration.py | 11 +++++++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/supervisor/docker/__init__.py b/supervisor/docker/__init__.py index 060d0fd3c..e0c365f4f 100644 --- a/supervisor/docker/__init__.py +++ b/supervisor/docker/__init__.py @@ -50,12 +50,16 @@ class DockerInfo: version: AwesomeVersion = attr.ib() storage: str = attr.ib() logging: str = attr.ib() + cgroup: str = attr.ib() @staticmethod def new(data: dict[str, Any]): """Create a object from docker info.""" return DockerInfo( - AwesomeVersion(data["ServerVersion"]), data["Driver"], data["LoggingDriver"] + AwesomeVersion(data["ServerVersion"]), + data["Driver"], + data["LoggingDriver"], + data["CgroupVersion"], ) @property diff --git a/supervisor/resolution/evaluations/docker_configuration.py b/supervisor/resolution/evaluations/docker_configuration.py index 0aa328ebb..5a211426e 100644 --- a/supervisor/resolution/evaluations/docker_configuration.py +++ b/supervisor/resolution/evaluations/docker_configuration.py @@ -8,6 +8,7 @@ from .base import EvaluateBase EXPECTED_LOGGING = "journald" EXPECTED_STORAGE = "overlay2" +EXPECTED_CGROUP_VERSION = "1" _LOGGER: logging.Logger = logging.getLogger(__name__) @@ -37,13 +38,27 @@ class EvaluateDockerConfiguration(EvaluateBase): async def evaluate(self): """Run evaluation.""" - _storage = self.sys_docker.info.storage - _logging = self.sys_docker.info.logging + storage_driver = self.sys_docker.info.storage + logging_driver = self.sys_docker.info.logging + cgroup_version = self.sys_docker.info.cgroup - if _storage != EXPECTED_STORAGE: - _LOGGER.warning("Docker storage driver %s is not supported!", _storage) + if storage_driver != EXPECTED_STORAGE: + _LOGGER.warning( + "Docker storage driver %s is not supported!", storage_driver + ) - if _logging != EXPECTED_LOGGING: - _LOGGER.warning("Docker logging driver %s is not supported!", _logging) + if logging_driver != EXPECTED_LOGGING: + _LOGGER.warning( + "Docker logging driver %s is not supported!", logging_driver + ) - return _storage != EXPECTED_STORAGE or _logging != EXPECTED_LOGGING + if cgroup_version != EXPECTED_CGROUP_VERSION: + _LOGGER.warning( + "Docker cgroup version %s is not supported!", cgroup_version + ) + + return ( + storage_driver != EXPECTED_STORAGE + or logging_driver != EXPECTED_LOGGING + or cgroup_version != EXPECTED_CGROUP_VERSION + ) diff --git a/tests/resolution/evaluation/test_evaluate_docker_configuration.py b/tests/resolution/evaluation/test_evaluate_docker_configuration.py index 31121ba70..3204e0773 100644 --- a/tests/resolution/evaluation/test_evaluate_docker_configuration.py +++ b/tests/resolution/evaluation/test_evaluate_docker_configuration.py @@ -5,6 +5,7 @@ from unittest.mock import patch from supervisor.const import CoreState from supervisor.coresys import CoreSys from supervisor.resolution.evaluations.docker_configuration import ( + EXPECTED_CGROUP_VERSION, EXPECTED_LOGGING, EXPECTED_STORAGE, EvaluateDockerConfiguration, @@ -20,18 +21,28 @@ async def test_evaluation(coresys: CoreSys): coresys.docker.info.storage = "unsupported" coresys.docker.info.logging = EXPECTED_LOGGING + coresys.docker.info.cgroup = EXPECTED_CGROUP_VERSION await docker_configuration() assert docker_configuration.reason in coresys.resolution.unsupported coresys.resolution.unsupported.clear() coresys.docker.info.storage = EXPECTED_STORAGE coresys.docker.info.logging = "unsupported" + coresys.docker.info.cgroup = EXPECTED_CGROUP_VERSION await docker_configuration() assert docker_configuration.reason in coresys.resolution.unsupported coresys.resolution.unsupported.clear() coresys.docker.info.storage = EXPECTED_STORAGE coresys.docker.info.logging = EXPECTED_LOGGING + coresys.docker.info.cgroup = "unsupported" + await docker_configuration() + assert docker_configuration.reason in coresys.resolution.unsupported + coresys.resolution.unsupported.clear() + + coresys.docker.info.storage = EXPECTED_STORAGE + coresys.docker.info.logging = EXPECTED_LOGGING + coresys.docker.info.cgroup = EXPECTED_CGROUP_VERSION await docker_configuration() assert docker_configuration.reason not in coresys.resolution.unsupported