4
0
Tim Jones 2 сар өмнө
parent
commit
2bdc301d08
50 өөрчлөгдсөн 1869 нэмэгдсэн , 1884 устгасан
  1. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Cpus/AddDesktopCpuUseCase.cs
  2. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Cpus/RemoveDesktopCpuUseCase.cs
  3. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Cpus/UpdateDesktopCpuUseCase.cs
  4. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/AddDesktopDriveUseCase.cs
  5. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/RemoveDesktopDriveUseCase.cs
  6. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Drives/UpdateDesktopDriveUseCase.cs
  7. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/AddDesktopGpuUseCase.cs
  8. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/RemoveDesktopGpuUseCase.cs
  9. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/Gpus/UpdateDesktopGpuUseCase.cs
  10. 1 1
      RackPeek.Domain/Resources/Hardware/Laptops/LaptopHardwareReportUseCase.cs
  11. 1 3
      RackPeek.Web/Components/AccessPoints/AccessPointCardComponent.razor
  12. 0 1
      RackPeek.Web/Components/AccessPoints/AccessPointsListPage.razor
  13. 6 6
      RackPeek.Web/Components/Components/HardwareDependencyTreeComponent.razor
  14. 10 11
      RackPeek.Web/Components/Components/ResourceBreadCrumbComponent.razor
  15. 1 3
      RackPeek.Web/Components/Desktops/DesktopCardComponent.razor
  16. 0 1
      RackPeek.Web/Components/Desktops/DesktopsListPage.razor
  17. 8 5
      RackPeek.Web/Components/Hardware/HardwareDetailsPage.razor
  18. 5 5
      RackPeek.Web/Components/Hardware/HardwareTreePage.razor
  19. 2 1
      RackPeek.Web/Components/Servers/AddServerComponent.razor
  20. 1 1
      RackPeek.Web/Components/Servers/ServerCardComponent.razor
  21. 3 2
      RackPeek.Web/Components/Servers/ServersListComponent.razor
  22. 0 1
      RackPeek.Web/Components/Servers/ServersListPage.razor
  23. 3 3
      RackPeek.Web/Components/Services/AddServiceComponent.razor
  24. 1 1
      RackPeek.Web/Components/Services/ServiceCardComponent.razor
  25. 1 1
      RackPeek.Web/Components/Services/ServiceDetailsPage.razor
  26. 4 2
      RackPeek.Web/Components/Services/ServicesListComponent.razor
  27. 0 1
      RackPeek.Web/Components/Services/ServicesListPage.razor
  28. 1 3
      RackPeek.Web/Components/Switches/SwitchCardComponent.razor
  29. 2 2
      RackPeek.Web/Components/Switches/SwitchListComponent.razor
  30. 0 1
      RackPeek.Web/Components/Switches/SwitchListPage.razor
  31. 2 1
      RackPeek.Web/Components/Systems/AddSystemComponent.razor
  32. 2 3
      RackPeek.Web/Components/Systems/SystemCardComponent.razor
  33. 8 11
      RackPeek.Web/Components/Systems/SystemDependencyTreeComponent.razor
  34. 1 1
      RackPeek.Web/Components/Systems/SystemsDetailsPage.razor
  35. 5 4
      RackPeek.Web/Components/Systems/SystemsListComponent.razor
  36. 0 1
      RackPeek.Web/Components/Systems/SystemsListPage.razor
  37. 28 28
      RackPeek.Web/RackPeek.Web.csproj
  38. 635 635
      RackPeek.Web/config copy/Services.yaml
  39. 207 207
      RackPeek.Web/config copy/Systems.yaml
  40. 35 35
      RackPeek.Web/config copy/accesspoints.yaml
  41. 21 21
      RackPeek.Web/config copy/desktops.yaml
  42. 13 13
      RackPeek.Web/config copy/firewalls.yaml
  43. 16 16
      RackPeek.Web/config copy/laptops.yaml
  44. 13 13
      RackPeek.Web/config copy/routers.yaml
  45. 420 420
      RackPeek.Web/config copy/servers.yaml
  46. 1 1
      RackPeek.Web/config copy/switches.yaml
  47. 5 5
      RackPeek.Web/config copy/ups.yaml
  48. 384 385
      RackPeek/CliBootstrap.cs
  49. 0 1
      RackPeek/Commands/Laptops/Gpus/LaptopGpuRemoveCommand.cs
  50. 14 19
      RackPeek/Yaml/YamlResourceCollection.cs

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Cpus/AddDesktopCpuUseCase.cs

@@ -7,7 +7,7 @@ public class AddLaptopCpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, Cpu cpu)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         Laptop.Cpus ??= new List<Cpu>();
         Laptop.Cpus.Add(cpu);

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Cpus/RemoveDesktopCpuUseCase.cs

@@ -7,7 +7,7 @@ public class RemoveLaptopCpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Cpus == null || index < 0 || index >= Laptop.Cpus.Count)
             throw new InvalidOperationException($"CPU index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Cpus/UpdateDesktopCpuUseCase.cs

@@ -7,7 +7,7 @@ public class UpdateLaptopCpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index, Cpu updated)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Cpus == null || index < 0 || index >= Laptop.Cpus.Count)
             throw new InvalidOperationException($"CPU index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Drives/AddDesktopDriveUseCase.cs

@@ -7,7 +7,7 @@ public class AddLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, Drive drive)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         Laptop.Drives ??= new List<Drive>();
         Laptop.Drives.Add(drive);

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Drives/RemoveDesktopDriveUseCase.cs

@@ -7,7 +7,7 @@ public class RemoveLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Drives == null || index < 0 || index >= Laptop.Drives.Count)
             throw new InvalidOperationException($"Drive index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Drives/UpdateDesktopDriveUseCase.cs

@@ -7,7 +7,7 @@ public class UpdateLaptopDriveUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index, Drive updated)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Drives == null || index < 0 || index >= Laptop.Drives.Count)
             throw new InvalidOperationException($"Drive index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Gpus/AddDesktopGpuUseCase.cs

@@ -7,7 +7,7 @@ public class AddLaptopGpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, Gpu gpu)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         Laptop.Gpus ??= new List<Gpu>();
         Laptop.Gpus.Add(gpu);

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Gpus/RemoveDesktopGpuUseCase.cs

@@ -7,7 +7,7 @@ public class RemoveLaptopGpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Gpus == null || index < 0 || index >= Laptop.Gpus.Count)
             throw new InvalidOperationException($"GPU index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/Gpus/UpdateDesktopGpuUseCase.cs

@@ -7,7 +7,7 @@ public class UpdateLaptopGpuUseCase(IHardwareRepository repository) : IUseCase
     public async Task ExecuteAsync(string LaptopName, int index, Gpu updated)
     {
         var Laptop = await repository.GetByNameAsync(LaptopName) as Laptop
-                      ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
+                     ?? throw new InvalidOperationException($"Laptop '{LaptopName}' not found.");
 
         if (Laptop.Gpus == null || index < 0 || index >= Laptop.Gpus.Count)
             throw new InvalidOperationException($"GPU index {index} not found on Laptop '{LaptopName}'.");

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Laptops/LaptopHardwareReportUseCase.cs

@@ -30,7 +30,7 @@ public class LaptopHardwareReportUseCase(IHardwareRepository repository) : IUseC
             var hddStorage = Laptop.Drives?
                 .Where(d => d.Type == "hdd")
                 .Sum(d => d.Size) ?? 0;
-            
+
             var gpuSummary = Laptop.Gpus == null
                 ? "None"
                 : string.Join(", ",

+ 1 - 3
RackPeek.Web/Components/AccessPoints/AccessPointCardComponent.razor

@@ -1,5 +1,4 @@
 @using RackPeek.Domain.Resources.Hardware.Models
-
 <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
     <div class="flex justify-between items-center mb-3">
         <div class="text-zinc-100">
@@ -30,6 +29,5 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired]
-    public AccessPoint AccessPoint { get; set; } = default!;
+    [Parameter] [EditorRequired] public AccessPoint AccessPoint { get; set; } = default!;
 }

+ 0 - 1
RackPeek.Web/Components/AccessPoints/AccessPointsListPage.razor

@@ -1,5 +1,4 @@
 @page "/accesspoints/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>AccessPoints</PageTitle>
 

+ 6 - 6
RackPeek.Web/Components/Components/HardwareDependencyTreeComponent.razor

@@ -37,7 +37,7 @@ else
                                 var url = service.NetworkString();
                                 <NavLink href="@($"/resources/services/{service.Name}")" class="block">
                                     <div class="border border-zinc-800 rounded bg-zinc-900 p-2 hover:border-zinc-700">
-        
+
                                         <div class="text-zinc-200 text-sm">
                                             @service.Name
                                         </div>
@@ -45,10 +45,10 @@ else
                                         @{
                                             var srv = BuildServiceSubtitle(service);
                                         }
-                
+
 
                                         <div class="text-xs text-zinc-500 mt-1">
-                                            Service - 
+                                            Service -
                                             @if (!string.IsNullOrEmpty(srv))
                                             {
                                                 <a href="@url"
@@ -58,7 +58,6 @@ else
                                                    @onclick:stopPropagation>
                                                     @srv
                                                 </a>
-
                                             }
 
                                         </div>
@@ -82,8 +81,8 @@ else
 }
 
 @code {
-    [Parameter][EditorRequired] public HardwareDependencyTree? Tree { get; set; }
-    
+    [Parameter] [EditorRequired] public HardwareDependencyTree? Tree { get; set; }
+
     private static string? BuildServiceSubtitle(Service service)
     {
         var endpoint = service.NetworkString();
@@ -93,4 +92,5 @@ else
 
         return endpoint;
     }
+
 }

+ 10 - 11
RackPeek.Web/Components/Components/ResourceBreadCrumbComponent.razor

@@ -19,13 +19,11 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired]
-    public ResourceType ResourceType { get; set; }
+    [Parameter] [EditorRequired] public ResourceType ResourceType { get; set; }
 
-    [Parameter][EditorRequired]
-    public string ResourceName { get; set; } = default!;
+    [Parameter] [EditorRequired] public string ResourceName { get; set; } = default!;
 
