Tim Jones 2 ماه پیش
والد
کامیت
bfc79fb7c6
86فایلهای تغییر یافته به همراه964 افزوده شده و 1026 حذف شده
  1. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Desktop.cs
  2. 0 1
      RackPeek.Domain/Resources/Hardware/Models/Hardware.cs
  3. 2 3
      RackPeek.Domain/Resources/Hardware/Models/Laptop.cs
  4. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Server.cs
  5. 4 3
      RackPeek.Domain/Resources/Hardware/Reports/AccessPointHardwareReport.cs
  6. 11 10
      RackPeek.Domain/Resources/Hardware/Reports/DesktopHardwareReport.cs
  7. 9 7
      RackPeek.Domain/Resources/Hardware/Reports/FirewallHardwareReport.cs
  8. 16 19
      RackPeek.Domain/Resources/Hardware/Reports/ServerHardwareReport.cs
  9. 9 7
      RackPeek.Domain/Resources/Hardware/Reports/SwitchHardwareReport.cs
  10. 4 3
      RackPeek.Domain/Resources/Hardware/Reports/UpsHardwareReport.cs
  11. 1 1
      RackPeek.Domain/Resources/Hardware/Server/AddServerUseCase.cs
  12. 2 5
      RackPeek.Domain/Resources/Hardware/Server/Cpu/AddCpuUseCase.cs
  13. 2 5
      RackPeek.Domain/Resources/Hardware/Server/Cpu/RemoveCpuUseCase.cs
  14. 3 6
      RackPeek.Domain/Resources/Hardware/Server/Cpu/UpdateCpuUseCase.cs
  15. 8 8
      RackPeek.Domain/Resources/Hardware/Server/DescribeServerUseCase.cs
  16. 2 5
      RackPeek.Domain/Resources/Hardware/Server/Drive/AddDriveUseCase.cs
  17. 1 4
      RackPeek.Domain/Resources/Hardware/Server/Drive/UpdateDriveUseCase.cs
  18. 2 5
      RackPeek.Domain/Resources/Hardware/Server/UpdateServerUseCase.cs
  19. 4 2
      RackPeek.Domain/Resources/Hardware/Switchs/AddSwitchUseCase.cs
  20. 1 1
      RackPeek.Domain/Resources/Hardware/Switchs/DescribeSwitchUseCase.cs
  21. 4 2
      RackPeek.Domain/Resources/Hardware/Switchs/GetSwitchUseCase.cs
  22. 4 2
      RackPeek.Domain/Resources/Hardware/Switchs/GetSwitchesUseCase.cs
  23. 10 8
      RackPeek.Domain/Resources/Hardware/Switchs/UpdateSwitchUseCase.cs
  24. 2 2
      RackPeek.Domain/Resources/Resource.cs
  25. 0 2
      RackPeek/Commands/AccessPointReportCommand.cs
  26. 0 2
      RackPeek/Commands/DesktopReportCommand.cs
  27. 5 7
      RackPeek/Commands/Server/Cpus/ServerCpuAddCommand.cs
  28. 3 2
      RackPeek/Commands/Server/Cpus/ServerCpuRemoveCommand.cs
  29. 7 9
      RackPeek/Commands/Server/Cpus/ServerCpuSetCommand.cs
  30. 2 4
      RackPeek/Commands/Server/Drives/ServerDriveAddCommand.cs
  31. 1 2
      RackPeek/Commands/Server/Drives/ServerDriveRemoveCommand.cs
  32. 3 6
      RackPeek/Commands/Server/Drives/ServerDriveUpdateCommand.cs
  33. 3 6
      RackPeek/Commands/Server/Nics/ServerNicAddCommand.cs
  34. 1 2
      RackPeek/Commands/Server/Nics/ServerNicRemoveCommand.cs
  35. 4 8
      RackPeek/Commands/Server/Nics/ServerNicUpdateCommand.cs
  36. 2 2
      RackPeek/Commands/Server/ServerAddCommand.cs
  37. 1 2
      RackPeek/Commands/Server/ServerCommands.cs
  38. 0 2
      RackPeek/Commands/Server/ServerDescribeCommand.cs
  39. 0 2
      RackPeek/Commands/Server/ServerGetCommand.cs
  40. 11 12
      RackPeek/Commands/Server/ServerReportCommand.cs
  41. 3 4
      RackPeek/Commands/Server/ServerSetCommand.cs
  42. 1 3
      RackPeek/Commands/SwitchReportCommand.cs
  43. 2 2
      RackPeek/Commands/Switches/SwitchAddCommand.cs
  44. 1 2
      RackPeek/Commands/Switches/SwitchCommands.cs
  45. 3 2
      RackPeek/Commands/Switches/SwitchDescribeCommand.cs
  46. 1 0
      RackPeek/Commands/Switches/SwitchGetByNameCommand.cs
  47. 2 4
      RackPeek/Commands/Switches/SwitchGetCommand.cs
  48. 4 5
      RackPeek/Commands/Switches/SwitchSetCommand.cs
  49. 0 2
      RackPeek/Commands/UpsReportCommand.cs
  50. 65 71
      RackPeek/Program.cs
  51. 10 10
      RackPeek/RackPeek.csproj
  52. 4 4
      RackPeek/TypeRegistrar.cs
  53. 8 6
      RackPeek/Yaml/Converters.cs
  54. 8 6
      RackPeek/Yaml/YamlHardwareRepository.cs
  55. 4 13
      RackPeek/Yaml/YamlResourceCollection.cs
  56. 30 30
      RackPeek/aps.yaml
  57. 20 20
      RackPeek/desktops.yaml
  58. 13 13
      RackPeek/firewalls.yaml
  59. 16 16
      RackPeek/laptops.yaml
  60. 13 13
      RackPeek/routers.yaml
  61. 396 396
      RackPeek/servers.yaml
  62. 13 13
      RackPeek/switches.yaml
  63. 5 5
      RackPeek/ups.yaml
  64. 20 19
      Tests/Hardware/AddCpuUseCaseTests.cs
  65. 17 16
      Tests/Hardware/AddDriveUseCaseTests.cs
  66. 0 1
      Tests/Hardware/AddNicUseCaseTests.cs
  67. 6 5
      Tests/Hardware/AddServerUseCaseTests.cs
  68. 2 1
      Tests/Hardware/DeleteServerUseCaseTests.cs
  69. 10 10
      Tests/Hardware/DescribeServerUseCaseTests.cs
  70. 2 2
      Tests/Hardware/GetServerUseCaseTests.cs
  71. 3 3
      Tests/Hardware/GetServersUseCaseTests.cs
  72. 8 9
      Tests/Hardware/RemoveCpuUseCaseTests.cs
  73. 8 9
      Tests/Hardware/RemoveDriveUseCaseTests.cs
  74. 3 4
      Tests/Hardware/RemoveNicUseCaseTests.cs
  75. 12 13
      Tests/Hardware/ServerHardwareReportTests.cs
  76. 2 2
      Tests/Hardware/Switches/AddSwitchUseCaseTests.cs
  77. 2 2
      Tests/Hardware/Switches/DeleteSwitchUseCaseTests.cs
  78. 3 3
      Tests/Hardware/Switches/DescribeSwitchUseCaseTests.cs
  79. 9 9
      Tests/Hardware/Switches/UpdateSwitchUseCaseTests.cs
  80. 18 19
      Tests/Hardware/UpdateCpuUseCaseTests.cs
  81. 15 16
      Tests/Hardware/UpdateDriveUseCaseTests.cs
  82. 3 4
      Tests/Hardware/UpdateNicUseCaseTests.cs
  83. 13 15
      Tests/Hardware/UpdateServerUseCaseTests.cs
  84. 2 2
      Tests/Tests.csproj
  85. 30 31
      Tests/Yaml/HardwareDeserializationTests.cs
  86. 8 10
      Tests/Yaml/SystemDeserializationTests.cs

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Models/Desktop.cs

@@ -6,5 +6,5 @@ public class Desktop : Hardware
     public Ram? Ram { get; set; }
     public List<Drive>? Drives { get; set; }
     public List<Nic>? Nics { get; set; }
-    public List<Gpu>? Gpus { get; set; } 
+    public List<Gpu>? Gpus { get; set; }
 }

+ 0 - 1
RackPeek.Domain/Resources/Hardware/Models/Hardware.cs

@@ -2,5 +2,4 @@ namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public abstract class Hardware : Resource
 {
-
 }

+ 2 - 3
RackPeek.Domain/Resources/Hardware/Models/Laptop.cs

@@ -4,7 +4,6 @@ public class Laptop : Hardware
 {
     public List<Cpu>? Cpus { get; set; }
     public Ram? Ram { get; set; }
-    public List<Drive>? Drives { get; set; } 
-    public List<Gpu>? Gpus { get; set; } 
-
+    public List<Drive>? Drives { get; set; }
+    public List<Gpu>? Gpus { get; set; }
 }

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Models/Server.cs

@@ -6,6 +6,6 @@ public class Server : Hardware
     public Ram? Ram { get; set; }
     public List<Drive>? Drives { get; set; }
     public List<Nic>? Nics { get; set; }
-    public List<Gpu>? Gpus { get; set; } 
+    public List<Gpu>? Gpus { get; set; }
     public bool? Ipmi { get; set; }
 }

+ 4 - 3
RackPeek.Domain/Resources/Hardware/Reports/AccessPointHardwareReport.cs

@@ -1,6 +1,7 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Reports;
+
 public record AccessPointHardwareReport(
     IReadOnlyList<AccessPointHardwareRow> AccessPoints
 );
@@ -21,9 +22,9 @@ public class AccessPointHardwareReportUseCase(IHardwareRepository repository)
         var rows = aps.Select(ap =>
         {
             return new AccessPointHardwareRow(
-                Name: ap.Name,
-                Model: ap.Model ?? "Unknown",
-                SpeedGb: ap.Speed ?? 0
+                ap.Name,
+                ap.Model ?? "Unknown",
+                ap.Speed ?? 0
             );
         }).ToList();
 

+ 11 - 10
RackPeek.Domain/Resources/Hardware/Reports/DesktopHardwareReport.cs

@@ -1,6 +1,7 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Reports;
+
 public record DesktopHardwareReport(
     IReadOnlyList<DesktopHardwareRow> Desktops
 );
@@ -67,16 +68,16 @@ public class DesktopHardwareReportUseCase(IHardwareRepository repository)
                         .Select(g => $"{g.Count()}× {g.Key}"));
 
             return new DesktopHardwareRow(
-                Name: desktop.Name,
-                CpuSummary: cpuSummary,
-                TotalCores: totalCores,
-                TotalThreads: totalThreads,
-                RamGb: ramGb,
-                TotalStorageGb: totalStorage,
-                SsdStorageGb: ssdStorage,
-                HddStorageGb: hddStorage,
-                NicSummary: nicSummary,
-                GpuSummary: gpuSummary
+                desktop.Name,
+                cpuSummary,
+                totalCores,
+                totalThreads,
+                ramGb,
+                totalStorage,
+                ssdStorage,
+                hddStorage,
+                nicSummary,
+                gpuSummary
             );
         }).ToList();
 

+ 9 - 7
RackPeek.Domain/Resources/Hardware/Reports/FirewallHardwareReport.cs

@@ -1,6 +1,7 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Reports;
+
 public record FirewallHardwareReport(
     IReadOnlyList<FirewallHardwareRow> Firewalls
 );
@@ -14,6 +15,7 @@ public record FirewallHardwareRow(
     int MaxPortSpeedGb,
     string PortSummary
 );
+
 public class FirewallHardwareReportUseCase(IHardwareRepository repository)
 {
     public async Task<FirewallHardwareReport> ExecuteAsync()
@@ -41,13 +43,13 @@ public class FirewallHardwareReportUseCase(IHardwareRepository repository)
                         }));
 
             return new FirewallHardwareRow(
-                Name: sw.Name,
-                Model: sw.Model ?? "Unknown",
-                Managed: sw.Managed ?? false,
-                Poe: sw.Poe ?? false,
-                TotalPorts: totalPorts,
-                MaxPortSpeedGb: maxSpeed,
-                PortSummary: portSummary
+                sw.Name,
+                sw.Model ?? "Unknown",
+                sw.Managed ?? false,
+                sw.Poe ?? false,
+                totalPorts,
+                maxSpeed,
+                portSummary
             );
         }).ToList();
 

+ 16 - 19
RackPeek.Domain/Resources/Hardware/Reports/ServerHardwareReport.cs

