Files
mcp/cmd/mcp/sync.go
Kyle Isom 08b3e2a472 Migrate module path from kyle/ to mc/ org
All import paths updated to git.wntrmute.dev/mc/. Bumps mcdsl to v1.2.0,
mc-proxy to v1.1.0.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 02:07:42 -07:00

84 lines
2.1 KiB
Go

package main
import (
"context"
"fmt"
mcpv1 "git.wntrmute.dev/mc/mcp/gen/mcp/v1"
"git.wntrmute.dev/mc/mcp/internal/config"
"git.wntrmute.dev/mc/mcp/internal/servicedef"
"github.com/spf13/cobra"
)
func syncCmd() *cobra.Command {
return &cobra.Command{
Use: "sync",
Short: "Push service definitions to agents (update desired state)",
RunE: func(cmd *cobra.Command, args []string) error {
cfg, err := config.LoadCLIConfig(cfgPath)
if err != nil {
return fmt.Errorf("load config: %w", err)
}
defs, err := servicedef.LoadAll(cfg.Services.Dir)
if err != nil {
return fmt.Errorf("load service definitions: %w", err)
}
// Group definitions by node.
byNode := make(map[string][]*servicedef.ServiceDef)
for _, def := range defs {
byNode[def.Node] = append(byNode[def.Node], def)
}
// Build node name -> address lookup.
nodeAddr := make(map[string]string, len(cfg.Nodes))
for _, n := range cfg.Nodes {
nodeAddr[n.Name] = n.Address
}
for nodeName, nodeDefs := range byNode {
addr, ok := nodeAddr[nodeName]
if !ok {
fmt.Printf("warning: no node %q in config, skipping %d service(s)\n", nodeName, len(nodeDefs))
continue
}
client, conn, err := dialAgent(addr, cfg)
if err != nil {
return fmt.Errorf("dial %s: %w", nodeName, err)
}
defer func() { _ = conn.Close() }()
var specs []*mcpv1.ServiceSpec
for _, def := range nodeDefs {
specs = append(specs, servicedef.ToProto(def))
}
resp, err := client.SyncDesiredState(context.Background(), &mcpv1.SyncDesiredStateRequest{
Services: specs,
})
if err != nil {
return fmt.Errorf("sync %s: %w", nodeName, err)
}
fmt.Printf("node %s:\n", nodeName)
for _, r := range resp.GetResults() {
marker := " unchanged"
if r.GetChanged() {
marker = " changed"
}
summary := r.GetSummary()
if summary != "" {
fmt.Printf("%s %s: %s\n", marker, r.GetName(), summary)
} else {
fmt.Printf("%s %s\n", marker, r.GetName())
}
}
}
return nil
},
}
}