diff --git a/cmd/homelab-deploy/main.go b/cmd/homelab-deploy/main.go index e40b819..83fc321 100644 --- a/cmd/homelab-deploy/main.go +++ b/cmd/homelab-deploy/main.go @@ -16,7 +16,7 @@ import ( "github.com/urfave/cli/v3" ) -const version = "0.1.4" +const version = "0.1.5" func main() { app := &cli.Command{ diff --git a/internal/listener/listener.go b/internal/listener/listener.go index 1a3644f..ce477b5 100644 --- a/internal/listener/listener.go +++ b/internal/listener/listener.go @@ -34,6 +34,10 @@ type Listener struct { // Expanded subjects for discovery responses expandedSubjects []string + + // restartCh signals that the listener should exit for restart + // (e.g., after a successful switch deployment) + restartCh chan struct{} } // New creates a new listener with the given configuration. @@ -43,10 +47,11 @@ func New(cfg Config, logger *slog.Logger) *Listener { } return &Listener{ - cfg: cfg, - executor: deploy.NewExecutor(cfg.FlakeURL, cfg.Hostname, cfg.Timeout), - lock: deploy.NewLock(), - logger: logger, + cfg: cfg, + executor: deploy.NewExecutor(cfg.FlakeURL, cfg.Hostname, cfg.Timeout), + lock: deploy.NewLock(), + logger: logger, + restartCh: make(chan struct{}, 1), } } @@ -93,9 +98,13 @@ func (l *Listener) Run(ctx context.Context) error { l.logger.Info("listener started", "deploy_subjects", l.expandedSubjects, "discover_subject", discoverSubject) - // Wait for context cancellation - <-ctx.Done() - l.logger.Info("shutting down listener") + // Wait for context cancellation or restart signal + select { + case <-ctx.Done(): + l.logger.Info("shutting down listener") + case <-l.restartCh: + l.logger.Info("exiting for restart after successful switch deployment") + } return nil } @@ -185,6 +194,15 @@ func (l *Listener) handleDeployRequest(subject string, data []byte) { messages.StatusCompleted, "deployment completed successfully", )) + + // After a successful switch, signal restart so we pick up any new version + if req.Action == messages.ActionSwitch { + select { + case l.restartCh <- struct{}{}: + default: + // Channel already has a signal pending + } + } } else { l.logger.Error("deployment failed", "exit_code", result.ExitCode,