-    private List<Breadcrumb> Breadcrumbs { get; set; } = new();
+    private List<Breadcrumb> Breadcrumbs { get; } = new();
 
     protected override async Task OnParametersSetAsync()
     {
@@ -49,7 +47,7 @@
 
     private async Task BuildHardwarePath(string hardwareName)
     {
-        Breadcrumbs.Add(new(hardwareName, $"resources/hardware/{hardwareName}"));
+        Breadcrumbs.Add(new Breadcrumb(hardwareName, $"resources/hardware/{hardwareName}"));
     }
 
     private async Task BuildSystemPath(string systemName)
@@ -58,13 +56,13 @@
 
         if (system?.RunsOn is not null)
         {
-            Breadcrumbs.Add(new(
+            Breadcrumbs.Add(new Breadcrumb(
                 system.RunsOn,
                 $"resources/hardware/{system.RunsOn}"
             ));
         }
 
-        Breadcrumbs.Add(new(
+        Breadcrumbs.Add(new Breadcrumb(
             systemName,
             $"resources/systems/{systemName}"
         ));
@@ -80,23 +78,24 @@
 
             if (system?.RunsOn is not null)
             {
-                Breadcrumbs.Add(new(
+                Breadcrumbs.Add(new Breadcrumb(
                     system.RunsOn,
                     $"resources/hardware/{system.RunsOn}"
                 ));
             }
 
-            Breadcrumbs.Add(new(
+            Breadcrumbs.Add(new Breadcrumb(
                 service.RunsOn,
                 $"resources/systems/{service.RunsOn}"
             ));
         }
 
-        Breadcrumbs.Add(new(
+        Breadcrumbs.Add(new Breadcrumb(
             serviceName,
             $"resources/services/{serviceName}"
         ));
     }
 
     private record Breadcrumb(string Label, string Href);
+
 }

+ 1 - 3
RackPeek.Web/Components/Desktops/DesktopCardComponent.razor

@@ -1,5 +1,4 @@
 @using RackPeek.Domain.Resources.Hardware.Models
-
 <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
     <div class="flex justify-between items-center mb-3">
         <div class="text-zinc-100">
@@ -82,6 +81,5 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired]
-    public Desktop Desktop { get; set; } = default!;
+    [Parameter] [EditorRequired] public Desktop Desktop { get; set; } = default!;
 }

+ 0 - 1
RackPeek.Web/Components/Desktops/DesktopsListPage.razor

@@ -1,5 +1,4 @@
 @page "/desktops/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>Desktops</PageTitle>
 

+ 8 - 5
RackPeek.Web/Components/Hardware/HardwareDetailsPage.razor

@@ -1,9 +1,9 @@
 @page "/resources/hardware/{HardwareName}"
 @using RackPeek.Domain.Resources.Hardware
 @using RackPeek.Domain.Resources.Hardware.Models
+@using RackPeek.Web.Components.AccessPoints
 @using RackPeek.Web.Components.Components
 @using RackPeek.Web.Components.Desktops
-@using RackPeek.Web.Components.AccessPoints
 @using RackPeek.Web.Components.Switches
 @inject IHardwareRepository HardwareRepository
 @inject GetHardwareSystemTreeUseCase GetHardwareSystemTreeUseCase
@@ -11,7 +11,7 @@
 
 <ResourceBreadCrumbComponent
     ResourceType="ResourceType.Hardware"
-    ResourceName="@HardwareName" />
+    ResourceName="@HardwareName"/>
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6">
     @if (_hardware is null && !_loading)
@@ -31,13 +31,16 @@
         @if (_hardware is Server server)
         {
             <ServerCardComponent Server="server"/>
-        } else if (_hardware is Desktop desktop)
+        }
+        else if (_hardware is Desktop desktop)
         {
             <DesktopCardComponent Desktop="desktop"/>
-        }else if (_hardware is AccessPoint accessPoint)
+        }
+        else if (_hardware is AccessPoint accessPoint)
         {
             <AccessPointCardComponent AccessPoint="accessPoint"/>
-        }else if (_hardware is Switch _switch)
+        }
+        else if (_hardware is Switch _switch)
         {
             <SwitchCardComponent Switch="_switch"/>
         }

+ 5 - 5
RackPeek.Web/Components/Hardware/HardwareTreePage.razor

@@ -17,12 +17,12 @@
         </NavLink>
         <NavLink href="/desktops/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
             Desktops
-        </NavLink>     
+        </NavLink>
         <NavLink href="/accesspoints/list" class="hover:text-emerald-400" activeClass="text-emerald-400 font-semibold">
             AccessPoints
         </NavLink>
     </nav>
-    
+
     @if (_tree is null)
     {
         <div class="text-zinc-500">loading tree…</div>
@@ -51,7 +51,7 @@
                         <li>
                             <!-- Hardware -->
                             <NavLink href="@($"/resources/hardware/{hardware.HardwareName}")" class="block">
-                               
+
                                 @if (hardware.Systems.Any())
                                 {
                                     <div class="text-zinc-100">
@@ -64,7 +64,7 @@
                                         @hardware.HardwareName
                                     </div>
                                 }
-               
+
                             </NavLink>
 
                             @if (hardware.Systems.Any())
@@ -87,7 +87,7 @@
                                                         └─ @system.SystemName
                                                     </div>
                                                 }
-                                 
+
                                             </NavLink>
 
                                             @if (system.Services.Any())

+ 2 - 1
RackPeek.Web/Components/Servers/AddServerComponent.razor

@@ -11,7 +11,7 @@
             class="flex-1 bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-600"
             placeholder="server name"
             @bind="_name"
-            @bind:event="oninput" />
+            @bind:event="oninput"/>
 
         <button
             class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
@@ -64,4 +64,5 @@
             _isSubmitting = false;
         }
     }
+
 }

+ 1 - 1
RackPeek.Web/Components/Servers/ServerCardComponent.razor

@@ -80,5 +80,5 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired] public TServer Server { get; set; } = default!;
+    [Parameter] [EditorRequired] public TServer Server { get; set; } = default!;
 }

+ 3 - 2
RackPeek.Web/Components/Servers/ServersListComponent.razor

@@ -7,7 +7,7 @@
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6 space-y-6">
 
-    <AddServerComponent OnCreated="NavigateToNewResource" />
+    <AddServerComponent OnCreated="NavigateToNewResource"/>
 
     @if (_servers is null)
     {
@@ -23,7 +23,7 @@
             @foreach (var server in _servers.OrderBy(s => s.Name))
             {
                 <NavLink href="@($"/resources/hardware/{server.Name}")" class="block">
-                    <ServerCardComponent Server="server" />
+                    <ServerCardComponent Server="server"/>
                 </NavLink>
             }
         </div>
@@ -43,4 +43,5 @@
         Nav.NavigateTo($"/resources/hardware/{serverName}");
         return Task.CompletedTask;
     }
+
 }

+ 0 - 1
RackPeek.Web/Components/Servers/ServersListPage.razor

@@ -1,5 +1,4 @@
 @page "/servers/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>Servers</PageTitle>
 <h1 class="text-lg text-zinc-100">

+ 3 - 3
RackPeek.Web/Components/Services/AddServiceComponent.razor

@@ -1,5 +1,4 @@
-@using RackPeek.Domain.Resources.Services
-@using RackPeek.Domain.Resources.Services.UseCases
+@using RackPeek.Domain.Resources.Services.UseCases
 @inject AddServiceUseCase AddService
 
 <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
@@ -12,7 +11,7 @@
             class="flex-1 bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-600"
             placeholder="service name"
             @bind="_name"
-            @bind:event="oninput" />
+            @bind:event="oninput"/>
 
         <button
             class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
@@ -65,4 +64,5 @@
             _isSubmitting = false;
         }
     }
+
 }

+ 1 - 1
RackPeek.Web/Components/Services/ServiceCardComponent.razor

@@ -113,7 +113,7 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired] public TService Service { get; set; } = default!;
+    [Parameter] [EditorRequired] public TService Service { get; set; } = default!;
 
     [Parameter] public EventCallback<ServiceEditModel> OnSave { get; set; }
 

+ 1 - 1
RackPeek.Web/Components/Services/ServiceDetailsPage.razor

@@ -8,7 +8,7 @@
 
 <ResourceBreadCrumbComponent
     ResourceType="ResourceType.Service"
-    ResourceName="@ServiceName" />
+    ResourceName="@ServiceName"/>
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6">
     @if (_service is null && !_loading)

+ 4 - 2
RackPeek.Web/Components/Services/ServicesListComponent.razor

@@ -7,8 +7,8 @@
 <PageTitle>Services</PageTitle>
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6 space-y-6">
-    <AddServiceComponent OnCreated="NavigateToNewResource" />
-    
+    <AddServiceComponent OnCreated="NavigateToNewResource"/>
+
     @if (_services is null)
     {
         <div class="text-zinc-500">loading services…</div>
@@ -52,9 +52,11 @@
             edit.RunsOn
         );
     }
+
     private Task NavigateToNewResource(string serverName)
     {
         Nav.NavigateTo($"/resources/services/{serverName}");
         return Task.CompletedTask;
     }
+
 }

+ 0 - 1
RackPeek.Web/Components/Services/ServicesListPage.razor

@@ -1,5 +1,4 @@
 @page "/services/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>Services</PageTitle>
 <h1 class="text-lg text-zinc-100">

+ 1 - 3
RackPeek.Web/Components/Switches/SwitchCardComponent.razor

@@ -1,5 +1,4 @@
 @using RackPeek.Domain.Resources.Hardware.Models
-
 <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
     <div class="flex justify-between items-center mb-3">
         <div class="text-zinc-100">
@@ -54,6 +53,5 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired]
-    public Switch Switch { get; set; } = default!;
+    [Parameter] [EditorRequired] public Switch Switch { get; set; } = default!;
 }

+ 2 - 2
RackPeek.Web/Components/Switches/SwitchListComponent.razor

@@ -1,5 +1,5 @@
-@using RackPeek.Domain.Resources.Hardware.Switches
-@using RackPeek.Domain.Resources.Hardware.Models
+@using RackPeek.Domain.Resources.Hardware.Models
+@using RackPeek.Domain.Resources.Hardware.Switches
 @inject GetSwitchesUseCase GetSwitches
 
 <PageTitle>Switches</PageTitle>

+ 0 - 1
RackPeek.Web/Components/Switches/SwitchListPage.razor

@@ -1,5 +1,4 @@
 @page "/switches/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>Switches</PageTitle>
 

+ 2 - 1
RackPeek.Web/Components/Systems/AddSystemComponent.razor

@@ -11,7 +11,7 @@
             class="flex-1 bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-600"
             placeholder="system resource name"
             @bind="_name"
-            @bind:event="oninput" />
+            @bind:event="oninput"/>
 
         <button
             class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
@@ -64,4 +64,5 @@
             _isSubmitting = false;
         }
     }
+
 }

+ 2 - 3
RackPeek.Web/Components/Systems/SystemCardComponent.razor

@@ -1,5 +1,4 @@
-@using RackPeek.Web.Components.Components
-@typeparam TSystem where TSystem : RackPeek.Domain.Resources.SystemResources.SystemResource
+@typeparam TSystem where TSystem : RackPeek.Domain.Resources.SystemResources.SystemResource
 
 <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
     <div class="flex justify-between items-center mb-3">
@@ -124,7 +123,7 @@
 </div>
 
 @code {
-    [Parameter][EditorRequired] public TSystem System { get; set; } = default!;
+    [Parameter] [EditorRequired] public TSystem System { get; set; } = default!;
 
     [Parameter] public EventCallback<SystemEditModel> OnSave { get; set; }
 

+ 8 - 11
RackPeek.Web/Components/Systems/SystemDependencyTreeComponent.razor

@@ -1,6 +1,5 @@
 @using RackPeek.Domain.Resources.Hardware
 @using RackPeek.Domain.Resources.Services
-@using RackPeek.Domain.Resources.Services.UseCases
 @if (Tree is null)
 {
     <div class="text-zinc-500 text-sm">
@@ -18,7 +17,7 @@ else
                 var url = service.NetworkString();
                 <NavLink href="@($"/resources/services/{service.Name}")" class="block">
                     <div class="border border-zinc-800 rounded bg-zinc-900 p-2 hover:border-zinc-700">
-        
+
                         <div class="text-zinc-200 text-sm">
                             @service.Name
                         </div>
@@ -26,10 +25,10 @@ else
                         @{
                             var srv = BuildServiceSubtitle(service);
                         }
-                
+
 
                         <div class="text-xs text-zinc-500 mt-1">
-                            Service - 
+                            Service -
                             @if (!string.IsNullOrEmpty(srv))
                             {
                                 <a href="@url"
@@ -39,16 +38,13 @@ else
                                    @onclick:stopPropagation>
                                     @srv
                                 </a>
-
                             }
 
                         </div>
 
-                            </div>
+                    </div>
                 </NavLink>
-
             }
-
         }
         else
         {
@@ -61,9 +57,9 @@ else
 }
 
 @code {
-    [Parameter][EditorRequired] public SystemDependencyTree? Tree { get; set; }
-    
-    
+    [Parameter] [EditorRequired] public SystemDependencyTree? Tree { get; set; }
+
+
     private static string? BuildServiceSubtitle(Service service)
     {
         var endpoint = service.NetworkString();
@@ -73,4 +69,5 @@ else
 
         return endpoint;
     }
+
 }

+ 1 - 1
RackPeek.Web/Components/Systems/SystemsDetailsPage.razor

@@ -10,7 +10,7 @@
 
 <ResourceBreadCrumbComponent
     ResourceType="ResourceType.System"
-    ResourceName="@SystemName" />
+    ResourceName="@SystemName"/>
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6">
     @if (_system is null && !_loading)

+ 5 - 4
RackPeek.Web/Components/Systems/SystemsListComponent.razor

@@ -5,9 +5,9 @@
 @inject NavigationManager Nav
 
 <div class="min-h-screen bg-zinc-950 text-zinc-200 font-mono p-6 space-y-6">
