feat: Implement agent heartbeat with mTLS and node status tracking

This commit is contained in:
2025-05-17 13:32:05 -04:00
parent dad5586339
commit 3408e7801e
7 changed files with 639 additions and 16 deletions

View File

@ -265,6 +265,10 @@ func runInit(cmd *cobra.Command, args []string) {
joinHandler := api.NewJoinHandler(etcdStore, caKeyPath, caCertPath)
apiServer.RegisterJoinHandler(joinHandler)
log.Printf("Registered join handler with CA key: %s, CA cert: %s", caKeyPath, caCertPath)
// Register the node status handler
nodeStatusHandler := api.NewNodeStatusHandler(etcdStore)
apiServer.RegisterNodeStatusHandler(nodeStatusHandler)
// Start the server in a goroutine
go func() {
@ -333,7 +337,8 @@ func runJoin(cmd *cobra.Command, args []string) {
pkiDir := filepath.Join(os.Getenv("HOME"), ".kat-agent", nodeName, "pki")
// Join the cluster
if err := cli.JoinCluster(leaderAPI, advertiseAddr, nodeName, leaderCACert, pkiDir); err != nil {
joinResp, err := cli.JoinCluster(leaderAPI, advertiseAddr, nodeName, leaderCACert, pkiDir)
if err != nil {
log.Fatalf("Failed to join cluster: %v", err)
}
@ -343,20 +348,36 @@ func runJoin(cmd *cobra.Command, args []string) {
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
// Stay up in an idle loop until interrupted
log.Printf("Node %s is now running. Press Ctrl+C to exit.", nodeName)
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
log.Println("Received shutdown signal. Exiting...")
return
case <-ticker.C:
log.Printf("Node %s is still running...", nodeName)
}
// Create and start the agent with heartbeating
agent, err := agent.NewAgent(
joinResp.NodeName,
joinResp.NodeUID,
leaderAPI,
advertiseAddr,
pkiDir,
15, // Default heartbeat interval in seconds
)
if err != nil {
log.Fatalf("Failed to create agent: %v", err)
}
// Setup mTLS client
if err := agent.SetupMTLSClient(); err != nil {
log.Fatalf("Failed to setup mTLS client: %v", err)
}
// Start heartbeating
if err := agent.StartHeartbeat(ctx); err != nil {
log.Fatalf("Failed to start heartbeat: %v", err)
}
log.Printf("Node %s is now running with heartbeat. Press Ctrl+C to exit.", nodeName)
// Wait for shutdown signal
<-ctx.Done()
log.Println("Received shutdown signal. Stopping heartbeat...")
agent.StopHeartbeat()
log.Println("Exiting...")
}
func runVerify(cmd *cobra.Command, args []string) {