Add raw export reanalyze flow for Redfish snapshots

This commit is contained in:
Mikhail Chusavitin
2026-02-24 17:23:26 +03:00
parent 5d9e9d73de
commit 810c4b5ff9
7 changed files with 783 additions and 23 deletions

View File

@@ -0,0 +1,104 @@
package server
import (
"encoding/base64"
"encoding/json"
"time"
"git.mchus.pro/mchus/logpile/internal/models"
)
const rawExportFormatV1 = "logpile.raw-export.v1"
type RawExportPackage struct {
Format string `json:"format"`
ExportedAt time.Time `json:"exported_at"`
Source RawExportSource `json:"source"`
Analysis *models.AnalysisResult `json:"analysis_result,omitempty"`
}
type RawExportSource struct {
Kind string `json:"kind"` // file_bytes | live_redfish | snapshot_json
Filename string `json:"filename,omitempty"`
MIMEType string `json:"mime_type,omitempty"`
Encoding string `json:"encoding,omitempty"` // base64
Data string `json:"data,omitempty"`
Protocol string `json:"protocol,omitempty"`
TargetHost string `json:"target_host,omitempty"`
RawPayloads map[string]any `json:"raw_payloads,omitempty"`
CollectLogs []string `json:"collect_logs,omitempty"`
CollectMeta *CollectRequestMeta `json:"collect_meta,omitempty"`
}
func newRawExportFromUploadedFile(filename, mimeType string, payload []byte, result *models.AnalysisResult) *RawExportPackage {
return &RawExportPackage{
Format: rawExportFormatV1,
ExportedAt: time.Now().UTC(),
Source: RawExportSource{
Kind: "file_bytes",
Filename: filename,
MIMEType: mimeType,
Encoding: "base64",
Data: base64.StdEncoding.EncodeToString(payload),
Protocol: resultProtocol(result),
TargetHost: resultTargetHost(result),
},
}
}
func newRawExportFromLiveCollect(result *models.AnalysisResult, req CollectRequest, logs []string) *RawExportPackage {
rawPayloads := map[string]any{}
if result != nil && result.RawPayloads != nil {
for k, v := range result.RawPayloads {
rawPayloads[k] = v
}
}
meta := CollectRequestMeta{
Host: req.Host,
Protocol: req.Protocol,
Port: req.Port,
Username: req.Username,
AuthType: req.AuthType,
TLSMode: req.TLSMode,
}
return &RawExportPackage{
Format: rawExportFormatV1,
ExportedAt: time.Now().UTC(),
Source: RawExportSource{
Kind: "live_redfish",
Protocol: req.Protocol,
TargetHost: req.Host,
RawPayloads: rawPayloads,
CollectLogs: append([]string(nil), logs...),
CollectMeta: &meta,
},
}
}
func parseRawExportPackage(payload []byte) (*RawExportPackage, bool, error) {
var pkg RawExportPackage
if err := json.Unmarshal(payload, &pkg); err != nil {
return nil, false, err
}
if pkg.Format != rawExportFormatV1 {
return nil, false, nil
}
if pkg.ExportedAt.IsZero() {
pkg.ExportedAt = time.Now().UTC()
}
return &pkg, true, nil
}
func resultProtocol(result *models.AnalysisResult) string {
if result == nil {
return ""
}
return result.Protocol
}
func resultTargetHost(result *models.AnalysisResult) string {
if result == nil {
return ""
}
return result.TargetHost
}