Skip to content

Verified: IT hardware (SNMP, Redfish, node_exporter)

Each claim the IT hardware (SNMP, Redfish, node_exporter) page makes, with the tests that prove it in the last green CI run: 7 of 35 verified, 2 with no test yet. The claims live in docs/claims/it-hardware.yaml.

Last green CI run 16 Oct 2026, 14:48 UTC on c7618d3 · all runtime claims

IT-001 verified

The snmp, redfish and prometheus drivers deliver one shared UDT set (Server, Fan, PSU, TempSensor, Switch, SwitchPort, PDU, PDUOutlet, UPS), so a program compiled against those types reads the values the drivers deliver.

where the docs say so · TestTypesRenderAndCompile holds the committed hw_types.st of every importer (snmp and three Redfish profiles) and the prometheus rendering to one TYPE body, which declares the nine UDTs the page names, and compiles it slot for slot; TestBaseThroughRuntime has a compiled program read a driver-built SwitchPort through the hw base all three drivers use.

  • pass TestTypesRenderAndCompile in hw
  • pass TestBaseThroughRuntime in hw

IT-002 partly verified

The alarm members the page lists (`Fault`, `Warning`, `High`, `HighHigh`, `Down`, `Overload`, `OnBattery`, `LowBattery`, `BatteryFault`) exist on the types the table names them under, and `Down` is derived as enabled-with-no-link.

where the docs say so · Only SwitchPort `Down` derivation is asserted; the existence of each alarm member on each type is not tested against the page's table.

  • pass TestBaseDeliversDerivesAndReports in hw

IT-003 partly verified

Instances are flat tags (`SW1_Port03 : SwitchPort`, `NODE1_Fan2 : Fan`, `NODE1_Temp_Inlet : TempSensor`), not arrays.

where the docs say so · Golden outputs show flat names; no test asserts "no arrays" as a rule.

IT-004 partly verified

Each importer writes `<proto>_manifest.yaml`, `tags/<proto>.yaml` and `hw_types.st`, generated and byte-identical on re-run, and all three write the same `hw_types.st` body.

where the docs say so · SNMP and Redfish golden-compare and re-run-check all three files, and their committed hw_types.st bodies are held to one body, which the prometheus rendering (TypesST) also matches. The hw_types.st the Prometheus importer writes is still neither golden-compared, re-run-checked nor compared with the others (only parsed).

  • pass TestSnmpImportGolden in cmd/naut
  • pass TestRedfishImportGolden in cmd/naut (4 of 4 passed)
  • pass TestPrometheusImportGolden in cmd/naut
  • pass TestPrometheusImportIsByteIdenticalOnRerun in cmd/naut
  • pass TestTypesRenderAndCompile in hw
  • pass TestForeignImportByteIdenticalOnRerun in prom

IT-005 partly verified

The generated manifest is explicit: every member of every tag names its OID, its Redfish resource and path, or its metric selector.

where the docs say so · The Redfish and Prometheus tests assert every generated binding resolves on the device it came from; no test asserts that every member of every tag is bound, and SNMP is not checked (the two SNMP tests listed before only loaded the manifest and compiled hw_types.st, which says nothing about explicit bindings).

IT-006 partly verified

An import from a recording gives the same bytes as from the live device, so a recording is a shared fixture.

where the docs say so · SNMP is covered end to end: a live import, `browse --record` and an import of that recording give the same manifest, tag file and hw_types.st. Redfish compares the live and recorded manifests only, not the tag file or hw_types.st. Prometheus is not covered: no test imports from a `browse --record` body and compares it with a live import. TestForeignImportByteIdenticalOnRerun was removed: its "recording" is the parsed scrape re-rendered by prom.RenderText, not a recorded body, and it compares the manifest only.

  • pass TestSnmpLiveEqualsRecording in cmd/naut
  • pass TestLiveImportMatchesRecording in redfish/codegen (4 of 4 passed)
  • pass TestRedfishLiveImportAndRecord in cmd/naut

IT-036 verified

A live `naut prometheus import` whose scrape does not finish within `--timeout` fails rather than generating a manifest from the part of the body that arrived.

where the docs say so

  • pass TestScrapeOnceTimeoutIsAnError in cmd/naut

IT-008 partly verified

`manifest:` is the only required key and `New` never dials, so check and build validate every binding offline.

where the docs say so · Offline validation is asserted per manifest; that the drivers' `New` opens no socket and that the project loader requires only `manifest:` are not tested for these three drivers.

  • pass TestManifestValidate in snmp (27 of 27 passed)
  • pass TestManifestValidate in redfish
  • pass TestManifestValidation in prom

