feat: patching REST API, patching scope, run IDs from apply-updates and MCP

This commit is contained in:
2026-09-15 09:31:51 +00:00
parent 17c9f813fc
commit b5bbf28c63
11 changed files with 1697 additions and 28 deletions
+13 -5
View File
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"gitea.hostxtra.co.uk/mrhid6/vantage/server/internal/models"
"gitea.hostxtra.co.uk/mrhid6/vantage/server/internal/services"
)
@@ -156,6 +157,7 @@ type updateBatchResult struct {
Servers int `json:"servers"`
Succeeded []string `json:"succeeded"`
Failed map[string]string `json:"failed,omitempty"`
RunIDs map[string]string `json:"run_ids,omitempty"` // server ID -> patch run ID
}
// apply_updates. The REST route (internal/api/handlers.go's applyUpdates) is
@@ -178,9 +180,9 @@ func init() {
Write: true,
Scope: "servers:write",
Description: "Apply pending OS package updates on real servers, selected by " +
"server_ids and/or tags. This installs packages on real machines right now and " +
"cannot be undone from here. A server may need a reboot afterward, which this " +
"tool does not do.",
"server_ids and/or tags. Starts one manual patch run per server. This installs " +
"packages on real machines right now and cannot be undone from here. A server " +
"may need a reboot afterward, which this tool does not do.",
Handler: func(ctx context.Context, c Caller, args map[string]any) (any, error) {
ids := stringSliceArg(args, "server_ids")
targets, err := services.ResolveTargetsScoped(c.InstanceID, ids, tagArg(args), c.TokenScope)
@@ -192,12 +194,18 @@ func init() {
}
result := updateBatchResult{Servers: len(targets), Failed: map[string]string{}}
for _, srv := range targets {
if err := services.DispatchApplyUpdates(srv.ServerID); err != nil {
for i := range targets {
srv := targets[i]
run, err := services.StartManualRun(c.InstanceID, &srv, "mcp:"+c.TokenName, models.PatchSourceMCP)
if err != nil {
result.Failed[srv.ServerID] = err.Error()
continue
}
result.Succeeded = append(result.Succeeded, srv.ServerID)
if result.RunIDs == nil {
result.RunIDs = map[string]string{}
}
result.RunIDs[srv.ServerID] = run.RunID
}
if len(result.Failed) == 0 {
result.Failed = nil