Kaynağa Gözat

Added ServerHardware Report usecase

Tim Jones 2 ay önce
ebeveyn
işleme
866facac08
33 değiştirilmiş dosya ile 294 ekleme ve 74 silme
  1. 9 0
      RackPeek.Domain/RackPeek.Domain.csproj
  2. 6 0
      RackPeek.Domain/Resources/Hardware/IHardwareRepository.cs
  3. 1 1
      RackPeek.Domain/Resources/Hardware/Models/AccessPoint.cs
  4. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Cpu.cs
  5. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Desktop.cs
  6. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Drive.cs
  7. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Firewall.cs
  8. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Gpu.cs
  9. 6 0
      RackPeek.Domain/Resources/Hardware/Models/Hardware.cs
  10. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Laptop.cs
  11. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Nic.cs
  12. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Port.cs
  13. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Ram.cs
  14. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Router.cs
  15. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Server.cs
  16. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Switch.cs
  17. 1 1
      RackPeek.Domain/Resources/Hardware/Models/Ups.cs
  18. 72 0
      RackPeek.Domain/Resources/Hardware/Reports/ServerHardwareReport.cs
  19. 10 0
      RackPeek.Domain/Resources/Resource.cs
  20. 6 0
      RackPeek.Domain/Resources/SystemResources/ISystemRepository.cs
  21. 3 1
      RackPeek.Domain/Resources/SystemResources/SystemResource.cs
  22. 6 0
      RackPeek.sln
  23. 4 0
      RackPeek/RackPeek.csproj
  24. 0 6
      RackPeek/Resources/Hardware/Hardware.cs
  25. 0 6
      RackPeek/Resources/LabFile.cs
  26. 0 19
      RackPeek/Resources/Resource.cs
  27. 12 0
      RackPeek/YamlHardwareRepository.cs
  28. 20 4
      RackPeek/YamlResourceCollection.cs
  29. 11 0
      RackPeek/YamlSystemRepository.cs
  30. 46 0
      Tests/Hardware/ServerHardwareReportTests.cs
  31. 1 0
      Tests/Tests.csproj
  32. 55 20
      Tests/Yaml/HardwareDeserializationTests.cs
  33. 13 4
      Tests/Yaml/SystemDeserializationTests.cs

+ 9 - 0
RackPeek.Domain/RackPeek.Domain.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFramework>net10.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <Nullable>enable</Nullable>
+    </PropertyGroup>
+
+</Project>

+ 6 - 0
RackPeek.Domain/Resources/Hardware/IHardwareRepository.cs

@@ -0,0 +1,6 @@
+namespace RackPeek.Domain.Resources.Hardware;
+
+public interface IHardwareRepository
+{
+    Task<IReadOnlyList<Models.Hardware>> GetAllAsync();
+}

