From ca457ac72bf6821a89f647d701f6fc970a41954d Mon Sep 17 00:00:00 2001 From: Mikhail Chusavitin Date: Thu, 30 Apr 2026 16:05:30 +0300 Subject: [PATCH] fix(exporter): propagate iommu_group through PCIe export pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IOMMUGroup was added to models.PCIeDevice but never wired into the converter — missing from Details in buildDevicesFromLegacy, no field in ReanimatorPCIe, and convertPCIeFromDevices never read it. Add IOMMUGroup *int to ReanimatorPCIe, propagate through Details, add intPtrFromDetailMap helper. Co-Authored-By: Claude Sonnet 4.6 --- internal/exporter/reanimator_converter.go | 15 +++++++++++++++ internal/exporter/reanimator_models.go | 1 + 2 files changed, 16 insertions(+) diff --git a/internal/exporter/reanimator_converter.go b/internal/exporter/reanimator_converter.go index fbb0210..a6c25de 100644 --- a/internal/exporter/reanimator_converter.go +++ b/internal/exporter/reanimator_converter.go @@ -218,6 +218,9 @@ func buildDevicesFromLegacy(hw *models.HardwareConfig) []models.HardwareDevice { if pcie.HWSlowdown != nil { details = mergeDetailMaps(details, map[string]any{"hw_slowdown": *pcie.HWSlowdown}) } + if pcie.IOMMUGroup != nil { + details = mergeDetailMaps(details, map[string]any{"iommu_group": *pcie.IOMMUGroup}) + } present := pcie.Present appendDevice(models.HardwareDevice{ Kind: models.DeviceKindPCIe, @@ -844,6 +847,7 @@ func convertPCIeFromDevices(devices []models.HardwareDevice, collectedAt string) VendorID: d.VendorID, DeviceID: d.DeviceID, NUMANode: d.NUMANode, + IOMMUGroup: intPtrFromDetailMap(d.Details, "iommu_group"), TemperatureC: temperatureC, PowerW: powerW, LifeRemainingPct: floatFromDetailMap(d.Details, "life_remaining_pct"), @@ -2119,6 +2123,17 @@ func parseSocketFromSlot(slot string) int { return v } +func intPtrFromDetailMap(details map[string]any, key string) *int { + if details == nil { + return nil + } + if _, ok := details[key]; !ok { + return nil + } + v := intFromDetailMap(details, key) + return &v +} + func intFromDetailMap(details map[string]any, key string) int { if details == nil { return 0 diff --git a/internal/exporter/reanimator_models.go b/internal/exporter/reanimator_models.go index 3c9a1c8..aed2cff 100644 --- a/internal/exporter/reanimator_models.go +++ b/internal/exporter/reanimator_models.go @@ -143,6 +143,7 @@ type ReanimatorPCIe struct { VendorID int `json:"vendor_id,omitempty"` DeviceID int `json:"device_id,omitempty"` NUMANode int `json:"numa_node,omitempty"` + IOMMUGroup *int `json:"iommu_group,omitempty"` TemperatureC float64 `json:"temperature_c,omitempty"` PowerW float64 `json:"power_w,omitempty"` LifeRemainingPct float64 `json:"life_remaining_pct,omitempty"`