-    
-    <AddSystemComponent OnCreated="NavigateToNewResource" />
-    
+
+    <AddSystemComponent OnCreated="NavigateToNewResource"/>
+
     @if (_systems is null)
     {
         <div class="text-zinc-500">loading systems…</div>
@@ -27,7 +27,6 @@
                         <SystemCardComponent System="systemResource" OnSave="UpdateSystem"/>
                     </NavLink>
                 }
-      
             }
         </div>
     }
@@ -52,9 +51,11 @@
             edit.RunsOn
         );
     }
+
     private Task NavigateToNewResource(string serverName)
     {
         Nav.NavigateTo($"/resources/systems/{serverName}");
         return Task.CompletedTask;
     }
+
 }

+ 0 - 1
RackPeek.Web/Components/Systems/SystemsListPage.razor

@@ -1,5 +1,4 @@
 @page "/systems/list"
-@using RackPeek.Web.Components.Components
 
 <PageTitle>Systems</PageTitle>
 

+ 28 - 28
RackPeek.Web/RackPeek.Web.csproj

@@ -12,37 +12,37 @@
     </ItemGroup>
 
     <ItemGroup>
-      <_ContentIncludedByDefault Remove="Components\Components\Desktops\DesktopCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Components\Desktops\DesktopsListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallsListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallsListPage.razor" />
-      <_ContentIncludedByDefault Remove="Components\Laptops\LaptopCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Laptops\LaptopsListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Laptops\LaptopsListPage.razor" />
-      <_ContentIncludedByDefault Remove="Components\Routers\RouterCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Routers\RoutersListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Routers\RoutersListPage.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\HardwareDependencyTreeComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\ResourceBreadCrumbComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\ServerCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\ServersListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\ServiceCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\ServicesListComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemCardComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemDependencyTreeComponent.razor" />
-      <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemsListComponent.razor" />
+        <_ContentIncludedByDefault Remove="Components\Components\Desktops\DesktopCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Components\Desktops\DesktopsListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallsListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\FireWalls\FireWallsListPage.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Laptops\LaptopCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Laptops\LaptopsListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Laptops\LaptopsListPage.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Routers\RouterCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Routers\RoutersListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Routers\RoutersListPage.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\HardwareDependencyTreeComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\ResourceBreadCrumbComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\ServerCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\ServersListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\ServiceCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\ServicesListComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemCardComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemDependencyTreeComponent.razor"/>
+        <_ContentIncludedByDefault Remove="Components\Servers\Components\SystemsListComponent.razor"/>
     </ItemGroup>
 
     <ItemGroup>
-      <AdditionalFiles Include="Components\Components\HardwareDependencyTreeComponent.razor" />
-      <AdditionalFiles Include="Components\Components\ServerCardComponent.razor" />
-      <AdditionalFiles Include="Components\Components\ServersListComponent.razor" />
-      <AdditionalFiles Include="Components\Components\ServiceCardComponent.razor" />
-      <AdditionalFiles Include="Components\Components\ServicesListComponent.razor" />
-      <AdditionalFiles Include="Components\Components\SystemCardComponent.razor" />
-      <AdditionalFiles Include="Components\Components\SystemDependencyTreeComponent.razor" />
-      <AdditionalFiles Include="Components\Components\SystemsListComponent.razor" />
+        <AdditionalFiles Include="Components\Components\HardwareDependencyTreeComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\ServerCardComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\ServersListComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\ServiceCardComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\ServicesListComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\SystemCardComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\SystemDependencyTreeComponent.razor"/>
+        <AdditionalFiles Include="Components\Components\SystemsListComponent.razor"/>
     </ItemGroup>
 
 </Project>

+ 635 - 635
RackPeek.Web/config copy/Services.yaml

@@ -1,636 +1,636 @@
 resources:
