57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package inspur
|
|
|
|
import (
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"git.mchus.pro/mchus/logpile/internal/models"
|
|
)
|
|
|
|
var reFaultGPU = regexp.MustCompile(`\bF_GPU(\d+)\b`)
|
|
|
|
func applyGPUStatusFromEvents(hw *models.HardwareConfig, events []models.Event) {
|
|
if hw == nil || len(hw.GPUs) == 0 {
|
|
return
|
|
}
|
|
|
|
faulty := make(map[int]bool)
|
|
for _, e := range events {
|
|
if !isGPUFaultEvent(e) {
|
|
continue
|
|
}
|
|
|
|
matches := reFaultGPU.FindAllStringSubmatch(e.Description, -1)
|
|
for _, m := range matches {
|
|
if len(m) < 2 {
|
|
continue
|
|
}
|
|
idx, err := strconv.Atoi(m[1])
|
|
if err == nil && idx >= 0 {
|
|
faulty[idx] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
for i := range hw.GPUs {
|
|
gpu := &hw.GPUs[i]
|
|
idx, ok := extractLogicalGPUIndex(gpu.Slot)
|
|
if ok && faulty[idx] {
|
|
gpu.Status = "Critical"
|
|
continue
|
|
}
|
|
|
|
if strings.TrimSpace(gpu.Status) == "" {
|
|
gpu.Status = "OK"
|
|
}
|
|
}
|
|
}
|
|
|
|
func isGPUFaultEvent(e models.Event) bool {
|
|
desc := strings.ToLower(e.Description)
|
|
if strings.Contains(desc, "bios miss f_gpu") {
|
|
return true
|
|
}
|
|
return strings.EqualFold(strings.TrimSpace(e.ID), "17FFB002")
|
|
}
|