@@ -1,5 +1,3 @@
-using RackPeek.Domain.Resources.Hardware.Models;
-
 namespace RackPeek.Domain.Resources.Hardware.Reports;
 
 public record ServerHardwareReport(
@@ -21,7 +19,6 @@ public record ServerHardwareRow(
     int TotalGpuVramGb,
     string GpuSummary,
     bool Ipmi
-    
 );
 
 public class ServerHardwareReportUseCase(IHardwareRepository repository)
@@ -55,7 +52,7 @@ public class ServerHardwareReportUseCase(IHardwareRepository repository)
 
             var totalNicPorts = server.Nics?.Sum(n => n.Ports) ?? 0;
             var maxNicSpeed = server.Nics?.Max(n => n.Speed) ?? 0;
-            
+
             var gpuCount = server.Gpus?.Count ?? 0;
 
             var totalGpuVram = server.Gpus?
@@ -70,23 +67,23 @@ public class ServerHardwareReportUseCase(IHardwareRepository repository)
 
 
             return new ServerHardwareRow(
-                Name: server.Name,
-                CpuSummary: cpuSummary,
-                TotalCores: totalCores,
-                TotalThreads: totalThreads,
-                RamGb: ramGb,
-                TotalStorageGb: totalStorage,
-                SsdStorageGb: ssdStorage,
-                HddStorageGb: hddStorage,
-                TotalNicPorts: totalNicPorts,
-                MaxNicSpeedGb: maxNicSpeed,
-                GpuCount: gpuCount,
-                TotalGpuVramGb: totalGpuVram,
-                GpuSummary: gpuSummary,
-                Ipmi: server.Ipmi ?? false
+                server.Name,
+                cpuSummary,
+                totalCores,
+                totalThreads,
+                ramGb,
+                totalStorage,
+                ssdStorage,
+                hddStorage,
+                totalNicPorts,
+                maxNicSpeed,
+                gpuCount,
+                totalGpuVram,
+                gpuSummary,
+                server.Ipmi ?? false
             );
         }).ToList();
 
         return new ServerHardwareReport(rows);
     }
-}
+}

+ 9 - 7
RackPeek.Domain/Resources/Hardware/Reports/SwitchHardwareReport.cs

@@ -1,6 +1,7 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Reports;
+
 public record SwitchHardwareReport(
     IReadOnlyList<SwitchHardwareRow> Switches
 );
@@ -14,6 +15,7 @@ public record SwitchHardwareRow(
     int MaxPortSpeedGb,
     string PortSummary
 );
+
 public class SwitchHardwareReportUseCase(IHardwareRepository repository)
 {
     public async Task<SwitchHardwareReport> ExecuteAsync()
@@ -41,13 +43,13 @@ public class SwitchHardwareReportUseCase(IHardwareRepository repository)
                         }));
 
             return new SwitchHardwareRow(
-                Name: sw.Name,
-                Model: sw.Model ?? "Unknown",
-                Managed: sw.Managed ?? false,
-                Poe: sw.Poe ?? false,
-                TotalPorts: totalPorts,
-                MaxPortSpeedGb: maxSpeed,
-                PortSummary: portSummary
+                sw.Name,
+                sw.Model ?? "Unknown",
+                sw.Managed ?? false,
+                sw.Poe ?? false,
+                totalPorts,
+                maxSpeed,
+                portSummary
             );
         }).ToList();
 

+ 4 - 3
RackPeek.Domain/Resources/Hardware/Reports/UpsHardwareReport.cs

@@ -1,6 +1,7 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Reports;
+
 public record UpsHardwareReport(
     IReadOnlyList<UpsHardwareRow> UpsUnits
 );
@@ -21,9 +22,9 @@ public class UpsHardwareReportUseCase(IHardwareRepository repository)
         var rows = upsUnits.Select(ups =>
         {
             return new UpsHardwareRow(
-                Name: ups.Name,
-                Model: ups.Model ?? "Unknown",
-                Va: ups.Va ?? 0
+                ups.Name,
+                ups.Model ?? "Unknown",
+                ups.Va ?? 0
             );
         }).ToList();
 

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Server/AddServerUseCase.cs

@@ -11,7 +11,7 @@ public class AddServerUseCase(IHardwareRepository repository)
 
         var server = new Models.Server
         {
-            Name = name,
+            Name = name
         };
 
         await repository.AddAsync(server);

+ 2 - 5
RackPeek.Domain/Resources/Hardware/Server/Cpu/AddCpuUseCase.cs

@@ -10,13 +10,10 @@ public class AddCpuUseCase(IHardwareRepository repository)
     {
         var hardware = await repository.GetByNameAsync(serverName);
 
-        if (hardware is not Models.Server server)
-        {
-            return;
-        }
+        if (hardware is not Models.Server server) return;
 
         server.Cpus ??= [];
-        
+
         server.Cpus.Add(new Models.Cpu
         {
             Model = model,

+ 2 - 5
RackPeek.Domain/Resources/Hardware/Server/Cpu/RemoveCpuUseCase.cs

@@ -7,11 +7,8 @@ public class RemoveCpuUseCase(IHardwareRepository repository)
         int index)
     {
         var hardware = await repository.GetByNameAsync(serverName);
-        if (hardware is not Models.Server server)
-        {
-            return;
-        }
-        
+        if (hardware is not Models.Server server) return;
+
         server.Cpus ??= [];
 
         if (index < 0 || index >= server.Cpus.Count)

+ 3 - 6
RackPeek.Domain/Resources/Hardware/Server/Cpu/UpdateCpuUseCase.cs

@@ -11,13 +11,10 @@ public class UpdateCpuUseCase(IHardwareRepository repository)
     {
         var hardware = await repository.GetByNameAsync(serverName);
 
-        if (hardware is not Models.Server server)
-        {
-            return;
-        }
-        
+        if (hardware is not Models.Server server) return;
+
         server.Cpus ??= [];
-        
+
         if (index < 0 || index >= server.Cpus.Count)
             throw new ArgumentOutOfRangeException(nameof(index), "CPU index out of range.");
 

+ 8 - 8
RackPeek.Domain/Resources/Hardware/Server/DescribeServerUseCase.cs

@@ -27,14 +27,14 @@ public class DescribeServerUseCase(IHardwareRepository repository)
                     .Select(g => $"{g.Count()}× {g.Key}"));
 
         return new ServerDescription(
-            Name: server.Name,
-            CpuSummary: cpuSummary,
-            TotalCores: server.Cpus?.Sum(c => c.Cores) ?? 0,
-            TotalThreads: server.Cpus?.Sum(c => c.Threads) ?? 0,
-            RamGb: server.Ram?.Size ?? 0,
-            TotalStorageGb: server.Drives?.Sum(d => d.Size) ?? 0,
-            NicPorts: server.Nics?.Sum(n => n.Ports) ?? 0,
-            Ipmi: server.Ipmi ?? false
+            server.Name,
+            cpuSummary,
+            server.Cpus?.Sum(c => c.Cores) ?? 0,
+            server.Cpus?.Sum(c => c.Threads) ?? 0,
+            server.Ram?.Size ?? 0,
+            server.Drives?.Sum(d => d.Size) ?? 0,
+            server.Nics?.Sum(n => n.Ports) ?? 0,
+            server.Ipmi ?? false
         );
     }
 }

+ 2 - 5
RackPeek.Domain/Resources/Hardware/Server/Drive/AddDriveUseCase.cs

@@ -9,10 +9,7 @@ public class AddDrivesUseCase(IHardwareRepository repository)
     {
         var hardware = await repository.GetByNameAsync(serverName);
 
-        if (hardware is not Models.Server server)
-        {
-            return;
-        }
+        if (hardware is not Models.Server server) return;
 
         server.Drives ??= [];
 
@@ -21,7 +18,7 @@ public class AddDrivesUseCase(IHardwareRepository repository)
             Type = type,
             Size = size
         });
-        
+
         await repository.UpdateAsync(server);
     }
 }

+ 1 - 4
RackPeek.Domain/Resources/Hardware/Server/Drive/UpdateDriveUseCase.cs

@@ -5,10 +5,7 @@ public class UpdateDriveUseCase(IHardwareRepository repository)
     public async Task ExecuteAsync(string serverName, int index, string type, int size)
     {
         var hardware = await repository.GetByNameAsync(serverName);
-        if (hardware is not Models.Server server)
-        {
-            return;
-        }
+        if (hardware is not Models.Server server) return;
 
         server.Drives ??= [];
         if (index < 0 || index >= server.Drives.Count)

+ 2 - 5
RackPeek.Domain/Resources/Hardware/Server/UpdateServerUseCase.cs

@@ -22,11 +22,8 @@ public class UpdateServerUseCase(IHardwareRepository repository)
         }
 
         // ---- IPMI ----
-        if (ipmi.HasValue)
-        {
-            server.Ipmi = ipmi.Value;
-        }
+        if (ipmi.HasValue) server.Ipmi = ipmi.Value;
 
         await repository.UpdateAsync(server);
     }
-}
+}

+ 4 - 2
RackPeek.Domain/Resources/Hardware/Switchs/AddSwitchUseCase.cs

@@ -1,3 +1,5 @@
+using RackPeek.Domain.Resources.Hardware.Models;
+
 namespace RackPeek.Domain.Resources.Hardware.Switchs;
 
 public class AddSwitchUseCase(IHardwareRepository repository)
@@ -9,9 +11,9 @@ public class AddSwitchUseCase(IHardwareRepository repository)
         if (existing != null)
             throw new InvalidOperationException($"Switch '{name}' already exists.");
 
-        var switchResource = new Models.Switch
+        var switchResource = new Switch
         {
-            Name = name,
+            Name = name
         };
 
         await repository.AddAsync(switchResource);

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switchs/DescribeSwitchUseCase.cs

@@ -16,7 +16,7 @@ public class DescribeSwitchUseCase(IHardwareRepository repository)
 {
     public async Task<SwitchDescription?> ExecuteAsync(string name)
     {
-        var switchResource = await repository.GetByNameAsync(name) as Models.Switch;
+        var switchResource = await repository.GetByNameAsync(name) as Switch;
         if (switchResource == null)
             return null;
 

+ 4 - 2
RackPeek.Domain/Resources/Hardware/Switchs/GetSwitchUseCase.cs

@@ -1,10 +1,12 @@
+using RackPeek.Domain.Resources.Hardware.Models;
+
 namespace RackPeek.Domain.Resources.Hardware.Switchs;
 
 public class GetSwitchUseCase(IHardwareRepository repository)
 {
-    public async Task<Models.Switch?> ExecuteAsync(string name)
+    public async Task<Switch?> ExecuteAsync(string name)
     {
         var hardware = await repository.GetByNameAsync(name);
-        return hardware as Models.Switch;
+        return hardware as Switch;
     }
 }

+ 4 - 2
RackPeek.Domain/Resources/Hardware/Switchs/GetSwitchesUseCase.cs

@@ -1,10 +1,12 @@
+using RackPeek.Domain.Resources.Hardware.Models;
+
 namespace RackPeek.Domain.Resources.Hardware.Switchs;
 
 public class GetSwitchesUseCase(IHardwareRepository repository)
 {
-    public async Task<IReadOnlyList<Models.Switch>> ExecuteAsync()
+    public async Task<IReadOnlyList<Switch>> ExecuteAsync()
     {
         var hardware = await repository.GetAllAsync();
-        return hardware.OfType<Models.Switch>().ToList();
+        return hardware.OfType<Switch>().ToList();
     }
 }

+ 10 - 8
RackPeek.Domain/Resources/Hardware/Switchs/UpdateSwitchUseCase.cs

@@ -1,3 +1,5 @@
+using RackPeek.Domain.Resources.Hardware.Models;
+
 namespace RackPeek.Domain.Resources.Hardware.Switchs;
 
 public class UpdateSwitchUseCase(IHardwareRepository repository)
@@ -9,19 +11,19 @@ public class UpdateSwitchUseCase(IHardwareRepository repository)
         bool? poe = null
     )
     {
-        var switchResource = await repository.GetByNameAsync(name) as Models.Switch;
+        var switchResource = await repository.GetByNameAsync(name) as Switch;
         if (switchResource == null)
             throw new InvalidOperationException($"Switch '{name}' not found.");
 
-        if(!string.IsNullOrWhiteSpace(model))
+        if (!string.IsNullOrWhiteSpace(model))
             switchResource.Model = model;
-        
-        if(managed.HasValue)
+
+        if (managed.HasValue)
             switchResource.Managed = managed.Value;
-        
-        if(poe.HasValue)
+
+        if (poe.HasValue)
             switchResource.Poe = poe.Value;
-        
+
         await repository.UpdateAsync(switchResource);
     }
-}
+}

+ 2 - 2
RackPeek.Domain/Resources/Resource.cs

@@ -3,8 +3,8 @@ namespace RackPeek.Domain.Resources;
 public abstract class Resource
 {
     public string Kind { get; set; } = string.Empty;
-    
+
     public required string Name { get; set; }
-    
+
     public Dictionary<string, string>? Tags { get; set; }
 }

+ 0 - 2
RackPeek/Commands/AccessPointReportCommand.cs

