5.7 KiB
Hardware Ingest Contract
Version: 2.4
Updated: 2026-03-15
Source: Reanimator Core hardware-ingest-contract.md
This file mirrors the external Reanimator hardware-ingest contract that LOGPile targets. The Reanimator endpoint uses strict JSON decoding. Any field not listed here must not be emitted.
Endpoint
POST /ingest/hardware
Content-Type: application/json
The ingest request is asynchronous. Accepted response:
{
"status": "accepted",
"job_id": "job_01J..."
}
Final result is available from:
GET /ingest/hardware/jobs/{job_id}
Top-level payload
{
"filename": "redfish://10.10.10.103",
"source_type": "api",
"protocol": "redfish",
"target_host": "10.10.10.103",
"collected_at": "2026-02-10T15:30:00Z",
"hardware": {
"board": {},
"firmware": [],
"cpus": [],
"memory": [],
"storage": [],
"pcie_devices": [],
"power_supplies": [],
"sensors": {}
}
}
Top-level rules
collected_atis required and must be RFC3339hardware.board.serial_numberis requiredsource_typeallowed values:api,logfile,manualprotocolallowed values:redfish,ipmi,snmp,ssh- Unknown JSON keys are rejected by Reanimator
Shared component status fields
Allowed on cpus, memory, storage, pcie_devices, power_supplies:
statusstatus_checked_atstatus_changed_atstatus_historyerror_description
status_history[] items:
statuschanged_atdetails
Do not emit status_at_collection; it is not part of the current strict ingest schema.
hardware.board
Allowed fields:
serial_numberrequiredmanufacturerproduct_namepart_numberuuid
String values equal to "NULL" should be omitted.
hardware.firmware
Allowed fields:
device_nameversion
Only system-level firmware belongs here. Device-bound firmware must stay on the relevant device record and must not be duplicated at the top level.
hardware.cpus
Allowed fields:
socketmodelmanufacturercoresthreadsfrequency_mhzmax_frequency_mhztemperature_cpower_wthrottledcorrectable_error_countuncorrectable_error_countlife_remaining_pctlife_used_pctserial_numberfirmwarepresent- shared status fields
Exporter rule:
- if CPU serial is missing, generate
{board_serial}-CPU-{socket}
hardware.memory
Allowed fields:
slotlocationpresentserial_numberpart_numbermanufacturersize_mbtypemax_speed_mhzcurrent_speed_mhztemperature_ccorrectable_ecc_error_countuncorrectable_ecc_error_countlife_remaining_pctlife_used_pctspare_blocks_remaining_pctperformance_degradeddata_loss_detected- shared status fields
Exporter rules:
- skip memory items with missing
serial_number - skip memory items with
present=false - skip memory items with
status=Empty
hardware.storage
Allowed fields:
slotserial_numbermodelmanufacturertypeinterfacesize_gbtemperature_cpower_on_hourspower_cyclesunsafe_shutdownsmedia_errorserror_log_entrieswritten_bytesread_byteslife_used_pctfirmwarepresentremaining_endurance_pctlife_remaining_pctavailable_spare_pctreallocated_sectorscurrent_pending_sectorsoffline_uncorrectable- shared status fields
Exporter rule:
- skip storage items with missing
serial_number
hardware.pcie_devices
Allowed fields:
slotvendor_iddevice_idnuma_nodetemperature_cpower_wlife_remaining_pctlife_used_pctecc_corrected_totalecc_uncorrected_totalhw_slowdownbattery_charge_pctbattery_health_pctbattery_temperature_cbattery_voltage_vbattery_replace_requiredsfp_temperature_csfp_tx_power_dbmsfp_rx_power_dbmsfp_voltage_vsfp_bias_mabdfdevice_classmanufacturermodelserial_numberfirmwarelink_widthlink_speedmax_link_widthmax_link_speedmac_addressespresent- shared status fields
Known device_class values:
MassStorageControllerStorageControllerNetworkControllerEthernetControllerFibreChannelControllerVideoControllerProcessingAcceleratorDisplayController
Exporter rules:
- if PCIe serial is missing or placeholder-like, generate
{board_serial}-PCIE-{slot} numa_nodeis allowed again in the upstream contract- network adapters should emit
mac_addresseswhen available - do not emit fields outside the upstream contract
hardware.power_supplies
Allowed fields:
slotpresentserial_numberpart_numbermodelvendorwattage_wfirmwareinput_typeinput_voltageinput_power_woutput_power_wtemperature_clife_remaining_pctlife_used_pct- shared status fields
Exporter rule:
- skip PSUs with missing
serial_number
hardware.sensors
Shape:
{
"fans": [],
"power": [],
"temperatures": [],
"other": []
}
sensors.fans
Allowed fields:
namerequiredlocationrpmstatus
sensors.power
Allowed fields:
namerequiredlocationvoltage_vcurrent_apower_wstatus
sensors.temperatures
Allowed fields:
namerequiredlocationcelsiusthreshold_warning_celsiusthreshold_critical_celsiusstatus
sensors.other
Allowed fields:
namerequiredlocationvalueunitstatus
Sensor rules:
- dedupe within one payload by
(section, name), keeping the first item - skip sensors without
name - the current LOGPile exporter maps generic
SensorReadingvalues into these four groups heuristically