Przeglądaj źródła

diagnostics: rename "capacity" to used_percentage and update "used" meaning

"capacity" is misleading, we'll report it as "used_percentage" instead.

Also, we'll ensure that "used" also includes reserved space so that
used + free == total.
Lucian Petrut 1 dzień temu
rodzic
commit
778e0011a1

+ 2 - 2
coriolis/api-refs/api_samples/diagnostics/diagnostics-get-resp.json

@@ -30,7 +30,7 @@
                     "size": 21474836480,
                     "used": 10737418240,
                     "available": 10737418240,
-                    "capacity": 50,
+                    "used_percentage": 50,
                     "mounted_on": "/"
                 }
             ],
@@ -146,7 +146,7 @@
                     "size": 21474836480,
                     "used": 10737418240,
                     "available": 10737418240,
-                    "capacity": 50,
+                    "used_percentage": 50,
                     "mounted_on": "/"
                 }
             ],

+ 3 - 2
coriolis/api-refs/source/parameters.yaml

@@ -417,8 +417,9 @@ diagnostic_cpu_usage:
 diagnostic_filesystems:
   description: |
     Usage of mounted block devices, in bytes. Each entry reports the
-    filesystem, mount point, size, used and available bytes, and capacity
-    percentage. Nodev filesystems such as tmpfs are omitted.
+    filesystem, mount point, size, used and available bytes, and
+    used_percentage. used includes blocks reserved for root, so size
+    equals used plus available. Nodev filesystems such as tmpfs are omitted.
   in: body
   type: array
   required: true

+ 10 - 2
coriolis/tests/integration/management/test_diagnostics.py

@@ -63,12 +63,20 @@ class DiagnosticsTest(base.CoriolisIntegrationTestBase):
         for entry in filesystems:
             self.assertEqual(
                 set(entry.keys()),
-                {"filesystem", "size", "used", "available", "capacity", "mounted_on"},
+                {
+                    "filesystem",
+                    "size",
+                    "used",
+                    "available",
+                    "used_percentage",
+                    "mounted_on",
+                },
             )
             self.assertIsInstance(entry["filesystem"], str)
             self.assertIsInstance(entry["mounted_on"], str)
-            for field in ("size", "used", "available", "capacity"):
+            for field in ("size", "used", "available", "used_percentage"):
                 self.assertIsInstance(entry[field], int)
+            self.assertEqual(entry["size"], entry["used"] + entry["available"])
             mounts.append(entry["mounted_on"])
         self.assertIn("/", mounts)
 

+ 4 - 4
coriolis/tests/test_utils.py

@@ -83,7 +83,7 @@ class UtilsTestCase(test_base.CoriolisBaseTestCase):
         ]
         mock_usage.side_effect = lambda path: {
             '/': mock.Mock(total=1000, used=400, free=600),
-            # 1 / (1 + 2) is 33.3%, which rounds up to 34.
+            # 7 bytes are reserved for root, so reported used is 8, not 1.
             '/mnt/my data': mock.Mock(total=10, used=1, free=2),
         }[path]
 
@@ -98,15 +98,15 @@ class UtilsTestCase(test_base.CoriolisBaseTestCase):
                     "size": 1000,
                     "used": 400,
                     "available": 600,
-                    "capacity": 40,
+                    "used_percentage": 40,
                     "mounted_on": "/",
                 },
                 {
                     "filesystem": "/dev/sdb1",
                     "size": 10,
-                    "used": 1,
+                    "used": 8,
                     "available": 2,
-                    "capacity": 34,
+                    "used_percentage": 80,
                     "mounted_on": "/mnt/my data",
                 },
             ],

+ 13 - 8
coriolis/utils.py

@@ -128,15 +128,15 @@ def _get_release_tag():
     return release_tag
 
 
-def _filesystem_capacity(used, available):
+def _filesystem_used_percentage(used, available):
     """Return the used-space percentage, rounded up.
 
-    This is the integer Capacity column ``df`` prints:
+    ``available`` is space a normal user can still use. The percentage is
     ``used / (used + available) * 100``.
     """
     total = used + available
     if total == 0:
-        return 100 if used else 0
+        return 0
     return (used * 100 + total - 1) // total
 
 
@@ -145,7 +145,9 @@ def _get_filesystems():
 
     The mount list is ``psutil.disk_partitions(all=False)``: devices with a
     real block filesystem, including squashfs, and not nodev types such as
-    tmpfs. ``capacity`` is the integer percentage of used space, rounded up.
+    tmpfs. ``size`` is the whole filesystem. ``used`` includes blocks
+    reserved for root, so ``size`` equals ``used + available``.
+    ``used_percentage`` is that used share, rounded up.
     """
     filesystems = []
     for partition in psutil.disk_partitions(all=False):
@@ -159,13 +161,16 @@ def _get_filesystems():
                 exc,
             )
             continue
+        total = usage.total
+        available = usage.free
+        used = total - available
         filesystems.append(
             {
                 "filesystem": partition.device,
-                "size": usage.total,
-                "used": usage.used,
-                "available": usage.free,
-                "capacity": _filesystem_capacity(usage.used, usage.free),
+                "size": total,
+                "used": used,
+                "available": available,
+                "used_percentage": _filesystem_used_percentage(used, available),
                 "mounted_on": partition.mountpoint,
             }
         )