@@ -31,13 +31,11 @@ public class AccessPointReportCommand(
             .AddColumn("Speed (Gb)");
 
         foreach (var ap in report.AccessPoints)
-        {
             table.AddRow(
                 ap.Name,
                 ap.Model,
                 $"{ap.SpeedGb}G"
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;

+ 0 - 2
RackPeek/Commands/DesktopReportCommand.cs

@@ -35,7 +35,6 @@ public class DesktopReportCommand(
             .AddColumn("GPU");
 
         foreach (var d in report.Desktops)
-        {
             table.AddRow(
                 d.Name,
                 d.CpuSummary,
@@ -45,7 +44,6 @@ public class DesktopReportCommand(
                 d.NicSummary,
                 d.GpuSummary
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;

+ 5 - 7
RackPeek/Commands/Server/Cpus/ServerCpuAddCommand.cs

@@ -4,16 +4,14 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server.Cpus;
+
 public class ServerCpuAddSettings : ServerNameSettings
 {
-    [CommandOption("--model <MODEL>")]
-    public string Model { get; set; }
+    [CommandOption("--model <MODEL>")] public string Model { get; set; }
+
+    [CommandOption("--cores <CORES>")] public int Cores { get; set; }
 
-    [CommandOption("--cores <CORES>")]
-    public int Cores { get; set; }
-    
-    [CommandOption("--threads <THREADS>")]
-    public int Threads { get; set; }
+    [CommandOption("--threads <THREADS>")] public int Threads { get; set; }
 }
 
 public class ServerCpuAddCommand(

+ 3 - 2
RackPeek/Commands/Server/Cpus/ServerCpuRemoveCommand.cs

@@ -4,11 +4,12 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server.Cpus;
+
 public class ServerCpuRemoveSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
 }
+
 public class ServerCpuRemoveCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuRemoveSettings>
 {
     public override async Task<int> ExecuteAsync(

+ 7 - 9
RackPeek/Commands/Server/Cpus/ServerCpuSetCommand.cs

@@ -4,20 +4,18 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server.Cpus;
+
 public class ServerCpuSetSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
+
+    [CommandOption("--model <MODEL>")] public string Model { get; set; }
 
-    [CommandOption("--model <MODEL>")]
-    public string Model { get; set; }
+    [CommandOption("--cores <CORES>")] public int Cores { get; set; }
 
-    [CommandOption("--cores <CORES>")]
-    public int Cores { get; set; }
-    
-    [CommandOption("--threads <THREADS>")]
-    public int Threads { get; set; }
+    [CommandOption("--threads <THREADS>")] public int Threads { get; set; }
 }
+
 public class ServerCpuSetCommand(IServiceProvider serviceProvider) : AsyncCommand<ServerCpuSetSettings>
 {
     public override async Task<int> ExecuteAsync(

+ 2 - 4
RackPeek/Commands/Server/Drives/ServerDriveAddCommand.cs

@@ -7,11 +7,9 @@ namespace RackPeek.Commands.Server.Drives;
 
 public class ServerDriveAddSettings : ServerNameSettings
 {
-    [CommandOption("--type <TYPE>")]
-    public string Type { get; set; }
+    [CommandOption("--type <TYPE>")] public string Type { get; set; }
 
-    [CommandOption("--size <SIZE>")]
-    public int Size { get; set; }
+    [CommandOption("--size <SIZE>")] public int Size { get; set; }
 }
 
 public class ServerDriveAddCommand(IServiceProvider serviceProvider)

+ 1 - 2
RackPeek/Commands/Server/Drives/ServerDriveRemoveCommand.cs

@@ -7,8 +7,7 @@ namespace RackPeek.Commands.Server.Drives;
 
 public class ServerDriveRemoveSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
 }
 
 public class ServerDriveRemoveCommand(IServiceProvider serviceProvider)

+ 3 - 6
RackPeek/Commands/Server/Drives/ServerDriveUpdateCommand.cs

@@ -7,14 +7,11 @@ namespace RackPeek.Commands.Server.Drives;
 
 public class ServerDriveUpdateSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
 
-    [CommandOption("--type <TYPE>")]
-    public string Type { get; set; }
+    [CommandOption("--type <TYPE>")] public string Type { get; set; }
 
-    [CommandOption("--size <SIZE>")]
-    public int Size { get; set; }
+    [CommandOption("--size <SIZE>")] public int Size { get; set; }
 }
 
 public class ServerDriveUpdateCommand(IServiceProvider serviceProvider)

+ 3 - 6
RackPeek/Commands/Server/Nics/ServerNicAddCommand.cs

@@ -7,14 +7,11 @@ namespace RackPeek.Commands.Server.Nics;
 
 public class ServerNicAddSettings : ServerNameSettings
 {
-    [CommandOption("--type <TYPE>")]
-    public string Type { get; set; }
+    [CommandOption("--type <TYPE>")] public string Type { get; set; }
 
-    [CommandOption("--speed <SPEED>")]
-    public int Speed { get; set; }
+    [CommandOption("--speed <SPEED>")] public int Speed { get; set; }
 
-    [CommandOption("--ports <PORTS>")]
-    public int Ports { get; set; }
+    [CommandOption("--ports <PORTS>")] public int Ports { get; set; }
 }
 
 public class ServerNicAddCommand(IServiceProvider serviceProvider)

+ 1 - 2
RackPeek/Commands/Server/Nics/ServerNicRemoveCommand.cs

@@ -7,8 +7,7 @@ namespace RackPeek.Commands.Server.Nics;
 
 public class ServerNicRemoveSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
 }
 
 public class ServerNicRemoveCommand(IServiceProvider serviceProvider)

+ 4 - 8
RackPeek/Commands/Server/Nics/ServerNicUpdateCommand.cs

@@ -7,17 +7,13 @@ namespace RackPeek.Commands.Server.Nics;
 
 public class ServerNicUpdateSettings : ServerNameSettings
 {
-    [CommandOption("--index <INDEX>")]
-    public int Index { get; set; }
+    [CommandOption("--index <INDEX>")] public int Index { get; set; }
 
-    [CommandOption("--type <TYPE>")]
-    public string Type { get; set; }
+    [CommandOption("--type <TYPE>")] public string Type { get; set; }
 
-    [CommandOption("--speed <SPEED>")]
-    public int Speed { get; set; }
+    [CommandOption("--speed <SPEED>")] public int Speed { get; set; }
 
-    [CommandOption("--ports <PORTS>")]
-    public int Ports { get; set; }
+    [CommandOption("--ports <PORTS>")] public int Ports { get; set; }
 }
 
 public class ServerNicUpdateCommand(IServiceProvider serviceProvider)

+ 2 - 2
RackPeek/Commands/Server/ServerAddCommand.cs

@@ -4,10 +4,10 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server;
+
 public class ServerAddSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")]
-    public string Name { get; set; } = default!;
+    [CommandArgument(0, "<name>")] public string Name { get; set; } = default!;
 }
 
 public class ServerAddCommand(

+ 1 - 2
RackPeek/Commands/Server/ServerCommands.cs

@@ -4,6 +4,5 @@ namespace RackPeek.Commands.Server;
 
 public class ServerNameSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")]
-    public string Name { get; set; } = default!;
+    [CommandArgument(0, "<name>")] public string Name { get; set; } = default!;
 }

+ 0 - 2
RackPeek/Commands/Server/ServerDescribeCommand.cs

@@ -34,10 +34,8 @@ public class ServerDescribeCommand(
         grid.AddRow("RAM", $"{server.Ram?.Size ?? 0} GB");
 
         if (server.Cpus != null)
-        {
             foreach (var cpu in server.Cpus)
                 grid.AddRow("CPU", $"{cpu.Model} ({cpu.Cores}/{cpu.Threads})");
-        }
 
         AnsiConsole.Write(
             new Panel(grid)

+ 0 - 2
RackPeek/Commands/Server/ServerGetCommand.cs

@@ -35,7 +35,6 @@ public class ServerGetCommand(
             .AddColumn("IPMI");
 
         foreach (var s in report.Servers)
-        {
             table.AddRow(
                 s.Name,
                 s.CpuSummary,
@@ -45,7 +44,6 @@ public class ServerGetCommand(
                 $"{s.TotalNicPorts}×{s.MaxNicSpeedGb}G",
                 s.Ipmi ? "[green]yes[/]" : "[red]no[/]"
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;

+ 11 - 12
RackPeek/Commands/Server/ServerReportCommand.cs

@@ -5,6 +5,7 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server;
+
 public class ServerReportCommand(ILogger<ServerReportCommand> logger, IServiceProvider serviceProvider)
     : AsyncCommand
 {
@@ -33,22 +34,20 @@ public class ServerReportCommand(ILogger<ServerReportCommand> logger, IServicePr
             .AddColumn("IPMI");
 
         foreach (var s in report.Servers)
-        {
             table.AddRow(
-                    s.Name,
-                    s.CpuSummary,
-                    $"{s.TotalCores}/{s.TotalThreads}",
-                    $"{s.RamGb} GB",
-                    $"{s.TotalStorageGb} GB (SSD {s.SsdStorageGb} / HDD {s.HddStorageGb})",
-                    $"{s.TotalNicPorts}×{s.MaxNicSpeedGb}G",
-                    s.GpuCount == 0
-                        ? "[grey]none[/]"
-                        : $"{s.GpuSummary} ({s.TotalGpuVramGb} GB VRAM)",
+                s.Name,
+                s.CpuSummary,
+                $"{s.TotalCores}/{s.TotalThreads}",
+                $"{s.RamGb} GB",
+                $"{s.TotalStorageGb} GB (SSD {s.SsdStorageGb} / HDD {s.HddStorageGb})",
+                $"{s.TotalNicPorts}×{s.MaxNicSpeedGb}G",
+                s.GpuCount == 0
+                    ? "[grey]none[/]"
+                    : $"{s.GpuSummary} ({s.TotalGpuVramGb} GB VRAM)",
                 s.Ipmi ? "[green]yes[/]" : "[red]no[/]"
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;
     }
-}
+}

+ 3 - 4
RackPeek/Commands/Server/ServerSetCommand.cs

@@ -4,13 +4,12 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Server;
+
 public class ServerSetSettings : ServerNameSettings
 {
-    [CommandOption("--ram <GB>")]
-    public int RamGb { get; set; }
+    [CommandOption("--ram <GB>")] public int RamGb { get; set; }
 
-    [CommandOption("--ipmi")]
-    public bool Ipmi { get; set; }
+    [CommandOption("--ipmi")] public bool Ipmi { get; set; }
 }
 
 public class ServerSetCommand(

+ 1 - 3
RackPeek/Commands/SwitchReportCommand.cs

@@ -35,7 +35,6 @@ public class SwitchReportCommand(
             .AddColumn("Port Summary");
 
         foreach (var s in report.Switches)
-        {
             table.AddRow(
                 s.Name,
                 s.Model,
@@ -45,9 +44,8 @@ public class SwitchReportCommand(
                 $"{s.MaxPortSpeedGb}G",
                 s.PortSummary
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;
     }
-}
+}

+ 2 - 2
RackPeek/Commands/Switches/SwitchAddCommand.cs

@@ -4,10 +4,10 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Switches;
+
 public class SwitchAddSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")]
-    public string Name { get; set; } = default!;
+    [CommandArgument(0, "<name>")] public string Name { get; set; } = default!;
 }
 
 public class SwitchAddCommand(

+ 1 - 2
RackPeek/Commands/Switches/SwitchCommands.cs

@@ -4,6 +4,5 @@ namespace RackPeek.Commands.Switches;
 
 public class SwitchNameSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")]
-    public string Name { get; set; } = default!;
+    [CommandArgument(0, "<name>")] public string Name { get; set; } = default!;
 }

+ 3 - 2
RackPeek/Commands/Switches/SwitchDescribeCommand.cs

@@ -4,6 +4,7 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Switches;
+
 public class SwitchDescribeCommand(
     IServiceProvider serviceProvider
 ) : AsyncCommand<SwitchNameSettings>
@@ -30,8 +31,8 @@ public class SwitchDescribeCommand(
 
         grid.AddRow("Name:", sw.Name);
         grid.AddRow("Model:", sw.Model ?? "Unknown");
-        grid.AddRow("Managed:", sw.Managed.HasValue ? (sw.Managed.Value ? "Yes" : "No") : "Unknown");
-        grid.AddRow("PoE:", sw.Poe.HasValue ? (sw.Poe.Value ? "Yes" : "No") : "Unknown");
+        grid.AddRow("Managed:", sw.Managed.HasValue ? sw.Managed.Value ? "Yes" : "No" : "Unknown");
+        grid.AddRow("PoE:", sw.Poe.HasValue ? sw.Poe.Value ? "Yes" : "No" : "Unknown");
         grid.AddRow("Total Ports:", sw.TotalPorts.ToString());
         grid.AddRow("Total Speed (Gb):", sw.TotalSpeedGb.ToString());
         grid.AddRow("Ports:", sw.PortSummary);

+ 1 - 0
RackPeek/Commands/Switches/SwitchGetByNameCommand.cs

@@ -4,6 +4,7 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Switches;
+
 public class SwitchGetByNameCommand(
     IServiceProvider serviceProvider
 ) : AsyncCommand<SwitchNameSettings>

+ 2 - 4
RackPeek/Commands/Switches/SwitchGetCommand.cs

@@ -34,16 +34,14 @@ public class SwitchGetCommand(
             .AddColumn("Port Summary");
 
         foreach (var s in report.Switches)
-        {
             table.AddRow(
                 s.Name,
                 s.Model ?? "Unknown",
-                s.Managed == true ? "[green]yes[/]" : "[red]no[/]",
-                s.Poe == true ? "[green]yes[/]" : "[red]no[/]",
+                s.Managed ? "[green]yes[/]" : "[red]no[/]",
+                s.Poe ? "[green]yes[/]" : "[red]no[/]",
                 s.TotalPorts.ToString(),
                 s.PortSummary
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;

+ 4 - 5
RackPeek/Commands/Switches/SwitchSetCommand.cs

@@ -5,15 +5,14 @@ using Spectre.Console;
 using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Switches;
+
 public class SwitchSetSettings : ServerNameSettings
 {
     [CommandOption("--Model")] public string Model { get; set; } = default!;
 
-    [CommandOption("--managed")]
-    public bool Managed { get; set; }
-    
-    [CommandOption("--poe")]
-    public bool Poe { get; set; }
+    [CommandOption("--managed")] public bool Managed { get; set; }
+
+    [CommandOption("--poe")] public bool Poe { get; set; }
 }
 
 public class SwitchSetCommand(

+ 0 - 2
RackPeek/Commands/UpsReportCommand.cs

@@ -31,13 +31,11 @@ public class UpsReportCommand(
             .AddColumn("VA");
 
         foreach (var u in report.UpsUnits)
-        {
             table.AddRow(
                 u.Name,
                 u.Model,
                 u.Va.ToString()
             );
-        }
 
         AnsiConsole.Write(table);
         return 0;

+ 65 - 71
RackPeek/Program.cs

@@ -1,28 +1,22 @@
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Hardware;
-using Spectre.Console;
-using Spectre.Console.Cli;
 using Microsoft.Extensions.Logging;
 using RackPeek.Commands;
 using RackPeek.Commands.Server;
 using RackPeek.Commands.Server.Cpus;
-using RackPeek.Commands.Switches;
-using RackPeek.Domain.Resources.Hardware.Reports;
-using RackPeek.Domain.Resources.Hardware.Server;
-using RackPeek.Domain.Resources.Hardware.Server.Cpu;
-using RackPeek.Domain.Resources.Hardware.Switchs;
-using RackPeek.Commands.Server.Nics;
-using RackPeek.Domain.Resources.Hardware.Reports;
-using RackPeek.Domain.Resources.Hardware.Server;
-using RackPeek.Domain.Resources.Hardware.Server.Cpu;
-using RackPeek.Domain.Resources.Hardware.Server.Nic;
 using RackPeek.Commands.Server.Drives;
+using RackPeek.Commands.Server.Nics;
+using RackPeek.Commands.Switches;
+using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Reports;
 using RackPeek.Domain.Resources.Hardware.Server;
 using RackPeek.Domain.Resources.Hardware.Server.Cpu;
 using RackPeek.Domain.Resources.Hardware.Server.Drive;
+using RackPeek.Domain.Resources.Hardware.Server.Nic;
+using RackPeek.Domain.Resources.Hardware.Switchs;
 using RackPeek.Yaml;
+using Spectre.Console;
+using Spectre.Console.Cli;
 
 namespace RackPeek;
 
@@ -33,7 +27,7 @@ public static class Program
         // Configuration
         var configuration = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
-            .AddJsonFile("appsettings.json", optional: true)
+            .AddJsonFile("appsettings.json", true)
             .Build();
 
         // DI
@@ -45,7 +39,7 @@ public static class Program
         services.AddScoped<IHardwareRepository>(_ =>
         {
             var path = configuration["HardwareFile"] ?? "hardware.yaml";
-            
+
             var collection = new YamlResourceCollection();
             collection.LoadFiles([
                 "servers.yaml",
@@ -55,17 +49,17 @@ public static class Program
                 "ups.yaml",
                 "firewalls.yaml",
                 "laptops.yaml",
-                "routers.yaml"]);
+                "routers.yaml"
+            ]);
 
             return new YamlHardwareRepository(collection);
         });
-        
+
         services.AddLogging(configure =>
             configure
                 .AddSimpleConsole(opts => { opts.TimestampFormat = "yyyy-MM-dd HH:mm:ss "; }));
 
 
-        
         // Application
         services.AddScoped<ServerHardwareReportUseCase>();
         services.AddScoped<ServerReportCommand>();
@@ -77,27 +71,27 @@ public static class Program
         services.AddScoped<UpsReportCommand>();
         services.AddScoped<DesktopHardwareReportUseCase>();
         services.AddScoped<DesktopReportCommand>();
-        
+
         services.AddScoped<AddServerUseCase>();
         services.AddScoped<ServerAddCommand>();
-        
+
         services.AddScoped<DeleteServerUseCase>();
         services.AddScoped<ServerDeleteCommand>();
 
         services.AddScoped<DescribeServerUseCase>();
         services.AddScoped<ServerDescribeCommand>();
-        
+
         services.AddScoped<GetServerUseCase>();
         services.AddScoped<ServerGetByNameCommand>();
-        
+
         services.AddScoped<UpdateServerUseCase>();
         services.AddScoped<ServerSetCommand>();
-        
+
         // CPU use cases
         services.AddScoped<AddCpuUseCase>();
         services.AddScoped<UpdateCpuUseCase>();
         services.AddScoped<RemoveCpuUseCase>();
-        
+
         // Drive use cases
         services.AddScoped<AddDrivesUseCase>();
         services.AddScoped<UpdateDriveUseCase>();
@@ -108,7 +102,7 @@ public static class Program
         services.AddScoped<ServerCpuAddCommand>();
         services.AddScoped<ServerCpuSetCommand>();
         services.AddScoped<ServerCpuRemoveCommand>();
-        
+
         // Switch commands
         services.AddScoped<SwitchAddCommand>();
         services.AddScoped<SwitchDeleteCommand>();
@@ -116,7 +110,7 @@ public static class Program
         services.AddScoped<SwitchGetByNameCommand>();
         services.AddScoped<SwitchGetCommand>();
         services.AddScoped<SwitchSetCommand>();
-        
+
         // Switch Usecases
         services.AddScoped<AddSwitchUseCase>();
         services.AddScoped<DeleteSwitchUseCase>();
@@ -128,7 +122,7 @@ public static class Program
         services.AddScoped<AddNicUseCase>();
         services.AddScoped<UpdateNicUseCase>();
         services.AddScoped<RemoveNicUseCase>();
-        
+
         // NIC commands
         services.AddScoped<ServerNicAddCommand>();
         services.AddScoped<ServerNicUpdateCommand>();
@@ -138,7 +132,7 @@ public static class Program
         services.AddScoped<ServerDriveUpdateCommand>();
         services.AddScoped<ServerDriveRemoveCommand>();
 
-        
+
         // Spectre bootstrap
         var registrar = new TypeRegistrar(services);
         var app = new CommandApp(registrar);
@@ -153,10 +147,10 @@ public static class Program
             config.AddBranch("servers", server =>
             {
                 server.SetDescription("Manage servers");
-                
+
                 server.AddCommand<ServerReportCommand>("summary")
                     .WithDescription("Show server hardware report");
-                
+
                 server.AddCommand<ServerAddCommand>("add")
                     .WithDescription("Add a new server");
 
@@ -171,7 +165,7 @@ public static class Program
 
                 server.AddCommand<ServerDeleteCommand>("del")
                     .WithDescription("Delete a server");
-                
+
                 server.AddBranch("cpu", cpu =>
                 {
                     cpu.SetDescription("Manage server CPUs");
@@ -185,7 +179,7 @@ public static class Program
                     cpu.AddCommand<ServerCpuRemoveCommand>("del")
                         .WithDescription("Remove a CPU from a server");
                 });
-                
+
                 server.AddBranch("nic", nic =>
                 {
                     nic.SetDescription("Manage server NICs");
@@ -198,58 +192,58 @@ public static class Program
 
                     nic.AddCommand<ServerNicRemoveCommand>("del")
                         .WithDescription("Remove a NIC from a server");
-                server.AddBranch("drive", drive =>
-                {
-                    drive.SetDescription("Manage server drives");
+                    server.AddBranch("drive", drive =>
+                    {
+                        drive.SetDescription("Manage server drives");
 
-                    drive.AddCommand<ServerDriveAddCommand>("add")
-                        .WithDescription("Add a drive to a server");
+                        drive.AddCommand<ServerDriveAddCommand>("add")
+                            .WithDescription("Add a drive to a server");
 
-                    drive.AddCommand<ServerDriveUpdateCommand>("set")
-                        .WithDescription("Update a drive on a server");
+                        drive.AddCommand<ServerDriveUpdateCommand>("set")
+                            .WithDescription("Update a drive on a server");
 
-                    drive.AddCommand<ServerDriveRemoveCommand>("del")
-                        .WithDescription("Remove a drive from a server");
+                        drive.AddCommand<ServerDriveRemoveCommand>("del")
+                            .WithDescription("Remove a drive from a server");
+                    });
                 });
 
-            });
+                config.AddBranch("switches", server =>
+                {
+                    server.SetDescription("Manage switches");
 
-            config.AddBranch("switches", server =>
-            {
-                server.SetDescription("Manage switches");
-                
-                server.AddCommand<SwitchReportCommand>("summary")
-                    .WithDescription("Show switch hardware report");
-                
-                server.AddCommand<SwitchAddCommand>("add")
-                    .WithDescription("Add a new switch");
+                    server.AddCommand<SwitchReportCommand>("summary")
+                        .WithDescription("Show switch hardware report");
 
-                server.AddCommand<SwitchGetByNameCommand>("get")
-                    .WithDescription("List switches or get a switches by name");
+                    server.AddCommand<SwitchAddCommand>("add")
+                        .WithDescription("Add a new switch");
 
-                server.AddCommand<SwitchDescribeCommand>("describe")
-                    .WithDescription("Show detailed information about a switch");
+                    server.AddCommand<SwitchGetByNameCommand>("get")
+                        .WithDescription("List switches or get a switches by name");
 
-                server.AddCommand<SwitchSetCommand>("set")
-                    .WithDescription("Update switch properties");
+                    server.AddCommand<SwitchDescribeCommand>("describe")
+                        .WithDescription("Show detailed information about a switch");
 
-                server.AddCommand<SwitchDeleteCommand>("del")
-                    .WithDescription("Delete a switch");
-            });
-            
-            // ----------------------------
-            // Reports (read-only summaries)
-            // ----------------------------
-            config.AddCommand<AccessPointReportCommand>("ap")
-                .WithDescription("Show access point hardware report");
+                    server.AddCommand<SwitchSetCommand>("set")
+                        .WithDescription("Update switch properties");
+
+                    server.AddCommand<SwitchDeleteCommand>("del")
+                        .WithDescription("Delete a switch");
+                });
 
-            config.AddCommand<DesktopReportCommand>("desktops")
-                .WithDescription("Show desktop hardware report");
+                // ----------------------------
+                // Reports (read-only summaries)
+                // ----------------------------
+                config.AddCommand<AccessPointReportCommand>("ap")
+                    .WithDescription("Show access point hardware report");
 
-            config.AddCommand<UpsReportCommand>("ups")
-                .WithDescription("Show UPS hardware report");
+                config.AddCommand<DesktopReportCommand>("desktops")
+                    .WithDescription("Show desktop hardware report");
 
-            config.ValidateExamples();
+                config.AddCommand<UpsReportCommand>("ups")
+                    .WithDescription("Show UPS hardware report");
+
+                config.ValidateExamples();
+            });
         });
 
         return await app.RunAsync(args);

+ 10 - 10
RackPeek/RackPeek.csproj

@@ -8,19 +8,19 @@
     </PropertyGroup>
 
     <ItemGroup>
-      <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.2" />
-      <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.2" />
-      <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.2" />
-      <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
-      <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2" />
-      <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
-      <PackageReference Include="Spectre.Console" Version="0.54.0" />
-      <PackageReference Include="Spectre.Console.Cli" Version="0.53.1" />
-      <PackageReference Include="YamlDotNet" Version="16.3.0" />
+        <PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.2"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.2"/>
+        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.2"/>
+        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2"/>
+        <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.2"/>
+        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2"/>
+        <PackageReference Include="Spectre.Console" Version="0.54.0"/>
+        <PackageReference Include="Spectre.Console.Cli" Version="0.53.1"/>
+        <PackageReference Include="YamlDotNet" Version="16.3.0"/>
     </ItemGroup>
 
     <ItemGroup>
-      <ProjectReference Include="..\RackPeek.Domain\RackPeek.Domain.csproj" />
+        <ProjectReference Include="..\RackPeek.Domain\RackPeek.Domain.csproj"/>
     </ItemGroup>
 
 </Project>

+ 4 - 4
RackPeek/TypeRegistrar.cs

@@ -28,13 +28,13 @@ public sealed class TypeRegistrar(IServiceCollection services) : ITypeRegistrar
 
 public sealed class TypeResolver(ServiceProvider provider) : ITypeResolver, IDisposable
 {
-    public object? Resolve(Type? type)
+    public void Dispose()
     {
-        return type == null ? null : provider.GetService(type);
+        provider.Dispose();
     }
 
-    public void Dispose()
+    public object? Resolve(Type? type)
     {
-        provider.Dispose();
+        return type == null ? null : provider.GetService(type);
     }
 }

+ 8 - 6
RackPeek/Yaml/Converters.cs

@@ -26,11 +26,13 @@ public static class StorageSizeParser
 
 public class StorageSizeYamlConverter : IYamlTypeConverter
 {
-    public bool Accepts(Type type) =>
-        type == typeof(int) ||
-        type == typeof(int?) ||
-        type == typeof(double) ||
-        type == typeof(double?);
+    public bool Accepts(Type type)
+    {
+        return type == typeof(int) ||
+               type == typeof(int?) ||
+               type == typeof(double) ||
+               type == typeof(double?);
+    }
 
     public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
     {
@@ -63,4 +65,4 @@ public class StorageSizeYamlConverter : IYamlTypeConverter
     {
         emitter.Emit(new Scalar(value?.ToString() ?? string.Empty));
     }
-}
+}

+ 8 - 6
RackPeek/Yaml/YamlHardwareRepository.cs

@@ -13,19 +13,21 @@ public class YamlHardwareRepository : IHardwareRepository
     }
 
     public Task<IReadOnlyList<Hardware>> GetAllAsync()
-        => Task.FromResult(_resources.HardwareResources);
+    {
+        return Task.FromResult(_resources.HardwareResources);
+    }
 
     public Task<Hardware?> GetByNameAsync(string name)
-        => Task.FromResult(_resources.GetByName(name) as Hardware);
+    {
+        return Task.FromResult(_resources.GetByName(name) as Hardware);
+    }
 
     public Task AddAsync(Hardware hardware)
     {
         if (_resources.HardwareResources.Any(r =>
-            r.Name.Equals(hardware.Name, StringComparison.OrdinalIgnoreCase)))
-        {
+                r.Name.Equals(hardware.Name, StringComparison.OrdinalIgnoreCase)))
             throw new InvalidOperationException(
                 $"Hardware with name '{hardware.Name}' already exists.");
-        }
 
         // Use first file as default for new resources
         var targetFile = _resources.SourceFiles.FirstOrDefault()
@@ -64,4 +66,4 @@ public class YamlHardwareRepository : IHardwareRepository
 
         return Task.CompletedTask;
     }
-}
+}

+ 4 - 13
RackPeek/Yaml/YamlResourceCollection.cs

@@ -23,27 +23,18 @@ public sealed class YamlResourceCollection
         foreach (var file in filePaths)
         {
             var yaml = File.ReadAllText(file);
-            foreach (var resource in Deserialize(yaml))
-            {
-                _entries.Add(new ResourceEntry(resource, file));
-            }
+            foreach (var resource in Deserialize(yaml)) _entries.Add(new ResourceEntry(resource, file));
         }
     }
 
     public void Load(string yaml, string file)
     {
-        foreach (var resource in Deserialize(yaml))
-        {
-            _entries.Add(new ResourceEntry(resource, file));
-        }
+        foreach (var resource in Deserialize(yaml)) _entries.Add(new ResourceEntry(resource, file));
     }
 
     public void SaveAll()
     {
-        foreach (var group in _entries.GroupBy(e => e.SourceFile))
-        {
-            SaveToFile(group.Key, group.Select(e => e.Resource));
-        }
+        foreach (var group in _entries.GroupBy(e => e.SourceFile)) SaveToFile(group.Key, group.Select(e => e.Resource));
     }
 
     // ----------------------------
@@ -189,4 +180,4 @@ public sealed class YamlResourceCollection
     }
 
     private sealed record ResourceEntry(Resource Resource, string SourceFile);
-}
+}

+ 30 - 30
RackPeek/aps.yaml

@@ -1,31 +1,31 @@
 resources:
-- kind: AccessPoint
-  model: Unifi-Ap-Pro
-  speed: 1
-  name: lounge-ap
-  tags: 
-- kind: AccessPoint
-  model: Unifi-U6-Lite
-  speed: 1
-  name: office-ap
-  tags: 
-- kind: AccessPoint
-  model: TP-Link-EAP245
-  speed: 1
-  name: garage-ap
-  tags: 
-- kind: AccessPoint
-  model: Aruba-AP-515
-  speed: 2.5
-  name: upstairs-ap
-  tags: 
-- kind: AccessPoint
-  model: Unifi-U6-Mesh
-  speed: 1
-  name: guest-ap
-  tags: 
-- kind: AccessPoint
-  model: Cisco-Aironet-1832i
-  speed: 1
-  name: warehouse-ap
-  tags: 
+  - kind: AccessPoint
+    model: Unifi-Ap-Pro
+    speed: 1
+    name: lounge-ap
+    tags:
+  - kind: AccessPoint
+    model: Unifi-U6-Lite
+    speed: 1
+    name: office-ap
+    tags:
+  - kind: AccessPoint
+    model: TP-Link-EAP245
+    speed: 1
+    name: garage-ap
+    tags:
+  - kind: AccessPoint
+    model: Aruba-AP-515
+    speed: 2.5
+    name: upstairs-ap
+    tags:
+  - kind: AccessPoint
+    model: Unifi-U6-Mesh
+    speed: 1
+    name: guest-ap
+    tags:
+  - kind: AccessPoint
+    model: Cisco-Aironet-1832i
+    speed: 1
+    name: warehouse-ap
+    tags: 

+ 20 - 20
RackPeek/desktops.yaml

@@ -1,21 +1,21 @@
 resources:
-- kind: Desktop
-  cpus:
-  - model: Intel(R) Core(TM) i5-9500
-    cores: 6
-    threads: 6
-  ram:
-    size: 16
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 512
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 1
-  gpus:
-  - model: RTX 3080
-    vram: 12
-  name: dell-optiplex
-  tags: 
+  - kind: Desktop
+    cpus:
+      - model: Intel(R) Core(TM) i5-9500
+        cores: 6
+        threads: 6
+    ram:
+      size: 16
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 512
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 1
+    gpus:
+      - model: RTX 3080
+        vram: 12
+    name: dell-optiplex
+    tags: 

+ 13 - 13
RackPeek/firewalls.yaml

@@ -1,14 +1,14 @@
 resources:
-- kind: Firewall
-  model: pfSense-1100
-  managed: true
-  poe: true
-  ports:
-  - type: rj45
-    speed: 1
-    count: 8
-  - type: sfp
-    speed: 10
-    count: 2
-  name: pfsense
-  tags: 
+  - kind: Firewall
+    model: pfSense-1100
+    managed: true
+    poe: true
+    ports:
+      - type: rj45
+        speed: 1
+        count: 8
+      - type: sfp
+        speed: 10
+        count: 2
+    name: pfsense
+    tags: 

+ 16 - 16
RackPeek/laptops.yaml

@@ -1,17 +1,17 @@
 resources:
-- kind: Laptop
-  cpus:
-  - model: Intel(R) Core(TM) i7-10510U
-    cores: 4
-    threads: 8
-  ram:
-    size: 16
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 1024
-  gpus:
-  - model: RTX 3080
-    vram: 12
-  name: thinkpad-x1
-  tags: 
+  - kind: Laptop
+    cpus:
+      - model: Intel(R) Core(TM) i7-10510U
+        cores: 4
+        threads: 8
+    ram:
+      size: 16
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 1024
+    gpus:
+      - model: RTX 3080
+        vram: 12
+    name: thinkpad-x1
+    tags: 

+ 13 - 13
RackPeek/routers.yaml

@@ -1,14 +1,14 @@
 resources:
-- kind: Router
-  model: ER-4
-  managed: true
-  poe: true
-  ports:
-  - type: rj45
-    speed: 1
-    count: 8
-  - type: sfp
-    speed: 10
-    count: 2
-  name: ubiquiti-edge-router
-  tags: 
+  - kind: Router
+    model: ER-4
+    managed: true
+    poe: true
+    ports:
+      - type: rj45
+        speed: 1
+        count: 8
+      - type: sfp
+        speed: 10
+        count: 2
+    name: ubiquiti-edge-router
+    tags: 

+ 396 - 396
RackPeek/servers.yaml

@@ -1,397 +1,397 @@
 resources:
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4110
-    cores: 8
-    threads: 16
-  ram:
-    size: 64
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 480
-  - type: ssd
-    size: 480
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: dell-c6400-node01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4110
-    cores: 8
-    threads: 16
-  ram:
-    size: 128
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 960
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: dell-c6400-node02
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4110
-    cores: 8
-    threads: 16
-  ram:
-    size: 64
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 480
-  - type: ssd
-    size: 480
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: dell-c6400-node03
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4110
-    cores: 8
-    threads: 16
-  ram:
-    size: 128
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 960
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: dell-c6400-node04
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E5-2620 v4
-    cores: 8
-    threads: 16
-  ram:
-    size: 64
-    mts: 2133
-  drives:
-  - type: hdd
-    size: 8192
-  - type: hdd
-    size: 8192
-  - type: hdd
-    size: 8192
-  - type: hdd
-    size: 8192
-  - type: ssd
-    size: 120
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 1
-  - type: sfp+
-    speed: 10
-    ports: 1
-  gpus: 
-  ipmi: true
-  name: truenas-storage01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Core(TM) i5-8500
-    cores: 6
-    threads: 6
-  ram:
-    size: 32
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 512
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 4
-  gpus: 
-  ipmi: false
-  name: proxmox-edge01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Celeron(R) J4125
-    cores: 4
-    threads: 4
-  ram:
-    size: 8
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 64
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 4
-  gpus: 
-  ipmi: false
-  name: opnsense-fw01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E3-1270 v6
-    cores: 4
-    threads: 8
-  ram:
-    size: 16
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 256
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 1
-  gpus: 
-  ipmi: true
-  name: mgmt-bastion01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E5-2630 v4
-    cores: 10
-    threads: 20
-  ram:
-    size: 64
-    mts: 2133
-  drives:
-  - type: hdd
-    size: 6144
-  - type: hdd
-    size: 6144
-  - type: hdd
-    size: 6144
-  - type: hdd
-    size: 6144
-  - type: ssd
-    size: 240
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  - type: sfp+
-    speed: 10
-    ports: 1
-  gpus: 
-  ipmi: true
-  name: truenas-backup01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4214
-    cores: 12
-    threads: 24
-  ram:
-    size: 128
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 1024
-  nics:
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus:
-  - model: NVIDIA Tesla P40
-    vram: 24
-  - model: NVIDIA Tesla P40
-    vram: 24
-  - model: NVIDIA Tesla P4
-    vram: 8
-  ipmi: true
-  name: compute-gpu01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E3-1240 v5
-    cores: 4
-    threads: 8
-  ram:
-    size: 32
-    mts: 2133
-  drives:
-  - type: ssd
-    size: 512
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: proxmox-lab01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E-2224
-    cores: 4
-    threads: 4
-  ram:
-    size: 16
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 256
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: k8s-control01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E-2224
-    cores: 4
-    threads: 4
-  ram:
-    size: 16
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 256
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: k8s-control02
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) Silver 4108
-    cores: 8
-    threads: 16
-  ram:
-    size: 64
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 1024
-  - type: ssd
-    size: 1024
-  nics:
-  - type: sfp+
-    speed: 10
-    ports: 1
-  gpus: 
-  ipmi: true
-  name: elk-logging01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Core(TM) i3-8100
-    cores: 4
-    threads: 4
-  ram:
-    size: 16
-    mts: 2400
-  drives:
-  - type: ssd
-    size: 256
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 2
-  gpus: 
-  ipmi: false
-  name: edge-node01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E5-1650 v3
-    cores: 6
-    threads: 12
-  ram:
-    size: 64
-    mts: 2133
-  drives:
-  - type: ssd
-    size: 480
-  - type: hdd
-    size: 4096
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 4
-  gpus: 
-  ipmi: true
-  name: backup-proxmox01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Core(TM) i7-8700
-    cores: 6
-    threads: 12
-  ram:
-    size: 32
-    mts: 2666
-  drives:
-  - type: ssd
-    size: 512
-  nics:
-  - type: rj45
-    speed: 1
-    ports: 1
-  gpus: 
-  ipmi: false
-  name: lab-general01
-  tags: 
-- kind: Server
-  cpus:
-  - model: Intel(R) Xeon(R) E5-2650 v3
-    cores: 10
-    threads: 20
-  ram:
-    size: 128
-    mts: 2133
-  drives:
-  - type: hdd
-    size: 4096
-  - type: hdd
-    size: 4096
-  - type: hdd
-    size: 4096
-  - type: hdd
-    size: 4096
-  nics:
-  - type: sfp+
-    speed: 10
-    ports: 2
-  gpus: 
-  ipmi: true
-  name: dell-r730-archive01
-  tags: 
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4110
+        cores: 8
+        threads: 16
+    ram:
+      size: 64
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 480
+      - type: ssd
+        size: 480
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+    ipmi: true
+    name: dell-c6400-node01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4110
+        cores: 8
+        threads: 16
+    ram:
+      size: 128
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 960
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+    ipmi: true
+    name: dell-c6400-node02
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4110
+        cores: 8
+        threads: 16
+    ram:
+      size: 64
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 480
+      - type: ssd
+        size: 480
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+    ipmi: true
+    name: dell-c6400-node03
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4110
+        cores: 8
+        threads: 16
+    ram:
+      size: 128
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 960
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+    ipmi: true
+    name: dell-c6400-node04
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E5-2620 v4
+        cores: 8
+        threads: 16
+    ram:
+      size: 64
+      mts: 2133
+    drives:
+      - type: hdd
+        size: 8192
+      - type: hdd
+        size: 8192
+      - type: hdd
+        size: 8192
+      - type: hdd
+        size: 8192
+      - type: ssd
+        size: 120
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 1
+      - type: sfp+
+        speed: 10
+        ports: 1
+    gpus:
+    ipmi: true
+    name: truenas-storage01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Core(TM) i5-8500
+        cores: 6
+        threads: 6
+    ram:
+      size: 32
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 512
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 4
+    gpus:
+    ipmi: false
+    name: proxmox-edge01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Celeron(R) J4125
+        cores: 4
+        threads: 4
+    ram:
+      size: 8
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 64
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 4
+    gpus:
+    ipmi: false
+    name: opnsense-fw01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E3-1270 v6
+        cores: 4
+        threads: 8
+    ram:
+      size: 16
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 256
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 1
+    gpus:
+    ipmi: true
+    name: mgmt-bastion01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E5-2630 v4
+        cores: 10
+        threads: 20
+    ram:
+      size: 64
+      mts: 2133
+    drives:
+      - type: hdd
+        size: 6144
+      - type: hdd
+        size: 6144
+      - type: hdd
+        size: 6144
+      - type: hdd
+        size: 6144
+      - type: ssd
+        size: 240
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+      - type: sfp+
+        speed: 10
+        ports: 1
+    gpus:
+    ipmi: true
+    name: truenas-backup01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4214
+        cores: 12
+        threads: 24
+    ram:
+      size: 128
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 1024
+    nics:
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+      - model: NVIDIA Tesla P40
+        vram: 24
+      - model: NVIDIA Tesla P40
+        vram: 24
+      - model: NVIDIA Tesla P4
+        vram: 8
+    ipmi: true
+    name: compute-gpu01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E3-1240 v5
+        cores: 4
+        threads: 8
+    ram:
+      size: 32
+      mts: 2133
+    drives:
+      - type: ssd
+        size: 512
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+    gpus:
+    ipmi: true
+    name: proxmox-lab01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E-2224
+        cores: 4
+        threads: 4
+    ram:
+      size: 16
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 256
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+    gpus:
+    ipmi: true
+    name: k8s-control01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E-2224
+        cores: 4
+        threads: 4
+    ram:
+      size: 16
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 256
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+    gpus:
+    ipmi: true
+    name: k8s-control02
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) Silver 4108
+        cores: 8
+        threads: 16
+    ram:
+      size: 64
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 1024
+      - type: ssd
+        size: 1024
+    nics:
+      - type: sfp+
+        speed: 10
+        ports: 1
+    gpus:
+    ipmi: true
+    name: elk-logging01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Core(TM) i3-8100
+        cores: 4
+        threads: 4
+    ram:
+      size: 16
+      mts: 2400
+    drives:
+      - type: ssd
+        size: 256
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 2
+    gpus:
+    ipmi: false
+    name: edge-node01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E5-1650 v3
+        cores: 6
+        threads: 12
+    ram:
+      size: 64
+      mts: 2133
+    drives:
+      - type: ssd
+        size: 480
+      - type: hdd
+        size: 4096
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 4
+    gpus:
+    ipmi: true
+    name: backup-proxmox01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Core(TM) i7-8700
+        cores: 6
+        threads: 12
+    ram:
+      size: 32
+      mts: 2666
+    drives:
+      - type: ssd
+        size: 512
+    nics:
+      - type: rj45
+        speed: 1
+        ports: 1
+    gpus:
+    ipmi: false
+    name: lab-general01
+    tags:
+  - kind: Server
+    cpus:
+      - model: Intel(R) Xeon(R) E5-2650 v3
+        cores: 10
+        threads: 20
+    ram:
+      size: 128
+      mts: 2133
+    drives:
+      - type: hdd
+        size: 4096
+      - type: hdd
+        size: 4096
+      - type: hdd
+        size: 4096
+      - type: hdd
+        size: 4096
+    nics:
+      - type: sfp+
+        speed: 10
+        ports: 2
+    gpus:
+    ipmi: true
+    name: dell-r730-archive01
+    tags: 

+ 13 - 13
RackPeek/switches.yaml

@@ -1,14 +1,14 @@
 resources:
-- kind: Switch
-  model: GS324
-  managed: true
-  poe: true
-  ports:
-  - type: rj45
-    speed: 1
-    count: 8
-  - type: sfp
-    speed: 10
-    count: 2
-  name: netgear-s24
-  tags: 
+  - kind: Switch
+    model: GS324
+    managed: true
+    poe: true
+    ports:
+      - type: rj45
+        speed: 1
+        count: 8
+      - type: sfp
+        speed: 10
+        count: 2
+    name: netgear-s24
+    tags: 

+ 5 - 5
RackPeek/ups.yaml

@@ -1,6 +1,6 @@
 resources:
-- kind: Ups
-  model: Volta
-  va: 2200
-  name: rack-ups
-  tags: 
+  - kind: Ups
+    model: Volta
+    va: 2200
+    name: rack-ups
+    tags: 

+ 20 - 19
Tests/Hardware/AddCpuUseCaseTests.cs

@@ -1,5 +1,6 @@
 using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Cpu;
 
 namespace Tests.Hardware;
@@ -11,10 +12,10 @@ public class AddCpuUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        var server = new RackPeek.Domain.Resources.Hardware.Models.Server
+        var server = new Server
         {
             Name = "node01",
-            Cpus = new List<RackPeek.Domain.Resources.Hardware.Models.Cpu>()
+            Cpus = new List<Cpu>()
         };
 
         repo.GetByNameAsync("node01").Returns(server);
@@ -23,10 +24,10 @@ public class AddCpuUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            model: "7950x",
-            cores: 8,
-            threads: 16
+            "node01",
+            "7950x",
+            8,
+            16
         );
 
         // Assert
@@ -35,7 +36,7 @@ public class AddCpuUseCaseTests
         Assert.Equal(8, server.Cpus[0].Cores);
         Assert.Equal(16, server.Cpus[0].Threads);
 
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Name == "node01" &&
             s.Cpus.Count == 1 &&
             s.Cpus[0].Model == "7950x" &&
@@ -49,7 +50,7 @@ public class AddCpuUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        var server = new RackPeek.Domain.Resources.Hardware.Models.Server
+        var server = new Server
         {
             Name = "node01",
             Cpus = null
@@ -61,17 +62,17 @@ public class AddCpuUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            model: "7950x",
-            cores: 8,
-            threads: 16
+            "node01",
+            "7950x",
+            8,
+            16
         );
 
         // Assert
         Assert.NotNull(server.Cpus);
         Assert.Single(server.Cpus);
 
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Cpus != null &&
             s.Cpus.Count == 1 &&
             s.Cpus[0].Model == "7950x"
@@ -89,13 +90,13 @@ public class AddCpuUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            model: "7950x",
-            cores: 8,
-            threads: 16
+            "node01",
+            "7950x",
+            8,
+            16
         );
 
         // Assert
-        await repo.DidNotReceive().UpdateAsync(Arg.Any<RackPeek.Domain.Resources.Hardware.Models.Server>());
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 17 - 16
Tests/Hardware/AddDriveUseCaseTests.cs

@@ -1,5 +1,6 @@
 using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Drive;
 
 namespace Tests.Hardware;
@@ -11,10 +12,10 @@ public class AddDrivesUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        var server = new RackPeek.Domain.Resources.Hardware.Models.Server
+        var server = new Server
         {
             Name = "node01",
-            Drives = new List<RackPeek.Domain.Resources.Hardware.Models.Drive>()
+            Drives = new List<Drive>()
         };
 
         repo.GetByNameAsync("node01").Returns(server);
@@ -23,9 +24,9 @@ public class AddDrivesUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            type: "NVMe",
-            size: 2000
+            "node01",
+            "NVMe",
+            2000
         );
 
         // Assert
@@ -33,7 +34,7 @@ public class AddDrivesUseCaseTests
         Assert.Equal("NVMe", server.Drives[0].Type);
         Assert.Equal(2000, server.Drives[0].Size);
 
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Name == "node01" &&
             s.Drives.Count == 1 &&
             s.Drives[0].Type == "NVMe" &&
@@ -46,7 +47,7 @@ public class AddDrivesUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        var server = new RackPeek.Domain.Resources.Hardware.Models.Server
+        var server = new Server
         {
             Name = "node01",
             Drives = null
@@ -58,16 +59,16 @@ public class AddDrivesUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            type: "SATA",
-            size: 500
+            "node01",
+            "SATA",
+            500
         );
 
         // Assert
         Assert.NotNull(server.Drives);
         Assert.Single(server.Drives);
 
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Drives != null &&
             s.Drives.Count == 1 &&
             s.Drives[0].Type == "SATA"
@@ -85,12 +86,12 @@ public class AddDrivesUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            type: "NVMe",
-            size: 2000
+            "node01",
+            "NVMe",
+            2000
         );
 
         // Assert
-        await repo.DidNotReceive().UpdateAsync(Arg.Any<RackPeek.Domain.Resources.Hardware.Models.Server>());
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 0 - 1
Tests/Hardware/AddNicUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Nic;
-using Xunit;
 
 namespace Tests.Hardware;
 

+ 6 - 5
Tests/Hardware/AddServerUseCaseTests.cs

@@ -1,5 +1,6 @@
 using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server;
 
 namespace Tests.Hardware;
@@ -17,11 +18,11 @@ public class AddServerUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "node01"
+            "node01"
         );
 
         // Assert
