using ZA.CoreService.ESBCertificateManager.Models; namespace ZA.CoreService.ESBCertificateManager.Services; /// /// Nur Container-Neustart (kein Deploy, kein TLS, kein XApi). /// public sealed class DeploymentOrchestrator { private readonly RestartExecutor _restartExecutor; private readonly PreflightValidator _preflightValidator = new(); private readonly AppSettings _settings; public DeploymentOrchestrator(AppSettings settings) { _settings = settings; _restartExecutor = new RestartExecutor(settings.SonicConnections); } public PreflightValidationResult ValidateRestartOnly(IReadOnlyList selectedTargets) => _preflightValidator.ValidateRestartOnly(selectedTargets); public async Task RestartOnlyAsync( IReadOnlyList selectedTargets, IProgress? progress, CancellationToken cancellationToken = default) { DateTimeOffset startedAt = DateTimeOffset.Now; List results = []; using RunLogger logger = new(_settings.LogDirectory); logger.Write($"Neustart gestartet für {selectedTargets.Count} Ziel(e)."); foreach (DeploymentTarget target in selectedTargets) { cancellationToken.ThrowIfCancellationRequested(); DateTimeOffset targetStart = DateTimeOffset.Now; progress?.Report(new TargetProgressUpdate(target.Id, $"Neustart {target.ContainerName}…", null)); (bool ok, string status, string? detail) = await _restartExecutor.ExecuteAsync(target, cancellationToken); logger.Write($"[{target.Name}] {status} | {detail}"); progress?.Report(new TargetProgressUpdate(target.Id, status, ok)); results.Add(new TargetStepResult { TargetId = target.Id, TargetName = target.Name, Success = ok, StatusText = status, Detail = detail, StartedAt = targetStart, FinishedAt = DateTimeOffset.Now }); } DateTimeOffset finishedAt = DateTimeOffset.Now; DeploymentRunResult runResult = new() { TargetResults = results, StartedAt = startedAt, FinishedAt = finishedAt }; logger.Write( $"Neustart beendet. Erfolg={runResult.OverallSuccess}; Dauer={(finishedAt - startedAt).TotalSeconds:F1}s; Log={logger.LogFilePath}"); return runResult; } }