-- kind: Service
-  network:
-    ip: 192.168.0.10
-    port: 8096
-    protocol: TCP
-    url: http://jellyfin.lan:8096
-  runsOn: docker-host
-  name: jellyfin
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.11
-    port: 32400
-    protocol: TCP
-    url: http://plex.lan:32400
-  runsOn: proxmox-host
-  name: plex
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.20
-    port: 8123
-    protocol: TCP
-    url: http://ha.lan:8123
-  runsOn: k8s-node-1
-  name: home-assistant
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.2
-    port: 53
-    protocol: UDP
-    url: http://pihole.lan/admin
-  runsOn: baremetal-rpi4
-  name: pihole
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.5
-    port: 8443
-    protocol: TCP
-    url: https://unifi.lan:8443
-  runsOn: vm-cluster-1
-  name: unifi-controller
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.0.15
-    port: 8384
-    protocol: TCP
-    url: http://sync.internal:8384
-  runsOn: docker-host
-  name: syncthing
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.0.20
-    port: 3000
-    protocol: TCP
-    url: http://grafana.internal:3000
-  runsOn: monitoring-node
-  name: grafana
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.0.21
-    port: 9090
-    protocol: TCP
-    url: http://prometheus.internal:9090
-  runsOn: monitoring-node
-  name: prometheus
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.0.22
-    port: 3100
-    protocol: TCP
-    url: http://loki.internal:3100
-  runsOn: monitoring-node
-  name: loki
-  tags: 
-- kind: Service
-  network:
-    ip: 172.16.0.10
-    port: 9000
-    protocol: TCP
-    url: http://minio.storage:9000
-  runsOn: storage-node-1
-  name: minio
-  tags: 
-- kind: Service
-  network:
-    ip: 172.16.0.11
-    port: 443
-    protocol: TCP
-    url: https://nextcloud.storage
-  runsOn: storage-node-2
-  name: nextcloud
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.30
-    port: 8081
-    protocol: TCP
-    url: http://vault.lan:8081
-  runsOn: docker-host
-  name: vaultwarden
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.2
-    port: 80
-    protocol: TCP
-    url: http://traefik.lan
-  runsOn: k8s-node-1
-  name: traefik
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.3
-    port: 443
-    protocol: TCP
-    url: https://proxy.lan
-  runsOn: docker-host
-  name: nginx-reverse-proxy
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.40
-    port: 8080
-    protocol: TCP
-    url: http://torrent.lan:8080
-  runsOn: proxmox-host
-  name: qbittorrent
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.41
-    port: 7878
-    protocol: TCP
-    url: http://radarr.lan:7878
-  runsOn: docker-host
-  name: radarr
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.43
-    port: 9696
-    protocol: TCP
-    url: http://prowlarr.lan:9696
-  runsOn: docker-host
-  name: prowlarr
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.43
-    port: 9696
-    protocol: TCP
-    url: http://prowlarr.lan:9696
-  runsOn: docker-host
-  name: prowlarr
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.44
-    port: 8085
-    protocol: TCP
-    url: http://sabnzbd.lan:8085
-  runsOn: docker-host
-  name: sabnzbd
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.31
-    port: 1883
-    protocol: TCP
-    url: mqtt://mqtt.lan:1883
-  runsOn: docker-host
-  name: mosquitto-mqtt
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.32
-    port: 8080
-    protocol: TCP
-    url: http://z2m.lan:8080
-  runsOn: docker-host
-  name: zigbee2mqtt
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.1.10
-    port: 5432
-    protocol: TCP
-    url: postgres://db.internal:5432
-  runsOn: db-node-1
-  name: postgres-main
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.1.11
-    port: 3306
-    protocol: TCP
-    url: mysql://mariadb.internal:3306
-  runsOn: db-node-2
-  name: mariadb
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.1.12
-    port: 6379
-    protocol: TCP
-    url: redis://redis.internal:6379
-  runsOn: cache-node
-  name: redis-cache
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.2.10
-    port: 9200
-    protocol: TCP
-    url: http://es.internal:9200
-  runsOn: search-node
-  name: elasticsearch
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.2.11
-    port: 5601
-    protocol: TCP
-    url: http://kibana.internal:5601
-  runsOn: search-node
-  name: kibana
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.50
-    port: 3001
-    protocol: TCP
-    url: http://uptime.lan:3001
-  runsOn: docker-host
-  name: uptime-kuma
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.100
-    port: 51820
-    protocol: UDP
-    url: wg://vpn.lan
-  runsOn: baremetal-rpi4
-  name: wireguard-vpn
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.101
-    port: 1194
-    protocol: UDP
-    url: ovpn://openvpn.lan
-  runsOn: vm-cluster-2
-  name: openvpn
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.3.10
-    port: 443
-    protocol: TCP
-    url: https://gitlab.internal
-  runsOn: dev-node-1
-  name: gitlab
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.3.11
-    port: 3000
-    protocol: TCP
-    url: http://gitea.internal:3000
-  runsOn: dev-node-2
-  name: gitea
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.3.12
-    port: 8080
-    protocol: TCP
-    url: http://drone.internal:8080
-  runsOn: dev-node-2
-  name: drone-ci
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.3.13
-    port: 5000
-    protocol: TCP
-    url: http://harbor.internal:5000
-  runsOn: dev-node-3
-  name: harbor-registry
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.4.1
-    port: 6443
-    protocol: TCP
-    url: https://k8s-api.internal:6443
-  runsOn: k8s-control-plane
-  name: kubernetes-api
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.4.20
-    port: 9500
-    protocol: TCP
-    url: http://longhorn.internal:9500
-  runsOn: k8s-node-3
-  name: longhorn-ui
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.4.21
-    port: 8443
-    protocol: TCP
-    url: https://ceph.internal:8443
-  runsOn: k8s-node-3
-  name: rook-ceph-dashboard
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.60
-    port: 445
-    protocol: TCP
-    url: smb://fileserver.lan
-  runsOn: storage-node-1
-  name: samba-fileserver
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.61
-    port: 2049
-    protocol: TCP
-    url: nfs://nfs.lan
-  runsOn: dell-c6400-node01
-  name: nfs-server
-  tags: 
-- kind: Service
-  network:
-    ip: 172.16.1.10
-    port: 3260
-    protocol: TCP
-    url: iscsi://iscsi.storage
-  runsOn: storage-node-3
-  name: iscsi-target
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.70
-    port: 8083
-    protocol: TCP
-    url: http://books.lan:8083
-  runsOn: docker-host
-  name: calibre-web
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.71
-    port: 8000
-    protocol: TCP
-    url: http://docs.lan:8000
-  runsOn: dell-c6400-node01
-  name: paperless-ngx
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.5.10
-    port: 389
-    protocol: TCP
-    url: ldap://ldap.internal:389
-  runsOn: dell-c6400-node01
-  name: openldap
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.5.10
-    port: 389
-    protocol: TCP
-    url: ldap://ldap.internal:389
-  runsOn: dell-c6400-node01
-  name: openldap
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.50
-    port: 123
-    protocol: UDP
-    url: ntp://ntp.lan
-  runsOn: baremetal-rpi3
-  name: ntp-server
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.6.10
-    port: 514
-    protocol: UDP
-    url: syslog://syslog.internal
-  runsOn: monitoring-node
-  name: syslog-server
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.1
-    port: 67
-    protocol: UDP
-    url: dhcp://dhcp.lan
-  runsOn: router-appliance
-  name: dhcp-server
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.7.10
-    port: 53
-    protocol: UDP
-    url: dns://dns.internal
-  runsOn: infra-node
-  name: bind-dns
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.7.11
-    port: 8200
-    protocol: TCP
-    url: http://vault.internal:8200
-  runsOn: infra-node
-  name: vault
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.7.12
-    port: 8500
-    protocol: TCP
-    url: http://consul.internal:8500
-  runsOn: infra-node
-  name: consul
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.7.13
-    port: 4646
-    protocol: TCP
-    url: http://nomad.internal:4646
-  runsOn: infra-node
-  name: nomad
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.40
-    port: 8080
-    protocol: TCP
-    url: http://openhab.lan:8080
-  runsOn: k8s-node-2
-  name: openhab
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.41
-    port: 4000
-    protocol: TCP
-    url: http://mqtt-explorer.lan:4000
-  runsOn: docker-host
-  name: mqtt-explorer
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.8.10
-    port: 8086
-    protocol: TCP
-    url: http://influx.internal:8086
-  runsOn: monitoring-node
-  name: influxdb
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.8.11
-    port: 8125
-    protocol: UDP
-    url: statsd://telegraf.internal
-  runsOn: monitoring-node
-  name: telegraf
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.80
-    port: 8080
-    protocol: TCP
-    url: http://speedtest.lan:8080
-  runsOn: docker-host
-  name: speedtest-tracker
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.81
-    port: 4533
-    protocol: TCP
-    url: http://music.lan:4533
-  runsOn: docker-host
-  name: navidrome
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.82
-    port: 2342
-    protocol: TCP
-    url: http://photos.lan:2342
-  runsOn: docker-host
-  name: photoprism
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.9.10
-    port: 53
-    protocol: UDP
-    url: dns://dnsdist.internal
-  runsOn: infra-node
-  name: dnsdist
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.9.11
-    port: 8081
-    protocol: TCP
-    url: http://pdns.internal:8081
-  runsOn: infra-node
-  name: powerdns
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.10.10
-    port: 8080
-    protocol: TCP
-    url: http://openproject.internal:8080
-  runsOn: dev-node-3
-  name: openproject
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.10.11
-    port: 8065
-    protocol: TCP
-    url: http://chat.internal:8065
-  runsOn: dev-node-3
-  name: mattermost
-  tags: 
-- kind: Service
-  network:
-    ip: 10.0.10.12
-    port: 3000
-    protocol: TCP
-    url: http://rocket.internal:3000
-  runsOn: dev-node-3
-  name: rocket-chat
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.0.4
-    port: 80801
-    protocol: TCP
-    url: http://immich.lan:8080
-  runsOn: proxmox-host
-  name: immich
-  tags: 
-- kind: Service
-  network:
-    ip: 192.168.1.3
-    port: 3002
-    protocol: TCP
-    url: http://adguard.lan:3002
-  runsOn: docker-host
-  name: adguard-home
-  tags: 
-- kind: Server
-  cpus: 
-  ram: 
-  drives: 
-  nics: 
-  gpus: 
-  ipmi: 
-  name: test
-  tags: 
-- kind: Server
-  cpus: 
-  ram: 
-  drives: 
-  nics: 
-  gpus: 
-  ipmi: 
-  name: mr-server
-  tags: 
-- kind: Server
-  cpus: 
-  ram: 
-  drives: 
-  nics: 
-  gpus: 
-  ipmi: 
-  name: new server
-  tags: 
-- kind: Server
-  cpus: 
-  ram: 
-  drives: 
-  nics: 
-  gpus: 
-  ipmi: 
-  name: new server
-  tags: 
-- kind: System
-  type: 
-  os: 
-  cores: 
-  ram: 
-  drives: 
-  runsOn: 
-  name: new-system
-  tags: 
-- kind: System
-  type: 
-  os: 
-  cores: 
-  ram: 
-  drives: 
-  runsOn: 
-  name: new-system
-  tags: 
-- kind: Service
-  network: 
-  runsOn: 
-  name: new-service
-  tags: 
+  - kind: Service
+    network:
+      ip: 192.168.0.10
+      port: 8096
+      protocol: TCP
+      url: http://jellyfin.lan:8096
+    runsOn: docker-host
+    name: jellyfin
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.11
+      port: 32400
+      protocol: TCP
+      url: http://plex.lan:32400
+    runsOn: proxmox-host
+    name: plex
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.20
+      port: 8123
+      protocol: TCP
+      url: http://ha.lan:8123
+    runsOn: k8s-node-1
+    name: home-assistant
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.2
+      port: 53
+      protocol: UDP
+      url: http://pihole.lan/admin
+    runsOn: baremetal-rpi4
+    name: pihole
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.5
+      port: 8443
+      protocol: TCP
+      url: https://unifi.lan:8443
+    runsOn: vm-cluster-1
+    name: unifi-controller
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.0.15
+      port: 8384
+      protocol: TCP
+      url: http://sync.internal:8384
+    runsOn: docker-host
+    name: syncthing
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.0.20
+      port: 3000
+      protocol: TCP
+      url: http://grafana.internal:3000
+    runsOn: monitoring-node
+    name: grafana
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.0.21
+      port: 9090
+      protocol: TCP
+      url: http://prometheus.internal:9090
+    runsOn: monitoring-node
+    name: prometheus
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.0.22
+      port: 3100
+      protocol: TCP
+      url: http://loki.internal:3100
+    runsOn: monitoring-node
+    name: loki
+    tags:
+  - kind: Service
+    network:
+      ip: 172.16.0.10
+      port: 9000
+      protocol: TCP
+      url: http://minio.storage:9000
+    runsOn: storage-node-1
+    name: minio
+    tags:
+  - kind: Service
+    network:
+      ip: 172.16.0.11
+      port: 443
+      protocol: TCP
+      url: https://nextcloud.storage
+    runsOn: storage-node-2
+    name: nextcloud
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.30
+      port: 8081
+      protocol: TCP
+      url: http://vault.lan:8081
+    runsOn: docker-host
+    name: vaultwarden
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.2
+      port: 80
+      protocol: TCP
+      url: http://traefik.lan
+    runsOn: k8s-node-1
+    name: traefik
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.3
+      port: 443
+      protocol: TCP
+      url: https://proxy.lan
+    runsOn: docker-host
+    name: nginx-reverse-proxy
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.40
+      port: 8080
+      protocol: TCP
+      url: http://torrent.lan:8080
+    runsOn: proxmox-host
+    name: qbittorrent
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.41
+      port: 7878
+      protocol: TCP
+      url: http://radarr.lan:7878
+    runsOn: docker-host
+    name: radarr
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.43
+      port: 9696
+      protocol: TCP
+      url: http://prowlarr.lan:9696
+    runsOn: docker-host
+    name: prowlarr
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.43
+      port: 9696
+      protocol: TCP
+      url: http://prowlarr.lan:9696
+    runsOn: docker-host
+    name: prowlarr
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.44
+      port: 8085
+      protocol: TCP
+      url: http://sabnzbd.lan:8085
+    runsOn: docker-host
+    name: sabnzbd
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.31
+      port: 1883
+      protocol: TCP
+      url: mqtt://mqtt.lan:1883
+    runsOn: docker-host
+    name: mosquitto-mqtt
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.32
+      port: 8080
+      protocol: TCP
+      url: http://z2m.lan:8080
+    runsOn: docker-host
+    name: zigbee2mqtt
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.1.10
+      port: 5432
+      protocol: TCP
+      url: postgres://db.internal:5432
+    runsOn: db-node-1
+    name: postgres-main
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.1.11
+      port: 3306
+      protocol: TCP
+      url: mysql://mariadb.internal:3306
+    runsOn: db-node-2
+    name: mariadb
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.1.12
+      port: 6379
+      protocol: TCP
+      url: redis://redis.internal:6379
+    runsOn: cache-node
+    name: redis-cache
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.2.10
+      port: 9200
+      protocol: TCP
+      url: http://es.internal:9200
+    runsOn: search-node
+    name: elasticsearch
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.2.11
+      port: 5601
+      protocol: TCP
+      url: http://kibana.internal:5601
+    runsOn: search-node
+    name: kibana
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.50
+      port: 3001
+      protocol: TCP
+      url: http://uptime.lan:3001
+    runsOn: docker-host
+    name: uptime-kuma
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.100
+      port: 51820
+      protocol: UDP
+      url: wg://vpn.lan
+    runsOn: baremetal-rpi4
+    name: wireguard-vpn
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.101
+      port: 1194
+      protocol: UDP
+      url: ovpn://openvpn.lan
+    runsOn: vm-cluster-2
+    name: openvpn
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.3.10
+      port: 443
+      protocol: TCP
+      url: https://gitlab.internal
+    runsOn: dev-node-1
+    name: gitlab
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.3.11
+      port: 3000
+      protocol: TCP
+      url: http://gitea.internal:3000
+    runsOn: dev-node-2
+    name: gitea
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.3.12
+      port: 8080
+      protocol: TCP
+      url: http://drone.internal:8080
+    runsOn: dev-node-2
+    name: drone-ci
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.3.13
+      port: 5000
+      protocol: TCP
+      url: http://harbor.internal:5000
+    runsOn: dev-node-3
+    name: harbor-registry
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.4.1
+      port: 6443
+      protocol: TCP
+      url: https://k8s-api.internal:6443
+    runsOn: k8s-control-plane
+    name: kubernetes-api
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.4.20
+      port: 9500
+      protocol: TCP
+      url: http://longhorn.internal:9500
+    runsOn: k8s-node-3
+    name: longhorn-ui
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.4.21
+      port: 8443
+      protocol: TCP
+      url: https://ceph.internal:8443
+    runsOn: k8s-node-3
+    name: rook-ceph-dashboard
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.60
+      port: 445
+      protocol: TCP
+      url: smb://fileserver.lan
+    runsOn: storage-node-1
+    name: samba-fileserver
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.61
+      port: 2049
+      protocol: TCP
+      url: nfs://nfs.lan
+    runsOn: dell-c6400-node01
+    name: nfs-server
+    tags:
+  - kind: Service
+    network:
+      ip: 172.16.1.10
+      port: 3260
+      protocol: TCP
+      url: iscsi://iscsi.storage
+    runsOn: storage-node-3
+    name: iscsi-target
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.70
+      port: 8083
+      protocol: TCP
+      url: http://books.lan:8083
+    runsOn: docker-host
+    name: calibre-web
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.71
+      port: 8000
+      protocol: TCP
+      url: http://docs.lan:8000
+    runsOn: dell-c6400-node01
+    name: paperless-ngx
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.5.10
+      port: 389
+      protocol: TCP
+      url: ldap://ldap.internal:389
+    runsOn: dell-c6400-node01
+    name: openldap
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.5.10
+      port: 389
+      protocol: TCP
+      url: ldap://ldap.internal:389
+    runsOn: dell-c6400-node01
+    name: openldap
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.50
+      port: 123
+      protocol: UDP
+      url: ntp://ntp.lan
+    runsOn: baremetal-rpi3
+    name: ntp-server
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.6.10
+      port: 514
+      protocol: UDP
+      url: syslog://syslog.internal
+    runsOn: monitoring-node
+    name: syslog-server
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.1
+      port: 67
+      protocol: UDP
+      url: dhcp://dhcp.lan
+    runsOn: router-appliance
+    name: dhcp-server
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.7.10
+      port: 53
+      protocol: UDP
+      url: dns://dns.internal
+    runsOn: infra-node
+    name: bind-dns
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.7.11
+      port: 8200
+      protocol: TCP
+      url: http://vault.internal:8200
+    runsOn: infra-node
+    name: vault
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.7.12
+      port: 8500
+      protocol: TCP
+      url: http://consul.internal:8500
+    runsOn: infra-node
+    name: consul
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.7.13
+      port: 4646
+      protocol: TCP
+      url: http://nomad.internal:4646
+    runsOn: infra-node
+    name: nomad
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.40
+      port: 8080
+      protocol: TCP
+      url: http://openhab.lan:8080
+    runsOn: k8s-node-2
+    name: openhab
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.41
+      port: 4000
+      protocol: TCP
+      url: http://mqtt-explorer.lan:4000
+    runsOn: docker-host
+    name: mqtt-explorer
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.8.10
+      port: 8086
+      protocol: TCP
+      url: http://influx.internal:8086
+    runsOn: monitoring-node
+    name: influxdb
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.8.11
+      port: 8125
+      protocol: UDP
+      url: statsd://telegraf.internal
+    runsOn: monitoring-node
+    name: telegraf
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.80
+      port: 8080
+      protocol: TCP
+      url: http://speedtest.lan:8080
+    runsOn: docker-host
+    name: speedtest-tracker
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.81
+      port: 4533
+      protocol: TCP
+      url: http://music.lan:4533
+    runsOn: docker-host
+    name: navidrome
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.82
+      port: 2342
+      protocol: TCP
+      url: http://photos.lan:2342
+    runsOn: docker-host
+    name: photoprism
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.9.10
+      port: 53
+      protocol: UDP
+      url: dns://dnsdist.internal
+    runsOn: infra-node
+    name: dnsdist
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.9.11
+      port: 8081
+      protocol: TCP
+      url: http://pdns.internal:8081
+    runsOn: infra-node
+    name: powerdns
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.10.10
+      port: 8080
+      protocol: TCP
+      url: http://openproject.internal:8080
+    runsOn: dev-node-3
+    name: openproject
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.10.11
+      port: 8065
+      protocol: TCP
+      url: http://chat.internal:8065
+    runsOn: dev-node-3
+    name: mattermost
+    tags:
+  - kind: Service
+    network:
+      ip: 10.0.10.12
+      port: 3000
+      protocol: TCP
+      url: http://rocket.internal:3000
+    runsOn: dev-node-3
+    name: rocket-chat
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.0.4
+      port: 80801
+      protocol: TCP
+      url: http://immich.lan:8080
+    runsOn: proxmox-host
+    name: immich
+    tags:
+  - kind: Service
+    network:
+      ip: 192.168.1.3
+      port: 3002
+      protocol: TCP
+      url: http://adguard.lan:3002
+    runsOn: docker-host
+    name: adguard-home
+    tags:
+  - kind: Server
+    cpus:
+    ram:
+    drives:
+    nics:
+    gpus:
+    ipmi:
+    name: test
+    tags:
+  - kind: Server
+    cpus:
+    ram:
+    drives:
+    nics:
+    gpus:
+    ipmi:
+    name: mr-server
+    tags:
+  - kind: Server
+    cpus:
+    ram:
+    drives:
+    nics:
+    gpus:
+    ipmi:
+    name: new server
+    tags:
+  - kind: Server
+    cpus:
+    ram:
+    drives:
+    nics:
+    gpus:
+    ipmi:
+    name: new server
+    tags:
+  - kind: System
+    type:
+    os:
+    cores:
+    ram:
+    drives:
+    runsOn:
+    name: new-system
+    tags:
+  - kind: System
+    type:
+    os:
+    cores:
+    ram:
+    drives:
+    runsOn:
+    name: new-system
+    tags:
+  - kind: Service
+    network:
+    runsOn:
+    name: new-service
+    tags: 

