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>
84 lines
2.1 KiB
Go
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
|
|
},
|
|
}
|
|
}
|