105 lines
3.8 KiB
Markdown
105 lines
3.8 KiB
Markdown
# 04 — Data Models
|
|
|
|
## AnalysisResult
|
|
|
|
`internal/models/` — the central data contract shared by parsers, collectors, exporters, and the HTTP layer.
|
|
|
|
**Stability rule:** Never break the JSON shape of `AnalysisResult`.
|
|
Backward-compatible additions are allowed; removals or renames are not.
|
|
|
|
Key top-level fields:
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `filename` | `string` | Uploaded filename or generated live source identifier |
|
|
| `source_type` | `string` | `archive` or `api` |
|
|
| `protocol` | `string` | `redfish`, `ipmi`, or empty for archive uploads |
|
|
| `target_host` | `string` | BMC host for live collection |
|
|
| `collected_at` | `time.Time` | Upload/collection timestamp |
|
|
| `hardware` | `*HardwareConfig` | All normalized hardware inventory |
|
|
| `events` | `[]Event` | Diagnostic events from parsers |
|
|
| `fru` | `[]FRUInfo` | FRU/SDR-derived inventory details |
|
|
| `sensors` | `[]SensorReading` | Sensor readings |
|
|
| `raw_payloads` | `map[string]any` | Raw vendor data (e.g. `redfish_tree`) |
|
|
|
|
`raw_payloads` is the durable source for offline re-analysis (especially for Redfish).
|
|
Normalized fields should be treated as derivable output from raw source data.
|
|
|
|
### Hardware sub-structure
|
|
|
|
```
|
|
HardwareConfig
|
|
├── board BoardInfo — server/motherboard identity
|
|
├── devices []HardwareDevice — CANONICAL INVENTORY (see below)
|
|
├── cpus []CPU
|
|
├── memory []MemoryDIMM
|
|
├── storage []Storage
|
|
├── volumes []StorageVolume — logical RAID/VROC volumes
|
|
├── pcie_devices []PCIeDevice
|
|
├── gpus []GPU
|
|
├── network_adapters []NetworkAdapter
|
|
├── network_cards []NIC (legacy/alternate source field)
|
|
├── power_supplies []PSU
|
|
└── firmware []FirmwareInfo
|
|
```
|
|
|
|
---
|
|
|
|
## Canonical Device Repository (`hardware.devices`)
|
|
|
|
`hardware.devices` is the **single source of truth** for hardware inventory.
|
|
|
|
### Rules — must not be violated
|
|
|
|
1. All UI tabs displaying hardware components **must read from `hardware.devices`**.
|
|
2. The Device Inventory tab shows kinds: `pcie`, `storage`, `gpu`, `network`.
|
|
3. The Reanimator exporter **must use the same `hardware.devices`** as the UI.
|
|
4. Any discrepancy between UI data and Reanimator export data is a **bug**.
|
|
5. New hardware attributes must be added to the canonical device schema **first**,
|
|
then mapped to Reanimator/UI — never the other way around.
|
|
6. The exporter should group/filter canonical records by section, not rebuild data
|
|
from multiple sources.
|
|
|
|
### Deduplication logic (applied once by repository builder)
|
|
|
|
| Priority | Key used |
|
|
|----------|----------|
|
|
| 1 | `serial_number` — usable (not empty, not `N/A`, `NA`, `NONE`, `NULL`, `UNKNOWN`, `-`) |
|
|
| 2 | `bdf` — PCI Bus:Device.Function address |
|
|
| 3 | No merge — records remain distinct if both serial and bdf are absent |
|
|
|
|
### Device schema alignment
|
|
|
|
Keep `hardware.devices` schema as close as possible to Reanimator JSON field names.
|
|
This minimizes translation logic in the exporter and prevents drift.
|
|
|
|
---
|
|
|
|
## Source metadata fields (stored directly on `AnalysisResult`)
|
|
|
|
Carried by both `/api/status` and `/api/config`:
|
|
|
|
```json
|
|
{
|
|
"source_type": "api",
|
|
"protocol": "redfish",
|
|
"target_host": "10.0.0.1",
|
|
"collected_at": "2026-02-10T15:30:00Z"
|
|
}
|
|
```
|
|
|
|
Valid `source_type` values: `archive`, `api`
|
|
Valid `protocol` values: `redfish`, `ipmi` (empty is allowed for archive uploads)
|
|
|
|
---
|
|
|
|
## Raw Export Package (reopenable artifact)
|
|
|
|
`Export Raw Data` does not merely dump `AnalysisResult`; it emits a reopenable raw package
|
|
(JSON or ZIP bundle) that carries source data required for re-analysis.
|
|
|
|
Design rules:
|
|
- raw source is authoritative (`redfish_tree` or original file bytes)
|
|
- imports must re-analyze from raw source
|
|
- parsed field snapshots included in bundles are diagnostic artifacts, not the source of truth
|