+ 207 - 207
RackPeek.Web/config copy/Systems.yaml

@@ -1,208 +1,208 @@
 resources:
-- kind: System
-  type: KubernetesNode
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: k8s-node-1
-  tags: 
-- kind: System
-  type: KubernetesNode
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: k8s-node-2
-  tags: 
-- kind: System
-  type: KubernetesNode
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: k8s-node-3
-  tags: 
-- kind: System
-  type: KubernetesControlPlane
-  os: ubuntu
-  cores: 4
-  ram: 16
-  drives: 
-  runsOn: dell-c6400-node01
-  name: k8s-control-plane
-  tags: 
-- kind: System
-  type: Monitoring
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: monitoring-node
-  tags: 
-- kind: System
-  type: Storage
-  os: truenas
-  cores: 8
-  ram: 64
-  drives: 
-  runsOn: dell-c6400-node01
-  name: storage-node-1
-  tags: 
-- kind: System
-  type: Storage
-  os: truenas
-  cores: 8
-  ram: 64
-  drives: 
-  runsOn: dell-c6400-node01
-  name: storage-node-2
-  tags: 
-- kind: System
-  type: Storage
-  os: truenas
-  cores: 8
-  ram: 64
-  drives: 
-  runsOn: dell-c6400-node01
-  name: storage-node-3
-  tags: 
-- kind: System
-  type: Database
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: db-node-1
-  tags: 
-- kind: System
-  type: Database
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: db-node-2
-  tags: 
-- kind: System
-  type: Cache
-  os: ubuntu
-  cores: 4
-  ram: 16
-  drives: 
-  runsOn: dell-c6400-node01
-  name: cache-node
-  tags: 
-- kind: System
-  type: Search
-  os: ubuntu
-  cores: 8
-  ram: 32
-  drives: 
-  runsOn: dell-c6400-node01
-  name: search-node
-  tags: 
-- kind: System
-  type: Development
-  os: ubuntu
-  cores: 4
-  ram: 16
-  drives: 
-  runsOn: dell-c6400-node01
-  name: dev-node-1
-  tags: 
-- kind: System
-  type: Development
-  os: ubuntu
-  cores: 4
-  ram: 16
-  drives: 
-  runsOn: dell-c6400-node01
-  name: dev-node-2
-  tags: 
-- kind: System
-  type: Development
-  os: ubuntu
-  cores: 6
-  ram: 24
-  drives: 
-  runsOn: dell-c6400-node01
-  name: dev-node-3
-  tags: 
-- kind: System
-  type: VirtualMachineCluster
-  os: proxmox
-  cores: 12
-  ram: 48
-  drives: 
-  runsOn: dell-c6400-node01
-  name: vm-cluster-1
-  tags: 
-- kind: System
-  type: BareMetal
-  os: raspbian
-  cores: 4
-  ram: 8
-  drives: 
-  runsOn: rack-edge
-  name: baremetal-rpi4
-  tags: 
-- kind: System
-  type: BareMetal
-  os: raspbian
-  cores: 4
-  ram: 4
-  drives: 
-  runsOn: rack-edge
-  name: baremetal-rpi3
-  tags: 
-- kind: System
-  type: Infrastructure
-  os: ubuntu
-  cores: 4
-  ram: 16
-  drives: 
-  runsOn: dell-c6400-node01
-  name: infra-node
-  tags: 
-- kind: System
-  type: NetworkAppliance
-  os: openwrt
-  cores: 2
-  ram: 2
-  drives: 
-  runsOn: network-rack
-  name: router-appliance
-  tags: 
-- kind: System
-  type: Hypervisor
-  os: proxmox
-  cores: 16
-  ram: 61
-  drives: 
-  runsOn: dell-c6400-node01
-  name: proxmox-host
-  tags: 
-- kind: System
-  type: ContainerHost
-  os: ubuntu
-  cores: 12
-  ram: 26
-  drives: 
-  runsOn: dell-c6400-node01
-  name: docker-host
-  tags: 
-- kind: System
-  type: VirtualMachineCluster
-  os: proxmox
-  cores: 13
-  ram: 44
-  drives: 
-  runsOn: dell-c6400-node01
-  name: vm-cluster-2
-  tags: 
+  - kind: System
+    type: KubernetesNode
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: k8s-node-1
+    tags:
+  - kind: System
+    type: KubernetesNode
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: k8s-node-2
+    tags:
+  - kind: System
+    type: KubernetesNode
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: k8s-node-3
+    tags:
+  - kind: System
+    type: KubernetesControlPlane
+    os: ubuntu
+    cores: 4
+    ram: 16
+    drives:
+    runsOn: dell-c6400-node01
+    name: k8s-control-plane
+    tags:
+  - kind: System
+    type: Monitoring
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: monitoring-node
+    tags:
+  - kind: System
+    type: Storage
+    os: truenas
+    cores: 8
+    ram: 64
+    drives:
+    runsOn: dell-c6400-node01
+    name: storage-node-1
+    tags:
+  - kind: System
+    type: Storage
+    os: truenas
+    cores: 8
+    ram: 64
+    drives:
+    runsOn: dell-c6400-node01
+    name: storage-node-2
+    tags:
+  - kind: System
+    type: Storage
+    os: truenas
+    cores: 8
+    ram: 64
+    drives:
+    runsOn: dell-c6400-node01
+    name: storage-node-3
+    tags:
+  - kind: System
+    type: Database
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: db-node-1
+    tags:
+  - kind: System
+    type: Database
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: db-node-2
+    tags:
+  - kind: System
+    type: Cache
+    os: ubuntu
+    cores: 4
+    ram: 16
+    drives:
+    runsOn: dell-c6400-node01
+    name: cache-node
+    tags:
+  - kind: System
+    type: Search
+    os: ubuntu
+    cores: 8
+    ram: 32
+    drives:
+    runsOn: dell-c6400-node01
+    name: search-node
+    tags:
+  - kind: System
+    type: Development
+    os: ubuntu
+    cores: 4
+    ram: 16
+    drives:
+    runsOn: dell-c6400-node01
+    name: dev-node-1
+    tags:
+  - kind: System
+    type: Development
+    os: ubuntu
+    cores: 4
+    ram: 16
+    drives:
+    runsOn: dell-c6400-node01
+    name: dev-node-2
+    tags:
+  - kind: System
+    type: Development
+    os: ubuntu
+    cores: 6
+    ram: 24
+    drives:
+    runsOn: dell-c6400-node01
+    name: dev-node-3
+    tags:
+  - kind: System
+    type: VirtualMachineCluster
+    os: proxmox
+    cores: 12
+    ram: 48
+    drives:
+    runsOn: dell-c6400-node01
+    name: vm-cluster-1
+    tags:
+  - kind: System
+    type: BareMetal
+    os: raspbian
+    cores: 4
+    ram: 8
+    drives:
+    runsOn: rack-edge
+    name: baremetal-rpi4
+    tags:
+  - kind: System
+    type: BareMetal
+    os: raspbian
+    cores: 4
+    ram: 4
+    drives:
+    runsOn: rack-edge
+    name: baremetal-rpi3
+    tags:
+  - kind: System
+    type: Infrastructure
+    os: ubuntu
+    cores: 4
+    ram: 16
+    drives:
+    runsOn: dell-c6400-node01
+    name: infra-node
+    tags:
+  - kind: System
+    type: NetworkAppliance
+    os: openwrt
+    cores: 2
+    ram: 2
+    drives:
+    runsOn: network-rack
+    name: router-appliance
+    tags:
+  - kind: System
+    type: Hypervisor
+    os: proxmox
+    cores: 16
+    ram: 61
+    drives:
+    runsOn: dell-c6400-node01
+    name: proxmox-host
+    tags:
+  - kind: System
+    type: ContainerHost
+    os: ubuntu
+    cores: 12
+    ram: 26
+    drives:
+    runsOn: dell-c6400-node01
+    name: docker-host
+    tags:
+  - kind: System
+    type: VirtualMachineCluster
+    os: proxmox
+    cores: 13
+    ram: 44
+    drives:
+    runsOn: dell-c6400-node01
+    name: vm-cluster-2
+    tags: 

+ 35 - 35
RackPeek.Web/config copy/accesspoints.yaml

@@ -1,36 +1,36 @@
 resources:
-- kind: AccessPoint
-  model: Unifi-Ap-Pro-7
-  speed: 1
-  name: lounge-ap
-  tags: 
-- kind: AccessPoint
-  model: Unifi-Ap-Pro-7
-  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-7
+    speed: 1
+    name: lounge-ap
+    tags:
+  - kind: AccessPoint
+    model: Unifi-Ap-Pro-7
+    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: 

+ 21 - 21
RackPeek.Web/config copy/desktops.yaml

@@ -1,22 +1,22 @@
 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
-  model: 
-  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
+    model:
+    name: dell-optiplex
+    tags: 

+ 13 - 13
RackPeek.Web/config copy/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.Web/config copy/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.Web/config copy/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: 

+ 420 - 420
RackPeek.Web/config copy/servers.yaml

@@ -1,421 +1,421 @@
 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: 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: 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: 

+ 1 - 1
RackPeek.Web/config copy/switches.yaml

@@ -1 +1 @@
-resources: []
+resources: [ ]

+ 5 - 5
RackPeek.Web/config copy/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: 

+ 384 - 385
RackPeek/CliBootstrap.cs

@@ -72,448 +72,447 @@ public static class CliBootstrap
         services.AddCommands();
 
         // Spectre bootstrap
