9.8 KiB
Reanimator Export - Implementation Summary
Обзор
Реализован новый формат экспорта данных LOGPile в формат Reanimator для интеграции с системами отслеживания серверных компонентов (asset tracking).
Реализованные компоненты
1. Модели данных (internal/exporter/reanimator_models.go)
Определены структуры для формата Reanimator:
ReanimatorExport- корневая структура экспортаReanimatorHardware- контейнер для всех аппаратных компонентовReanimatorBoard- материнская плата/серверReanimatorCPU- процессорыReanimatorMemory- модули памяти (DIMM)ReanimatorStorage- накопителиReanimatorPCIe- PCIe устройстваReanimatorPSU- блоки питанияReanimatorFirmware- прошивки
2. Функции конвертации (internal/exporter/reanimator_converter.go)
Главная функция: ConvertToReanimator(result *models.AnalysisResult) (*ReanimatorExport, error)
Вспомогательные функции:
inferCPUManufacturer()- определение производителя CPU по модели (Intel/AMD/ARM/Ampere)generatePCIeSerialNumber()- генерация серийных номеров для PCIe устройствinferStorageStatus()- определение статуса накопителейconvertBoard(),convertCPUs(),convertMemory(), и т.д. - конвертация отдельных секций
Ключевые особенности конвертации:
- Автоматическое определение производителя CPU из модели
- Генерация серийных номеров для PCIe устройств:
{board_serial}-PCIE-{slot} - Объединение GPUs и NetworkAdapters в секцию pcie_devices
- Фильтрация компонентов без серийных номеров (storage, PSU)
- Нормализация статусов в допустимые значения (
OK,Warning,Critical,Unknown;Emptyтолько для memory) - RFC3339 формат для collected_at
- Вывод target_host из filename (
redfish://,ipmi://) если отсутствует в source target_hostопционален: если определить не удалось, поле не включается в JSON- Нормализация
board.manufacturerиboard.product_name: строка"NULL"трактуется как отсутствующее значение - Нормализация/очистка
source_typeиprotocol: в экспорт попадают только допустимые значения из гайда
3. HTTP эндпоинт
Маршрут: GET /api/export/reanimator
Обработчик: handleExportReanimator() в internal/server/handlers.go
Функциональность:
- Проверка наличия данных hardware
- Конвертация в формат Reanimator
- Возврат JSON с отступами для читаемости
- Установка заголовка Content-Disposition для скачивания
4. Frontend интеграция
Добавлена кнопка "Экспорт Reanimator" в веб-интерфейсе:
- Расположение: вкладка "Конфигурация"
- Использует существующую функцию
exportData('reanimator')
5. Тесты
Unit-тесты (reanimator_converter_test.go):
TestConvertToReanimator- основная функция конвертацииTestInferCPUManufacturer- определение производителя CPUTestGeneratePCIeSerialNumber- генерация серийных номеровTestInferStorageStatus- определение статуса накопителейTestConvertCPUs,TestConvertMemory, и т.д. - тесты для каждого типа компонентов
Интеграционные тесты (reanimator_integration_test.go):
TestFullReanimatorExport- полный экспорт с реалистичными даннымиTestReanimatorExportWithoutTargetHost- тест вывода target_host
Результаты: Все тесты проходят успешно ✓
6. Документация
Обновлен CLAUDE.md:
- Добавлен эндпоинт
/api/export/reanimatorв секцию "Export behavior" - Описаны ключевые особенности экспорта
- Добавлена ссылка на спецификацию формата
7. Примеры
Создан пример экспорта: example/docs/export-example-logpile.json
Формат экспорта
Обязательные поля:
collected_at(RFC3339)target_hosthardware.board.serial_number
Структура экспорта:
{
"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": [...]
}
}
Соответствие спецификации Reanimator
Формат полностью соответствует спецификации из example/docs/INTEGRATION_GUIDE.md:
✓ Все обязательные поля присутствуют ✓ Правильные типы данных ✓ RFC3339 формат времени ✓ Генерация серийных номеров для PCIe ✓ Определение производителя CPU ✓ Статусы компонентов ✓ Включение пустых слотов памяти (present=false)
Особенности реализации
Маппинг моделей LOGPile → Reanimator
| LOGPile | Reanimator | Примечания |
|---|---|---|
BoardInfo |
board |
Прямой маппинг |
CPU |
cpus |
+ manufacturer (выводится) + status=Unknown при отсутствии фактического статуса |
MemoryDIMM |
memory |
Прямой маппинг |
Storage |
storage |
+ status=Unknown (статус источником не предоставляется) |
PCIeDevice |
pcie_devices |
+ model + status=Unknown |
GPU |
pcie_devices |
Объединены как device_class=DisplayController |
NetworkAdapter |
pcie_devices |
Объединены как NetworkController |
PSU |
power_supplies |
Прямой маппинг |
FirmwareInfo |
firmware |
Прямой маппинг |
Фильтрация данных
Исключаются из экспорта:
- Storage без serial_number
- PSU без serial_number или present=false
- NetworkAdapters с present=false
Включаются в экспорт:
- Memory с present=false (как Empty slots)
- PCIe устройства без serial_number (генерируется)
Использование
Через Web UI:
- Загрузить архив или собрать данные через API
- Перейти на вкладку "Конфигурация"
- Нажать "Экспорт Reanimator"
Через API:
curl http://localhost:8082/api/export/reanimator > reanimator.json
Программно:
import "git.mchus.pro/mchus/logpile/internal/exporter"
result := &models.AnalysisResult{...}
reanimatorData, err := exporter.ConvertToReanimator(result)
if err != nil {
// handle error
}
jsonData, _ := json.MarshalIndent(reanimatorData, "", " ")
Тестирование
Запуск тестов:
# Все тесты
go test ./internal/exporter/...
# Только тесты Reanimator
go test ./internal/exporter/... -v -run Reanimator
# С покрытием
go test ./internal/exporter/... -cover
Файлы изменений
Новые файлы:
internal/exporter/reanimator_models.go(4.6 KB)internal/exporter/reanimator_converter.go(10 KB)internal/exporter/reanimator_converter_test.go(8.0 KB)internal/exporter/reanimator_integration_test.go(7.4 KB)internal/exporter/generate_example_test.go(4.3 KB)example/docs/export-example-logpile.json(2.3 KB)
Измененные файлы:
internal/server/handlers.go- добавлен handleExportReanimatorinternal/server/server.go- добавлен маршрутweb/templates/index.html- добавлена кнопка экспортаCLAUDE.md- обновлена документация
Совместимость
- ✓ Обратная совместимость: существующие экспорты (JSON/CSV) не затронуты
- ✓ Формат данных:
AnalysisResultне изменен - ✓ API контракты: новый эндпоинт не влияет на существующие
Будущие улучшения
- Поддержка статусов из реальных данных (Warning/Critical) для Storage
- Расширенная телеметрия для компонентов
- Валидация экспорта против JSON схемы Reanimator
- Поддержка инкрементальных обновлений
Статус: ✅ Реализация завершена и протестирована Версия: LOGPile v1.2.1+ Дата: 2026-02-12