From 7160b0bbddaf66897471d952e4e4b8e18ef7d832 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 23 Aug 2026 11:53:24 +0200 Subject: [PATCH] feat(core): add host, alert, and metrics domain models --- src/Vantage.Core/Models/DockerContainer.cs | 23 ++++++++++++ src/Vantage.Core/Models/HealthCheck.cs | 43 ++++++++++++++++++++++ src/Vantage.Core/Models/HostConfig.cs | 28 ++++++++++++++ src/Vantage.Core/Models/HostMetrics.cs | 21 +++++++++++ src/Vantage.Core/Models/VantageConfig.cs | 16 ++++++++ 5 files changed, 131 insertions(+) create mode 100644 src/Vantage.Core/Models/DockerContainer.cs create mode 100644 src/Vantage.Core/Models/HealthCheck.cs create mode 100644 src/Vantage.Core/Models/HostConfig.cs create mode 100644 src/Vantage.Core/Models/HostMetrics.cs create mode 100644 src/Vantage.Core/Models/VantageConfig.cs diff --git a/src/Vantage.Core/Models/DockerContainer.cs b/src/Vantage.Core/Models/DockerContainer.cs new file mode 100644 index 0000000..3d6531b --- /dev/null +++ b/src/Vantage.Core/Models/DockerContainer.cs @@ -0,0 +1,23 @@ +namespace Vantage.Core.Models; + +public enum ContainerState +{ + Running, + Exited, + Paused, + Restarting, + Created, + Dead, + Other +} + +public sealed record DockerContainer +{ + public string Id { get; init; } = ""; + public string Name { get; init; } = ""; + public string Image { get; init; } = ""; + public ContainerState State { get; init; } = ContainerState.Other; + public string StatusText { get; init; } = ""; + + public bool IsRunning => State == ContainerState.Running; +} diff --git a/src/Vantage.Core/Models/HealthCheck.cs b/src/Vantage.Core/Models/HealthCheck.cs new file mode 100644 index 0000000..0b2a9d0 --- /dev/null +++ b/src/Vantage.Core/Models/HealthCheck.cs @@ -0,0 +1,43 @@ +namespace Vantage.Core.Models; + +public enum HealthKind +{ + Http, + Tcp +} + +public enum HealthStatus +{ + Unknown, + Up, + Degraded, + Down +} + +public sealed class HealthCheckConfig +{ + public string Id { get; set; } = Guid.NewGuid().ToString("N"); + public string Name { get; set; } = ""; + public HealthKind Kind { get; set; } = HealthKind.Http; + public string Target { get; set; } = ""; + public int TimeoutMs { get; set; } = 5000; + public int ExpectedStatusMin { get; set; } = 200; + public int ExpectedStatusMax { get; set; } = 399; +} + +public sealed record HealthCheckResult +{ + public HealthStatus Status { get; init; } = HealthStatus.Unknown; + public double? LatencyMs { get; init; } + public string Message { get; init; } = ""; + public DateTimeOffset CheckedAt { get; init; } = DateTimeOffset.UtcNow; + + public static HealthCheckResult Up(double latencyMs, string message) => + new() { Status = HealthStatus.Up, LatencyMs = latencyMs, Message = message }; + + public static HealthCheckResult Degraded(double latencyMs, string message) => + new() { Status = HealthStatus.Degraded, LatencyMs = latencyMs, Message = message }; + + public static HealthCheckResult Down(string message) => + new() { Status = HealthStatus.Down, Message = message }; +} diff --git a/src/Vantage.Core/Models/HostConfig.cs b/src/Vantage.Core/Models/HostConfig.cs new file mode 100644 index 0000000..1151e53 --- /dev/null +++ b/src/Vantage.Core/Models/HostConfig.cs @@ -0,0 +1,28 @@ +namespace Vantage.Core.Models; + +public enum SshAuthMethod +{ + PrivateKey, + Password, + Agent +} + +public sealed class HostConfig +{ + public string Id { get; set; } = Guid.NewGuid().ToString("N"); + public string Name { get; set; } = ""; + public string Address { get; set; } = ""; + public int Port { get; set; } = 22; + public string Username { get; set; } = ""; + public SshAuthMethod AuthMethod { get; set; } = SshAuthMethod.PrivateKey; + public string? PrivateKeyPath { get; set; } + public string? PrivateKeyPassphrase { get; set; } + public string? Password { get; set; } + public string DiskMount { get; set; } = "/"; + public string? MetricsEndpoint { get; set; } + + public string ResolveMetricsEndpoint() => + string.IsNullOrWhiteSpace(MetricsEndpoint) + ? $"http://{Address}:9100/metrics" + : MetricsEndpoint; +} diff --git a/src/Vantage.Core/Models/HostMetrics.cs b/src/Vantage.Core/Models/HostMetrics.cs new file mode 100644 index 0000000..2f468d1 --- /dev/null +++ b/src/Vantage.Core/Models/HostMetrics.cs @@ -0,0 +1,21 @@ +namespace Vantage.Core.Models; + +public sealed record HostMetrics +{ + public double CpuUsagePercent { get; init; } + public long MemoryUsedBytes { get; init; } + public long MemoryTotalBytes { get; init; } + public long DiskUsedBytes { get; init; } + public long DiskTotalBytes { get; init; } + public double Load1 { get; init; } + public double Load5 { get; init; } + public double Load15 { get; init; } + public TimeSpan Uptime { get; init; } + public DateTimeOffset CollectedAt { get; init; } = DateTimeOffset.UtcNow; + + public double MemoryUsedPercent => + MemoryTotalBytes <= 0 ? 0 : Math.Round(100.0 * MemoryUsedBytes / MemoryTotalBytes, 1); + + public double DiskUsedPercent => + DiskTotalBytes <= 0 ? 0 : Math.Round(100.0 * DiskUsedBytes / DiskTotalBytes, 1); +} diff --git a/src/Vantage.Core/Models/VantageConfig.cs b/src/Vantage.Core/Models/VantageConfig.cs new file mode 100644 index 0000000..d28fe46 --- /dev/null +++ b/src/Vantage.Core/Models/VantageConfig.cs @@ -0,0 +1,16 @@ +using Vantage.Core.Alerts; +using Vantage.Core.Logs; + +namespace Vantage.Core.Models; + +public sealed class VantageConfig +{ + public List Hosts { get; set; } = new(); + public List HealthChecks { get; set; } = new(); + public List AlertRules { get; set; } = new(); + public List LogSources { get; set; } = new(); + public int RefreshIntervalSeconds { get; set; } = 5; + public int HistoryLength { get; set; } = 120; + public int HistoryRetentionHours { get; set; } = 168; + public string? AlertWebhookUrl { get; set; } +}