diff --git a/bible-local/backlog.md b/bible-local/backlog.md index 1238d8c..1de8d3e 100644 --- a/bible-local/backlog.md +++ b/bible-local/backlog.md @@ -1,5 +1,103 @@ # Backlog +## Сбор SFP-модулей + +**Статус:** не реализовано. + +### Источник данных + +`ethtool -m ` / `ethtool --module-info ` — читает EEPROM SFP/SFP+/QSFP28/QSFP-DD по стандарту MSA (SFF-8472 / SFF-8636). + +Доступные поля из EEPROM: +- Идентификатор модуля: `Identifier` (SFP, SFP+, QSFP28, …) +- Тип коннектора: `Connector` +- Вендор: `Vendor name`, `Vendor OUI`, `Vendor PN`, `Vendor SN`, `Vendor rev` +- Оптика: `Wavelength`, `Transceiver type` (10GBase-SR, LR, DAC, …) +- Телеметрия DOM (если модуль поддерживает): `Laser tx bias current`, `Transmit avg optical power`, `Receive avg optical power`, `Module temperature`, `Module voltage` +- Статус: `Rx power high alarm`, `Tx power low warning`, … + +Для QSFP28 данные повторяются на 4 канала (lane 0–3). + +Инструмент требует root. На bee ISO — доступен (`ethtool` входит в образ). + +### Scope для bee + +1. Собирать список сетевых интерфейсов через `ip -j link show` (только `ether`, без `lo`/VLAN/bond). +2. Для каждого интерфейса пробовать `ethtool -m `. Если модуль отсутствует или не поддерживает EEPROM read — тихо пропускать. +3. Связывать интерфейс с PCIe-устройством через `ethtool -i ` → поле `bus-info` (BDF) → сопоставление с `pcie_devices[].slot`. + +### Gap в контракте + +Текущий контракт v2.10 имеет в `pcie_devices[]` скалярные поля: +- `sfp_temperature_c`, `sfp_tx_power_dbm`, `sfp_rx_power_dbm`, `sfp_voltage_v`, `sfp_bias_ma` + +Этого **недостаточно**: +- Одна NIC-карта может иметь несколько портов — нужен массив, а не скаляр. +- Нет полей идентификации модуля (vendor, part_number, serial_number, wavelength, connector). +- Нет разбивки по каналам для QSFP28. + +### Предлагаемое расширение контракта + +Добавить в `pcie_devices[]` массив `sfp_modules[]`: + +```json +"pcie_devices": [ + { + "slot": "0000:3b:00.0", + "device_class": "EthernetController", + "model": "ConnectX-6 Dx", + "sfp_modules": [ + { + "port": 0, + "identifier": "QSFP28", + "connector": "LC", + "vendor": "Mellanox", + "part_number": "MFA1A00-C003", + "serial_number": "MT2124VS09999", + "revision": "A", + "wavelength_nm": 850, + "transceiver_type": "100GBase-SR4", + "temperature_c": 36.4, + "voltage_v": 3.29, + "tx_power_dbm": -1.8, + "rx_power_dbm": -2.1, + "bias_ma": 7.2 + } + ] + } +] +``` + +Поля `sfp_modules[]`: + +| Поле | Тип | Описание | +|---|---|---| +| `port` | int | Номер порта на NIC (0-based) | +| `identifier` | string | `SFP`, `SFP+`, `QSFP28`, `QSFP-DD`, … | +| `connector` | string | `LC`, `MPO`, `DAC`, … | +| `vendor` | string | Производитель модуля | +| `part_number` | string | Партномер | +| `serial_number` | string | Серийный номер | +| `revision` | string | Ревизия | +| `wavelength_nm` | int | Длина волны, нм | +| `transceiver_type` | string | `10GBase-SR`, `100GBase-SR4`, `DAC`, … | +| `temperature_c` | float | Температура модуля, °C | +| `voltage_v` | float | Напряжение, В | +| `tx_power_dbm` | float | TX оптическая мощность, dBm | +| `rx_power_dbm` | float | RX оптическая мощность, dBm | +| `bias_ma` | float | Bias current, мА | + +Старые скалярные поля `sfp_temperature_c` / `sfp_tx_power_dbm` / `sfp_rx_power_dbm` / `sfp_voltage_v` / `sfp_bias_ma` на уровне `pcie_devices[]` — **вывести из контракта** (deprecated), заменить на `sfp_modules[]`. + +### Порядок реализации + +1. Согласовать расширение контракта с Reanimator Core (bump до v2.11). +2. Добавить `ethtool` parser в `audit/internal/collector/` — новый файл `sfp.go`. +3. Дополнить schema в `audit/internal/schema/` типом `SFPModule`. +4. Добавить `sfp_modules` в `PCIeDevice` в schema. +5. Заполнять в NIC-коллекторе: связь интерфейс → BDF → `pcie_devices[].sfp_modules`. +6. Показывать в TUI и web UI в разделе PCIe/NIC. + ## BMC версия через IPMI **Статус:** реализовано.