summaryrefslogtreecommitdiffstats
path: root/roles/openshift_health_checker/openshift_checks/etcd_volume.py
blob: 00e24023190c76e1e960e12f9f13b9d1111e3ffe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""
Ansible module for warning about etcd volume size past a defined threshold.
"""

from openshift_checks import OpenShiftCheck, OpenShiftCheckException, get_var


class EtcdVolume(OpenShiftCheck):
    """Ensure disk size for an etcd host does not exceed a defined limit"""

    name = "etcd_volume"
    tags = ["etcd", "health"]

    etcd_default_size_limit_percent = 0.9

    def run(self, tmp, task_vars):
        ansible_mounts = get_var(task_vars, "ansible_mounts")

        etcd_mount_path = self._get_etcd_mount_path(ansible_mounts)
        etcd_disk_size_available = float(etcd_mount_path["size_available"])
        etcd_disk_size_total = float(etcd_mount_path["size_total"])
        etcd_disk_size_used = etcd_disk_size_total - etcd_disk_size_available

        size_limit_percent = get_var(
            task_vars,
            "etcd_disk_size_limit_percent",
            default=self.etcd_default_size_limit_percent
        )

        if etcd_disk_size_used / etcd_disk_size_total > size_limit_percent:
            msg = ("Current etcd volume usage ({actual:.2f} GB) for the volume \"{volume}\" "
                   "is greater than the storage limit ({limit:.2f} GB).")
            msg = msg.format(
                actual=self._to_gigabytes(etcd_disk_size_used),
                volume=etcd_mount_path["mount"],
                limit=self._to_gigabytes(size_limit_percent * etcd_disk_size_total),
            )
            return {"failed": True, "msg": msg}

        return {"changed": False}

    @staticmethod
    def _get_etcd_mount_path(ansible_mounts):
        supported_mnt_paths = ["/var/lib/etcd", "/var/lib", "/var", "/"]
        available_mnts = {mnt.get("mount"): mnt for mnt in ansible_mounts}

        for path in supported_mnt_paths:
            if path in available_mnts:
                return available_mnts[path]

        paths = ', '.join(sorted(available_mnts)) or 'none'
        msg = "Unable to determine available disk space. Paths mounted: {}.".format(paths)
        raise OpenShiftCheckException(msg)

    @staticmethod
    def _to_gigabytes(byte_size):
        return float(byte_size) / 10.0**9