Add CPU usage to host inventory

This commit is contained in:
2026-10-04 20:30:43 -04:00
parent 456af32b36
commit a1b957392f
7 changed files with 91 additions and 5 deletions
+34 -1
View File
@@ -6,7 +6,7 @@ from pathlib import Path
import tempfile
import threading
import unittest
from unittest.mock import patch
from unittest.mock import mock_open, patch
spec = importlib.util.spec_from_file_location("ec_agent", Path(__file__).resolve().parents[1] / "ec_agent.py")
module = importlib.util.module_from_spec(spec)
@@ -74,6 +74,39 @@ class AgentTests(unittest.TestCase):
self.agent.journal.close()
self.temp.cleanup()
def cpu_sample(self, line):
with patch.object(Path, "open", mock_open(read_data=line)):
return self.agent.cpu_usage_percent()
def test_cpu_usage_uses_interval_and_excludes_guest_double_counting(self):
self.assertIsNone(self.cpu_sample("cpu 100 0 50 800 50 0 0 0 20 0\n"))
# 30 busy ticks (including steal), 60 idle, 10 I/O wait = 30%.
self.assertEqual(self.cpu_sample("cpu 120 0 55 860 60 0 0 5 30 0\n"), 30.0)
self.assertEqual(self.cpu_sample("cpu 120 0 55 960 60 0 0 5 30 0\n"), 0.0)
self.assertEqual(self.cpu_sample("cpu 220 0 55 960 60 0 0 5 30 0\n"), 100.0)
def test_cpu_usage_rebases_after_reset_or_invalid_sample(self):
baseline = "cpu 100 0 50 800 50 0 0 0\n"
self.assertIsNone(self.cpu_sample(baseline))
self.assertIsNone(self.cpu_sample(baseline))
self.assertIsNone(self.cpu_sample("cpu 10 0 5 80 5 0 0 0\n"))
self.assertIsNone(self.cpu_sample("cpu 20 0 5 90 4 0 0 0\n"))
for invalid in ("", "cpu0 1 2 3 4 5 6 7 8", "cpu 1 2", "cpu x 0 0 0 0 0 0 0", "cpu -1 0 0 0 0 0 0 0"):
self.assertIsNone(self.cpu_sample(invalid))
self.assertIsNone(self.cpu_sample(baseline))
with patch.object(Path, "open", side_effect=OSError("unavailable")):
self.assertIsNone(self.agent.cpu_usage_percent())
self.assertIsNone(self.cpu_sample(baseline))
def test_inventory_reports_cpu_only_when_available(self):
for usage in (None, 0.0, 42.3, 100.0):
with patch.object(self.agent, "cpu_usage_percent", return_value=usage):
inventory = self.agent.inventory()
if usage is None:
self.assertNotIn("cpuUsagePercent", inventory)
else:
self.assertEqual(inventory["cpuUsagePercent"], usage)
def operation(self, kind, payload=None, op_id="operation-1", generation=1):
return {"id": op_id, "kind": kind, "instanceId": INSTANCE, "generation": generation, "payload": payload or {}}