Skip to content

Commit 8d80a3c

Browse files
authored
Merge pull request #23 from michalskrivanek/graceful
graceful restart
2 parents adae770 + 6b8b003 commit 8d80a3c

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

cmd/apply.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@ var applyCmd = &cobra.Command{
6060
}
6161

6262
config_lint.Validate(cfg)
63-
if err := config_lint.ValidateWithError(cfg); err != nil {
64-
return fmt.Errorf("config validation failed: %w", err)
65-
}
6663

6764
tapplier, err := templating.NewTemplateApplier(cfg, nil)
6865
if err != nil {

internal/config/loader.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,8 @@ func retrieveContainerVersionsFromExporters(loaded *LoadedLabConfig) map[string]
329329

330330
// Retrieve version information for each unique image
331331
for imageURL := range uniqueImages {
332+
fmt.Printf("🔍 Checking container version for %s...\n", imageURL)
333+
332334
imageLabels, err := container.GetImageLabelsFromRegistry(imageURL)
333335
if err != nil {
334336
fmt.Printf("Latest container version of %s: unavailable (%v)\n", imageURL, err)

internal/exporter/ssh/ssh.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,17 @@ func (m *SSHHostManager) Apply(exporterConfig *v1alpha1.ExporterConfigTemplate,
186186
return fmt.Errorf("both SystemdContainerTemplate and SystemdServiceTemplate specified - only one should be used")
187187
}
188188

189-
// Helper function to restart service
190-
restartService := func(serviceName string, dryRun bool) {
189+
// Helper function to restart service, gracefully wating on lease exit
190+
restartGracefully := func(serviceName string, dryRun bool) {
191191
if !dryRun {
192-
_, enableErr := m.runCommand("systemctl restart " + fmt.Sprintf("%q", serviceName))
192+
_, enableErr := m.runCommand(fmt.Sprintf("command -v podman >/dev/null 2>&1 && podman kill -s SIGHUP %q || systemctl kill -s SIGHUP %q", serviceName, serviceName))
193193
if enableErr != nil {
194-
fmt.Printf(" ❌ Failed to start service %s: %v\n", serviceName, enableErr)
194+
fmt.Printf(" ❌ Failed to signal %s: %v\n", serviceName, enableErr)
195195
} else {
196-
fmt.Printf(" ✅ Service %s started\n", serviceName)
196+
fmt.Printf(" ✅ %s signalled to restart when not leased\n", serviceName)
197197
}
198198
} else {
199-
fmt.Printf(" 📄 Would restart service %s\n", serviceName)
199+
fmt.Printf(" 📄 Would trigger restart of %s\n", serviceName)
200200
}
201201
}
202202

@@ -245,7 +245,7 @@ func (m *SSHHostManager) Apply(exporterConfig *v1alpha1.ExporterConfigTemplate,
245245
return fmt.Errorf("failed to enable exporter: %w", err)
246246
}
247247
}
248-
restartService(svcName, dryRun)
248+
restartGracefully(svcName, dryRun)
249249
}
250250
} else {
251251
// Check if service is running and start if needed
@@ -254,10 +254,19 @@ func (m *SSHHostManager) Apply(exporterConfig *v1alpha1.ExporterConfigTemplate,
254254

255255
if !serviceRunning {
256256
fmt.Printf(" ⚠️ Service %s is not running...\n", svcName)
257-
restartService(svcName, dryRun)
257+
if !dryRun {
258+
_, enableErr := m.runCommand("systemctl restart " + fmt.Sprintf("%q", svcName))
259+
if enableErr != nil {
260+
fmt.Printf(" ❌ Failed to restart service %s: %v\n", svcName, enableErr)
261+
} else {
262+
fmt.Printf(" ✅ Service %s restarted\n", svcName)
263+
}
264+
} else {
265+
fmt.Printf(" 📄 Would restart service %s\n", svcName)
266+
}
258267
} else {
259268
// Only check container version if service is running
260-
err = m.checkContainerVersion(exporterConfig, svcName, dryRun, restartService)
269+
err = m.checkContainerVersion(exporterConfig, svcName, dryRun, restartGracefully)
261270
if err != nil {
262271
return fmt.Errorf("container version check failed: %w", err)
263272
}
@@ -327,12 +336,12 @@ func (m *SSHHostManager) checkDetailedContainerVersion(containerImage, svcName s
327336
// getRunningContainerLabels gets container labels from running container
328337
func (m *SSHHostManager) getRunningContainerLabels(serviceName string) (*container.ImageLabels, error) {
329338
// Try jumpstarter labels first, then fall back to OCI standard labels
330-
result, err := m.runCommand(fmt.Sprintf("podman inspect --format '{{index .Config.Labels \"jumpstarter.version\"}}\n{{index .Config.Labels \"jumpstarter.revision\"}}\n{{index .Config.Labels \"org.opencontainers.image.version\"}}\n{{index .Config.Labels \"org.opencontainers.image.revision\"}}' %s", serviceName))
339+
result, err := m.runCommand(fmt.Sprintf("podman inspect --format '{{index .Config.Labels \"jumpstarter.version\"}} {{index .Config.Labels \"jumpstarter.revision\"}} {{index .Config.Labels \"org.opencontainers.image.version\"}} {{index .Config.Labels \"org.opencontainers.image.revision\"}}' %s", serviceName))
331340
if err != nil {
332341
return nil, fmt.Errorf("failed to inspect container %s: %w", serviceName, err)
333342
}
334343

335-
parts := strings.Split(strings.TrimSpace(result.Stdout), "\n")
344+
parts := strings.Fields(strings.TrimSpace(result.Stdout))
336345
// Pad with empty strings if we got fewer parts
337346
for len(parts) < 4 {
338347
parts = append(parts, "")

0 commit comments

Comments
 (0)