ServerHardwareReport.cs 2.6 KB

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