+ 1 - 1
RackPeek/Resources/Hardware/AccessPoint.cs → RackPeek.Domain/Resources/Hardware/Models/AccessPoint.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class AccessPoint : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Cpu.cs → RackPeek.Domain/Resources/Hardware/Models/Cpu.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Cpu
 {

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

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Desktop : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Drive.cs → RackPeek.Domain/Resources/Hardware/Models/Drive.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Drive
 {

+ 1 - 1
RackPeek/Resources/Hardware/Firewall.cs → RackPeek.Domain/Resources/Hardware/Models/Firewall.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Firewall : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Gpu.cs → RackPeek.Domain/Resources/Hardware/Models/Gpu.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Gpu
 {

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

@@ -0,0 +1,6 @@
+namespace RackPeek.Domain.Resources.Hardware.Models;
+
+public abstract class Hardware : Resource
+{
+
+}

+ 1 - 1
RackPeek/Resources/Hardware/Laptop.cs → RackPeek.Domain/Resources/Hardware/Models/Laptop.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Laptop : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Nic.cs → RackPeek.Domain/Resources/Hardware/Models/Nic.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Nic
 {

+ 1 - 1
RackPeek/Resources/Hardware/Port.cs → RackPeek.Domain/Resources/Hardware/Models/Port.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Port
 {

+ 1 - 1
RackPeek/Resources/Hardware/Ram.cs → RackPeek.Domain/Resources/Hardware/Models/Ram.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Ram
 {

+ 1 - 1
RackPeek/Resources/Hardware/Router.cs → RackPeek.Domain/Resources/Hardware/Models/Router.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Router : Hardware
 {

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

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Server : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Switch.cs → RackPeek.Domain/Resources/Hardware/Models/Switch.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Switch : Hardware
 {

+ 1 - 1
RackPeek/Resources/Hardware/Ups.cs → RackPeek.Domain/Resources/Hardware/Models/Ups.cs

@@ -1,4 +1,4 @@
-namespace RackPeek.Resources.Hardware;
+namespace RackPeek.Domain.Resources.Hardware.Models;
 
 public class Ups : Hardware
 {

+ 72 - 0
RackPeek.Domain/Resources/Hardware/Reports/ServerHardwareReport.cs

@@ -0,0 +1,72 @@
+using RackPeek.Domain.Resources.Hardware.Models;
+
+namespace RackPeek.Domain.Resources.Hardware.Reports;
+
+public record ServerHardwareReport(
+    IReadOnlyList<ServerHardwareRow> Servers
+);
+
+public record ServerHardwareRow(
+    string Name,
+    string CpuSummary,
+    int TotalCores,
+    int TotalThreads,
+    int RamGb,
+    int TotalStorageGb,
+    int SsdStorageGb,
+    int HddStorageGb,
+    int TotalNicPorts,
+    int MaxNicSpeedGb,
+    bool Ipmi
+);
+
+public class ServerHardwareReportUseCase(IHardwareRepository repository)
+{
+    public async Task<ServerHardwareReport> ExecuteAsync()
+    {
+        var hardware = await repository.GetAllAsync();
+        var servers = hardware.OfType<Server>();
+
+        var rows = servers.Select(server =>
+        {
+            var totalCores = server.Cpus?.Sum(c => c.Cores) ?? 0;
+            var totalThreads = server.Cpus?.Sum(c => c.Threads) ?? 0;
+
+            var cpuSummary = server.Cpus == null
+                ? "Unknown"
+                : string.Join(", ",
+                    server.Cpus
+                        .GroupBy(c => c.Model)
+                        .Select(g => $"{g.Count()}× {g.Key}"));
+
+            var ramGb = server.Ram?.Size ?? 0;
+
+            var totalStorage = server.Drives?.Sum(d => d.Size) ?? 0;
+            var ssdStorage = server.Drives?
+                .Where(d => d.Type == "ssd")
+                .Sum(d => d.Size) ?? 0;
+            var hddStorage = server.Drives?
+                .Where(d => d.Type == "hdd")
+                .Sum(d => d.Size) ?? 0;
+
+            var totalNicPorts = server.Nics?.Sum(n => n.Ports) ?? 0;
+            var maxNicSpeed = server.Nics?.Max(n => n.Speed) ?? 0;
+
+            return new ServerHardwareRow(
+                Name: server.Name,
+                CpuSummary: cpuSummary,
+                TotalCores: totalCores,
+                TotalThreads: totalThreads,
+                RamGb: ramGb,
+                TotalStorageGb: totalStorage,
+                SsdStorageGb: ssdStorage,
+                HddStorageGb: hddStorage,
+                TotalNicPorts: totalNicPorts,
+                MaxNicSpeedGb: maxNicSpeed,
+                Ipmi: server.Ipmi ?? false
+            );
+        }).ToList();
+
+        return new ServerHardwareReport(rows);
+    }
+}

+ 10 - 0
RackPeek.Domain/Resources/Resource.cs

@@ -0,0 +1,10 @@
+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; }
+}

+ 6 - 0
RackPeek.Domain/Resources/SystemResources/ISystemRepository.cs

@@ -0,0 +1,6 @@
+namespace RackPeek.Domain.Resources.SystemResources;
+
+public interface ISystemRepository
+{
+    Task<IReadOnlyList<SystemResource>> GetAllAsync();
+}

+ 3 - 1
RackPeek/Resources/Hardware/SystemResource.cs → RackPeek.Domain/Resources/SystemResources/SystemResource.cs

@@ -1,4 +1,6 @@
-namespace RackPeek.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
+
+namespace RackPeek.Domain.Resources.SystemResources;
 
 public class SystemResource : Resource
 {

+ 6 - 0
RackPeek.sln

@@ -4,6 +4,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RackPeek", "RackPeek\RackPe
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{2B19149A-FBD7-415E-9FE3-3BA53F2A0DD8}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RackPeek.Domain", "RackPeek.Domain\RackPeek.Domain.csproj", "{760E6165-A7E0-4144-B289-1BAB6483FD29}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -18,5 +20,9 @@ Global
 		{2B19149A-FBD7-415E-9FE3-3BA53F2A0DD8}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{2B19149A-FBD7-415E-9FE3-3BA53F2A0DD8}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{2B19149A-FBD7-415E-9FE3-3BA53F2A0DD8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{760E6165-A7E0-4144-B289-1BAB6483FD29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{760E6165-A7E0-4144-B289-1BAB6483FD29}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{760E6165-A7E0-4144-B289-1BAB6483FD29}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{760E6165-A7E0-4144-B289-1BAB6483FD29}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 EndGlobal

+ 4 - 0
RackPeek/RackPeek.csproj

@@ -11,4 +11,8 @@
       <PackageReference Include="YamlDotNet" Version="16.3.0" />
     </ItemGroup>
 
+    <ItemGroup>
+      <ProjectReference Include="..\RackPeek.Domain\RackPeek.Domain.csproj" />
+    </ItemGroup>
+
 </Project>

+ 0 - 6
RackPeek/Resources/Hardware/Hardware.cs

@@ -1,6 +0,0 @@
-namespace RackPeek.Resources.Hardware;
-
-public abstract class Hardware : Resource
-{
-
-}

+ 0 - 6
RackPeek/Resources/LabFile.cs

@@ -1,6 +0,0 @@
-namespace RackPeek.Resources;
-
-public class LabFile
-{
-    public List<Dictionary<string, object>> Resources { get; set; } = new();
-}

+ 0 - 19
RackPeek/Resources/Resource.cs

@@ -1,19 +0,0 @@
-using System.Text.Json.Serialization;
-using YamlDotNet.Serialization;
-
-namespace RackPeek.Resources;
-
-public abstract class Resource
-{
-    [JsonPropertyName("kind")]
-    [YamlMember(Alias = "kind")]
-    public string Kind { get; set; } = string.Empty;
-
-    [JsonPropertyName("name")]
-    [YamlMember(Alias = "name")]
-    public required string Name { get; set; }
-
-    [JsonPropertyName("tags")]
-    [YamlMember(Alias = "tags")]
-    public Dictionary<string, string>? Tags { get; set; }
-}

+ 12 - 0
RackPeek/YamlHardwareRepository.cs

@@ -0,0 +1,12 @@
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
+
+namespace RackPeek;
+
+public class YamlHardwareRepository(YamlResourceCollection resourceCollection) : IHardwareRepository
+{
+    public Task<IReadOnlyList<Hardware>> GetAllAsync()
+    {
+        return Task.FromResult(resourceCollection.HardwareResources);
+    }
+}

+ 20 - 4
RackPeek/Resources/LabLoader.cs → RackPeek/YamlResourceCollection.cs

@@ -1,12 +1,27 @@
-using RackPeek.Resources.Hardware;
+using RackPeek.Domain.Resources;
+using RackPeek.Domain.Resources.Hardware.Models;
+using RackPeek.Domain.Resources.SystemResources;
 using YamlDotNet.Serialization;
 using YamlDotNet.Serialization.NamingConventions;
 
-namespace RackPeek.Resources;
+namespace RackPeek;
 
-public static class LabLoader
+public class YamlResourceCollection
 {
-    public static List<Resource> Load(string yaml)
+    private readonly List<Resource> _resources = new();
+    
+    public IReadOnlyList<Hardware> HardwareResources => _resources.OfType<Hardware>().ToList();
+    public IReadOnlyList<SystemResource> SystemResources => _resources.OfType<SystemResource>().ToList();
+
+    public void Load(List<string> yamlContents)
+    {
+        foreach (var yamlContent in yamlContents)
+        {
+            _resources.AddRange(Deserialize(yamlContent));
+        }
+    }
+    
+    private static List<Resource> Deserialize(string yaml)
     {
         var deserializer = new DeserializerBuilder()
             .WithNamingConvention(CamelCaseNamingConvention.Instance)
@@ -46,4 +61,5 @@ public static class LabLoader
 
         return resources;
     }
+    
 }

+ 11 - 0
RackPeek/YamlSystemRepository.cs

@@ -0,0 +1,11 @@
+using RackPeek.Domain.Resources.SystemResources;
+
+namespace RackPeek;
+
+public class YamlSystemRepository(YamlResourceCollection resourceCollection) : ISystemRepository
+{
+    public Task<IReadOnlyList<SystemResource>> GetAllAsync()
+    {
+        return Task.FromResult(resourceCollection.SystemResources);
+    }
+}

+ 46 - 0
Tests/Hardware/ServerHardwareReportTests.cs

@@ -0,0 +1,46 @@
+using NSubstitute;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
+using RackPeek.Domain.Resources.Hardware.Reports;
+
+namespace Tests.Hardware;
+
+public class ServerHardwareReportTests
+{
+    [Fact]
+    public async Task Server_report_calculates_storage_and_cpu_correctly()
+    {
+        var repo = Substitute.For<IHardwareRepository>();
+        repo.GetAllAsync().Returns([
+            new Server
+            {
+                Name = "srv1",
+                Ipmi = true,
+                Cpus = new()
+                {
+                    new Cpu { Model = "Xeon", Cores = 4, Threads = 8 }
+                },
+                Ram = new Ram { Size = 32 },
+                Drives = new()
+                {
+                    new Drive { Type = "ssd", Size = 256 },
+                    new Drive { Type = "hdd", Size = 2048 }
+                },
+                Nics = new()
+                {
+                    new Nic { Speed = 10, Ports = 2 }
+                }
+            }
+        ]);
+
+        var sut = new ServerHardwareReportUseCase(repo);
+
+        var report = await sut.ExecuteAsync();
+        var server = report.Servers.Single();
+
+        Assert.Equal(2304, server.TotalStorageGb);
+        Assert.Equal(4, server.TotalCores);
+        Assert.Equal(10, server.MaxNicSpeedGb);
+    }
+
+}

+ 1 - 0
Tests/Tests.csproj

@@ -10,6 +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="xunit" Version="2.9.3"/>
         <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"/>
     </ItemGroup>

+ 55 - 20
Tests/HardwareDeserializationTests.cs → Tests/Yaml/HardwareDeserializationTests.cs

@@ -1,10 +1,18 @@
-using RackPeek.Resources;
-using RackPeek.Resources.Hardware;
+using RackPeek;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace Tests;
 
 public class HardwareDeserializationTests
 {
+    public static IHardwareRepository CreateSut(string yaml)
+    {
+        var yamlResourceCollection = new YamlResourceCollection();
+        yamlResourceCollection.Load([yaml]);
+        return new YamlHardwareRepository(yamlResourceCollection);
+    }
+    
     [Theory]
     [InlineData("Server", typeof(Server))]
     [InlineData("Switch", typeof(Switch))]
@@ -14,7 +22,7 @@ public class HardwareDeserializationTests
     [InlineData("Router", typeof(Router))]
     [InlineData("AccessPoint", typeof(AccessPoint))]
     [InlineData("Ups", typeof(Ups))]
-    public void deserialize_yaml_kind(string kind, Type type)
+    public async Task deserialize_yaml_kind(string kind, Type type)
     {
         // Given
         var yaml = $@"
@@ -22,8 +30,10 @@ resources:
   - kind: {kind}
 ";
         
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
         
         // Then
         var hardware = Assert.Single(resources);
@@ -31,7 +41,7 @@ resources:
     }
     
     [Fact]
-    public void deserialize_yaml_kind_server()
+    public async Task deserialize_yaml_kind_server()
     {
         // Given
         var yaml = $@"
@@ -59,8 +69,11 @@ resources:
           ports: 2
     ipmi: true
 ";
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
         
         // Then
         var hardware = Assert.Single(resources);
@@ -105,7 +118,7 @@ resources:
     }
     
     [Fact]
-    public void deserialize_yaml_kind_switch()
+    public async Task deserialize_yaml_kind_switch()
     {
         // Given
         var yaml = @"
@@ -124,8 +137,11 @@ resources:
     poe: true
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -152,7 +168,7 @@ resources:
         
     }
     [Fact]
-    public void deserialize_yaml_kind_firewall()
+    public async Task deserialize_yaml_kind_firewall()
     {
         // Given
         var yaml = @"
@@ -171,8 +187,11 @@ resources:
     poe: true
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -198,7 +217,7 @@ resources:
         Assert.Equal(2, nic1.Count);
     }
     [Fact]
-    public void deserialize_yaml_kind_router()
+    public async Task deserialize_yaml_kind_router()
     {
         // Given
         var yaml = @"
@@ -217,8 +236,11 @@ resources:
     poe: true
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -243,8 +265,9 @@ resources:
         Assert.Equal(10, nic1.Speed);
         Assert.Equal(2, nic1.Count);
     }
+    
     [Fact]
-    public void deserialize_yaml_kind_desktop()
+    public async Task deserialize_yaml_kind_desktop()
     {
         // Given
         var yaml = @"
@@ -270,8 +293,11 @@ resources:
          vram: 12gb
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -305,7 +331,7 @@ resources:
         Assert.Equal(1, desktop.Nics[0].Ports);
     }
     [Fact]
-    public void deserialize_yaml_kind_laptop()
+    public async Task deserialize_yaml_kind_laptop()
     {
         // Given
         var yaml = @"
@@ -327,8 +353,11 @@ resources:
          vram: 12gb
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -357,7 +386,7 @@ resources:
     }
     
     [Fact]
-    public void deserialize_yaml_kind_accesspoint()
+    public async Task deserialize_yaml_kind_accesspoint()
     {
         // Given
         var yaml = @"
@@ -368,8 +397,11 @@ resources:
     speed: 1gb
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);
@@ -385,7 +417,7 @@ resources:
     }
     
     [Fact]
-    public void deserialize_yaml_kind_ups()
+    public async Task deserialize_yaml_kind_ups()
     {
         // Given
         var yaml = @"
@@ -396,8 +428,11 @@ resources:
     va: 2200
 ";
 
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
+
 
         // Then
         var hardware = Assert.Single(resources);

+ 13 - 4
Tests/SystemDeserializationTests.cs → Tests/Yaml/SystemDeserializationTests.cs

@@ -1,12 +1,19 @@
-using RackPeek.Resources;
-using RackPeek.Resources.Hardware;
+using RackPeek;
+using RackPeek.Domain.Resources.SystemResources;
 
 namespace Tests;
 
 public class ServiceDeserializationTests
 {
+    public static ISystemRepository CreateSut(string yaml)
+    {
+        var yamlResourceCollection = new YamlResourceCollection();
+        yamlResourceCollection.Load([yaml]);
+        return new YamlSystemRepository(yamlResourceCollection);
+    }
+    
     [Fact]
-    public void deserialize_yaml_kind_System()
+    public async Task deserialize_yaml_kind_System()
     {
         // type: Hypervisor | Baremetal | VM | Container 
         
@@ -24,8 +31,10 @@ resources:
         - size: 1tb   
     runsOn: dell-c6400-node-01
 ";
+        var sut = CreateSut(yaml);
+        
         // When
-        var resources = LabLoader.Load(yaml);
+        var resources = await sut.GetAllAsync();
         
         // Then
         var resource = Assert.Single(resources);