fix: 修复Agent按IP关联资产

- 统一系统主机名与云资产名称的指标归属
- 修复SQLite更新参数顺序和自动注册冲突错误
- 增加Agent上报关联回归测试
This commit is contained in:
Logan.Li committed 2026-07-25 15:46:08 +08:00
1 parent 827d9a31cd
commit af98940211
2 files changed
+121 -42

No files matched your search

+78
View File
@@ -0,0 +1,78 @@
package controller
import (
"bytes"
"net/http"
"net/http/httptest"
"testing"
"ezops/model"
"github.com/gin-gonic/gin"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
gormlogger "gorm.io/gorm/logger"
)
func TestReceiveReportMatchesExistingAssetByIP(t *testing.T) {
gin.SetMode(gin.TestMode)
db, err := gorm.Open(sqlite.Open("file:agent_report_match?mode=memory&cache=shared"), &gorm.Config{
Logger: gormlogger.Default.LogMode(gormlogger.Silent),
})
if err != nil {
t.Fatalf("打开测试数据库失败: %v", err)
}
if err := db.AutoMigrate(&model.Server{}, &model.AgentReport{}, &model.HealthProbe{}); err != nil {
t.Fatalf("迁移测试表失败: %v", err)
}
server := model.Server{Hostname: "c-redis-cluster-3", IP: "172.19.16.59", Status: "running"}
if err := db.Create(&server).Error; err != nil {
t.Fatalf("创建测试资产失败: %v", err)
}
body := []byte(`{
"hostname":"VM-16-59-tencentos",
"ip":"172.19.16.59",
"agent_version":"v2.1.0",
"cpu":{"usage_percent":12.5,"iowait":0.5,"core_count":4},
"memory":{"total_gb":7.8,"used_gb":3.1,"available_gb":4.7,"usage_percent":39.7},
"disks":[{"mount":"/","total_gb":100,"used_gb":25,"usage_percent":25}],
"system":{"os_version":"TencentOS Server 4","kernel":"6.6.0","uptime":3600}
}`)
req := httptest.NewRequest(http.MethodPost, "/api/v1/agent/report", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
recorder := httptest.NewRecorder()
c, _ := gin.CreateTestContext(recorder)
c.Request = req
NewAgentHandler(db, nil, nil).ReceiveReport(c)
if recorder.Code != http.StatusOK {
t.Fatalf("上报返回码 = %d, body=%s", recorder.Code, recorder.Body.String())
}
var gotServer model.Server
if err := db.Take(&gotServer, server.ID).Error; err != nil {
t.Fatalf("读取资产失败: %v", err)
}
if gotServer.Hostname != server.Hostname || gotServer.AgentStatus != "online" {
t.Fatalf("资产关联错误: hostname=%q status=%q", gotServer.Hostname, gotServer.AgentStatus)
}
if gotServer.OS != "TencentOS Server 4" || gotServer.Kernel != "6.6.0" || gotServer.Uptime != 3600 {
t.Fatalf("系统字段更新错误: os=%q kernel=%q uptime=%d", gotServer.OS, gotServer.Kernel, gotServer.Uptime)
}
var report model.AgentReport
if err := db.Order("id DESC").Take(&report).Error; err != nil {
t.Fatalf("读取 Agent 报告失败: %v", err)
}
if report.Hostname != server.Hostname {
t.Fatalf("报告主机名未归一: got=%q want=%q", report.Hostname, server.Hostname)
}
var serverCount int64
db.Model(&model.Server{}).Count(&serverCount)
if serverCount != 1 {
t.Fatalf("上报后产生重复资产: count=%d", serverCount)
}
}