Add SNMP profile mapping and fix asset cleanup

This commit is contained in:
Keith Smith
2026-05-26 16:34:10 -06:00
parent fe7157fdad
commit e59733d331
15 changed files with 676 additions and 35 deletions
+95
View File
@@ -10,6 +10,15 @@ from app.collectors.snmp import (
IF_OPER_STATUS,
IF_OUT_DISCARDS,
IF_OUT_ERRORS,
ENT_PHY_SENSOR_OPER_STATUS,
ENT_PHY_SENSOR_PRECISION,
ENT_PHY_SENSOR_SCALE,
ENT_PHY_SENSOR_TYPE,
ENT_PHY_SENSOR_VALUE,
HR_PROCESSOR_LOAD,
HR_STORAGE_ALLOCATION_UNITS,
HR_STORAGE_SIZE,
HR_STORAGE_USED,
SYS_UPTIME,
SnmpCheckConfig,
_with_index,
@@ -37,6 +46,92 @@ class SnmpCollectorTestCase(unittest.IsolatedAsyncioTestCase):
("uptime_seconds", 1234.0, "seconds")
]
async def test_collects_cpu_load(self) -> None:
oid = _with_index(HR_PROCESSOR_LOAD, 196608)
with patch("app.collectors.snmp.SnmpV2Client") as client_class:
client_class.return_value.get_many.return_value = {oid: 42}
result = await run_snmp_check(
SnmpCheckConfig(
host="192.0.2.10",
community="private-community",
item_id="cpu.196608.load",
item_type="cpu_load",
)
)
assert result.status == "up"
assert result.message == "CPU load is 42%"
assert [(metric.name, metric.value, metric.unit) for metric in result.metrics] == [
("load_percent", 42.0, "%")
]
async def test_collects_storage_usage(self) -> None:
oids = [
_with_index(HR_STORAGE_ALLOCATION_UNITS, 31),
_with_index(HR_STORAGE_SIZE, 31),
_with_index(HR_STORAGE_USED, 31),
]
with patch("app.collectors.snmp.SnmpV2Client") as client_class:
client_class.return_value.get_many.return_value = {
oids[0]: 4096,
oids[1]: 100,
oids[2]: 25,
}
result = await run_snmp_check(
SnmpCheckConfig(
host="192.0.2.10",
community="private-community",
item_id="storage.31.usage",
item_type="storage_usage",
label="Disk / usage",
)
)
assert result.status == "up"
assert result.message == "Disk / usage is 25.0% used"
assert [(metric.name, metric.value, metric.unit) for metric in result.metrics] == [
("used_percent", 25.0, "%"),
("used_bytes", 102400.0, "bytes"),
("total_bytes", 409600.0, "bytes"),
]
async def test_collects_sensor_value_and_status(self) -> None:
oids = [
_with_index(ENT_PHY_SENSOR_TYPE, 10),
_with_index(ENT_PHY_SENSOR_SCALE, 10),
_with_index(ENT_PHY_SENSOR_PRECISION, 10),
_with_index(ENT_PHY_SENSOR_VALUE, 10),
_with_index(ENT_PHY_SENSOR_OPER_STATUS, 10),
]
with patch("app.collectors.snmp.SnmpV2Client") as client_class:
client_class.return_value.get_many.return_value = {
oids[0]: 8,
oids[1]: 9,
oids[2]: 1,
oids[3]: 310,
oids[4]: 1,
}
result = await run_snmp_check(
SnmpCheckConfig(
host="192.0.2.10",
community="private-community",
item_id="sensor.10.value",
item_type="sensor_value",
label="Temperature Inlet",
unit="C",
)
)
assert result.status == "up"
assert result.message == "Temperature Inlet is 31C; sensor status ok"
assert [(metric.name, metric.value, metric.unit) for metric in result.metrics] == [
("sensor_value", 31.0, "C"),
("sensor_status", 1.0, None),
]
async def test_collects_interface_status(self) -> None:
admin_oid = _with_index(IF_ADMIN_STATUS, 7)
oper_oid = _with_index(IF_OPER_STATUS, 7)