Files
logpile/REANIMATOR_EXPORT.md
Michael Chus 1b1bc74fc7 Add Reanimator format export support
Implement export to Reanimator format for asset tracking integration.

Features:
- New API endpoint: GET /api/export/reanimator
- Web UI button "Экспорт Reanimator" in Configuration tab
- Auto-detect CPU manufacturer (Intel/AMD/ARM/Ampere)
- Generate PCIe serial numbers if missing
- Merge GPUs and NetworkAdapters into pcie_devices
- Filter components without serial numbers
- RFC3339 timestamp format
- Full compliance with Reanimator specification

Changes:
- Add reanimator_models.go: data models for Reanimator format
- Add reanimator_converter.go: conversion functions
- Add reanimator_converter_test.go: unit tests
- Add reanimator_integration_test.go: integration tests
- Update handlers.go: add handleExportReanimator
- Update server.go: register /api/export/reanimator route
- Update index.html: add export button
- Update CLAUDE.md: document export behavior
- Add REANIMATOR_EXPORT.md: implementation summary

Tests: All tests passing (15+ new tests)
Format spec: example/docs/INTEGRATION_GUIDE.md

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 21:54:37 +03:00

225 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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" для обнаруженных компонентов
- RFC3339 формат для collected_at
- Вывод target_host из filename если отсутствует
### 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` - определение производителя CPU
- `TestGeneratePCIeSerialNumber` - генерация серийных номеров
- `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_host`
- `hardware.board.serial_number`
### Структура экспорта:
```json
{
"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 |
| `MemoryDIMM` | `memory` | Прямой маппинг |
| `Storage` | `storage` | + status (OK/Empty) |
| `PCIeDevice` | `pcie_devices` | + model + status |
| `GPU` | `pcie_devices` | Объединены как 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:
1. Загрузить архив или собрать данные через API
2. Перейти на вкладку "Конфигурация"
3. Нажать "Экспорт Reanimator"
### Через API:
```bash
curl http://localhost:8082/api/export/reanimator > reanimator.json
```
### Программно:
```go
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, "", " ")
```
## Тестирование
Запуск тестов:
```bash
# Все тесты
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` - добавлен handleExportReanimator
- `internal/server/server.go` - добавлен маршрут
- `web/templates/index.html` - добавлена кнопка экспорта
- `CLAUDE.md` - обновлена документация
## Совместимость
- ✓ Обратная совместимость: существующие экспорты (JSON/CSV/TXT) не затронуты
- ✓ Формат данных: `AnalysisResult` не изменен
- ✓ API контракты: новый эндпоинт не влияет на существующие
## Будущие улучшения
1. Поддержка статусов из реальных данных (Warning/Critical) для Storage
2. Расширенная телеметрия для компонентов
3. Валидация экспорта против JSON схемы Reanimator
4. Поддержка инкрементальных обновлений
---
**Статус:** ✅ Реализация завершена и протестирована
**Версия:** LOGPile v1.2.1+
**Дата:** 2026-02-12