IT-009 partly verified

`scan-classes` and `tag-classes` assign tags to poll classes (the `slow` class for names and models), with the rest on the default interval.

where the docs say so · Class membership from glob assignments is asserted in `hw` with the assignments set directly; the `scan-classes` / `tag-classes` keys in `nautilus.yaml` reaching the snmp/redfish/prometheus drivers, and the slow class actually polling at its own rate, are not asserted.

  • pass TestBaseClassAssignments in hw
  • pass TestBaseDeliversDerivesAndReports in hw

IT-010 partly verified

Credentials are never in the manifest, the tag file, a log line or an error: a source names the variable (`community-env`, `auth-env`, `priv-env`, `password-env`) or the file (`community-file`, `password-file`) the driver reads where it runs.

where the docs say so · SNMP resolves community/priv from an env variable and a file and its warnings never carry the value; Redfish refuses a password in the host URL without echoing it. No test scans log lines or the generated tag file for a secret, and Redfish `password-file` is not exercised here. TestManifestCredentialRules was removed: it only checks that bearer env and file are not both set.

  • pass TestCredentials in snmp
  • pass TestManifestNeverEchoesSecrets in redfish

IT-011 partly verified

An unset credential variable or unreadable file is a warning at check time (never an error, since `New` does not need the secrets) and a connect-time error naming the variable; a secret file's trailing newline is trimmed and an empty file is an error.

where the docs say so · The warnings are asserted at the manifest level; `naut check` printing them is not tested.

  • pass TestCredentials in snmp
  • pass TestManifestWarningsAndPassword in redfish
  • pass TestDriverUnsetCredential in snmp
  • pass TestClientPasswordUnset in redfish

IT-012 verified

SNMPv3 with SHA-256 and AES-128 works, and MD5 and DES are accepted with a warning.

where the docs say so

  • pass TestCredentials in snmp
  • pass TestForeignDecodeAgreement in snmp (5 of 5 passed)
  • pass TestForeignPrivacyFlavours/des in snmp

IT-013 partly verified

`<id>__Online` is true while the source answered within `stale-after`; a device that stops answering keeps its last values marked Stale (never a silent zero), and `__Online` goes false.

where the docs say so · The "three intervals" default for `stale-after` is not asserted.

  • pass TestBasePartialBadAndStale in hw
  • pass TestBaseOnlineMemberAndRequests in hw
  • pass TestDriverOutageAndRecovery in snmp
  • pass TestForeignRestartRecovers in redfish
  • pass TestDriverRecoversAfterStandInRestart in prom

IT-014 partly verified

An unbound `Online` member on Server, Switch, PDU and UPS mirrors the `__Online` verdict, and `<id>__LastPollMs` is the poll clock.

where the docs say so · Online mirroring is asserted on Switch only.

  • pass TestBaseOnlineMemberAndRequests in hw
  • pass TestBaseDeliversDerivesAndReports in hw

IT-015 verified

A dark device's alarms are Suppressed rather than frozen lit when the alarm rule's `enable:` is `{site}__Online`.

where the docs say so

  • pass a port that is enabled but has no link alarms after 15 s, and is suppressed while the switch is dark in examples/it-rack

IT-016 partly verified

`InBps`, `OutBps` and `ErrorRate` are per-second rates of wire counters, with 32-bit wrap and 64-bit reset handled (a backwards step on a 64-bit counter is a reboot, not a wrap); a 32-bit step backwards that would mean more than half its range in one interval is a reset, an SNMP source's `sysUpTime` going backwards makes every rate across the restart a reset, a reset delivers no rate for that interval, and the first sample after connect delivers no rate.

where the docs say so · Rates read 0 for exactly one interval after connect; the tests assert no rate on the first sample and a reset on reconnect, not the literal zero in the delivered tag. That the rate before a reset is kept is the caller's (hw.Base leaves a member whose binding delivers nothing as it was) and is not asserted for the reset case.

  • pass TestCounterRate in hw
  • pass TestCounterWrap32 in hw
  • pass TestCounterReset32 in hw
  • pass TestCounterDiscontinuity in hw
  • pass TestCounterFloat in hw
  • pass TestDriverCounterRate in snmp
  • pass TestForeignCounterRate in snmp
  • pass TestPollAgentRestartIsNotAWrap in snmp (5 of 5 passed)
  • pass TestPollReconnectResetsRateCounters in prom