-        await repo.Received(1).AddAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).AddAsync(Arg.Is<Server>(s =>
             s.Name == "node01"
         ));
     }
@@ -31,19 +32,19 @@ public class AddServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server { Name = "node01" });
+        repo.GetByNameAsync("node01").Returns(new Server { Name = "node01" });
 
         var sut = new AddServerUseCase(repo);
 
         // Act
         var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
             await sut.ExecuteAsync(
-                name: "node01"
+                "node01"
             )
         );
 
         // Assert
         Assert.Equal("Server 'node01' already exists.", ex.Message);
-        await repo.DidNotReceive().AddAsync(Arg.Any<RackPeek.Domain.Resources.Hardware.Models.Server>());
+        await repo.DidNotReceive().AddAsync(Arg.Any<Server>());
     }
 }

+ 2 - 1
Tests/Hardware/DeleteServerUseCaseTests.cs

@@ -1,5 +1,6 @@
 using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server;
 
 namespace Tests.Hardware;
@@ -11,7 +12,7 @@ public class DeleteServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server { Name = "node01" });
+        repo.GetByNameAsync("node01").Returns(new Server { Name = "node01" });
 
         var sut = new DeleteServerUseCase(repo);
 

+ 10 - 10
Tests/Hardware/DescribeServerUseCaseTests.cs

