功能:补充固定场景助手与GPU健康诊断能力

This commit is contained in:
songyiming committed 2026-11-12 17:33:07 +08:00
1 parent 9f05aa20ea
commit b6026f9759
29 files changed
+1333 -22

No files matched your search

+19 -2
View File
@@ -37,8 +37,20 @@ type gpuItem struct {
Class string `json:"class"`
IOMMUGroup *int `json:"iommuGroup"`
State string `json:"state"`
Health gpuHealth `json:"health"`
References []gpuReference `json:"references"`
}
type gpuHealth struct {
Status string `json:"status"`
Source string `json:"source"`
ObservedAt time.Time `json:"observedAt"`
TemperatureC *float64 `json:"temperatureC"`
UtilizationPercent *float64 `json:"utilizationPercent"`
MemoryUsedBytes *int64 `json:"memoryUsedBytes"`
MemoryTotalBytes *int64 `json:"memoryTotalBytes"`
Driver string `json:"driver"`
DriverBinding string `json:"driverBinding"`
}
type gpuIssue struct {
Code string `json:"code"`
VMID int `json:"vmid"`
@@ -92,6 +104,7 @@ func (s *Server) gpuInventory(c *gin.Context) {
return
}
items := []gpuItem{}
observedAt := time.Now().UTC()
for _, d := range devices {
if !d.IsGPU() {
continue
@@ -105,7 +118,11 @@ func (s *Server) gpuInventory(c *gin.Context) {
if group != nil && *group < 0 {
group = nil
}
items = append(items, gpuItem{ID: node + ":" + address, Address: address, Name: d.DeviceName, Vendor: d.VendorName, VendorID: d.Vendor, DeviceID: d.Device, Class: d.Class, IOMMUGroup: group, References: []gpuReference{}})
driverBinding := "unknown"
if strings.TrimSpace(d.Driver) != "" {
driverBinding = "bound"
}
items = append(items, gpuItem{ID: node + ":" + address, Address: address, Name: d.DeviceName, Vendor: d.VendorName, VendorID: d.Vendor, DeviceID: d.Device, Class: d.Class, IOMMUGroup: group, Health: gpuHealth{Status: "not_collected", Source: "pve-pci", ObservedAt: observedAt, Driver: d.Driver, DriverBinding: driverBinding}, References: []gpuReference{}})
}
fullVisibility, err := pve.HasPermission(ctx, "/", "VM.Audit")
if err != nil || !fullVisibility {
@@ -227,7 +244,7 @@ func (s *Server) gpuInventory(c *gin.Context) {
}
}
sort.Slice(items, func(i, j int) bool { return items[i].Address < items[j].Address })
c.JSON(200, gin.H{"node": node, "observedAt": time.Now().UTC(), "complete": len(issues) == 0, "visibleVmCount": visibleCount, "scannedVmCount": scannedCount, "items": items, "issues": issues})
c.JSON(200, gin.H{"node": node, "observedAt": observedAt, "complete": len(issues) == 0, "visibleVmCount": visibleCount, "scannedVmCount": scannedCount, "items": items, "issues": issues, "health": gin.H{"status": "partial", "source": "pve-pci", "temperature": "not_collected", "utilization": "not_collected", "memory": "not_collected", "driverBinding": "reported_when_pve_exposes_driver"}})
}
func rawOptionText(value json.RawMessage) string {