IT-017 verified

A refused OID, a 404 resource or a metric the exporter no longer carries marks that tag Bad and leaves its siblings Good.

where the docs say so

  • pass TestDriverOneBadTag in snmp
  • pass TestForeign404IsBadSiblingsGood in redfish
  • pass TestDriverExprSelectorMissingIsBad in prom
  • pass TestForeignMetricRenamedAway in prom
  • pass TestBasePartialBadAndStale in hw

IT-018 partly verified

A transport failure (timeout, refused, bad credentials) climbs a backoff ladder from 1 s to 60 s and shows on `/api/drivers` with the reason.

where the docs say so · State transitions and the retry are asserted with shortened timings; the 1 s to 60 s ladder and the `/api/drivers` rendering are not.

  • pass TestBasePartialBadAndStale in hw
  • pass TestBaseNeverAnsweredErrorsAtOnce in hw

IT-019 partly verified

A wrong SNMPv3 auth pass phrase reads as `authentication failed — wrong auth pass phrase or protocol for user …`, and a wrong priv pass phrase as `authentication succeeded but privacy failed`, not as a timeout.

where the docs say so · Reworded after the page changed (#293); the code produces both quoted strings. The tests assert a wrong v3 auth or priv key puts "authentication failed" / "privacy failed" (and not "no answer within") in the source's LastError; the rest of each quoted string is not checked, and the `/api/drivers` rendering is not asserted. (TestDriverWrongCommunity removed: the v2c case is not on the page.)

  • pass TestForeignWrongCredentials/v3 wrong auth key in snmp
  • pass TestForeignWrongCredentials/v3 wrong priv key in snmp

IT-020 partly verified

A rule on `(type, member)` expands to every matching tag with `{site}`, name and `enable:` interpolated, using `site-from` to derive the site (`SW1_Port03` to `SW1`, `SW1` to `SW1`), including tags added by a later import.

where the docs say so · Expansion and site-from are tested against an RTU/AnalogInput fixture, not the IT types; the page's exact `site-from` regex is not run.

IT-021 partly verified

The importers generate no writable binding; a command is added by hand as a `writes:` entry bound to the member it acts on, rendered into the manifest.

where the docs say so · The Redfish importer asserts no `writes:`; the SNMP and Prometheus importers are not asserted to emit none.

IT-037 partly verified

A BOOL command over SNMP must have `set:` naming the INTEGER each value writes; `naut check` refuses a BOOL write without it rather than send 0 for false.

where the docs say so · The refusal is asserted in the manifest's Validate, which `naut check` reaches through the driver's `New`; the check command itself is not run against such a manifest.

  • pass TestManifestValidate/bool write without set in snmp
  • pass TestWriteMapping in snmp

IT-022 partly verified

A Redfish `PowerCmd` is an INT (0 none, 1 on, 2 graceful shutdown, 3 force off, 4 restart) posted exactly once on a change to a non-zero value and never as the baseline; a return to 0 sends nothing, an out-of-range value is refused with the error on the row, and the POST goes to the configured action target.

where the docs say so · ForceOff and On are asserted; the graceful-shutdown and restart reset types are not.

  • pass TestDriverPowerCommand in redfish

IT-023 verified

The first value seen after a start is a baseline that is never written, so `init: false` on an outlet command cannot switch the outlet off at boot.

where the docs say so

  • pass TestBaseWrites in hw
  • pass TestDriverCommandWrite in snmp
  • pass TestDriverPowerCommand in redfish

IT-024 partly verified

Every command goes through the runtime's existing gates: a closed write gate (standby, not leader) neither queues nor records a command, and becoming leader replays nothing.

where the docs say so · The leader gate is asserted in `hw`; the write token and the HMI confirm dialog are not tested here.

  • pass TestBaseWrites in hw

IT-026 partly verified

`naut snmp browse --record` / `naut redfish browse --record` / `naut prometheus browse --record` capture a recording that the matching importer reads (`--walk`, `--mockup`, `.prom`).

where the docs say so · Prometheus `browse --record` has no test.

  • pass TestRedfishLiveImportAndRecord in cmd/naut
  • pass TestSnmpLiveEqualsRecording in cmd/naut

IT-027 partly verified

`naut snmp serve`, `naut redfish serve` and `naut prometheus serve` stand in for the device from its recording (a walk, a mockup, a `.prom` file), and `--ramp` drifts the SNMP and exporter values.

where the docs say so · SNMP and Redfish serve are shown to stand in (a live import against them equals the recording's import), and SNMP `--ramp` moves counters. The Prometheus stand-in is tested through the serve package only (it answers with the seeded body), and its `--ramp` is not asserted. The plant/inversion and snmpsim-fixture tests listed before were removed: they test the plant-feed path and fixture drift, not what the page says.

  • pass TestSnmpLiveEqualsRecording in cmd/naut
  • pass TestSnmpServeRamp in cmd/naut
  • pass TestRedfishLiveImportAndRecord in cmd/naut
  • pass TestPrometheusServeAnswersHTTP in cmd/naut

IT-028 no test yet

The bench stand-ins listen on `127.0.0.1:1161` (SNMP v2c), `127.0.0.1:8000` (Redfish) and `127.0.0.1:9100` (exporter) by default.

where the docs say so · Default listen addresses are not asserted.

IT-029 no test yet

A Redfish recording is reviewed before committing because it carries serial numbers and addresses.

where the docs say so · A process instruction; the committed prom real-scrape fixture is checked for scrubbing (TestRealScrapeFixtureIsScrubbed) but nothing scans Redfish recordings.

IT-030 partly verified

`examples/it-rack` runs on a laptop with a switch and a host, rules, rollups and an acceptance suite in virtual time.

where the docs say so · The acceptance suite runs on the virtual-time memory loopback; running the same project against the recorded stand-ins is not tested.

  • pass PortsUp / PortsDown count links, only while the switch answers in examples/it-rack
  • pass a port that is enabled but has no link alarms after 15 s, and is suppressed while the switch is dark in examples/it-rack
  • pass a stopped fan and a critical temperature on the host in examples/it-rack
  • pass the rack's hottest reading and its fault rollup in examples/it-rack

IT-031 partly verified

The snmp profiles read IF-MIB/ifXTable for ports (64-bit counters, falling back to 32-bit without ifXTable), ENTITY-MIB for the chassis, ENTITY-SENSOR-MIB and POWER-ETHERNET-MIB where present, and the PDU and UPS profiles (RFC 1628 UPS-MIB, CPS-MIB).

where the docs say so · The PDU/UPS profiles are written from published MIBs and marked unverified until a device confirms them.

IT-032 partly verified

The snmp driver does one GetBulk walk per table column per poll, not one Get per port, over v2c and v3, and the agent decodes against a foreign snmpsim identically to the in-repo agent.

where the docs say so · Request count per poll is not asserted; only that GetBulk walks work and decode identically across two agents.

  • pass TestForeignDecodeAgreement in snmp (5 of 5 passed)
  • pass TestGetBulk in snmp/agent

IT-033 partly verified

The redfish driver reads both generations (legacy `Thermal`/`Power` and `ThermalSubsystem`/`PowerSubsystem`/`Sensors`), uses sessions with basic-auth fallback, and selects array members by `MemberId` or `Name` rather than position.

where the docs say so · Both generations are exercised against the DMTF mockups in CI; the member-selection by MemberId/Name versus position is only covered incidentally by path evaluation.

  • pass TestForeignImportAndDecode in redfish (3 of 3 passed)
  • pass TestDriverAgainstStandIn in redfish
  • pass TestClientSessionLifecycle in redfish
  • pass TestClientBasicFallback in redfish
  • pass TestPathEval in redfish

IT-034 partly verified

The prometheus driver parses the node_exporter exposition format, reports a bound metric the scrape no longer carries, derives `CpuPct`, `MemPct`, `RootDiskPct` and uptime from expressions over named selectors, and takes fan and temperature sensors from hwmon.

where the docs say so · Parsing a real scrape, a missing metric marking the tag Bad, CpuPct and MemPct from expressions, and hwmon fans/temps in the generated manifest (golden) are asserted. RootDiskPct and uptime values are never checked (the golden shows the uptime expression generated; RootDiskPct is not in the fixture). TestGenerateNodeTempCollision removed: it tests a tag-name collision error, not the profile.

  • pass TestParseTextRealScrape in prom
  • pass TestForeignCpuMemPollAndRate in prom
  • pass TestForeignMetricRenamedAway in prom
  • pass TestGenerateNodeAgainstRealScrape in prom/codegen
  • pass TestGenerateNodeGolden in prom/codegen
  • pass TestExprEval in hw

IT-035 verified

The prometheus driver scrapes the exporter directly, with no Prometheus server needed.

where the docs say so

  • pass TestDriverAgainstStandIn in prom
  • pass TestForeignCpuMemPollAndRate in prom