[修复] 修复 WS 连接下更新无法下发

This commit is contained in:
ryan
2026-05-29 11:07:36 +08:00
parent ab8e3d4705
commit 806863f303
3 changed files with 29 additions and 1 deletions
+6 -1
View File
@@ -223,8 +223,13 @@ func handleAgentWSStatus(c *gin.Context, node *model.Node, message service.Agent
slog.Debug("agent ws status payload decode failed", "node_id", node.NodeID, "error", err)
return
}
freshNode, err := model.GetNodeByNodeID(node.NodeID)
if err != nil {
slog.Debug("agent ws status reload node failed", "node_id", node.NodeID, "error", err)
return
}
payload.IP = service.ResolveReportedNodeIP(payload.IP, c.Request.RemoteAddr)
response, err := service.HeartbeatNode(node, payload)
response, err := service.HeartbeatNode(freshNode, payload)
if err != nil {
slog.Debug("agent ws status handling failed", "node_id", node.NodeID, "error", err)
return
+5
View File
@@ -171,6 +171,11 @@ func RequestNodeAgentUpdate(id uint, input NodeAgentUpdateInput) (*NodeView, err
return nil, err
}
refreshAgentTokenCache(node)
if SendAgentWSSettings(node.NodeID, buildAgentSettings(node, true, channel.String(), tagName, node.RestartOpenrestyRequested)) {
slog.Debug("agent manual update pushed via ws", "node_id", node.NodeID, "channel", channel.String(), "tag", tagName)
} else {
slog.Debug("agent manual update waiting for next heartbeat", "node_id", node.NodeID, "channel", channel.String(), "tag", tagName)
}
slog.Info("agent manual update requested", "node_id", node.NodeID, "name", node.Name, "channel", channel.String(), "tag", tagName)
return buildNodeView(node), nil
}
@@ -120,6 +120,9 @@ func TestRequestNodeAgentPreviewUpdate(t *testing.T) {
SetUpdateHTTPClientForTest(originalClient)
})
wsClient := RegisterAgentWSClient(node.NodeID)
defer UnregisterAgentWSClient(wsClient)
updated, err := RequestNodeAgentUpdate(node.ID, NodeAgentUpdateInput{
Channel: "preview",
TagName: "v0.5.0-rc.1",
@@ -136,6 +139,21 @@ func TestRequestNodeAgentPreviewUpdate(t *testing.T) {
if updated.UpdateTag != "v0.5.0-rc.1" {
t.Fatalf("unexpected update tag: %s", updated.UpdateTag)
}
select {
case message := <-wsClient.Messages():
if message.Type != AgentWSMessageTypeSettings {
t.Fatalf("expected settings message, got %s", message.Type)
}
settings, ok := message.Payload.(*AgentSettings)
if !ok {
t.Fatalf("expected agent settings payload, got %T", message.Payload)
}
if !settings.UpdateNow || settings.UpdateChannel != "preview" || settings.UpdateTag != "v0.5.0-rc.1" {
t.Fatalf("unexpected pushed settings: %+v", settings)
}
case <-time.After(time.Second):
t.Fatal("expected websocket settings push for manual update")
}
}
func TestHeartbeatNodeReturnsPreviewUpdateSettings(t *testing.T) {