using ZA.CoreService.ESBCertificateManager.Models;
namespace ZA.CoreService.ESBCertificateManager.Services;
///
/// Orchestriert nur noch Container-Neustart (kein Deploy/TLS/SQL).
///
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();
results.Add(await RestartTargetOnlyAsync(target, logger, progress, cancellationToken));
}
DateTimeOffset finishedAt = DateTimeOffset.Now;
DeploymentRunResult runResult = new()
{
TargetResults = results,
StartedAt = startedAt,
FinishedAt = finishedAt,
CertificateFilePath = string.Empty,
CertificateFingerprint = string.Empty
};
logger.Write(
$"Neustart beendet. Erfolg={runResult.OverallSuccess}; Dauer={(finishedAt - startedAt).TotalSeconds:F1}s; Log={logger.LogFilePath}");
return runResult;
}
private async Task RestartTargetOnlyAsync(
DeploymentTarget target,
RunLogger logger,
IProgress? progress,
CancellationToken cancellationToken)
{
List steps = [];
DateTimeOffset targetStart = DateTimeOffset.Now;
progress?.Report(new TargetProgressUpdate(target.Id, "Neustart…", false));
(bool restartOk, string restartStatus, string? restartDetail) =
await _restartExecutor.ExecuteAsync(target, cancellationToken);
steps.Add($"{restartStatus}: {restartDetail}");
logger.Write($"[{target.Name}] Restart: {restartStatus} | {restartDetail}");
TargetStepResult targetResult = new()
{
TargetId = target.Id,
TargetName = target.Name,
Success = restartOk,
StatusText = restartStatus,
Detail = restartDetail,
Steps = steps,
StartedAt = targetStart,
FinishedAt = DateTimeOffset.Now,
CopySucceeded = true,
RestartSucceeded = restartOk,
TlsSucceeded = true,
ObservedFingerprint = null
};
progress?.Report(new TargetProgressUpdate(target.Id, restartStatus, restartOk));
return targetResult;
}
}
public readonly record struct TargetProgressUpdate(int TargetId, string StatusText, bool? SuccessHint);