@@ -12,24 +12,24 @@ public class DescribeServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server
+        repo.GetByNameAsync("node01").Returns(new Server
         {
             Name = "node01",
             Ipmi = true,
-            Cpus = new()
+            Cpus = new List<Cpu>
             {
-                new Cpu { Model = "Xeon", Cores = 4, Threads = 8 },
-                new Cpu { Model = "Xeon", Cores = 4, Threads = 8 }
+                new() { Model = "Xeon", Cores = 4, Threads = 8 },
+                new() { Model = "Xeon", Cores = 4, Threads = 8 }
             },
             Ram = new Ram { Size = 32 },
-            Drives = new()
+            Drives = new List<Drive>
             {
-                new Drive { Type = "ssd", Size = 256 },
-                new Drive { Type = "hdd", Size = 2048 }
+                new() { Type = "ssd", Size = 256 },
+                new() { Type = "hdd", Size = 2048 }
             },
-            Nics = new()
+            Nics = new List<Nic>
             {
-                new Nic { Speed = 10, Ports = 2 }
+                new() { Speed = 10, Ports = 2 }
             }
         });
 
@@ -65,4 +65,4 @@ public class DescribeServerUseCaseTests
         // Assert
         Assert.Null(description);
     }
-}
+}

+ 2 - 2
Tests/Hardware/GetServerUseCaseTests.cs