-app.Configure(config =>
-{
-    config.SetApplicationName("rpk");
-    config.ValidateExamples();
-
-    // Global summary
-    config.AddCommand<GetTotalSummaryCommand>("summary")
-        .WithDescription("Show a summarized report of all resources in the system.");
-
-    // ----------------------------
-    // Server commands (CRUD-style)
-    // ----------------------------
-    config.AddBranch("servers", server =>
-    {
-        server.SetDescription("Manage servers and their components.");
-
-        server.AddCommand<ServerReportCommand>("summary")
-            .WithDescription("Show a summarized hardware report for all servers.");
-
-        server.AddCommand<ServerAddCommand>("add")
-            .WithDescription("Add a new server to the inventory.");
-
-        server.AddCommand<ServerGetByNameCommand>("get")
-            .WithDescription("List all servers or retrieve a specific server by name.");
-
-        server.AddCommand<ServerDescribeCommand>("describe")
-            .WithDescription("Display detailed information about a specific server.");
-
-        server.AddCommand<ServerSetCommand>("set")
-            .WithDescription("Update properties of an existing server.");
-
-        server.AddCommand<ServerDeleteCommand>("del")
-            .WithDescription("Delete a server from the inventory.");
-
-        server.AddCommand<ServerTreeCommand>("tree")
-            .WithDescription("Display the dependency tree of a server.");
-
-        // Server CPUs
-        server.AddBranch("cpu", cpu =>
-        {
-            cpu.SetDescription("Manage CPUs attached to a server.");
-
-            cpu.AddCommand<ServerCpuAddCommand>("add")
-                .WithDescription("Add a CPU to a specific server.");
-
-            cpu.AddCommand<ServerCpuSetCommand>("set")
-                .WithDescription("Update configuration of a server CPU.");
-
-            cpu.AddCommand<ServerCpuRemoveCommand>("del")
-                .WithDescription("Remove a CPU from a server.");
-        });
-
-        // Server Drives
-        server.AddBranch("drive", drive =>
-        {
-            drive.SetDescription("Manage drives attached to a server.");
-
-            drive.AddCommand<ServerDriveAddCommand>("add")
-                .WithDescription("Add a storage drive to a server.");
-
-            drive.AddCommand<ServerDriveUpdateCommand>("set")
-                .WithDescription("Update properties of a server drive.");
-
-            drive.AddCommand<ServerDriveRemoveCommand>("del")
-                .WithDescription("Remove a drive from a server.");
-        });
-
-        // Server GPUs
-        server.AddBranch("gpu", gpu =>
+        app.Configure(config =>
         {
-            gpu.SetDescription("Manage GPUs attached to a server.");
+            config.SetApplicationName("rpk");
+            config.ValidateExamples();
 
-            gpu.AddCommand<ServerGpuAddCommand>("add")
-                .WithDescription("Add a GPU to a server.");
+            // Global summary
+            config.AddCommand<GetTotalSummaryCommand>("summary")
+                .WithDescription("Show a summarized report of all resources in the system.");
 
-            gpu.AddCommand<ServerGpuUpdateCommand>("set")
-                .WithDescription("Update properties of a server GPU.");
+            // ----------------------------
+            // Server commands (CRUD-style)
+            // ----------------------------
+            config.AddBranch("servers", server =>
+            {
+                server.SetDescription("Manage servers and their components.");
 
-            gpu.AddCommand<ServerGpuRemoveCommand>("del")
-                .WithDescription("Remove a GPU from a server.");
-        });
-
-        // Server NICs
-        server.AddBranch("nic", nic =>
-        {
-            nic.SetDescription("Manage network interface cards (NICs) for a server.");
-
-            nic.AddCommand<ServerNicAddCommand>("add")
-                .WithDescription("Add a NIC to a server.");
+                server.AddCommand<ServerReportCommand>("summary")
+                    .WithDescription("Show a summarized hardware report for all servers.");
 
-            nic.AddCommand<ServerNicUpdateCommand>("set")
-                .WithDescription("Update properties of a server NIC.");
-
-            nic.AddCommand<ServerNicRemoveCommand>("del")
-                .WithDescription("Remove a NIC from a server.");
-        });
-    });
-
-    // ----------------------------
-    // Switch commands
-    // ----------------------------
-    config.AddBranch("switches", switches =>
-    {
-        switches.SetDescription("Manage network switches.");
+                server.AddCommand<ServerAddCommand>("add")
+                    .WithDescription("Add a new server to the inventory.");
 
-        switches.AddCommand<SwitchReportCommand>("summary")
-            .WithDescription("Show a hardware report for all switches.");
+                server.AddCommand<ServerGetByNameCommand>("get")
+                    .WithDescription("List all servers or retrieve a specific server by name.");
 
-        switches.AddCommand<SwitchAddCommand>("add")
-            .WithDescription("Add a new network switch to the inventory.");
+                server.AddCommand<ServerDescribeCommand>("describe")
+                    .WithDescription("Display detailed information about a specific server.");
 
-        switches.AddCommand<SwitchGetCommand>("list")
-            .WithDescription("List all switches in the system.");
+                server.AddCommand<ServerSetCommand>("set")
+                    .WithDescription("Update properties of an existing server.");
 
-        switches.AddCommand<SwitchGetByNameCommand>("get")
-            .WithDescription("Retrieve details of a specific switch by name.");
+                server.AddCommand<ServerDeleteCommand>("del")
+                    .WithDescription("Delete a server from the inventory.");
 
-        switches.AddCommand<SwitchDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a switch.");
+                server.AddCommand<ServerTreeCommand>("tree")
+                    .WithDescription("Display the dependency tree of a server.");
 
-        switches.AddCommand<SwitchSetCommand>("set")
-            .WithDescription("Update properties of a switch.");
+                // Server CPUs
+                server.AddBranch("cpu", cpu =>
+                {
+                    cpu.SetDescription("Manage CPUs attached to a server.");
 
-        switches.AddCommand<SwitchDeleteCommand>("del")
-            .WithDescription("Delete a switch from the inventory.");
-    });
+                    cpu.AddCommand<ServerCpuAddCommand>("add")
+                        .WithDescription("Add a CPU to a specific server.");
 
-    // ----------------------------
-    // Routers commands
-    // ----------------------------
-    config.AddBranch("routers", routers =>
-    {
-        routers.SetDescription("Manage network routers.");
+                    cpu.AddCommand<ServerCpuSetCommand>("set")
+                        .WithDescription("Update configuration of a server CPU.");
 
-        routers.AddCommand<FirewallReportCommand>("summary")
-            .WithDescription("Show a hardware report for all routers.");
+                    cpu.AddCommand<ServerCpuRemoveCommand>("del")
+                        .WithDescription("Remove a CPU from a server.");
+                });
 
-        routers.AddCommand<FirewallAddCommand>("add")
-            .WithDescription("Add a new network router to the inventory.");
+                // Server Drives
+                server.AddBranch("drive", drive =>
+                {
+                    drive.SetDescription("Manage drives attached to a server.");
 
-        routers.AddCommand<FirewallGetCommand>("list")
-            .WithDescription("List all routers in the system.");
+                    drive.AddCommand<ServerDriveAddCommand>("add")
+                        .WithDescription("Add a storage drive to a server.");
 
-        routers.AddCommand<FirewallGetByNameCommand>("get")
-            .WithDescription("Retrieve details of a specific router by name.");
+                    drive.AddCommand<ServerDriveUpdateCommand>("set")
+                        .WithDescription("Update properties of a server drive.");
 
-        routers.AddCommand<FirewallDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a router.");
+                    drive.AddCommand<ServerDriveRemoveCommand>("del")
+                        .WithDescription("Remove a drive from a server.");
+                });
 
-        routers.AddCommand<FirewallSetCommand>("set")
-            .WithDescription("Update properties of a router.");
+                // Server GPUs
+                server.AddBranch("gpu", gpu =>
+                {
+                    gpu.SetDescription("Manage GPUs attached to a server.");
 
-        routers.AddCommand<FirewallDeleteCommand>("del")
-            .WithDescription("Delete a router from the inventory.");
-    });
-    
-    // ----------------------------
-    // Firewalls commands
-    // ----------------------------
-    config.AddBranch("firewalls", firewalls =>
-    {
-        firewalls.SetDescription("Manage firewalls.");
+                    gpu.AddCommand<ServerGpuAddCommand>("add")
+                        .WithDescription("Add a GPU to a server.");
 
-        firewalls.AddCommand<FirewallReportCommand>("summary")
-            .WithDescription("Show a hardware report for all firewalls.");
+                    gpu.AddCommand<ServerGpuUpdateCommand>("set")
+                        .WithDescription("Update properties of a server GPU.");
 
-        firewalls.AddCommand<FirewallAddCommand>("add")
-            .WithDescription("Add a new firewall to the inventory.");
+                    gpu.AddCommand<ServerGpuRemoveCommand>("del")
+                        .WithDescription("Remove a GPU from a server.");
+                });
 
-        firewalls.AddCommand<FirewallGetCommand>("list")
-            .WithDescription("List all firewalls in the system.");
+                // Server NICs
+                server.AddBranch("nic", nic =>
+                {
+                    nic.SetDescription("Manage network interface cards (NICs) for a server.");
 
-        firewalls.AddCommand<FirewallGetByNameCommand>("get")
-            .WithDescription("Retrieve details of a specific firewall by name.");
+                    nic.AddCommand<ServerNicAddCommand>("add")
+                        .WithDescription("Add a NIC to a server.");
 
-        firewalls.AddCommand<FirewallDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a firewall.");
+                    nic.AddCommand<ServerNicUpdateCommand>("set")
+                        .WithDescription("Update properties of a server NIC.");
 
-        firewalls.AddCommand<FirewallSetCommand>("set")
-            .WithDescription("Update properties of a firewall.");
+                    nic.AddCommand<ServerNicRemoveCommand>("del")
+                        .WithDescription("Remove a NIC from a server.");
+                });
+            });
 
-        firewalls.AddCommand<FirewallDeleteCommand>("del")
-            .WithDescription("Delete a firewall from the inventory.");
-    });
-    
-    // ----------------------------
-    // System commands
-    // ----------------------------
-    config.AddBranch("systems", system =>
-    {
-        system.SetDescription("Manage systems and their dependencies.");
+            // ----------------------------
+            // Switch commands
+            // ----------------------------
+            config.AddBranch("switches", switches =>
+            {
+                switches.SetDescription("Manage network switches.");
 
-        system.AddCommand<SystemReportCommand>("summary")
-            .WithDescription("Show a summary report for all systems.");
+                switches.AddCommand<SwitchReportCommand>("summary")
+                    .WithDescription("Show a hardware report for all switches.");
 
-        system.AddCommand<SystemAddCommand>("add")
-            .WithDescription("Add a new system to the inventory.");
+                switches.AddCommand<SwitchAddCommand>("add")
+                    .WithDescription("Add a new network switch to the inventory.");
 
-        system.AddCommand<SystemGetCommand>("list")
-            .WithDescription("List all systems.");
+                switches.AddCommand<SwitchGetCommand>("list")
+                    .WithDescription("List all switches in the system.");
 
-        system.AddCommand<SystemGetByNameCommand>("get")
-            .WithDescription("Retrieve a system by name.");
+                switches.AddCommand<SwitchGetByNameCommand>("get")
+                    .WithDescription("Retrieve details of a specific switch by name.");
 
-        system.AddCommand<SystemDescribeCommand>("describe")
-            .WithDescription("Display detailed information about a system.");
+                switches.AddCommand<SwitchDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a switch.");
 
-        system.AddCommand<SystemSetCommand>("set")
-            .WithDescription("Update properties of a system.");
+                switches.AddCommand<SwitchSetCommand>("set")
+                    .WithDescription("Update properties of a switch.");
 
-        system.AddCommand<SystemDeleteCommand>("del")
-            .WithDescription("Delete a system from the inventory.");
+                switches.AddCommand<SwitchDeleteCommand>("del")
+                    .WithDescription("Delete a switch from the inventory.");
+            });
 
-        system.AddCommand<SystemTreeCommand>("tree")
-            .WithDescription("Display the dependency tree for a system.");
-    });
+            // ----------------------------
+            // Routers commands
+            // ----------------------------
+            config.AddBranch("routers", routers =>
+            {
+                routers.SetDescription("Manage network routers.");
 
-    // ----------------------------
-    // Access Points
-    // ----------------------------
-    config.AddBranch("accesspoints", ap =>
-    {
-        ap.SetDescription("Manage access points.");
+                routers.AddCommand<FirewallReportCommand>("summary")
+                    .WithDescription("Show a hardware report for all routers.");
 
-        ap.AddCommand<AccessPointReportCommand>("summary")
-            .WithDescription("Show a hardware report for all access points.");
+                routers.AddCommand<FirewallAddCommand>("add")
+                    .WithDescription("Add a new network router to the inventory.");
 
-        ap.AddCommand<AccessPointAddCommand>("add")
-            .WithDescription("Add a new access point.");
+                routers.AddCommand<FirewallGetCommand>("list")
+                    .WithDescription("List all routers in the system.");
 
-        ap.AddCommand<AccessPointGetCommand>("list")
-            .WithDescription("List all access points.");
+                routers.AddCommand<FirewallGetByNameCommand>("get")
+                    .WithDescription("Retrieve details of a specific router by name.");
 
-        ap.AddCommand<AccessPointGetByNameCommand>("get")
-            .WithDescription("Retrieve an access point by name.");
+                routers.AddCommand<FirewallDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a router.");
 
-        ap.AddCommand<AccessPointDescribeCommand>("describe")
-            .WithDescription("Show detailed information about an access point.");
+                routers.AddCommand<FirewallSetCommand>("set")
+                    .WithDescription("Update properties of a router.");
 
-        ap.AddCommand<AccessPointSetCommand>("set")
-            .WithDescription("Update properties of an access point.");
+                routers.AddCommand<FirewallDeleteCommand>("del")
+                    .WithDescription("Delete a router from the inventory.");
+            });
 
-        ap.AddCommand<AccessPointDeleteCommand>("del")
-            .WithDescription("Delete an access point.");
-    });
+            // ----------------------------
+            // Firewalls commands
+            // ----------------------------
+            config.AddBranch("firewalls", firewalls =>
+            {
+                firewalls.SetDescription("Manage firewalls.");
 
-    // ----------------------------
-    // UPS units
-    // ----------------------------
-    config.AddBranch("ups", ups =>
-    {
-        ups.SetDescription("Manage UPS units.");
+                firewalls.AddCommand<FirewallReportCommand>("summary")
+                    .WithDescription("Show a hardware report for all firewalls.");
 
-        ups.AddCommand<UpsReportCommand>("summary")
-            .WithDescription("Show a hardware report for all UPS units.");
+                firewalls.AddCommand<FirewallAddCommand>("add")
+                    .WithDescription("Add a new firewall to the inventory.");
 
-        ups.AddCommand<UpsAddCommand>("add")
-            .WithDescription("Add a new UPS unit.");
+                firewalls.AddCommand<FirewallGetCommand>("list")
+                    .WithDescription("List all firewalls in the system.");
 
-        ups.AddCommand<UpsGetCommand>("list")
-            .WithDescription("List all UPS units.");
+                firewalls.AddCommand<FirewallGetByNameCommand>("get")
+                    .WithDescription("Retrieve details of a specific firewall by name.");
 
-        ups.AddCommand<UpsGetByNameCommand>("get")
-            .WithDescription("Retrieve a UPS unit by name.");
+                firewalls.AddCommand<FirewallDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a firewall.");
 
-        ups.AddCommand<UpsDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a UPS unit.");
+                firewalls.AddCommand<FirewallSetCommand>("set")
+                    .WithDescription("Update properties of a firewall.");
 
-        ups.AddCommand<UpsSetCommand>("set")
-            .WithDescription("Update properties of a UPS unit.");
+                firewalls.AddCommand<FirewallDeleteCommand>("del")
+                    .WithDescription("Delete a firewall from the inventory.");
+            });
 
-        ups.AddCommand<UpsDeleteCommand>("del")
-            .WithDescription("Delete a UPS unit.");
-    });
+            // ----------------------------
+            // System commands
+            // ----------------------------
+            config.AddBranch("systems", system =>
+            {
+                system.SetDescription("Manage systems and their dependencies.");
 
-    // ----------------------------
-    // Desktops
-    // ----------------------------
-    config.AddBranch("desktops", desktops =>
-    {
-        desktops.SetDescription("Manage desktop computers and their components.");
-
-        // CRUD
-        desktops.AddCommand<DesktopAddCommand>("add")
-            .WithDescription("Add a new desktop.");
-        desktops.AddCommand<DesktopGetCommand>("list")
-            .WithDescription("List all desktops.");
-        desktops.AddCommand<DesktopGetByNameCommand>("get")
-            .WithDescription("Retrieve a desktop by name.");
-        desktops.AddCommand<DesktopDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a desktop.");
-        desktops.AddCommand<DesktopSetCommand>("set")
-            .WithDescription("Update properties of a desktop.");
-        desktops.AddCommand<DesktopDeleteCommand>("del")
-            .WithDescription("Delete a desktop from the inventory.");
-        desktops.AddCommand<DesktopReportCommand>("summary")
-            .WithDescription("Show a summarized hardware report for all desktops.");
-        desktops.AddCommand<DesktopTreeCommand>("tree")
-            .WithDescription("Display the dependency tree for a desktop.");
-
-        // CPU
-        desktops.AddBranch("cpu", cpu =>
-        {
-            cpu.SetDescription("Manage CPUs attached to desktops.");
-            cpu.AddCommand<DesktopCpuAddCommand>("add")
-                .WithDescription("Add a CPU to a desktop.");
-            cpu.AddCommand<DesktopCpuSetCommand>("set")
-                .WithDescription("Update a desktop CPU.");
-            cpu.AddCommand<DesktopCpuRemoveCommand>("del")
-                .WithDescription("Remove a CPU from a desktop.");
-        });
+                system.AddCommand<SystemReportCommand>("summary")
+                    .WithDescription("Show a summary report for all systems.");
 
-        // Drives
-        desktops.AddBranch("drive", drive =>
-        {
-            drive.SetDescription("Manage storage drives attached to desktops.");
-            drive.AddCommand<DesktopDriveAddCommand>("add")
-                .WithDescription("Add a drive to a desktop.");
-            drive.AddCommand<DesktopDriveSetCommand>("set")
-                .WithDescription("Update a desktop drive.");
-            drive.AddCommand<DesktopDriveRemoveCommand>("del")
-                .WithDescription("Remove a drive from a desktop.");
-        });
+                system.AddCommand<SystemAddCommand>("add")
+                    .WithDescription("Add a new system to the inventory.");
 
-        // GPUs
-        desktops.AddBranch("gpu", gpu =>
-        {
-            gpu.SetDescription("Manage GPUs attached to desktops.");
-            gpu.AddCommand<DesktopGpuAddCommand>("add")
-                .WithDescription("Add a GPU to a desktop.");
-            gpu.AddCommand<DesktopGpuSetCommand>("set")
-                .WithDescription("Update a desktop GPU.");
-            gpu.AddCommand<DesktopGpuRemoveCommand>("del")
-                .WithDescription("Remove a GPU from a desktop.");
-        });
+                system.AddCommand<SystemGetCommand>("list")
+                    .WithDescription("List all systems.");
 
-        // NICs
-        desktops.AddBranch("nic", nic =>
-        {
-            nic.SetDescription("Manage network interface cards (NICs) for desktops.");
-            nic.AddCommand<DesktopNicAddCommand>("add")
-                .WithDescription("Add a NIC to a desktop.");
-            nic.AddCommand<DesktopNicSetCommand>("set")
-                .WithDescription("Update a desktop NIC.");
-            nic.AddCommand<DesktopNicRemoveCommand>("del")
-                .WithDescription("Remove a NIC from a desktop.");
-        });
-    });
-    
-        // ----------------------------
-    // Laptops
-    // ----------------------------
-    config.AddBranch("Laptops", Laptops =>
-    {
-        Laptops.SetDescription("Manage Laptop computers and their components.");
-
-        // CRUD
-        Laptops.AddCommand<LaptopAddCommand>("add")
-            .WithDescription("Add a new Laptop.");
-        Laptops.AddCommand<LaptopGetCommand>("list")
-            .WithDescription("List all Laptops.");
-        Laptops.AddCommand<LaptopGetByNameCommand>("get")
-            .WithDescription("Retrieve a Laptop by name.");
-        Laptops.AddCommand<LaptopDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a Laptop.");
-        Laptops.AddCommand<LaptopDeleteCommand>("del")
-            .WithDescription("Delete a Laptop from the inventory.");
-        Laptops.AddCommand<LaptopReportCommand>("summary")
-            .WithDescription("Show a summarized hardware report for all Laptops.");
-        Laptops.AddCommand<LaptopTreeCommand>("tree")
-            .WithDescription("Display the dependency tree for a Laptop.");
-
-        // CPU
-        Laptops.AddBranch("cpu", cpu =>
-        {
-            cpu.SetDescription("Manage CPUs attached to Laptops.");
-            cpu.AddCommand<LaptopCpuAddCommand>("add")
-                .WithDescription("Add a CPU to a Laptop.");
-            cpu.AddCommand<LaptopCpuSetCommand>("set")
-                .WithDescription("Update a Laptop CPU.");
-            cpu.AddCommand<LaptopCpuRemoveCommand>("del")
-                .WithDescription("Remove a CPU from a Laptop.");
-        });
+                system.AddCommand<SystemGetByNameCommand>("get")
+                    .WithDescription("Retrieve a system by name.");
 
-        // Drives
-        Laptops.AddBranch("drive", drive =>
-        {
-            drive.SetDescription("Manage storage drives attached to Laptops.");
-            drive.AddCommand<LaptopDriveAddCommand>("add")
-                .WithDescription("Add a drive to a Laptop.");
-            drive.AddCommand<LaptopDriveSetCommand>("set")
-                .WithDescription("Update a Laptop drive.");
-            drive.AddCommand<LaptopDriveRemoveCommand>("del")
-                .WithDescription("Remove a drive from a Laptop.");
-        });
+                system.AddCommand<SystemDescribeCommand>("describe")
+                    .WithDescription("Display detailed information about a system.");
 
-        // GPUs
-        Laptops.AddBranch("gpu", gpu =>
-        {
-            gpu.SetDescription("Manage GPUs attached to Laptops.");
-            gpu.AddCommand<LaptopGpuAddCommand>("add")
-                .WithDescription("Add a GPU to a Laptop.");
-            gpu.AddCommand<LaptopGpuSetCommand>("set")
-                .WithDescription("Update a Laptop GPU.");
-            gpu.AddCommand<LaptopGpuRemoveCommand>("del")
-                .WithDescription("Remove a GPU from a Laptop.");
+                system.AddCommand<SystemSetCommand>("set")
+                    .WithDescription("Update properties of a system.");
+
+                system.AddCommand<SystemDeleteCommand>("del")
+                    .WithDescription("Delete a system from the inventory.");
+
+                system.AddCommand<SystemTreeCommand>("tree")
+                    .WithDescription("Display the dependency tree for a system.");
+            });
+
+            // ----------------------------
+            // Access Points
+            // ----------------------------
+            config.AddBranch("accesspoints", ap =>
+            {
+                ap.SetDescription("Manage access points.");
+
+                ap.AddCommand<AccessPointReportCommand>("summary")
+                    .WithDescription("Show a hardware report for all access points.");
+
+                ap.AddCommand<AccessPointAddCommand>("add")
+                    .WithDescription("Add a new access point.");
+
+                ap.AddCommand<AccessPointGetCommand>("list")
+                    .WithDescription("List all access points.");
+
+                ap.AddCommand<AccessPointGetByNameCommand>("get")
+                    .WithDescription("Retrieve an access point by name.");
+
+                ap.AddCommand<AccessPointDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about an access point.");
+
+                ap.AddCommand<AccessPointSetCommand>("set")
+                    .WithDescription("Update properties of an access point.");
+
+                ap.AddCommand<AccessPointDeleteCommand>("del")
+                    .WithDescription("Delete an access point.");
+            });
+
+            // ----------------------------
+            // UPS units
+            // ----------------------------
+            config.AddBranch("ups", ups =>
+            {
+                ups.SetDescription("Manage UPS units.");
+
+                ups.AddCommand<UpsReportCommand>("summary")
+                    .WithDescription("Show a hardware report for all UPS units.");
+
+                ups.AddCommand<UpsAddCommand>("add")
+                    .WithDescription("Add a new UPS unit.");
+
+                ups.AddCommand<UpsGetCommand>("list")
+                    .WithDescription("List all UPS units.");
+
+                ups.AddCommand<UpsGetByNameCommand>("get")
+                    .WithDescription("Retrieve a UPS unit by name.");
+
+                ups.AddCommand<UpsDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a UPS unit.");
+
+                ups.AddCommand<UpsSetCommand>("set")
+                    .WithDescription("Update properties of a UPS unit.");
+
+                ups.AddCommand<UpsDeleteCommand>("del")
+                    .WithDescription("Delete a UPS unit.");
+            });
+
+            // ----------------------------
+            // Desktops
+            // ----------------------------
+            config.AddBranch("desktops", desktops =>
+            {
+                desktops.SetDescription("Manage desktop computers and their components.");
+
+                // CRUD
+                desktops.AddCommand<DesktopAddCommand>("add")
+                    .WithDescription("Add a new desktop.");
+                desktops.AddCommand<DesktopGetCommand>("list")
+                    .WithDescription("List all desktops.");
+                desktops.AddCommand<DesktopGetByNameCommand>("get")
+                    .WithDescription("Retrieve a desktop by name.");
+                desktops.AddCommand<DesktopDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a desktop.");
+                desktops.AddCommand<DesktopSetCommand>("set")
+                    .WithDescription("Update properties of a desktop.");
+                desktops.AddCommand<DesktopDeleteCommand>("del")
+                    .WithDescription("Delete a desktop from the inventory.");
+                desktops.AddCommand<DesktopReportCommand>("summary")
+                    .WithDescription("Show a summarized hardware report for all desktops.");
+                desktops.AddCommand<DesktopTreeCommand>("tree")
+                    .WithDescription("Display the dependency tree for a desktop.");
+
+                // CPU
+                desktops.AddBranch("cpu", cpu =>
+                {
+                    cpu.SetDescription("Manage CPUs attached to desktops.");
+                    cpu.AddCommand<DesktopCpuAddCommand>("add")
+                        .WithDescription("Add a CPU to a desktop.");
+                    cpu.AddCommand<DesktopCpuSetCommand>("set")
+                        .WithDescription("Update a desktop CPU.");
+                    cpu.AddCommand<DesktopCpuRemoveCommand>("del")
+                        .WithDescription("Remove a CPU from a desktop.");
+                });
+
+                // Drives
+                desktops.AddBranch("drive", drive =>
+                {
+                    drive.SetDescription("Manage storage drives attached to desktops.");
+                    drive.AddCommand<DesktopDriveAddCommand>("add")
+                        .WithDescription("Add a drive to a desktop.");
+                    drive.AddCommand<DesktopDriveSetCommand>("set")
+                        .WithDescription("Update a desktop drive.");
+                    drive.AddCommand<DesktopDriveRemoveCommand>("del")
+                        .WithDescription("Remove a drive from a desktop.");
+                });
+
+                // GPUs
+                desktops.AddBranch("gpu", gpu =>
+                {
+                    gpu.SetDescription("Manage GPUs attached to desktops.");
+                    gpu.AddCommand<DesktopGpuAddCommand>("add")
+                        .WithDescription("Add a GPU to a desktop.");
+                    gpu.AddCommand<DesktopGpuSetCommand>("set")
+                        .WithDescription("Update a desktop GPU.");
+                    gpu.AddCommand<DesktopGpuRemoveCommand>("del")
+                        .WithDescription("Remove a GPU from a desktop.");
+                });
+
+                // NICs
+                desktops.AddBranch("nic", nic =>
+                {
+                    nic.SetDescription("Manage network interface cards (NICs) for desktops.");
+                    nic.AddCommand<DesktopNicAddCommand>("add")
+                        .WithDescription("Add a NIC to a desktop.");
+                    nic.AddCommand<DesktopNicSetCommand>("set")
+                        .WithDescription("Update a desktop NIC.");
+                    nic.AddCommand<DesktopNicRemoveCommand>("del")
+                        .WithDescription("Remove a NIC from a desktop.");
+                });
+            });
+
+            // ----------------------------
+            // Laptops
+            // ----------------------------
+            config.AddBranch("Laptops", Laptops =>
+            {
+                Laptops.SetDescription("Manage Laptop computers and their components.");
+
+                // CRUD
+                Laptops.AddCommand<LaptopAddCommand>("add")
+                    .WithDescription("Add a new Laptop.");
+                Laptops.AddCommand<LaptopGetCommand>("list")
+                    .WithDescription("List all Laptops.");
+                Laptops.AddCommand<LaptopGetByNameCommand>("get")
+                    .WithDescription("Retrieve a Laptop by name.");
+                Laptops.AddCommand<LaptopDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a Laptop.");
+                Laptops.AddCommand<LaptopDeleteCommand>("del")
+                    .WithDescription("Delete a Laptop from the inventory.");
+                Laptops.AddCommand<LaptopReportCommand>("summary")
+                    .WithDescription("Show a summarized hardware report for all Laptops.");
+                Laptops.AddCommand<LaptopTreeCommand>("tree")
+                    .WithDescription("Display the dependency tree for a Laptop.");
+
+                // CPU
+                Laptops.AddBranch("cpu", cpu =>
+                {
+                    cpu.SetDescription("Manage CPUs attached to Laptops.");
+                    cpu.AddCommand<LaptopCpuAddCommand>("add")
+                        .WithDescription("Add a CPU to a Laptop.");
+                    cpu.AddCommand<LaptopCpuSetCommand>("set")
+                        .WithDescription("Update a Laptop CPU.");
+                    cpu.AddCommand<LaptopCpuRemoveCommand>("del")
+                        .WithDescription("Remove a CPU from a Laptop.");
+                });
+
+                // Drives
+                Laptops.AddBranch("drive", drive =>
+                {
+                    drive.SetDescription("Manage storage drives attached to Laptops.");
+                    drive.AddCommand<LaptopDriveAddCommand>("add")
+                        .WithDescription("Add a drive to a Laptop.");
+                    drive.AddCommand<LaptopDriveSetCommand>("set")
+                        .WithDescription("Update a Laptop drive.");
+                    drive.AddCommand<LaptopDriveRemoveCommand>("del")
+                        .WithDescription("Remove a drive from a Laptop.");
+                });
+
+                // GPUs
+                Laptops.AddBranch("gpu", gpu =>
+                {
+                    gpu.SetDescription("Manage GPUs attached to Laptops.");
+                    gpu.AddCommand<LaptopGpuAddCommand>("add")
+                        .WithDescription("Add a GPU to a Laptop.");
+                    gpu.AddCommand<LaptopGpuSetCommand>("set")
+                        .WithDescription("Update a Laptop GPU.");
+                    gpu.AddCommand<LaptopGpuRemoveCommand>("del")
+                        .WithDescription("Remove a GPU from a Laptop.");
+                });
+            });
+
+
+            // ----------------------------
+            // Services
+            // ----------------------------
+            config.AddBranch("services", service =>
+            {
+                service.SetDescription("Manage services and their configurations.");
+
+                service.AddCommand<ServiceReportCommand>("summary")
+                    .WithDescription("Show a summary report for all services.");
+
+                service.AddCommand<ServiceAddCommand>("add")
+                    .WithDescription("Add a new service.");
+
+                service.AddCommand<ServiceGetCommand>("list")
+                    .WithDescription("List all services.");
+
+                service.AddCommand<ServiceGetByNameCommand>("get")
+                    .WithDescription("Retrieve a service by name.");
+
+                service.AddCommand<ServiceDescribeCommand>("describe")
+                    .WithDescription("Show detailed information about a service.");
+
+                service.AddCommand<ServiceSetCommand>("set")
+                    .WithDescription("Update properties of a service.");
+
+                service.AddCommand<ServiceDeleteCommand>("del")
+                    .WithDescription("Delete a service.");
+
+                service.AddCommand<ServiceSubnetsCommand>("subnets")
+                    .WithDescription("List subnets associated with a service, optionally filtered by CIDR.");
+            });
         });
-    });
-
-
-    // ----------------------------
-    // Services
-    // ----------------------------
-    config.AddBranch("services", service =>
-    {
-        service.SetDescription("Manage services and their configurations.");
-
-        service.AddCommand<ServiceReportCommand>("summary")
-            .WithDescription("Show a summary report for all services.");
-
-        service.AddCommand<ServiceAddCommand>("add")
-            .WithDescription("Add a new service.");
-
-        service.AddCommand<ServiceGetCommand>("list")
-            .WithDescription("List all services.");
-
-        service.AddCommand<ServiceGetByNameCommand>("get")
-            .WithDescription("Retrieve a service by name.");
-
-        service.AddCommand<ServiceDescribeCommand>("describe")
-            .WithDescription("Show detailed information about a service.");
-
-        service.AddCommand<ServiceSetCommand>("set")
-            .WithDescription("Update properties of a service.");
-
-        service.AddCommand<ServiceDeleteCommand>("del")
-            .WithDescription("Delete a service.");
-
-        service.AddCommand<ServiceSubnetsCommand>("subnets")
-            .WithDescription("List subnets associated with a service, optionally filtered by CIDR.");
-    });
-});
-
     }
 }

