From 3225aa00bf7aabf5af441fbed89f98cd3ca4ac98 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Thu, 6 Apr 2017 17:27:41 -0400 Subject: [PATCH] add docker storage driver check --- .../docker_storage_driver_check.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 roles/openshift_health_checker/openshift_checks/docker_storage_driver_check.py diff --git a/roles/openshift_health_checker/openshift_checks/docker_storage_driver_check.py b/roles/openshift_health_checker/openshift_checks/docker_storage_driver_check.py new file mode 100644 index 00000000000..f79479f6075 --- /dev/null +++ b/roles/openshift_health_checker/openshift_checks/docker_storage_driver_check.py @@ -0,0 +1,48 @@ +# pylint: disable=missing-docstring +from openshift_checks import OpenShiftCheck, get_var + + +class DockerStorageDriverCheck(OpenShiftCheck): + """Check Docker storage driver compatibility. + + This check ensures that Docker is using a supported storage driver, + and that Loopback is not being used (if using devicemapper). + """ + + name = "docker_storage_driver_check" + tags = ["preflight"] + + storage_drivers = ["devicemapper", "overlay2"] + + def run(self, tmp, task_vars): + is_containerized = get_var(task_vars, "openshift", "common", "is_containerized") + if not is_containerized: + return {"changed": False} + + info = self.execute_module("docker_info", {}, task_vars).get("info", {}) + + if not self.is_supported_storage_driver(info): + msg = "Unsupported Docker storage driver detected. Supported storage drivers: {drivers}" + return {"failed": True, "msg": msg.format(drivers=self.storage_drivers)} + + if self.is_using_loopback_device(info): + msg = "Use of loopback devices is discouraged. Try running Docker with `--storage-opt dm.thinpooldev`" + return {"failed": True, "msg": msg} + + return {"changed": False} + + def is_supported_storage_driver(self, docker_info): + return docker_info.get("Driver", "") in self.storage_drivers + + @staticmethod + def is_using_loopback_device(docker_info): + # Loopback device usage is only an issue if using devicemapper. + # Skip this check if using any other storage driver. + if docker_info.get("Driver", "") != "devicemapper": + return False + + for status in docker_info.get("DriverStatus", []): + if status[0] == "Data loop file": + return bool(status[1]) + + return False