ServerHardwareReport.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using RackPeek.Domain.Resources.Hardware.Models;
  2. namespace RackPeek.Domain.Resources.Hardware.Reports;
  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. int MaxNicSpeedGb,
  17. bool Ipmi
  18. );
  19. public class ServerHardwareReportUseCase(IHardwareRepository repository)
  20. {
  21. public async Task<ServerHardwareReport> ExecuteAsync()
  22. {
  23. var hardware = await repository.GetAllAsync();
  24. var servers = hardware.OfType<Server>();
  25. var rows = servers.Select(server =>
  26. {
  27. var totalCores = server.Cpus?.Sum(c => c.Cores) ?? 0;
  28. var totalThreads = server.Cpus?.Sum(c => c.Threads) ?? 0;
  29. var cpuSummary = server.Cpus == null
  30. ? "Unknown"
  31. : string.Join(", ",
  32. server.Cpus
  33. .GroupBy(c => c.Model)
  34. .Select(g => $"{g.Count()}× {g.Key}"));
  35. var ramGb = server.Ram?.Size ?? 0;
  36. var totalStorage = server.Drives?.Sum(d => d.Size) ?? 0;
  37. var ssdStorage = server.Drives?
  38. .Where(d => d.Type == "ssd")
  39. .Sum(d => d.Size) ?? 0;
  40. var hddStorage = server.Drives?
  41. .Where(d => d.Type == "hdd")
  42. .Sum(d => d.Size) ?? 0;
  43. var totalNicPorts = server.Nics?.Sum(n => n.Ports) ?? 0;
  44. var maxNicSpeed = server.Nics?.Max(n => n.Speed) ?? 0;
  45. return new ServerHardwareRow(
  46. Name: server.Name,
  47. CpuSummary: cpuSummary,
  48. TotalCores: totalCores,
  49. TotalThreads: totalThreads,
  50. RamGb: ramGb,
  51. TotalStorageGb: totalStorage,
  52. SsdStorageGb: ssdStorage,
  53. HddStorageGb: hddStorage,
  54. TotalNicPorts: totalNicPorts,
  55. MaxNicSpeedGb: maxNicSpeed,
  56. Ipmi: server.Ipmi ?? false
  57. );
  58. }).ToList();
  59. return new ServerHardwareReport(rows);
  60. }
  61. }