@@ -12,7 +12,7 @@ public class GetServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server { Name = "node01" });
+        repo.GetByNameAsync("node01").Returns(new Server { Name = "node01" });
 
         var sut = new GetServerUseCase(repo);
 
@@ -21,7 +21,7 @@ public class GetServerUseCaseTests
 
         // Assert
         Assert.NotNull(server);
-        Assert.IsType<RackPeek.Domain.Resources.Hardware.Models.Server>(server);
+        Assert.IsType<Server>(server);
         Assert.Equal("node01", server!.Name);
     }
 

+ 3 - 3
Tests/Hardware/GetServersUseCaseTests.cs

@@ -14,9 +14,9 @@ public class GetServersUseCaseTests
         var repo = Substitute.For<IHardwareRepository>();
         repo.GetAllAsync().Returns(new List<RackPeek.Domain.Resources.Hardware.Models.Hardware>
         {
-            new RackPeek.Domain.Resources.Hardware.Models.Server { Name = "server1" },
+            new Server { Name = "server1" },
             new Desktop { Name = "desktop1" },
-            new RackPeek.Domain.Resources.Hardware.Models.Server { Name = "server2" }
+            new Server { Name = "server2" }
         });
 
         var sut = new GetServersUseCase(repo);
@@ -26,7 +26,7 @@ public class GetServersUseCaseTests
 
         // Assert
         Assert.Equal(2, servers.Count);