+ 0 - 1
RackPeek/Commands/Laptops/Gpus/LaptopGpuRemoveCommand.cs

@@ -1,5 +1,4 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Commands.Desktops.Gpus;
 using RackPeek.Domain.Resources.Hardware.Laptops.Gpus;
 using Spectre.Console;
 using Spectre.Console.Cli;

+ 14 - 19
RackPeek/Yaml/YamlResourceCollection.cs

@@ -1,5 +1,5 @@
-using System.Collections.Specialized;
 using System.Collections.Concurrent;
+using System.Collections.Specialized;
 using RackPeek.Domain.Resources;
 using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.Services;
@@ -11,14 +11,13 @@ namespace RackPeek.Yaml;
 
 public sealed class YamlResourceCollection(bool watch) : IDisposable
 {
-    private readonly bool _watch = watch;
-    
+    private static readonly TimeSpan ReloadDebounce = TimeSpan.FromMilliseconds(300);
+
     private readonly List<ResourceEntry> _entries = [];
     private readonly List<string> _knownFiles = [];
-    private readonly Dictionary<string, FileSystemWatcher> _watchers = [];
     private readonly ConcurrentDictionary<string, DateTime> _reloadQueue = [];
-
-    private static readonly TimeSpan ReloadDebounce = TimeSpan.FromMilliseconds(300);
+    private readonly bool _watch = watch;
+    private readonly Dictionary<string, FileSystemWatcher> _watchers = [];
 
     public IReadOnlyList<string> SourceFiles => _knownFiles.ToList();
 
@@ -31,6 +30,12 @@ public sealed class YamlResourceCollection(bool watch) : IDisposable
     public IReadOnlyList<Service> ServiceResources =>
         _entries.Select(e => e.Resource).OfType<Service>().ToList();
 
+    public void Dispose()
+    {
+        foreach (var watcher in _watchers.Values)
+            watcher.Dispose();
+    }
+
     // ----------------------------
     // Loading
     // ----------------------------
@@ -82,8 +87,8 @@ public sealed class YamlResourceCollection(bool watch) : IDisposable
         {
             EnableRaisingEvents = true,
             NotifyFilter = NotifyFilters.LastWrite
-                         | NotifyFilters.FileName
-                         | NotifyFilters.Size
+                           | NotifyFilters.FileName
+                           | NotifyFilters.Size
         };
 
         watcher.Changed += OnFileChanged;
@@ -235,10 +240,8 @@ public sealed class YamlResourceCollection(bool watch) : IDisposable
             .Deserialize<Dictionary<string, object?>>(yaml);
 
         foreach (var (key, value) in props)
-        {
             if (key != "kind")
                 map[key] = value;
-        }
 
         return map;
     }
@@ -292,7 +295,6 @@ public sealed class YamlResourceCollection(bool watch) : IDisposable
     private static string SafeReadAllText(string file)
     {
         for (var i = 0; i < 5; i++)
-        {
             try
             {
                 return File.ReadAllText(file);
@@ -301,16 +303,9 @@ public sealed class YamlResourceCollection(bool watch) : IDisposable
             {
                 Thread.Sleep(50);
             }
-        }
 
         return string.Empty;
     }
 
-    public void Dispose()
-    {
-        foreach (var watcher in _watchers.Values)
-            watcher.Dispose();
-    }
-
     private sealed record ResourceEntry(Resource Resource, string SourceFile);
-}
+}