ServerHardwareReport.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using RackPeek.Domain.Persistence;
  2. using RackPeek.Domain.Resources.SubResources;
  3. namespace RackPeek.Domain.Resources.Servers;
  4. public record ServerHardwareReport(
  5. IReadOnlyList<ServerHardwareRow> Servers
  6. );
  7. public record ServerHardwareRow(
  8. string Name,
  9. string CpuSummary,
  10. int TotalCores,
  11. int TotalThreads,
  12. double RamGb,
  13. int TotalStorageGb,
  14. int SsdStorageGb,
  15. int HddStorageGb,
  16. int TotalNicPorts,
  17. double MaxNicSpeedGb,
  18. int GpuCount,
  19. int TotalGpuVramGb,
  20. string GpuSummary,
  21. bool Ipmi,
  22. IReadOnlyList<Port> Ports
  23. ) {
  24. public string NicSummary =>
  25. string.Join(", ",
  26. (Ports ?? [])
  27. .SelectMany(n => {
  28. var ports = n.Count ?? 1;
  29. var speed = n.Speed ?? 0;
  30. return Enumerable.Repeat(speed, ports);
  31. })
  32. .GroupBy(speed => speed)
  33. .OrderByDescending(g => g.Key)
  34. .Select(g => $"{g.Count()}×{g.Key}G")
  35. .DefaultIfEmpty("none")
  36. );
  37. }
  38. public class ServerHardwareReportUseCase(IResourceCollection repository) : IUseCase {
  39. public async Task<ServerHardwareReport> ExecuteAsync() {
  40. IReadOnlyList<Server> servers = await repository.GetAllOfTypeAsync<Server>();
  41. var rows = servers.Select(server => {
  42. var totalCores = server.Cpus?.Sum(c => c.Cores) ?? 0;
  43. var totalThreads = server.Cpus?.Sum(c => c.Threads) ?? 0;
  44. var cpuSummary = server.Cpus == null
  45. ? "Unknown"
  46. : string.Join(", ",
  47. server.Cpus
  48. .GroupBy(c => c.Model)
  49. .Select(g => $"{g.Count()}× {g.Key}"));
  50. var ramGb = server.Ram?.Size ?? 0;
  51. var totalStorage = server.Drives?.Sum(d => d.Size) ?? 0;
  52. var ssdStorage = server.Drives?
  53. .Where(d => d.Type == "ssd")
  54. .Sum(d => d.Size) ?? 0;
  55. var hddStorage = server.Drives?
  56. .Where(d => d.Type == "hdd")
  57. .Sum(d => d.Size) ?? 0;
  58. var totalNicPorts = server.Ports?.Sum(n => n.Count) ?? 0;
  59. var maxNicSpeed = server.Ports?.Max(n => n.Speed) ?? 0;
  60. var gpuCount = server.Gpus?.Count ?? 0;
  61. var totalGpuVram = server.Gpus?
  62. .Sum(g => g.Vram) ?? 0;
  63. var gpuSummary = server.Gpus == null || server.Gpus.Count == 0
  64. ? "None"
  65. : string.Join(", ",
  66. server.Gpus
  67. .GroupBy(g => g.Model)
  68. .Select(g => $"{g.Count()}× {g.Key}"));
  69. return new ServerHardwareRow(
  70. server.Name,
  71. cpuSummary,
  72. totalCores,
  73. totalThreads,
  74. ramGb,
  75. totalStorage,
  76. ssdStorage,
  77. hddStorage,
  78. totalNicPorts,
  79. maxNicSpeed,
  80. gpuCount,
  81. totalGpuVram,
  82. gpuSummary,
  83. server.Ipmi ?? false,
  84. server.Ports ?? new List<Port>()
  85. );
  86. }).ToList();
  87. return new ServerHardwareReport(rows);
  88. }
  89. }