-        Assert.All(servers, s => Assert.IsType<RackPeek.Domain.Resources.Hardware.Models.Server>(s));
+        Assert.All(servers, s => Assert.IsType<Server>(s));
         Assert.Contains(servers, s => s.Name == "server1");
         Assert.Contains(servers, s => s.Name == "server2");
     }

+ 8 - 9
Tests/Hardware/RemoveCpuUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Cpu;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -18,8 +17,8 @@ public class RemoveCpuUseCaseTests
             Name = "node01",
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "7950x", Cores = 8, Threads = 16 },
-                new Cpu { Model = "7900x", Cores = 12, Threads = 24 }
+                new() { Model = "7950x", Cores = 8, Threads = 16 },
+                new() { Model = "7900x", Cores = 12, Threads = 24 }
             }
         };
 
@@ -28,7 +27,7 @@ public class RemoveCpuUseCaseTests
         var sut = new RemoveCpuUseCase(repo);
 
         // Act
-        await sut.ExecuteAsync("node01", index: 0);
+        await sut.ExecuteAsync("node01", 0);
 
         // Assert
         Assert.Single(server.Cpus);
@@ -51,7 +50,7 @@ public class RemoveCpuUseCaseTests
             Name = "node01",
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "7950x", Cores = 8, Threads = 16 }
+                new() { Model = "7950x", Cores = 8, Threads = 16 }
             }
         };
 
@@ -61,7 +60,7 @@ public class RemoveCpuUseCaseTests
 
         // Act & Assert
         await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
-            await sut.ExecuteAsync("node01", index: 1)
+            await sut.ExecuteAsync("node01", 1)
         );
 
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
@@ -77,9 +76,9 @@ public class RemoveCpuUseCaseTests
         var sut = new RemoveCpuUseCase(repo);
 
         // Act
-        await sut.ExecuteAsync("node01", index: 0);
+        await sut.ExecuteAsync("node01", 0);
 
         // Assert
-        await repo.DidNotReceive().UpdateAsync(Arg.Any<RackPeek.Domain.Resources.Hardware.Models.Server>());
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 8 - 9
Tests/Hardware/RemoveDriveUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Drive;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -18,8 +17,8 @@ public class RemoveDriveUseCaseTests
             Name = "node01",
             Drives = new List<Drive>
             {
-                new Drive { Type = "NVMe", Size = 2000 },
-                new Drive { Type = "SATA", Size = 500 }
+                new() { Type = "NVMe", Size = 2000 },
+                new() { Type = "SATA", Size = 500 }
             }
         };
 
@@ -29,7 +28,7 @@ public class RemoveDriveUseCaseTests
         var sut = new RemoveDriveUseCase(repo);
 
         // Act
-        await sut.ExecuteAsync("node01", index: 0);
+        await sut.ExecuteAsync("node01", 0);
 
         // Assert
         Assert.Single(server.Drives);
@@ -52,7 +51,7 @@ public class RemoveDriveUseCaseTests
             Name = "node01",
             Drives = new List<Drive>
             {
-                new Drive { Type = "NVMe", Size = 2000 }
+                new() { Type = "NVMe", Size = 2000 }
             }
         };
 
@@ -62,7 +61,7 @@ public class RemoveDriveUseCaseTests
 
         // Act & Assert
         await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
-            await sut.ExecuteAsync("node01", index: 1)
+            await sut.ExecuteAsync("node01", 1)
         );
 
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
@@ -74,16 +73,16 @@ public class RemoveDriveUseCaseTests
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
 
-        
+
         repo.GetByNameAsync("node01")
             .Returns((RackPeek.Domain.Resources.Hardware.Models.Hardware?)null);
 
         var sut = new RemoveDriveUseCase(repo);
 
         // Act
-        await sut.ExecuteAsync("node01", index: 0);
+        await sut.ExecuteAsync("node01", 0);
 
         // Assert
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 3 - 4
Tests/Hardware/RemoveNicUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Nic;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -17,8 +16,8 @@ public class RemoveNicUseCaseTests
             Name = "node01",
             Nics = new List<Nic>
             {
-                new Nic { Type = "10GBase-T", Speed = 10000, Ports = 2 },
-                new Nic { Type = "SFP+", Speed = 10000, Ports = 1 }
+                new() { Type = "10GBase-T", Speed = 10000, Ports = 2 },
+                new() { Type = "SFP+", Speed = 10000, Ports = 1 }
             }
         };
 
@@ -41,7 +40,7 @@ public class RemoveNicUseCaseTests
         var server = new Server
         {
             Name = "node01",
-            Nics = new List<Nic> { new Nic() }
+            Nics = new List<Nic> { new() }
         };
 
         repo.GetByNameAsync("node01").Returns(server);

+ 12 - 13
Tests/Hardware/ServerHardwareReportTests.cs

@@ -12,29 +12,29 @@ public class ServerHardwareReportTests
     {
         var repo = Substitute.For<IHardwareRepository>();
         repo.GetAllAsync().Returns([
-            new RackPeek.Domain.Resources.Hardware.Models.Server
+            new Server
             {
                 Name = "srv1",
                 Ipmi = true,
-                Cpus = new()
+                Cpus = new List<Cpu>
                 {
-                    new Cpu { Model = "Xeon", Cores = 4, Threads = 8 }
+                    new() { Model = "Xeon", Cores = 4, Threads = 8 }
                 },
                 Ram = new Ram { Size = 32 },
-                Drives = new()
+                Drives = new List<Drive>
                 {
-                    new Drive { Type = "ssd", Size = 256 },
-                    new Drive { Type = "hdd", Size = 2048 }
+                    new() { Type = "ssd", Size = 256 },
+                    new() { Type = "hdd", Size = 2048 }
                 },
-                Nics = new()
+                Nics = new List<Nic>
                 {
-                    new Nic { Speed = 10, Ports = 2 }
+                    new() { Speed = 10, Ports = 2 }
                 },
-                Gpus = new()
+                Gpus = new List<Gpu>
                 {
-                    new Gpu { Model = "NVIDIA Tesla T4", Vram = 16 },
-                    new Gpu { Model = "NVIDIA Tesla T4", Vram = 16 },
-                    new Gpu { Model = "RTX 3080", Vram = 10 }
+                    new() { Model = "NVIDIA Tesla T4", Vram = 16 },
+                    new() { Model = "NVIDIA Tesla T4", Vram = 16 },
+                    new() { Model = "RTX 3080", Vram = 10 }
                 }
             }
         ]);
@@ -51,5 +51,4 @@ public class ServerHardwareReportTests
         Assert.Equal(42, server.TotalGpuVramGb);
         Assert.Equal("2× NVIDIA Tesla T4, 1× RTX 3080", server.GpuSummary);
     }
-
 }

+ 2 - 2
Tests/Hardware/Switches/AddSwitchUseCaseTests.cs

@@ -18,7 +18,7 @@ public class AddSwitchUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "sw01"
+            "sw01"
         );
 
         // Assert
@@ -39,7 +39,7 @@ public class AddSwitchUseCaseTests
         // Act
         var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
             await sut.ExecuteAsync(
-                name: "sw01"
+                "sw01"
             )
         );
 

+ 2 - 2
Tests/Hardware/Switches/DeleteSwitchUseCaseTests.cs

@@ -18,7 +18,7 @@ public class DeleteSwitchUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "sw01"
+            "sw01"
         );
 
         // Assert
@@ -37,7 +37,7 @@ public class DeleteSwitchUseCaseTests
         // Act
         var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
             await sut.ExecuteAsync(
-                name: "sw01"
+                "sw01"
             )
         );
 

+ 3 - 3
Tests/Hardware/Switches/DescribeSwitchUseCaseTests.cs

@@ -83,12 +83,12 @@ public class DescribeSwitchUseCaseTests
         Assert.True(result.Managed);
         Assert.True(result.Poe);
 
-        Assert.Equal(28, result.TotalPorts);          // 24 + 4
-        Assert.Equal(64, result.TotalSpeedGb);        // (24 * 1) + (4 * 10)
+        Assert.Equal(28, result.TotalPorts); // 24 + 4
+        Assert.Equal(64, result.TotalSpeedGb); // (24 * 1) + (4 * 10)
 
         Assert.Equal(
             "RJ45: 24 ports (24 Gb total), SFP+: 4 ports (40 Gb total)",
             result.PortSummary
         );
     }
-}
+}

+ 9 - 9
Tests/Hardware/Switches/UpdateSwitchUseCaseTests.cs

@@ -45,17 +45,17 @@ public class UpdateSwitchUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "sw01",
-            model: "NewModel",
+            "sw01",
+            "NewModel",
             poe: true
         );
 
         // Assert
         await repo.Received(1).UpdateAsync(Arg.Is<Switch>(s =>
-            s.Name == "sw01" &&
-            s.Model == "NewModel" &&   // updated
-            s.Managed == false &&      // unchanged
-            s.Poe == true              // updated
+                s.Name == "sw01" &&
+                s.Model == "NewModel" && // updated
+                s.Managed == false && // unchanged
+                s.Poe == true // updated
         ));
     }
 
@@ -78,8 +78,8 @@ public class UpdateSwitchUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "sw01",
-            model: "   "
+            "sw01",
+            "   "
         );
 
         // Assert
@@ -87,4 +87,4 @@ public class UpdateSwitchUseCaseTests
             s.Model == "KeepMe"
         ));
     }
-}
+}

+ 18 - 19
Tests/Hardware/UpdateCpuUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Cpu;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -18,7 +17,7 @@ public class UpdateCpuUseCaseTests
             Name = "node01",
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "7950x", Cores = 8, Threads = 16 }
+                new() { Model = "7950x", Cores = 8, Threads = 16 }
             }
         };
 
@@ -28,11 +27,11 @@ public class UpdateCpuUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            index: 0,
-            model: "7900x",
-            cores: 12,
-            threads: 24
+            "node01",
+            0,
+            "7900x",
+            12,
+            24
         );
 
         // Assert
@@ -59,7 +58,7 @@ public class UpdateCpuUseCaseTests
             Name = "node01",
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "7950x", Cores = 8, Threads = 16 }
+                new() { Model = "7950x", Cores = 8, Threads = 16 }
             }
         };
 
@@ -70,11 +69,11 @@ public class UpdateCpuUseCaseTests
         // Act & Assert
         await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
             await sut.ExecuteAsync(
-                serverName: "node01",
-                index: 1,
-                model: "7900x",
-                cores: 12,
-                threads: 24
+                "node01",
+                1,
+                "7900x",
+                12,
+                24
             )
         );
 
@@ -92,14 +91,14 @@ public class UpdateCpuUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            index: 0,
-            model: "7900x",
-            cores: 12,
-            threads: 24
+            "node01",
+            0,
+            "7900x",
+            12,
+            24
         );
 
         // Assert
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 15 - 16
Tests/Hardware/UpdateDriveUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Drive;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -18,7 +17,7 @@ public class UpdateDriveUseCaseTests
             Name = "node01",
             Drives = new List<Drive>
             {
-                new Drive { Type = "NVMe", Size = 2000 }
+                new() { Type = "NVMe", Size = 2000 }
             }
         };
 
@@ -28,10 +27,10 @@ public class UpdateDriveUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            index: 0,
-            type: "SATA",
-            size: 500
+            "node01",
+            0,
+            "SATA",
+            500
         );
 
         // Assert
@@ -56,7 +55,7 @@ public class UpdateDriveUseCaseTests
             Name = "node01",
             Drives = new List<Drive>
             {
-                new Drive { Type = "NVMe", Size = 2000 }
+                new() { Type = "NVMe", Size = 2000 }
             }
         };
 
@@ -67,10 +66,10 @@ public class UpdateDriveUseCaseTests
         // Act & Assert
         await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
             await sut.ExecuteAsync(
-                serverName: "node01",
-                index: 1,
-                type: "SATA",
-                size: 500
+                "node01",
+                1,
+                "SATA",
+                500
             )
         );
 
@@ -90,13 +89,13 @@ public class UpdateDriveUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            serverName: "node01",
-            index: 0,
-            type: "SATA",
-            size: 500
+            "node01",
+            0,
+            "SATA",
+            500
         );
 
         // Assert
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 3 - 4
Tests/Hardware/UpdateNicUseCaseTests.cs

@@ -2,7 +2,6 @@ using NSubstitute;
 using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Hardware.Server.Nic;
-using Xunit;
 
 namespace Tests.Hardware;
 
@@ -17,7 +16,7 @@ public class UpdateNicUseCaseTests
             Name = "node01",
             Nics = new List<Nic>
             {
-                new Nic { Type = "10GBase-T", Speed = 10000, Ports = 2 }
+                new() { Type = "10GBase-T", Speed = 10000, Ports = 2 }
             }
         };
 
@@ -41,7 +40,7 @@ public class UpdateNicUseCaseTests
         var server = new Server
         {
             Name = "node01",
-            Nics = new List<Nic> { new Nic() }
+            Nics = new List<Nic> { new() }
         };
 
         repo.GetByNameAsync("node01").Returns(server);
@@ -68,4 +67,4 @@ public class UpdateNicUseCaseTests
 
         await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
-}
+}

+ 13 - 15
Tests/Hardware/UpdateServerUseCaseTests.cs

@@ -12,14 +12,14 @@ public class UpdateServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server
+        repo.GetByNameAsync("node01").Returns(new Server
         {
             Name = "node01",
             Ipmi = false,
             Ram = new Ram { Size = 32 },
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "Old", Cores = 2, Threads = 4 }
+                new() { Model = "Old", Cores = 2, Threads = 4 }
             }
         });
 
@@ -27,13 +27,13 @@ public class UpdateServerUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "node01",
-            ramGb: 64,
-            ipmi: true
+            "node01",
+            64,
+            true
         );
 
         // Assert
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Name == "node01" &&
             s.Ram.Size == 64 &&
             s.Ipmi == true
@@ -51,12 +51,12 @@ public class UpdateServerUseCaseTests
 
         // Act
         var ex = await Assert.ThrowsAsync<InvalidOperationException>(() =>
-            sut.ExecuteAsync("node01", ramGb: 64)
+            sut.ExecuteAsync("node01", 64)
         );
 
         // Assert
         Assert.Equal("Server 'node01' not found.", ex.Message);
-        await repo.DidNotReceive().UpdateAsync(Arg.Any<RackPeek.Domain.Resources.Hardware.Models.Server>());
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
     }
 
     [Fact]
@@ -64,14 +64,14 @@ public class UpdateServerUseCaseTests
     {
         // Arrange
         var repo = Substitute.For<IHardwareRepository>();
-        repo.GetByNameAsync("node01").Returns(new RackPeek.Domain.Resources.Hardware.Models.Server
+        repo.GetByNameAsync("node01").Returns(new Server
         {
             Name = "node01",
             Ipmi = false,
             Ram = new Ram { Size = 32 },
             Cpus = new List<Cpu>
             {
-                new Cpu { Model = "Old", Cores = 2, Threads = 4 }
+                new() { Model = "Old", Cores = 2, Threads = 4 }
             }
         });
 
@@ -79,15 +79,13 @@ public class UpdateServerUseCaseTests
 
         // Act
         await sut.ExecuteAsync(
-            name: "node01",
-            ramGb: null,
-            ipmi: null
+            "node01"
         );
 
         // Assert
-        await repo.Received(1).UpdateAsync(Arg.Is<RackPeek.Domain.Resources.Hardware.Models.Server>(s =>
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
             s.Ram.Size == 32 &&
             s.Ipmi == false
         ));
     }
-}
+}

+ 2 - 2
Tests/Tests.csproj

@@ -10,7 +10,7 @@
     <ItemGroup>
         <PackageReference Include="coverlet.collector" Version="6.0.4"/>
         <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1"/>
-        <PackageReference Include="NSubstitute" Version="5.3.0" />
+        <PackageReference Include="NSubstitute" Version="5.3.0"/>
         <PackageReference Include="xunit" Version="2.9.3"/>
         <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"/>
     </ItemGroup>
@@ -20,7 +20,7 @@
     </ItemGroup>
 
     <ItemGroup>
-      <ProjectReference Include="..\RackPeek\RackPeek.csproj" />
+        <ProjectReference Include="..\RackPeek\RackPeek.csproj"/>
     </ItemGroup>
 
 </Project>

+ 30 - 31
Tests/Yaml/HardwareDeserializationTests.cs

@@ -1,5 +1,4 @@
-using RackPeek;
-using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Yaml;
 
@@ -13,7 +12,7 @@ public class HardwareDeserializationTests
         yamlResourceCollection.Load(yaml, "test.yaml");
         return new YamlHardwareRepository(yamlResourceCollection);
     }
-    
+
     [Theory]
     [InlineData("Server", typeof(Server))]
     [InlineData("Switch", typeof(Switch))]
@@ -30,22 +29,22 @@ public class HardwareDeserializationTests
 resources:
   - kind: {kind}
 ";
-        
+
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
-        
+
         // Then
         var hardware = Assert.Single(resources);
         Assert.IsType(type, hardware);
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_server()
     {
         // Given
-        var yaml = $@"
+        var yaml = @"
 resources:
   - kind: Server
     name: dell-c6400-node01
@@ -74,11 +73,11 @@ resources:
     ipmi: true
 ";
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
-        
+
         // Then
         var hardware = Assert.Single(resources);
         Assert.IsType<Server>(hardware);
@@ -91,12 +90,12 @@ resources:
         Assert.Equal("Intel(R) Xeon(R) CPU E3-1270 v6", cpu.Model);
         Assert.Equal(4, cpu.Cores);
         Assert.Equal(8, cpu.Threads);
-        
+
         // Ram
         Assert.NotNull(server.Ram);
         Assert.Equal(32, server.Ram.Size);
         Assert.Equal(2400, server.Ram.Mts);
-        
+
         // Drives
         Assert.NotNull(server.Drives);
         var hdd = server.Drives[0];
@@ -105,7 +104,7 @@ resources:
         var ssd = server.Drives[1];
         Assert.Equal("ssd", ssd.Type);
         Assert.Equal(256, ssd.Size);
-        
+
         //GPUs
         Assert.NotNull(server.Gpus);
         var gpu = server.Gpus[0];
@@ -114,7 +113,7 @@ resources:
 
         // ipmi
         Assert.True(server.Ipmi);
-        
+
         // Nics
         Assert.NotNull(server.Nics);
         var nic0 = server.Nics[0];
@@ -126,7 +125,7 @@ resources:
         Assert.Equal(10, nic1.Speed);
         Assert.Equal(2, nic1.Ports);
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_switch()
     {
@@ -148,7 +147,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -164,7 +163,7 @@ resources:
         Assert.Equal("GS324", sw.Model);
         Assert.Equal(true, sw.Managed);
         Assert.Equal(true, sw.Poe);
-        
+
         // Nics
         Assert.NotNull(sw.Ports);
         var nic0 = sw.Ports[0];
@@ -175,8 +174,8 @@ resources:
         Assert.Equal("sfp", nic1.Type);
         Assert.Equal(10, nic1.Speed);
         Assert.Equal(2, nic1.Count);
-        
     }
+
     [Fact]
     public async Task deserialize_yaml_kind_firewall()
     {
@@ -198,7 +197,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -214,7 +213,7 @@ resources:
         Assert.Equal("pfSense-1100", fw.Model);
         Assert.Equal(true, fw.Managed);
         Assert.Equal(true, fw.Poe);
-        
+
         // Nics
         Assert.NotNull(fw.Ports);
         var nic0 = fw.Ports[0];
@@ -226,6 +225,7 @@ resources:
         Assert.Equal(10, nic1.Speed);
         Assert.Equal(2, nic1.Count);
     }
+
     [Fact]
     public async Task deserialize_yaml_kind_router()
     {
@@ -247,7 +247,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -263,7 +263,7 @@ resources:
         Assert.Equal("ER-4", router.Model);
         Assert.Equal(true, router.Managed);
         Assert.Equal(true, router.Poe);
-        
+
         // Nics
         Assert.NotNull(router.Ports);
         var nic0 = router.Ports[0];
@@ -275,7 +275,7 @@ resources:
         Assert.Equal(10, nic1.Speed);
         Assert.Equal(2, nic1.Count);
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_desktop()
     {
@@ -304,7 +304,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -340,6 +340,7 @@ resources:
         Assert.Equal(1, desktop.Nics[0].Speed);
         Assert.Equal(1, desktop.Nics[0].Ports);
     }
+
     [Fact]
     public async Task deserialize_yaml_kind_laptop()
     {
@@ -364,7 +365,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -394,7 +395,7 @@ resources:
         Assert.Equal("ssd", laptop.Drives[0].Type);
         Assert.Equal(1024, laptop.Drives[0].Size);
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_accesspoint()
     {
@@ -408,7 +409,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -423,9 +424,8 @@ resources:
         Assert.Equal("lounge-ap", accessPoint.Name);
         Assert.Equal("Unifi-Ap-Pro", accessPoint.Model);
         Assert.Equal(2.5, accessPoint.Speed);
-
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_ups()
     {
@@ -439,7 +439,7 @@ resources:
 ";
 
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
 
@@ -454,6 +454,5 @@ resources:
         Assert.Equal("rack-ups", ups.Name);
         Assert.Equal("Volta", ups.Model);
         Assert.Equal(2200, ups.Va);
-
     }
 }

+ 8 - 10
Tests/Yaml/SystemDeserializationTests.cs

@@ -1,5 +1,4 @@
-using RackPeek;
-using RackPeek.Domain.Resources.SystemResources;
+using RackPeek.Domain.Resources.SystemResources;
 using RackPeek.Yaml;
 
 namespace Tests.Yaml;
@@ -12,14 +11,14 @@ public class ServiceDeserializationTests
         yamlResourceCollection.Load(yaml, "test.yaml");
         return new YamlSystemRepository(yamlResourceCollection);
     }
-    
+
     [Fact]
     public async Task deserialize_yaml_kind_System()
     {
         // type: Hypervisor | Baremetal | VM | Container 
-        
+
         // Given
-        var yaml = $@"
+        var yaml = @"
 resources:
   - kind: System
     type: Hypervisor
@@ -33,14 +32,14 @@ resources:
     runsOn: dell-c6400-node-01
 ";
         var sut = CreateSut(yaml);
-        
+
         // When
         var resources = await sut.GetAllAsync();
-        
+
         // Then
         var resource = Assert.Single(resources);
         Assert.IsType<SystemResource>(resource);
-        var system = resource as SystemResource;
+        var system = resource;
         Assert.NotNull(system);
         Assert.Equal("Hypervisor", system.Type);
         Assert.Equal("home-virtualization-host", system.Name);
@@ -52,8 +51,7 @@ resources:
         Assert.NotNull(system.Drives);
         Assert.Equal(2048, system.Drives[0].Size);
         Assert.Equal(1024, system.Drives[1].Size);
-        
-        Assert.Equal("dell-c6400-node-01", system.RunsOn);
 
+        Assert.Equal("dell-c6400-node-01", system.RunsOn);
     }
 }