Explorar el Código

General house keeping

Tim Jones hace 2 meses
padre
commit
06aec674a3
Se han modificado 100 ficheros con 886 adiciones y 1056 borrados
  1. BIN
      .DS_Store
  2. 27 27
      CommandIndex.md
  3. 598 568
      Commands.md
  4. 28 27
      README.md
  5. 5 0
      RackPeek.Domain/IUseCase.cs
  6. 4 0
      RackPeek.Domain/RackPeek.Domain.csproj
  7. 2 2
      RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPointHardwareReport.cs
  8. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/AddAccessPointUseCase.cs
  9. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/DeleteAccessPointUseCase.cs
  10. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/DescribeAccessPointUseCase.cs
  11. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointUseCase.cs
  12. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointsUseCase.cs
  13. 1 1
      RackPeek.Domain/Resources/Hardware/AccessPoints/UpdateAccessPointUseCase.cs
  14. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/AddDesktopUseCase.cs
  15. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Cpus/AddDesktopCpuUseCase.cs
  16. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Cpus/RemoveDesktopCpuUseCase.cs
  17. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Cpus/UpdateDesktopCpuUseCase.cs
  18. 3 10
      RackPeek.Domain/Resources/Hardware/Desktops/DeleteDesktopUseCase.cs
  19. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs
  20. 2 2
      RackPeek.Domain/Resources/Hardware/Desktops/DesktopHardwareReport.cs
  21. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/AddDesktopDriveUseCase.cs
  22. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/RemoveDesktopDriveUseCase.cs
  23. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Drives/UpdateDesktopDriveUseCase.cs
  24. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopUseCase.cs
  25. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopsUseCase.cs
  26. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/AddDesktopGpuUseCase.cs
  27. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/RemoveDesktopGpuUseCase.cs
  28. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Gpus/UpdateDesktopGpuUseCase.cs
  29. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/AddDesktopNicUseCase.cs
  30. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/RemoveDesktopNicUseCase.cs
  31. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/Nics/UpdateDesktopNicUseCase.cs
  32. 1 1
      RackPeek.Domain/Resources/Hardware/Desktops/UpdateDesktopUseCase.cs
  33. 2 2
      RackPeek.Domain/Resources/Hardware/Firewalls/FirewallHardwareReport.cs
  34. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/AddServerUseCase.cs
  35. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Cpus/AddCpuUseCase.cs
  36. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Cpus/RemoveCpuUseCase.cs
  37. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Cpus/UpdateCpuUseCase.cs
  38. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/DeleteServerUseCase.cs
  39. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs
  40. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Drives/AddDriveUseCase.cs
  41. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Drives/RemoveDriveUseCase.cs
  42. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Drives/UpdateDriveUseCase.cs
  43. 3 6
      RackPeek.Domain/Resources/Hardware/Servers/GetServerSystemTreeUseCase.cs
  44. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/GetServerUseCase.cs
  45. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/GetServersUseCase.cs
  46. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/AddGpuUseCase.cs
  47. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/RemoveGpuUseCase.cs
  48. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Gpus/UpdateGpuUseCase.cs
  49. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/AddNicUseCase.cs
  50. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/RemoveNicUseCase.cs
  51. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/Nics/UpdateNicUseCase.cs
  52. 2 2
      RackPeek.Domain/Resources/Hardware/Servers/ServerHardwareReport.cs
  53. 1 1
      RackPeek.Domain/Resources/Hardware/Servers/UpdateServerUseCase.cs
  54. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/AddSwitchUseCase.cs
  55. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/DeleteSwitchUseCase.cs
  56. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/DescribeSwitchUseCase.cs
  57. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/GetSwitchUseCase.cs
  58. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/GetSwitchesUseCase.cs
  59. 2 2
      RackPeek.Domain/Resources/Hardware/Switches/SwitchHardwareReport.cs
  60. 1 1
      RackPeek.Domain/Resources/Hardware/Switches/UpdateSwitchUseCase.cs
  61. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/AddUpsUseCase.cs
  62. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/DeleteUpsUseCase.cs
  63. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs
  64. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUnitUseCase.cs
  65. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUseCase.cs
  66. 1 1
      RackPeek.Domain/Resources/Hardware/UpsUnits/UpdateUpsUseCase.cs
  67. 2 2
      RackPeek.Domain/Resources/Hardware/UpsUnits/UpsHardwareReport.cs
  68. 8 8
      RackPeek.Domain/Resources/Services/Networking/Cidr.cs
  69. 0 3
      RackPeek.Domain/Resources/Services/Networking/IpHelper.cs
  70. 8 11
      RackPeek.Domain/Resources/Services/Service.cs
  71. 1 3
      RackPeek.Domain/Resources/Services/UseCases/AddServiceUseCase.cs
  72. 1 3
      RackPeek.Domain/Resources/Services/UseCases/DeleteServiceUseCase.cs
  73. 12 3
      RackPeek.Domain/Resources/Services/UseCases/DescribeServiceUseCase.cs
  74. 1 3
      RackPeek.Domain/Resources/Services/UseCases/GetServiceUseCase.cs
  75. 1 3
      RackPeek.Domain/Resources/Services/UseCases/GetServicesUseCase.cs
  76. 15 5
      RackPeek.Domain/Resources/Services/UseCases/ServiceReportUseCase.cs
  77. 15 16
      RackPeek.Domain/Resources/Services/UseCases/ServiceSubnetsUseCase.cs
  78. 8 7
      RackPeek.Domain/Resources/Services/UseCases/UpdateServiceUseCase.cs
  79. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/AddSystemUseCase.cs
  80. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/DeleteSystemUseCase.cs
  81. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/DescribeSystemUseCase.cs
  82. 4 5
      RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemServiceTreeUseCase.cs
  83. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemUseCase.cs
  84. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemsUseCase.cs
  85. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/SystemReportUseCase.cs
  86. 1 1
      RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemUseCase.cs
  87. 22 0
      RackPeek.Domain/ServiceCollectionExtensions.cs
  88. 36 259
      RackPeek/CliBootstrap.cs
  89. 1 1
      RackPeek/Commands/AccessPoints/AccessPointGetByNameCommand.cs
  90. 1 1
      RackPeek/Commands/AccessPoints/AccessPointGetCommand.cs
  91. 2 2
      RackPeek/Commands/AccessPoints/AccessPointReportCommand.cs
  92. 2 2
      RackPeek/Commands/Desktops/DesktopReportCommand.cs
  93. 1 1
      RackPeek/Commands/Servers/ServerGetCommand.cs
  94. 1 1
      RackPeek/Commands/Servers/ServerReportCommand.cs
  95. 1 4
      RackPeek/Commands/Servers/ServerTreeCommand.cs
  96. 1 1
      RackPeek/Commands/Services/ServiceAddCommand.cs
  97. 1 1
      RackPeek/Commands/Services/ServiceDescribeCommand.cs
  98. 1 1
      RackPeek/Commands/Services/ServiceGetByNameCommand.cs
  99. 1 1
      RackPeek/Commands/Services/ServiceGetCommand.cs
  100. 1 1
      RackPeek/Commands/Services/ServiceNameSettings.cs

BIN
.DS_Store


+ 27 - 27
CommandIndex.md

@@ -1,6 +1,30 @@
 # CLI Command Index
 
 - [rpk](Commands.md#rpk)
+  - [servers](Commands.md#rpk-servers)
+    - [summary](Commands.md#rpk-servers-summary)
+    - [add](Commands.md#rpk-servers-add)
+    - [get](Commands.md#rpk-servers-get)
+    - [describe](Commands.md#rpk-servers-describe)
+    - [set](Commands.md#rpk-servers-set)
+    - [del](Commands.md#rpk-servers-del)
+    - [tree](Commands.md#rpk-servers-tree)
+    - [cpu](Commands.md#rpk-servers-cpu)
+      - [add](Commands.md#rpk-servers-cpu-add)
+      - [set](Commands.md#rpk-servers-cpu-set)
+      - [del](Commands.md#rpk-servers-cpu-del)
+    - [drive](Commands.md#rpk-servers-drive)
+      - [add](Commands.md#rpk-servers-drive-add)
+      - [set](Commands.md#rpk-servers-drive-set)
+      - [del](Commands.md#rpk-servers-drive-del)
+    - [gpu](Commands.md#rpk-servers-gpu)
+      - [add](Commands.md#rpk-servers-gpu-add)
+      - [set](Commands.md#rpk-servers-gpu-set)
+      - [del](Commands.md#rpk-servers-gpu-del)
+    - [nic](Commands.md#rpk-servers-nic)
+      - [add](Commands.md#rpk-servers-nic-add)
+      - [set](Commands.md#rpk-servers-nic-set)
+      - [del](Commands.md#rpk-servers-nic-del)
   - [switches](Commands.md#rpk-switches)
     - [summary](Commands.md#rpk-switches-summary)
     - [add](Commands.md#rpk-switches-add)
@@ -17,6 +41,7 @@
     - [describe](Commands.md#rpk-systems-describe)
     - [set](Commands.md#rpk-systems-set)
     - [del](Commands.md#rpk-systems-del)
+    - [tree](Commands.md#rpk-systems-tree)
   - [accesspoints](Commands.md#rpk-accesspoints)
     - [summary](Commands.md#rpk-accesspoints-summary)
     - [add](Commands.md#rpk-accesspoints-add)
@@ -40,6 +65,7 @@
     - [describe](Commands.md#rpk-desktops-describe)
     - [set](Commands.md#rpk-desktops-set)
     - [del](Commands.md#rpk-desktops-del)
+    - [summary](Commands.md#rpk-desktops-summary)
     - [cpu](Commands.md#rpk-desktops-cpu)
       - [add](Commands.md#rpk-desktops-cpu-add)
       - [set](Commands.md#rpk-desktops-cpu-set)
@@ -64,30 +90,4 @@
     - [describe](Commands.md#rpk-services-describe)
     - [set](Commands.md#rpk-services-set)
     - [del](Commands.md#rpk-services-del)
-  - [ap](Commands.md#rpk-ap)
-  - [desktops](Commands.md#rpk-desktops)
-  - [ups](Commands.md#rpk-ups)
-  - [servers](Commands.md#rpk-servers)
-    - [summary](Commands.md#rpk-servers-summary)
-    - [add](Commands.md#rpk-servers-add)
-    - [get](Commands.md#rpk-servers-get)
-    - [describe](Commands.md#rpk-servers-describe)
-    - [set](Commands.md#rpk-servers-set)
-    - [del](Commands.md#rpk-servers-del)
-    - [tree](Commands.md#rpk-servers-tree)
-    - [cpu](Commands.md#rpk-servers-cpu)
-      - [add](Commands.md#rpk-servers-cpu-add)
-      - [set](Commands.md#rpk-servers-cpu-set)
-      - [del](Commands.md#rpk-servers-cpu-del)
-    - [drive](Commands.md#rpk-servers-drive)
-      - [add](Commands.md#rpk-servers-drive-add)
-      - [set](Commands.md#rpk-servers-drive-set)
-      - [del](Commands.md#rpk-servers-drive-del)
-    - [gpu](Commands.md#rpk-servers-gpu)
-      - [add](Commands.md#rpk-servers-gpu-add)
-      - [set](Commands.md#rpk-servers-gpu-set)
-      - [del](Commands.md#rpk-servers-gpu-del)
-    - [nic](Commands.md#rpk-servers-nic)
-      - [add](Commands.md#rpk-servers-nic-add)
-      - [set](Commands.md#rpk-servers-nic-set)
-      - [del](Commands.md#rpk-servers-nic-del)
+    - [subnets](Commands.md#rpk-services-subnets)

+ 598 - 568
Commands.md

@@ -9,58 +9,59 @@ OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    switches        Manage switches                  
-    systems         Manage systems                   
-    accesspoints    Manage access points             
-    ups             Manage UPS units                 
-    desktops                                         
-    services        Manage services                  
-    ap              Show access point hardware report
-    desktops        Show desktop hardware report     
-    ups             Show UPS hardware report         
-    servers         Manage servers                   
+    servers         Manage servers      
+    switches        Manage switches     
+    systems         Manage systems      
+    accesspoints    Manage access points
+    ups             Manage UPS units    
+    desktops                            
+    services        Manage services     
 ```
 
-## `rpk switches`
+## `rpk servers`
 ```
 DESCRIPTION:
-Manage switches
+Manage servers
 
 USAGE:
-    rpk switches [OPTIONS] <COMMAND>
+    rpk servers [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    summary            Show switch hardware report             
-    add <name>         Add a new switch                        
-    list               List switches                           
-    get <name>         Get a switches by name                  
-    describe <name>    Show detailed information about a switch
-    set <name>         Update switch properties                
-    del <name>         Delete a switch                         
+    summary            Show a summarized hardware report for all servers
+    add <name>         Add a new server                                 
+    get <name>         List servers or get a server by name             
+    describe <name>    Show detailed information about a server         
+    set <name>         Update server properties                         
+    del <name>         Delete a server                                  
+    tree <name>        Displays a dependency tree for the server        
+    cpu                Manage server CPUs                               
+    drive              Manage server drives                             
+    gpu                Manage server GPUs                               
+    nic                Manage server NICs                               
 ```
 
-## `rpk switches summary`
+## `rpk servers summary`
 ```
 DESCRIPTION:
-Show switch hardware report
+Show a summarized hardware report for all servers
 
 USAGE:
-    rpk switches summary [OPTIONS]
+    rpk servers summary [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk switches add`
+## `rpk servers add`
 ```
 DESCRIPTION:
-Add a new switch
+Add a new server
 
 USAGE:
-    rpk switches add <name> [OPTIONS]
+    rpk servers add <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -69,25 +70,28 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk switches list`
+## `rpk servers get`
 ```
 DESCRIPTION:
-List switches
+List servers or get a server by name
 
 USAGE:
-    rpk switches list [OPTIONS]
+    rpk servers get <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk switches get`
+## `rpk servers describe`
 ```
 DESCRIPTION:
-Get a switches by name
+Show detailed information about a server
 
 USAGE:
-    rpk switches get <name> [OPTIONS]
+    rpk servers describe <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -96,46 +100,45 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk switches describe`
+## `rpk servers set`
 ```
 DESCRIPTION:
-Show detailed information about a switch
+Update server properties
 
 USAGE:
-    rpk switches describe <name> [OPTIONS]
+    rpk servers set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help        Prints help information
+        --ram <GB>                           
+        --ipmi                               
 ```
 
-## `rpk switches set`
+## `rpk servers del`
 ```
 DESCRIPTION:
-Update switch properties
+Delete a server
 
 USAGE:
-    rpk switches set <name> [OPTIONS]
+    rpk servers del <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help       Prints help information
-        --Model                             
-        --managed                           
-        --poe                               
+    -h, --help    Prints help information
 ```
 
-## `rpk switches del`
+## `rpk servers tree`
 ```
 DESCRIPTION:
-Delete a switch
+Displays a dependency tree for the server
 
 USAGE:
-    rpk switches del <name> [OPTIONS]
+    rpk servers tree <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -144,293 +147,322 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk systems`
+## `rpk servers cpu`
 ```
 DESCRIPTION:
-Manage systems
+Manage server CPUs
 
 USAGE:
-    rpk systems [OPTIONS] <COMMAND>
+    rpk servers cpu [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    summary            Show system report                      
-    add <name>         Add a new system                        
-    list               List systems                            
-    get <name>         Get a system by name                    
-    describe <name>    Show detailed information about a system
-    set <name>         Update system properties                
-    del <name>         Delete a system                         
+    add <name>    Add a CPU to a server     
+    set <name>    Update a CPU on a server  
+    del <name>    Remove a CPU from a server
 ```
 
-## `rpk systems summary`
+## `rpk servers cpu add`
 ```
 DESCRIPTION:
-Show system report
+Add a CPU to a server
 
 USAGE:
-    rpk systems summary [OPTIONS]
+    rpk servers cpu add <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help                 Prints help information
+        --model <MODEL>                               
+        --cores <CORES>                               
+        --threads <THREADS>                           
 ```
 
-## `rpk systems add`
+## `rpk servers cpu set`
 ```
 DESCRIPTION:
-Add a new system
+Update a CPU on a server
 
 USAGE:
-    rpk systems add <name> [OPTIONS]
+    rpk servers cpu set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help                 Prints help information
+        --index <INDEX>                               
+        --model <MODEL>                               
+        --cores <CORES>                               
+        --threads <THREADS>                           
 ```
 
-## `rpk systems list`
+## `rpk servers cpu del`
 ```
 DESCRIPTION:
-List systems
+Remove a CPU from a server
 
 USAGE:
-    rpk systems list [OPTIONS]
+    rpk servers cpu del <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --index <INDEX>                           
 ```
 
-## `rpk systems get`
+## `rpk servers drive`
 ```
 DESCRIPTION:
-Get a system by name
+Manage server drives
 
 USAGE:
-    rpk systems get <name> [OPTIONS]
-
-ARGUMENTS:
-    <name>     
+    rpk servers drive [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
+
+COMMANDS:
+    add <name>    Add a drive to a server     
+    set <name>    Update a drive on a server  
+    del <name>    Remove a drive from a server
 ```
 
-## `rpk systems describe`
+## `rpk servers drive add`
 ```
 DESCRIPTION:
-Show detailed information about a system
+Add a drive to a server
 
 USAGE:
-    rpk systems describe <name> [OPTIONS]
+    rpk servers drive add <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help           Prints help information
+        --type <TYPE>                           
+        --size <SIZE>                           
 ```
 
-## `rpk systems set`
+## `rpk servers drive set`
 ```
 DESCRIPTION:
-Update system properties
+Update a drive on a server
 
 USAGE:
-    rpk systems set <name> [OPTIONS]
+    rpk servers drive set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help       Prints help information
-        --type                              
-        --os                                
-        --cores                             
-        --ram                               
-        --runs-on                           
+    -h, --help             Prints help information
+        --index <INDEX>                           
+        --type <TYPE>                             
+        --size <SIZE>                             
 ```
 
-## `rpk systems del`
+## `rpk servers drive del`
 ```
 DESCRIPTION:
-Delete a system
+Remove a drive from a server
 
 USAGE:
-    rpk systems del <name> [OPTIONS]
+    rpk servers drive del <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --index <INDEX>                           
 ```
 
-## `rpk accesspoints`
+## `rpk servers gpu`
 ```
 DESCRIPTION:
-Manage access points
+Manage server GPUs
 
 USAGE:
-    rpk accesspoints [OPTIONS] <COMMAND>
+    rpk servers gpu [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    summary            Show access point hardware report              
-    add <name>         Add a new access point                         
-    list               List access points                             
-    get <name>         Get an access point by name                    
-    describe <name>    Show detailed information about an access point
-    set <name>         Update access point properties                 
-    del <name>         Delete an access point                         
+    add <name>    Add a GPU to a server     
+    set <name>    Update a GPU on a server  
+    del <name>    Remove a GPU from a server
 ```
 
-## `rpk accesspoints summary`
+## `rpk servers gpu add`
 ```
 DESCRIPTION:
-Show access point hardware report
+Add a GPU to a server
 
 USAGE:
-    rpk accesspoints summary [OPTIONS]
+    rpk servers gpu add <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --model <MODEL>                           
+        --vram <VRAM>                             
 ```
 
-## `rpk accesspoints add`
+## `rpk servers gpu set`
 ```
 DESCRIPTION:
-Add a new access point
+Update a GPU on a server
 
 USAGE:
-    rpk accesspoints add <name> [OPTIONS]
+    rpk servers gpu set <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The access point name
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --index <INDEX>                           
+        --model <MODEL>                           
+        --vram <VRAM>                             
 ```
 
-## `rpk accesspoints list`
+## `rpk servers gpu del`
 ```
 DESCRIPTION:
-List access points
+Remove a GPU from a server
 
 USAGE:
-    rpk accesspoints list [OPTIONS]
+    rpk servers gpu del <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --index <INDEX>                           
 ```
 
-## `rpk accesspoints get`
+## `rpk servers nic`
 ```
 DESCRIPTION:
-Get an access point by name
+Manage server NICs
 
 USAGE:
-    rpk accesspoints get <name> [OPTIONS]
-
-ARGUMENTS:
-    <name>    The access point name
+    rpk servers nic [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
+
+COMMANDS:
+    add <name>    Add a NIC to a server     
+    set <name>    Update a NIC on a server  
+    del <name>    Remove a NIC from a server
 ```
 
-## `rpk accesspoints describe`
+## `rpk servers nic add`
 ```
 DESCRIPTION:
-Show detailed information about an access point
+Add a NIC to a server
 
 USAGE:
-    rpk accesspoints describe <name> [OPTIONS]
+    rpk servers nic add <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The access point name
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --type <TYPE>                             
+        --speed <SPEED>                           
+        --ports <PORTS>                           
 ```
 
-## `rpk accesspoints set`
+## `rpk servers nic set`
 ```
 DESCRIPTION:
-Update access point properties
+Update a NIC on a server
 
 USAGE:
-    rpk accesspoints set <name> [OPTIONS]
+    rpk servers nic set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help     Prints help information            
-        --model    The access point model name        
-        --speed    The speed of the access point in Gb
+    -h, --help             Prints help information
+        --index <INDEX>                           
+        --type <TYPE>                             
+        --speed <SPEED>                           
+        --ports <PORTS>                           
 ```
 
-## `rpk accesspoints del`
+## `rpk servers nic del`
 ```
 DESCRIPTION:
-Delete an access point
+Remove a NIC from a server
 
 USAGE:
-    rpk accesspoints del <name> [OPTIONS]
+    rpk servers nic del <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The access point name
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help             Prints help information
+        --index <INDEX>                           
 ```
 
-## `rpk ups`
+## `rpk switches`
 ```
 DESCRIPTION:
-Manage UPS units
+Manage switches
 
 USAGE:
-    rpk ups [OPTIONS] <COMMAND>
+    rpk switches [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    summary            Show UPS hardware report             
-    add <name>         Add a new UPS                        
-    list               List UPS units                       
-    get <name>         Get a UPS by name                    
-    describe <name>    Show detailed information about a UPS
-    set <name>         Update UPS properties                
-    del <name>         Delete a UPS                         
+    summary            Show switch hardware report             
+    add <name>         Add a new switch                        
+    list               List switches                           
+    get <name>         Get a switches by name                  
+    describe <name>    Show detailed information about a switch
+    set <name>         Update switch properties                
+    del <name>         Delete a switch                         
 ```
 
-## `rpk ups summary`
+## `rpk switches summary`
 ```
 DESCRIPTION:
-Show UPS hardware report
+Show switch hardware report
 
 USAGE:
-    rpk ups summary [OPTIONS]
+    rpk switches summary [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ups add`
+## `rpk switches add`
 ```
 DESCRIPTION:
-Add a new UPS
+Add a new switch
 
 USAGE:
-    rpk ups add <name> [OPTIONS]
+    rpk switches add <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -439,25 +471,25 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ups list`
+## `rpk switches list`
 ```
 DESCRIPTION:
-List UPS units
+List switches
 
 USAGE:
-    rpk ups list [OPTIONS]
+    rpk switches list [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ups get`
+## `rpk switches get`
 ```
 DESCRIPTION:
-Get a UPS by name
+Get a switches by name
 
 USAGE:
-    rpk ups get <name> [OPTIONS]
+    rpk switches get <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -466,13 +498,13 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ups describe`
+## `rpk switches describe`
 ```
 DESCRIPTION:
-Show detailed information about a UPS
+Show detailed information about a switch
 
 USAGE:
-    rpk ups describe <name> [OPTIONS]
+    rpk switches describe <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -481,30 +513,31 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ups set`
+## `rpk switches set`
 ```
 DESCRIPTION:
-Update UPS properties
+Update switch properties
 
 USAGE:
-    rpk ups set <name> [OPTIONS]
+    rpk switches set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help     Prints help information
-        --model                           
-        --va                              
+    -h, --help       Prints help information
+        --Model                             
+        --managed                           
+        --poe                               
 ```
 
-## `rpk ups del`
+## `rpk switches del`
 ```
 DESCRIPTION:
-Delete a UPS
+Delete a switch
 
 USAGE:
-    rpk ups del <name> [OPTIONS]
+    rpk switches del <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -513,31 +546,47 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops`
+## `rpk systems`
 ```
+DESCRIPTION:
+Manage systems
+
 USAGE:
-    rpk desktops [OPTIONS] <COMMAND>
+    rpk systems [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    add <name>          
-    list                
-    get <name>          
-    describe <name>     
-    set <name>          
-    del <name>          
-    cpu                 
-    drive               
-    gpu                 
-    nic                 
+    summary            Show system report                       
+    add <name>         Add a new system                         
+    list               List systems                             
+    get <name>         Get a system by name                     
+    describe <name>    Show detailed information about a system 
+    set <name>         Update system properties                 
+    del <name>         Delete a system                          
+    tree <name>        Displays a dependency tree for the system
 ```
 
-## `rpk desktops add`
+## `rpk systems summary`
 ```
+DESCRIPTION:
+Show system report
+
 USAGE:
-    rpk desktops add <name> [OPTIONS]
+    rpk systems summary [OPTIONS]
+
+OPTIONS:
+    -h, --help    Prints help information
+```
+
+## `rpk systems add`
+```
+DESCRIPTION:
+Add a new system
+
+USAGE:
+    rpk systems add <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
@@ -546,830 +595,811 @@ OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops list`
+## `rpk systems list`
 ```
+DESCRIPTION:
+List systems
+
 USAGE:
-    rpk desktops list [OPTIONS]
+    rpk systems list [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops get`
+## `rpk systems get`
 ```
+DESCRIPTION:
+Get a system by name
+
 USAGE:
-    rpk desktops get <name> [OPTIONS]
+    rpk systems get <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the system
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops describe`
+## `rpk systems describe`
 ```
+DESCRIPTION:
+Show detailed information about a system
+
 USAGE:
-    rpk desktops describe <name> [OPTIONS]
+    rpk systems describe <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the system
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops set`
+## `rpk systems set`
 ```
+DESCRIPTION:
+Update system properties
+
 USAGE:
-    rpk desktops set <name> [OPTIONS]
+    rpk systems set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help     Prints help information
-        --model                           
+    -h, --help       Prints help information
+        --type                              
+        --os                                
+        --cores                             
+        --ram                               
+        --runs-on                           
 ```
 
-## `rpk desktops del`
+## `rpk systems del`
 ```
+DESCRIPTION:
+Delete a system
+
 USAGE:
-    rpk desktops del <name> [OPTIONS]
+    rpk systems del <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the system
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops cpu`
+## `rpk systems tree`
 ```
+DESCRIPTION:
+Displays a dependency tree for the system
+
 USAGE:
-    rpk desktops cpu [OPTIONS] <COMMAND>
+    rpk systems tree <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>    The name of the system
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    add <desktop>             
-    set <desktop> <index>     
-    del <desktop> <index>     
 ```
 
-## `rpk desktops cpu add`
+## `rpk accesspoints`
 ```
-USAGE:
-    rpk desktops cpu add <desktop> [OPTIONS]
+DESCRIPTION:
+Manage access points
 
-ARGUMENTS:
-    <desktop>    The desktop name
+USAGE:
+    rpk accesspoints [OPTIONS] <COMMAND>
 
 OPTIONS:
-    -h, --help       Prints help information  
-        --model      The model name           
-        --cores      The number of cpu cores  
-        --threads    The number of cpu threads
+    -h, --help    Prints help information
+
+COMMANDS:
+    summary            Show access point hardware report              
+    add <name>         Add a new access point                         
+    list               List access points                             
+    get <name>         Get an access point by name                    
+    describe <name>    Show detailed information about an access point
+    set <name>         Update access point properties                 
+    del <name>         Delete an access point                         
 ```
 
-## `rpk desktops cpu set`
+## `rpk accesspoints summary`
 ```
-USAGE:
-    rpk desktops cpu set <desktop> <index> [OPTIONS]
+DESCRIPTION:
+Show access point hardware report
 
-ARGUMENTS:
-    <desktop>    The desktop name            
-    <index>      The index of the desktop cpu
+USAGE:
+    rpk accesspoints summary [OPTIONS]
 
 OPTIONS:
-    -h, --help       Prints help information  
-        --model      The cpu model            
-        --cores      The number of cpu cores  
-        --threads    The number of cpu threads
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops cpu del`
+## `rpk accesspoints add`
 ```
+DESCRIPTION:
+Add a new access point
+
 USAGE:
-    rpk desktops cpu del <desktop> <index> [OPTIONS]
+    rpk accesspoints add <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The name of the desktop               
-    <index>      The index of the desktop cpu to remove
+    <name>    The access point name
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops drive`
+## `rpk accesspoints list`
 ```
+DESCRIPTION:
+List access points
+
 USAGE:
-    rpk desktops drive [OPTIONS] <COMMAND>
+    rpk accesspoints list [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    add <desktop>             
-    set <desktop> <index>     
-    del <desktop> <index>     
 ```
 
-## `rpk desktops drive add`
+## `rpk accesspoints get`
 ```
+DESCRIPTION:
+Get an access point by name
+
 USAGE:
-    rpk desktops drive add <desktop> [OPTIONS]
+    rpk accesspoints get <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The name of the desktop
+    <name>    The access point name
 
 OPTIONS:
-    -h, --help    Prints help information     
-        --type    The drive type e.g hdd / ssd
-        --size    The drive capacity in Gb    
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops drive set`
+## `rpk accesspoints describe`
 ```
+DESCRIPTION:
+Show detailed information about an access point
+
 USAGE:
-    rpk desktops drive set <desktop> <index> [OPTIONS]
+    rpk accesspoints describe <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The desktop name         
-    <index>      The drive index to update
+    <name>    The access point name
 
 OPTIONS:
-    -h, --help    Prints help information     
-        --type    The drive type e.g hdd / ssd
-        --size    The drive capacity in Gb    
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops drive del`
+## `rpk accesspoints set`
 ```
+DESCRIPTION:
+Update access point properties
+
 USAGE:
-    rpk desktops drive del <desktop> <index> [OPTIONS]
+    rpk accesspoints set <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The name of the desktop         
-    <index>      The index of the drive to remove
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help     Prints help information            
+        --model    The access point model name        
+        --speed    The speed of the access point in Gb
 ```
 
-## `rpk desktops gpu`
+## `rpk accesspoints del`
 ```
+DESCRIPTION:
+Delete an access point
+
 USAGE:
-    rpk desktops gpu [OPTIONS] <COMMAND>
+    rpk accesspoints del <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>    The access point name
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    add <desktop>             
-    set <desktop> <index>     
-    del <desktop> <index>     
 ```
 
-## `rpk desktops gpu add`
+## `rpk ups`
 ```
-USAGE:
-    rpk desktops gpu add <desktop> [OPTIONS]
+DESCRIPTION:
+Manage UPS units
 
-ARGUMENTS:
-    <desktop>    The name of the desktop
+USAGE:
+    rpk ups [OPTIONS] <COMMAND>
 
 OPTIONS:
-    -h, --help     Prints help information     
-        --model    The Gpu model               
-        --vram     The amount of gpu vram in Gb
+    -h, --help    Prints help information
+
+COMMANDS:
+    summary            Show UPS hardware report             
+    add <name>         Add a new UPS                        
+    list               List UPS units                       
+    get <name>         Get a UPS by name                    
+    describe <name>    Show detailed information about a UPS
+    set <name>         Update UPS properties                
+    del <name>         Delete a UPS                         
 ```
 
-## `rpk desktops gpu set`
+## `rpk ups summary`
 ```
-USAGE:
-    rpk desktops gpu set <desktop> <index> [OPTIONS]
+DESCRIPTION:
+Show UPS hardware report
 
-ARGUMENTS:
-    <desktop>    The desktop name              
-    <index>      The index of the gpu to update
+USAGE:
+    rpk ups summary [OPTIONS]
 
 OPTIONS:
-    -h, --help     Prints help information     
-        --model    The gpu model name          
-        --vram     The amount of gpu vram in Gb
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops gpu del`
+## `rpk ups add`
 ```
+DESCRIPTION:
+Add a new UPS
+
 USAGE:
-    rpk desktops gpu del <desktop> <index> [OPTIONS]
+    rpk ups add <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The desktop name              
-    <index>      The index of the Gpu to remove
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk desktops nic`
+## `rpk ups list`
 ```
+DESCRIPTION:
+List UPS units
+
 USAGE:
-    rpk desktops nic [OPTIONS] <COMMAND>
+    rpk ups list [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    add <desktop>             
-    set <desktop> <index>     
-    del <desktop> <index>     
 ```
 
-## `rpk desktops nic add`
+## `rpk ups get`
 ```
+DESCRIPTION:
+Get a UPS by name
+
 USAGE:
-    rpk desktops nic add <desktop> [OPTIONS]
+    rpk ups get <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The desktop name
+    <name>     
 
 OPTIONS:
-    -h, --help     Prints help information          
-        --type     The nic port type e.g rj45 / sfp+
-        --speed    The port speed                   
-        --ports    The number of ports              
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops nic set`
+## `rpk ups describe`
 ```
+DESCRIPTION:
+Show detailed information about a UPS
+
 USAGE:
-    rpk desktops nic set <desktop> <index> [OPTIONS]
+    rpk ups describe <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The desktop name              
-    <index>      The index of the nic to remove
+    <name>     
 
 OPTIONS:
-    -h, --help     Prints help information          
-        --type     The nic port type e.g rj45 / sfp+
-        --speed    The speed of the nic in Gb/s     
-        --ports    The number of ports              
+    -h, --help    Prints help information
 ```
 
-## `rpk desktops nic del`
+## `rpk ups set`
 ```
+DESCRIPTION:
+Update UPS properties
+
 USAGE:
-    rpk desktops nic del <desktop> <index> [OPTIONS]
+    rpk ups set <name> [OPTIONS]
 
 ARGUMENTS:
-    <desktop>    The desktop name              
-    <index>      The index of the nic to remove
+    <name>     
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help     Prints help information
+        --model                           
+        --va                              
 ```
 
-## `rpk services`
+## `rpk ups del`
 ```
 DESCRIPTION:
-Manage services
+Delete a UPS
 
 USAGE:
-    rpk services [OPTIONS] <COMMAND>
+    rpk ups del <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    summary            Show service summary report              
-    add <name>         Add a new service                        
-    list               List all services                        
-    get <name>         Get a service by name                    
-    describe <name>    Show detailed information about a service
-    set <name>         Update service properties                
-    del <name>         Delete a service                         
 ```
 
-## `rpk services summary`
+## `rpk desktops`
 ```
-DESCRIPTION:
-Show service summary report
-
 USAGE:
-    rpk services summary [OPTIONS]
+    rpk desktops [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
-```
 
-## `rpk services add`
+COMMANDS:
+    add <name>                                     
+    list                                           
+    get <name>                                     
+    describe <name>                                
+    set <name>                                     
+    del <name>                                     
+    summary            Show desktop hardware report
+    cpu                                            
+    drive                                          
+    gpu                                            
+    nic                                            
 ```
-DESCRIPTION:
-Add a new service
 
+## `rpk desktops add`
+```
 USAGE:
-    rpk services add <name> [OPTIONS]
+    rpk desktops add <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The name of the service
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk services list`
+## `rpk desktops list`
 ```
-DESCRIPTION:
-List all services
-
 USAGE:
-    rpk services list [OPTIONS]
+    rpk desktops list [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk services get`
+## `rpk desktops get`
 ```
-DESCRIPTION:
-Get a service by name
-
 USAGE:
-    rpk services get <name> [OPTIONS]
+    rpk desktops get <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The name of the service
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk services describe`
+## `rpk desktops describe`
 ```
-DESCRIPTION:
-Show detailed information about a service
-
 USAGE:
-    rpk services describe <name> [OPTIONS]
+    rpk desktops describe <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The name of the service
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk services set`
+## `rpk desktops set`
 ```
-DESCRIPTION:
-Update service properties
-
 USAGE:
-    rpk services set <name> [OPTIONS]
+    rpk desktops set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help        Prints help information             
-        --ip          The ip address of the service       
-        --port        The port the service is running on  
-        --protocol    The service protocol                
-        --url         The service URL                     
-        --runs-on     The system the service is running on
+    -h, --help     Prints help information
+        --model                           
 ```
 
-## `rpk services del`
+## `rpk desktops del`
 ```
-DESCRIPTION:
-Delete a service
-
 USAGE:
-    rpk services del <name> [OPTIONS]
+    rpk desktops del <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>    The name of the service
+    <name>     
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk ap`
+## `rpk desktops summary`
 ```
 DESCRIPTION:
-Show access point hardware report
+Show desktop hardware report
 
 USAGE:
-    rpk ap [OPTIONS]
+    rpk desktops summary [OPTIONS]
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk servers`
+## `rpk desktops cpu`
 ```
-DESCRIPTION:
-Manage servers
-
 USAGE:
-    rpk servers [OPTIONS] <COMMAND>
+    rpk desktops cpu [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    summary            Show a summarized hardware report for all servers
-    add <name>         Add a new server                                 
-    get <name>         List servers or get a server by name             
-    describe <name>    Show detailed information about a server         
-    set <name>         Update server properties                         
-    del <name>         Delete a server                                  
-    tree <name>        Displays a dependency tree for the server        
-    cpu                Manage server CPUs                               
-    drive              Manage server drives                             
-    gpu                Manage server GPUs                               
-    nic                Manage server NICs                               
+    add <desktop>             
+    set <desktop> <index>     
+    del <desktop> <index>     
 ```
 
-## `rpk servers summary`
+## `rpk desktops cpu add`
 ```
-DESCRIPTION:
-Show a summarized hardware report for all servers
-
 USAGE:
-    rpk servers summary [OPTIONS]
+    rpk desktops cpu add <desktop> [OPTIONS]
 
-OPTIONS:
-    -h, --help    Prints help information
-```
+ARGUMENTS:
+    <desktop>    The desktop name
 
-## `rpk servers add`
+OPTIONS:
+    -h, --help       Prints help information  
+        --model      The model name           
+        --cores      The number of cpu cores  
+        --threads    The number of cpu threads
 ```
-DESCRIPTION:
-Add a new server
 
+## `rpk desktops cpu set`
+```
 USAGE:
-    rpk servers add <name> [OPTIONS]
+    rpk desktops cpu set <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name            
+    <index>      The index of the desktop cpu
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help       Prints help information  
+        --model      The cpu model            
+        --cores      The number of cpu cores  
+        --threads    The number of cpu threads
 ```
 
-## `rpk servers get`
+## `rpk desktops cpu del`
 ```
-DESCRIPTION:
-List servers or get a server by name
-
 USAGE:
-    rpk servers get <name> [OPTIONS]
+    rpk desktops cpu del <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The name of the desktop               
+    <index>      The index of the desktop cpu to remove
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk servers describe`
+## `rpk desktops drive`
 ```
-DESCRIPTION:
-Show detailed information about a server
-
 USAGE:
-    rpk servers describe <name> [OPTIONS]
-
-ARGUMENTS:
-    <name>     
+    rpk desktops drive [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
-```
 
-## `rpk servers set`
+COMMANDS:
+    add <desktop>             
+    set <desktop> <index>     
+    del <desktop> <index>     
 ```
-DESCRIPTION:
-Update server properties
 
+## `rpk desktops drive add`
+```
 USAGE:
-    rpk servers set <name> [OPTIONS]
+    rpk desktops drive add <desktop> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The name of the desktop
 
 OPTIONS:
-    -h, --help        Prints help information
-        --ram <GB>                           
-        --ipmi                               
+    -h, --help    Prints help information     
+        --type    The drive type e.g hdd / ssd
+        --size    The drive capacity in Gb    
 ```
 
-## `rpk servers del`
+## `rpk desktops drive set`
 ```
-DESCRIPTION:
-Delete a server
-
 USAGE:
-    rpk servers del <name> [OPTIONS]
+    rpk desktops drive set <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name         
+    <index>      The drive index to update
 
 OPTIONS:
-    -h, --help    Prints help information
+    -h, --help    Prints help information     
+        --type    The drive type e.g hdd / ssd
+        --size    The drive capacity in Gb    
 ```
 
-## `rpk servers tree`
+## `rpk desktops drive del`
 ```
-DESCRIPTION:
-Displays a dependency tree for the server
-
 USAGE:
-    rpk servers tree <name> [OPTIONS]
+    rpk desktops drive del <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The name of the desktop         
+    <index>      The index of the drive to remove
 
 OPTIONS:
     -h, --help    Prints help information
 ```
 
-## `rpk servers cpu`
+## `rpk desktops gpu`
 ```
-DESCRIPTION:
-Manage server CPUs
-
 USAGE:
-    rpk servers cpu [OPTIONS] <COMMAND>
+    rpk desktops gpu [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    add <name>    Add a CPU to a server     
-    set <name>    Update a CPU on a server  
-    del <name>    Remove a CPU from a server
+    add <desktop>             
+    set <desktop> <index>     
+    del <desktop> <index>     
 ```
 
-## `rpk servers cpu add`
+## `rpk desktops gpu add`
 ```
-DESCRIPTION:
-Add a CPU to a server
-
 USAGE:
-    rpk servers cpu add <name> [OPTIONS]
+    rpk desktops gpu add <desktop> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The name of the desktop
 
 OPTIONS:
-    -h, --help                 Prints help information
-        --model <MODEL>                               
-        --cores <CORES>                               
-        --threads <THREADS>                           
+    -h, --help     Prints help information     
+        --model    The Gpu model               
+        --vram     The amount of gpu vram in Gb
 ```
 
-## `rpk servers cpu set`
+## `rpk desktops gpu set`
 ```
-DESCRIPTION:
-Update a CPU on a server
-
 USAGE:
-    rpk servers cpu set <name> [OPTIONS]
+    rpk desktops gpu set <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name              
+    <index>      The index of the gpu to update
 
 OPTIONS:
-    -h, --help                 Prints help information
-        --index <INDEX>                               
-        --model <MODEL>                               
-        --cores <CORES>                               
-        --threads <THREADS>                           
+    -h, --help     Prints help information     
+        --model    The gpu model name          
+        --vram     The amount of gpu vram in Gb
 ```
 
-## `rpk servers cpu del`
+## `rpk desktops gpu del`
 ```
-DESCRIPTION:
-Remove a CPU from a server
-
 USAGE:
-    rpk servers cpu del <name> [OPTIONS]
+    rpk desktops gpu del <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name              
+    <index>      The index of the Gpu to remove
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
+    -h, --help    Prints help information
 ```
 
-## `rpk servers drive`
+## `rpk desktops nic`
 ```
-DESCRIPTION:
-Manage server drives
-
 USAGE:
-    rpk servers drive [OPTIONS] <COMMAND>
+    rpk desktops nic [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    add <name>    Add a drive to a server     
-    set <name>    Update a drive on a server  
-    del <name>    Remove a drive from a server
+    add <desktop>             
+    set <desktop> <index>     
+    del <desktop> <index>     
 ```
 
-## `rpk servers drive add`
+## `rpk desktops nic add`
 ```
-DESCRIPTION:
-Add a drive to a server
-
 USAGE:
-    rpk servers drive add <name> [OPTIONS]
+    rpk desktops nic add <desktop> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name
 
 OPTIONS:
-    -h, --help           Prints help information
-        --type <TYPE>                           
-        --size <SIZE>                           
+    -h, --help     Prints help information          
+        --type     The nic port type e.g rj45 / sfp+
+        --speed    The port speed                   
+        --ports    The number of ports              
 ```
 
-## `rpk servers drive set`
+## `rpk desktops nic set`
 ```
-DESCRIPTION:
-Update a drive on a server
-
 USAGE:
-    rpk servers drive set <name> [OPTIONS]
+    rpk desktops nic set <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name              
+    <index>      The index of the nic to remove
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
-        --type <TYPE>                             
-        --size <SIZE>                             
+    -h, --help     Prints help information          
+        --type     The nic port type e.g rj45 / sfp+
+        --speed    The speed of the nic in Gb/s     
+        --ports    The number of ports              
 ```
 
-## `rpk servers drive del`
+## `rpk desktops nic del`
 ```
-DESCRIPTION:
-Remove a drive from a server
-
 USAGE:
-    rpk servers drive del <name> [OPTIONS]
+    rpk desktops nic del <desktop> <index> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <desktop>    The desktop name              
+    <index>      The index of the nic to remove
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
+    -h, --help    Prints help information
 ```
 
-## `rpk servers gpu`
+## `rpk services`
 ```
 DESCRIPTION:
-Manage server GPUs
+Manage services
 
 USAGE:
-    rpk servers gpu [OPTIONS] <COMMAND>
+    rpk services [OPTIONS] <COMMAND>
 
 OPTIONS:
     -h, --help    Prints help information
 
 COMMANDS:
-    add <name>    Add a GPU to a server     
-    set <name>    Update a GPU on a server  
-    del <name>    Remove a GPU from a server
+    summary            Show service summary report              
+    add <name>         Add a new service                        
+    list               List all services                        
+    get <name>         Get a service by name                    
+    describe <name>    Show detailed information about a service
+    set <name>         Update service properties                
+    del <name>         Delete a service                         
+    subnets            List service subnets or filter by CIDR   
 ```
 
-## `rpk servers gpu add`
+## `rpk services summary`
 ```
 DESCRIPTION:
-Add a GPU to a server
+Show service summary report
 
 USAGE:
-    rpk servers gpu add <name> [OPTIONS]
-
-ARGUMENTS:
-    <name>     
+    rpk services summary [OPTIONS]
 
 OPTIONS:
-    -h, --help             Prints help information
-        --model <MODEL>                           
-        --vram <VRAM>                             
+    -h, --help    Prints help information
 ```
 
-## `rpk servers gpu set`
+## `rpk services add`
 ```
 DESCRIPTION:
-Update a GPU on a server
+Add a new service
 
 USAGE:
-    rpk servers gpu set <name> [OPTIONS]
+    rpk services add <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the service
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
-        --model <MODEL>                           
-        --vram <VRAM>                             
+    -h, --help    Prints help information
 ```
 
-## `rpk servers gpu del`
+## `rpk services list`
 ```
 DESCRIPTION:
-Remove a GPU from a server
+List all services
 
 USAGE:
-    rpk servers gpu del <name> [OPTIONS]
-
-ARGUMENTS:
-    <name>     
+    rpk services list [OPTIONS]
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
+    -h, --help    Prints help information
 ```
 
-## `rpk servers nic`
+## `rpk services get`
 ```
 DESCRIPTION:
-Manage server NICs
+Get a service by name
 
 USAGE:
-    rpk servers nic [OPTIONS] <COMMAND>
+    rpk services get <name> [OPTIONS]
+
+ARGUMENTS:
+    <name>    The name of the service
 
 OPTIONS:
     -h, --help    Prints help information
-
-COMMANDS:
-    add <name>    Add a NIC to a server     
-    set <name>    Update a NIC on a server  
-    del <name>    Remove a NIC from a server
 ```
 
-## `rpk servers nic add`
+## `rpk services describe`
 ```
 DESCRIPTION:
-Add a NIC to a server
+Show detailed information about a service
 
 USAGE:
-    rpk servers nic add <name> [OPTIONS]
+    rpk services describe <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the service
 
 OPTIONS:
-    -h, --help             Prints help information
-        --type <TYPE>                             
-        --speed <SPEED>                           
-        --ports <PORTS>                           
+    -h, --help    Prints help information
 ```
 
-## `rpk servers nic set`
+## `rpk services set`
 ```
 DESCRIPTION:
-Update a NIC on a server
+Update service properties
 
 USAGE:
-    rpk servers nic set <name> [OPTIONS]
+    rpk services set <name> [OPTIONS]
 
 ARGUMENTS:
     <name>     
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
-        --type <TYPE>                             
-        --speed <SPEED>                           
-        --ports <PORTS>                           
+    -h, --help        Prints help information             
+        --ip          The ip address of the service       
+        --port        The port the service is running on  
+        --protocol    The service protocol                
+        --url         The service URL                     
+        --runs-on     The system the service is running on
 ```
 
-## `rpk servers nic del`
+## `rpk services del`
 ```
 DESCRIPTION:
-Remove a NIC from a server
+Delete a service
 
 USAGE:
-    rpk servers nic del <name> [OPTIONS]
+    rpk services del <name> [OPTIONS]
 
 ARGUMENTS:
-    <name>     
+    <name>    The name of the service
 
 OPTIONS:
-    -h, --help             Prints help information
-        --index <INDEX>                           
+    -h, --help    Prints help information
+```
+
+## `rpk services subnets`
+```
+DESCRIPTION:
+List service subnets or filter by CIDR
+
+USAGE:
+    rpk services subnets [OPTIONS]
+
+OPTIONS:
+    -h, --help               Prints help information
+        --cidr <CIDR>                               
+        --prefix <PREFIX>                           
 ```
+

+ 28 - 27
README.md

@@ -5,7 +5,32 @@ Track servers, switches, routers, desktops, access points, UPS systems, and more
 It’s designed to help you inventory, configure, and audit your environment in a consistent, reusable way.
 
 ## Command Tree
+
 - [rpk](Commands.md#rpk)
+  - [servers](Commands.md#rpk-servers)
+    - [summary](Commands.md#rpk-servers-summary)
+    - [add](Commands.md#rpk-servers-add)
+    - [get](Commands.md#rpk-servers-get)
+    - [describe](Commands.md#rpk-servers-describe)
+    - [set](Commands.md#rpk-servers-set)
+    - [del](Commands.md#rpk-servers-del)
+    - [tree](Commands.md#rpk-servers-tree)
+    - [cpu](Commands.md#rpk-servers-cpu)
+      - [add](Commands.md#rpk-servers-cpu-add)
+      - [set](Commands.md#rpk-servers-cpu-set)
+      - [del](Commands.md#rpk-servers-cpu-del)
+    - [drive](Commands.md#rpk-servers-drive)
+      - [add](Commands.md#rpk-servers-drive-add)
+      - [set](Commands.md#rpk-servers-drive-set)
+      - [del](Commands.md#rpk-servers-drive-del)
+    - [gpu](Commands.md#rpk-servers-gpu)
+      - [add](Commands.md#rpk-servers-gpu-add)
+      - [set](Commands.md#rpk-servers-gpu-set)
+      - [del](Commands.md#rpk-servers-gpu-del)
+    - [nic](Commands.md#rpk-servers-nic)
+      - [add](Commands.md#rpk-servers-nic-add)
+      - [set](Commands.md#rpk-servers-nic-set)
+      - [del](Commands.md#rpk-servers-nic-del)
   - [switches](Commands.md#rpk-switches)
     - [summary](Commands.md#rpk-switches-summary)
     - [add](Commands.md#rpk-switches-add)
@@ -22,6 +47,7 @@ It’s designed to help you inventory, configure, and audit your environment in
     - [describe](Commands.md#rpk-systems-describe)
     - [set](Commands.md#rpk-systems-set)
     - [del](Commands.md#rpk-systems-del)
+    - [tree](Commands.md#rpk-systems-tree)
   - [accesspoints](Commands.md#rpk-accesspoints)
     - [summary](Commands.md#rpk-accesspoints-summary)
     - [add](Commands.md#rpk-accesspoints-add)
@@ -45,6 +71,7 @@ It’s designed to help you inventory, configure, and audit your environment in
     - [describe](Commands.md#rpk-desktops-describe)
     - [set](Commands.md#rpk-desktops-set)
     - [del](Commands.md#rpk-desktops-del)
+    - [summary](Commands.md#rpk-desktops-summary)
     - [cpu](Commands.md#rpk-desktops-cpu)
       - [add](Commands.md#rpk-desktops-cpu-add)
       - [set](Commands.md#rpk-desktops-cpu-set)
@@ -69,30 +96,4 @@ It’s designed to help you inventory, configure, and audit your environment in
     - [describe](Commands.md#rpk-services-describe)
     - [set](Commands.md#rpk-services-set)
     - [del](Commands.md#rpk-services-del)
-  - [ap](Commands.md#rpk-ap)
-  - [desktops](Commands.md#rpk-desktops)
-  - [ups](Commands.md#rpk-ups)
-  - [servers](Commands.md#rpk-servers)
-    - [summary](Commands.md#rpk-servers-summary)
-    - [add](Commands.md#rpk-servers-add)
-    - [get](Commands.md#rpk-servers-get)
-    - [describe](Commands.md#rpk-servers-describe)
-    - [set](Commands.md#rpk-servers-set)
-    - [del](Commands.md#rpk-servers-del)
-    - [tree](Commands.md#rpk-servers-tree)
-    - [cpu](Commands.md#rpk-servers-cpu)
-      - [add](Commands.md#rpk-servers-cpu-add)
-      - [set](Commands.md#rpk-servers-cpu-set)
-      - [del](Commands.md#rpk-servers-cpu-del)
-    - [drive](Commands.md#rpk-servers-drive)
-      - [add](Commands.md#rpk-servers-drive-add)
-      - [set](Commands.md#rpk-servers-drive-set)
-      - [del](Commands.md#rpk-servers-drive-del)
-    - [gpu](Commands.md#rpk-servers-gpu)
-      - [add](Commands.md#rpk-servers-gpu-add)
-      - [set](Commands.md#rpk-servers-gpu-set)
-      - [del](Commands.md#rpk-servers-gpu-del)
-    - [nic](Commands.md#rpk-servers-nic)
-      - [add](Commands.md#rpk-servers-nic-add)
-      - [set](Commands.md#rpk-servers-nic-set)
-      - [del](Commands.md#rpk-servers-nic-del)
+    - [subnets](Commands.md#rpk-services-subnets)

+ 5 - 0
RackPeek.Domain/IUseCase.cs

@@ -0,0 +1,5 @@
+namespace RackPeek.Domain;
+
+public interface IUseCase
+{
+}

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

@@ -6,4 +6,8 @@
         <Nullable>enable</Nullable>
     </PropertyGroup>
 
+    <ItemGroup>
+        <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2"/>
+    </ItemGroup>
+
 </Project>

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/AccessPointHardwareReport.cs → RackPeek.Domain/Resources/Hardware/AccessPoints/AccessPointHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
 public record AccessPointHardwareReport(
     IReadOnlyList<AccessPointHardwareRow> AccessPoints
@@ -12,7 +12,7 @@ public record AccessPointHardwareRow(
     double SpeedGb
 );
 
-public class AccessPointHardwareReportUseCase(IHardwareRepository repository)
+public class AccessPointHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<AccessPointHardwareReport> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/AddAccessPointUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
-public class AddAccessPointUseCase(IHardwareRepository repository)
+public class AddAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/DeleteAccessPointUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
-public class DeleteAccessPointUseCase(IHardwareRepository repository)
+public class DeleteAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/DescribeAccessPointUseCase.cs

@@ -8,7 +8,7 @@ public record AccessPointDescription(
     double? Speed
 );
 
-public class DescribeAccessPointUseCase(IHardwareRepository repository)
+public class DescribeAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<AccessPointDescription?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
-public class GetAccessPointUseCase(IHardwareRepository repository)
+public class GetAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<AccessPoint?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/GetAccessPointsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
-public class GetAccessPointsUseCase(IHardwareRepository repository)
+public class GetAccessPointsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<AccessPoint>> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/AccessPoints/UpdateAccessPointUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.AccessPoints;
 
-public class UpdateAccessPointUseCase(IHardwareRepository repository)
+public class UpdateAccessPointUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/AddDesktopUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
-public class AddDesktopUseCase(IHardwareRepository repository)
+public class AddDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Cpus;
 
-public class AddDesktopCpuUseCase(IHardwareRepository repository)
+public class AddDesktopCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, Cpu cpu)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Cpus;
 
-public class RemoveDesktopCpuUseCase(IHardwareRepository repository)
+public class RemoveDesktopCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Cpus;
 
-public class UpdateDesktopCpuUseCase(IHardwareRepository repository)
+public class UpdateDesktopCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index, Cpu updated)
     {

+ 3 - 10
RackPeek.Domain/Resources/Hardware/Desktops/DeleteDesktopUseCase.cs

@@ -1,20 +1,13 @@
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
-public class DeleteDesktopUseCase
+public class DeleteDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
-    private readonly IHardwareRepository _repository;
-
-    public DeleteDesktopUseCase(IHardwareRepository repository)
-    {
-        _repository = repository;
-    }
-
     public async Task ExecuteAsync(string name)
     {
-        var hardware = await _repository.GetByNameAsync(name);
+        var hardware = await repository.GetByNameAsync(name);
         if (hardware == null)
             throw new InvalidOperationException($"Desktop '{name}' not found.");
 
-        await _repository.DeleteAsync(name);
+        await repository.DeleteAsync(name);
     }
 }

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/DescribeDesktopUseCase.cs

@@ -12,7 +12,7 @@ public record DesktopDescription(
     int GpuCount
 );
 
-public class DescribeDesktopUseCase(IHardwareRepository repository)
+public class DescribeDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<DesktopDescription?> ExecuteAsync(string name)
     {

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/DesktopHardwareReport.cs → RackPeek.Domain/Resources/Hardware/Desktops/DesktopHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
 public record DesktopHardwareReport(
     IReadOnlyList<DesktopHardwareRow> Desktops
@@ -19,7 +19,7 @@ public record DesktopHardwareRow(
     string GpuSummary
 );
 
-public class DesktopHardwareReportUseCase(IHardwareRepository repository)
+public class DesktopHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<DesktopHardwareReport> ExecuteAsync()
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Drives;
 
-public class AddDesktopDriveUseCase(IHardwareRepository repository)
+public class AddDesktopDriveUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, Drive drive)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Drives;
 
-public class RemoveDesktopDriveUseCase(IHardwareRepository repository)
+public class RemoveDesktopDriveUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Drives;
 
-public class UpdateDesktopDriveUseCase(IHardwareRepository repository)
+public class UpdateDesktopDriveUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index, Drive updated)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
-public class GetDesktopUseCase(IHardwareRepository repository)
+public class GetDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<Desktop?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/GetDesktopsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
-public class GetDesktopsUseCase(IHardwareRepository repository)
+public class GetDesktopsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<Desktop>> ExecuteAsync()
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 
-public class AddDesktopGpuUseCase(IHardwareRepository repository)
+public class AddDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, Gpu gpu)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 
-public class RemoveDesktopGpuUseCase(IHardwareRepository repository)
+public class RemoveDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index)
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
 
-public class UpdateDesktopGpuUseCase(IHardwareRepository repository)
+public class UpdateDesktopGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index, Gpu updated)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Nics/AddDesktopNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 
-public class AddDesktopNicUseCase(IHardwareRepository repository)
+public class AddDesktopNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, Nic nic)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Nics/RemoveDesktopNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 
-public class RemoveDesktopNicUseCase(IHardwareRepository repository)
+public class RemoveDesktopNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/Nics/UpdateDesktopNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops.Nics;
 
-public class UpdateDesktopNicUseCase(IHardwareRepository repository)
+public class UpdateDesktopNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string desktopName, int index, Nic updated)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Desktops/UpdateDesktopUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Desktops;
 
-public class UpdateDesktopUseCase(IHardwareRepository repository)
+public class UpdateDesktopUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/FirewallHardwareReport.cs → RackPeek.Domain/Resources/Hardware/Firewalls/FirewallHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.Firewalls;
 
 public record FirewallHardwareReport(
     IReadOnlyList<FirewallHardwareRow> Firewalls
@@ -16,7 +16,7 @@ public record FirewallHardwareRow(
     string PortSummary
 );
 
-public class FirewallHardwareReportUseCase(IHardwareRepository repository)
+public class FirewallHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<FirewallHardwareReport> ExecuteAsync()
     {

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

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 
-public class AddServerUseCase(IHardwareRepository repository)
+public class AddServerUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Cpus/AddCpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Cpus;
 
-public class AddCpuUseCase(IHardwareRepository repository)
+public class AddCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Cpus/RemoveCpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Cpus;
 
-public class RemoveCpuUseCase(IHardwareRepository repository)
+public class RemoveCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Cpus/UpdateCpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Cpus;
 
-public class UpdateCpuUseCase(IHardwareRepository repository)
+public class UpdateCpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/DeleteServerUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 
-public class DeleteServerUseCase(IHardwareRepository repository)
+public class DeleteServerUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/DescribeServerUseCase.cs

@@ -13,7 +13,7 @@ public record ServerDescription(
     bool Ipmi
 );
 
-public class DescribeServerUseCase(IHardwareRepository repository)
+public class DescribeServerUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<ServerDescription?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Drives/AddDriveUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Drives;
 
-public class AddDrivesUseCase(IHardwareRepository repository)
+public class AddDrivesUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Drives/RemoveDriveUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Drives;
 
-public class RemoveDriveUseCase(IHardwareRepository repository)
+public class RemoveDriveUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string serverName, int index)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Drives/UpdateDriveUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Drives;
 
-public class UpdateDriveUseCase(IHardwareRepository repository)
+public class UpdateDriveUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string serverName, int index, string type, int size)
     {

+ 3 - 6
RackPeek.Domain/Resources/Hardware/Servers/GetServerSystemTreeUseCase.cs

@@ -7,7 +7,7 @@ namespace RackPeek.Domain.Resources.Hardware.Servers;
 public class GetServerSystemTreeUseCase(
     IHardwareRepository hardwareRepository,
     ISystemRepository systemRepository,
-    IServiceRepository serviceRepository)
+    IServiceRepository serviceRepository) : IUseCase
 {
     public async Task<HardwareDependencyTree?> ExecuteAsync(string hardwareName)
     {
@@ -22,10 +22,7 @@ public class GetServerSystemTreeUseCase(
         var systems = await systemRepository.GetByPhysicalHostAsync(server.Name);
 
         var systemTrees = new List<SystemDependencyTree>();
-        foreach (var system in systems)
-        {
-            systemTrees.Add(await BuildSystemDependencyTreeAsync(system));
-        }
+        foreach (var system in systems) systemTrees.Add(await BuildSystemDependencyTreeAsync(system));
 
         return new HardwareDependencyTree(server, systemTrees);
     }
@@ -48,4 +45,4 @@ public sealed class SystemDependencyTree(SystemResource system, IEnumerable<Serv
 {
     public SystemResource System { get; } = system;
     public IEnumerable<Service> Services { get; } = services;
-}
+}

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/GetServerUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 
-public class GetServerUseCase(IHardwareRepository repository)
+public class GetServerUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<Server?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/GetServersUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 
-public class GetServersUseCase(IHardwareRepository repository)
+public class GetServersUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<Server>> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/AddGpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 
-public class AddGpuUseCase(IHardwareRepository repository)
+public class AddGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/RemoveGpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 
-public class RemoveGpuUseCase(IHardwareRepository repository)
+public class RemoveGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string serverName, int index)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Gpus/UpdateGpuUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Gpus;
 
-public class UpdateGpuUseCase(IHardwareRepository repository)
+public class UpdateGpuUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/AddNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 
-public class AddNicUseCase(IHardwareRepository repository)
+public class AddNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/RemoveNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 
-public class RemoveNicUseCase(IHardwareRepository repository)
+public class RemoveNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string serverName, int index)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/Nics/UpdateNicUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers.Nics;
 
-public class UpdateNicUseCase(IHardwareRepository repository)
+public class UpdateNicUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string serverName,

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/ServerHardwareReport.cs → RackPeek.Domain/Resources/Hardware/Servers/ServerHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.Servers;
 
 public record ServerHardwareReport(
     IReadOnlyList<ServerHardwareRow> Servers
@@ -23,7 +23,7 @@ public record ServerHardwareRow(
     bool Ipmi
 );
 
-public class ServerHardwareReportUseCase(IHardwareRepository repository)
+public class ServerHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<ServerHardwareReport> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Servers/UpdateServerUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Servers;
 
-public class UpdateServerUseCase(IHardwareRepository repository)
+public class UpdateServerUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switches/AddSwitchUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 
-public class AddSwitchUseCase(IHardwareRepository repository)
+public class AddSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switches/DeleteSwitchUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 
-public class DeleteSwitchUseCase(IHardwareRepository repository)
+public class DeleteSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

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

@@ -12,7 +12,7 @@ public record SwitchDescription(
     string PortSummary
 );
 
-public class DescribeSwitchUseCase(IHardwareRepository repository)
+public class DescribeSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<SwitchDescription?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switches/GetSwitchUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 
-public class GetSwitchUseCase(IHardwareRepository repository)
+public class GetSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<Switch?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switches/GetSwitchesUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 
-public class GetSwitchesUseCase(IHardwareRepository repository)
+public class GetSwitchesUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<Switch>> ExecuteAsync()
     {

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/SwitchHardwareReport.cs → RackPeek.Domain/Resources/Hardware/Switches/SwitchHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.Switches;
 
 public record SwitchHardwareReport(
     IReadOnlyList<SwitchHardwareRow> Switches
@@ -16,7 +16,7 @@ public record SwitchHardwareRow(
     string PortSummary
 );
 
-public class SwitchHardwareReportUseCase(IHardwareRepository repository)
+public class SwitchHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<SwitchHardwareReport> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/Switches/UpdateSwitchUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.Switches;
 
-public class UpdateSwitchUseCase(IHardwareRepository repository)
+public class UpdateSwitchUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/AddUpsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
-public class AddUpsUseCase(IHardwareRepository repository)
+public class AddUpsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/DeleteUpsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
-public class DeleteUpsUseCase(IHardwareRepository repository)
+public class DeleteUpsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/DescribeUpsUseCase.cs

@@ -8,7 +8,7 @@ public record UpsDescription(
     int? Va
 );
 
-public class DescribeUpsUseCase(IHardwareRepository repository)
+public class DescribeUpsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<UpsDescription?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUnitUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
-public class GetUpsUnitUseCase(IHardwareRepository repository)
+public class GetUpsUnitUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<Ups?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/GetUpsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
-public class GetUpsUseCase(IHardwareRepository repository)
+public class GetUpsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<Ups>> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/Hardware/UpsUnits/UpdateUpsUseCase.cs

@@ -2,7 +2,7 @@ using RackPeek.Domain.Resources.Hardware.Models;
 
 namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
-public class UpdateUpsUseCase(IHardwareRepository repository)
+public class UpdateUpsUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 2 - 2
RackPeek.Domain/Resources/Hardware/Reports/UpsHardwareReport.cs → RackPeek.Domain/Resources/Hardware/UpsUnits/UpsHardwareReport.cs

@@ -1,6 +1,6 @@
 using RackPeek.Domain.Resources.Hardware.Models;
 
-namespace RackPeek.Domain.Resources.Hardware.Reports;
+namespace RackPeek.Domain.Resources.Hardware.UpsUnits;
 
 public record UpsHardwareReport(
     IReadOnlyList<UpsHardwareRow> UpsUnits
@@ -12,7 +12,7 @@ public record UpsHardwareRow(
     int Va
 );
 
-public class UpsHardwareReportUseCase(IHardwareRepository repository)
+public class UpsHardwareReportUseCase(IHardwareRepository repository) : IUseCase
 {
     public async Task<UpsHardwareReport> ExecuteAsync()
     {

+ 8 - 8
RackPeek.Domain/Resources/Services/Networking/Cidr.cs

@@ -1,8 +1,5 @@
-using System;
-
 namespace RackPeek.Domain.Resources.Services.Networking;
 
-
 public readonly struct Cidr
 {
     public uint Network { get; }
@@ -16,7 +13,10 @@ public readonly struct Cidr
         Prefix = prefix;
     }
 
-    public bool Contains(uint ip) => (ip & Mask) == Network;
+    public bool Contains(uint ip)
+    {
+        return (ip & Mask) == Network;
+    }
 
     public override string ToString()
     {
@@ -29,11 +29,11 @@ public readonly struct Cidr
         if (parts.Length != 2)
             throw new ArgumentException($"CIDR must be in format a.b.c.d/nn: {cidr}");
 
-        uint ip = IpHelper.ToUInt32(parts[0]);
-        int prefix = int.Parse(parts[1]);
+        var ip = IpHelper.ToUInt32(parts[0]);
+        var prefix = int.Parse(parts[1]);
 
-        uint mask = IpHelper.MaskFromPrefix(prefix);
-        uint network = ip & mask;
+        var mask = IpHelper.MaskFromPrefix(prefix);
+        var network = ip & mask;
 
         return new Cidr(network, mask, prefix);
     }

+ 0 - 3
RackPeek.Domain/Resources/Services/Networking/IpHelper.cs

@@ -1,8 +1,5 @@
-using System;
-
 namespace RackPeek.Domain.Resources.Services.Networking;
 
-
 public static class IpHelper
 {
     public static uint ToUInt32(string ip)

+ 8 - 11
RackPeek.Domain/Resources/Services/Service.cs

@@ -1,3 +1,5 @@
+using System.Text;
+
 namespace RackPeek.Domain.Resources.Services;
 
 public class Service : Resource
@@ -7,17 +9,11 @@ public class Service : Resource
 
     public string NetworkString()
     {
-        if (Network == null)
-        {
-            return string.Empty;
-        }
-        
-        if (!string.IsNullOrEmpty(Network.Url))
-        {
-            return Network.Url;
-        }
+        if (Network == null) return string.Empty;
+
+        if (!string.IsNullOrEmpty(Network.Url)) return Network.Url;
 
-        var stringBuilder = new System.Text.StringBuilder();
+        var stringBuilder = new StringBuilder();
         if (!string.IsNullOrEmpty(Network.Ip))
         {
             stringBuilder.Append("Ip: ");
@@ -27,9 +23,10 @@ public class Service : Resource
                 stringBuilder.Append(':');
                 stringBuilder.Append(Network.Port.Value);
             }
+
             stringBuilder.Append(' ');
         }
-        
+
         return stringBuilder.ToString();
     }
 }

+ 1 - 3
RackPeek.Domain/Resources/Services/UseCases/AddSystemUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/AddServiceUseCase.cs

@@ -1,8 +1,6 @@
-using RackPeek.Domain.Resources.SystemResources;
-
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class AddServiceUseCase(IServiceRepository repository)
+public class AddServiceUseCase(IServiceRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 3
RackPeek.Domain/Resources/Services/UseCases/DeleteSystemUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/DeleteServiceUseCase.cs

@@ -1,8 +1,6 @@
-using RackPeek.Domain.Resources.SystemResources;
-
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class DeleteServiceUseCase(IServiceRepository repository)
+public class DeleteServiceUseCase(IServiceRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 12 - 3
RackPeek.Domain/Resources/Services/UseCases/DescribeSystemUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/DescribeServiceUseCase.cs

@@ -8,10 +8,11 @@ public record ServiceDescription(
     int? Port,
     string? Protocol,
     string? Url,
-    string? RunsOn
+    string? RunsOnSystemHost,
+    string? RunsOnPhysicalHost
 );
 
-public class DescribeServiceUseCase(IServiceRepository repository)
+public class DescribeServiceUseCase(IServiceRepository repository, ISystemRepository systemRepo) : IUseCase
 {
     public async Task<ServiceDescription?> ExecuteAsync(string name)
     {
@@ -19,13 +20,21 @@ public class DescribeServiceUseCase(IServiceRepository repository)
         if (service is null)
             return null;
 
+        string? runsOnPhysicalHost = null;
+        if (!string.IsNullOrEmpty(service.RunsOn))
+        {
+            var systemResource = await systemRepo.GetByNameAsync(service.RunsOn);
+            runsOnPhysicalHost = systemResource?.RunsOn;   
+        }
+        
         return new ServiceDescription(
             service.Name,
             service.Network?.Ip,
             service.Network?.Port,
             service.Network?.Protocol,
             service.Network?.Url,
-            service.RunsOn
+            service.RunsOn,
+            runsOnPhysicalHost
         );
     }
 }

+ 1 - 3
RackPeek.Domain/Resources/Services/UseCases/GetSystemUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/GetServiceUseCase.cs

@@ -1,8 +1,6 @@
-using RackPeek.Domain.Resources.SystemResources;
-
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class GetServiceUseCase(IServiceRepository repository)
+public class GetServiceUseCase(IServiceRepository repository) : IUseCase
 {
     public async Task<Service?> ExecuteAsync(string name)
     {

+ 1 - 3
RackPeek.Domain/Resources/Services/UseCases/GetSystemsUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/GetServicesUseCase.cs

@@ -1,8 +1,6 @@
-using RackPeek.Domain.Resources.SystemResources;
-
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class GetServicesUseCase(IServiceRepository repository)
+public class GetServicesUseCase(IServiceRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<Service>> ExecuteAsync()
     {

+ 15 - 5
RackPeek.Domain/Resources/Services/UseCases/SystemReportUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/ServiceReportUseCase.cs

@@ -1,3 +1,4 @@
+using RackPeek.Domain.Resources.Hardware;
 using RackPeek.Domain.Resources.SystemResources;
 
 namespace RackPeek.Domain.Resources.Services.UseCases;
@@ -12,27 +13,36 @@ public record ServiceReportRow(
     int? Port,
     string? Protocol,
     string? Url,
-    string? RunsOn
+    string? RunsOnSystemHost,
+    string? RunsOnPhysicalHost
 );
 
-public class ServiceReportUseCase(IServiceRepository repository)
+public class ServiceReportUseCase(IServiceRepository repository, ISystemRepository systemRepo) : IUseCase
 {
     public async Task<ServiceReport> ExecuteAsync()
     {
         var services = await repository.GetAllAsync();
 
-        var rows = services.Select(s =>
+        var rows = services.Select(async s =>
         {
+            string? runsOnPhysicalHost = null;
+            if (!string.IsNullOrEmpty(s.RunsOn))
+            {
+                var systemResource = await systemRepo.GetByNameAsync(s.RunsOn);
+                runsOnPhysicalHost = systemResource?.RunsOn;
+            }
             return new ServiceReportRow(
                 s.Name,
                 s.Network?.Ip,
                 s.Network?.Port,
                 s.Network?.Protocol,
                 s.Network?.Url,
-                s.RunsOn
+                s.RunsOn,
+                runsOnPhysicalHost
             );
         }).ToList();
 
-        return new ServiceReport(rows);
+        var result = await Task.WhenAll(rows);
+        return new ServiceReport(result);
     }
 }

+ 15 - 16
RackPeek.Domain/Resources/Services/UseCases/ServiceSubnetsUseCase.cs

@@ -1,20 +1,12 @@
-using RackPeek.Domain.Resources.Services;
 using RackPeek.Domain.Resources.Services.Networking;
 
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class ServiceSubnetsUseCase
+public class ServiceSubnetsUseCase(IServiceRepository repo) : IUseCase
 {
-    private readonly IServiceRepository _repo;
-
-    public ServiceSubnetsUseCase(IServiceRepository repo)
-    {
-        _repo = repo;
-    }
-
     public async Task<ServiceSubnetsResult> ExecuteAsync(string? cidr, int? prefix, CancellationToken token)
     {
-        var services = await _repo.GetAllAsync();
+        var services = await repo.GetAllAsync();
 
         // If CIDR is provided → filter mode
         if (cidr is not null)
@@ -42,8 +34,8 @@ public class ServiceSubnetsUseCase
         }
 
         // No CIDR → subnet discovery mode
-        int effectivePrefix = prefix ?? 24;
-        uint mask = IpHelper.MaskFromPrefix(effectivePrefix);
+        var effectivePrefix = prefix ?? 24;
+        var mask = IpHelper.MaskFromPrefix(effectivePrefix);
 
         var groups = services
             .Where(s => s.Network?.Ip != null)
@@ -60,6 +52,7 @@ public class ServiceSubnetsUseCase
 }
 
 public record SubnetSummary(string Cidr, int Count);
+
 public record ServiceSummary(string Name, string Ip, string? RunsOn);
 
 public class ServiceSubnetsResult
@@ -73,11 +66,17 @@ public class ServiceSubnetsResult
     public List<ServiceSummary> Services { get; private set; } = new();
 
     public static ServiceSubnetsResult InvalidCidr(string cidr)
-        => new() { IsInvalidCidr = true, InvalidCidrValue = cidr };
+    {
+        return new ServiceSubnetsResult { IsInvalidCidr = true, InvalidCidrValue = cidr };
+    }
 
     public static ServiceSubnetsResult FromSubnets(List<SubnetSummary> subnets)
-        => new() { Subnets = subnets };
+    {
+        return new ServiceSubnetsResult { Subnets = subnets };
+    }
 
     public static ServiceSubnetsResult FromServices(List<ServiceSummary> services, string cidr)
-        => new() { Services = services, FilteredCidr = cidr };
-}
+    {
+        return new ServiceSubnetsResult { Services = services, FilteredCidr = cidr };
+    }
+}

+ 8 - 7
RackPeek.Domain/Resources/Services/UseCases/UpdateSystemUseCase.cs → RackPeek.Domain/Resources/Services/UseCases/UpdateServiceUseCase.cs

@@ -1,8 +1,6 @@
-using RackPeek.Domain.Resources.SystemResources;
-
 namespace RackPeek.Domain.Resources.Services.UseCases;
 
-public class UpdateServiceUseCase(IServiceRepository repository)
+public class UpdateServiceUseCase(IServiceRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,
@@ -19,22 +17,25 @@ public class UpdateServiceUseCase(IServiceRepository repository)
 
         if (!string.IsNullOrWhiteSpace(ip))
         {
-            service.Network ??= new Network();      
+            service.Network ??= new Network();
             service.Network.Ip = ip;
         }
+
         if (!string.IsNullOrWhiteSpace(protocol))
         {
-            service.Network ??= new Network();      
+            service.Network ??= new Network();
             service.Network.Protocol = protocol;
         }
+
         if (!string.IsNullOrWhiteSpace(url))
         {
-            service.Network ??= new Network();      
+            service.Network ??= new Network();
             service.Network.Url = url;
         }
+
         if (port.HasValue)
         {
-            service.Network ??= new Network();      
+            service.Network ??= new Network();
             service.Network.Port = port.Value;
         }
 

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/AddSystemUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
-public class AddSystemUseCase(ISystemRepository repository)
+public class AddSystemUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/DeleteSystemUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
-public class DeleteSystemUseCase(ISystemRepository repository)
+public class DeleteSystemUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/DescribeSystemUseCase.cs

@@ -10,7 +10,7 @@ public record SystemDescription(
     string? RunsOn
 );
 
-public class DescribeSystemUseCase(ISystemRepository repository)
+public class DescribeSystemUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task<SystemDescription?> ExecuteAsync(string name)
     {

+ 4 - 5
RackPeek.Domain/Resources/Services/UseCases/GetServerSystemTreeUseCase.cs → RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemServiceTreeUseCase.cs

@@ -1,11 +1,11 @@
 using RackPeek.Domain.Resources.Hardware.Servers;
-using RackPeek.Domain.Resources.SystemResources;
+using RackPeek.Domain.Resources.Services;
 
-namespace RackPeek.Domain.Resources.Services.UseCases;
+namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
 public class GetSystemServiceTreeUseCase(
     ISystemRepository systemRepository,
-    IServiceRepository serviceRepository)
+    IServiceRepository serviceRepository) : IUseCase
 {
     public async Task<SystemDependencyTree?> ExecuteAsync(string systemName)
     {
@@ -15,6 +15,5 @@ public class GetSystemServiceTreeUseCase(
         var services = await serviceRepository.GetBySystemHostAsync(system.Name);
 
         return new SystemDependencyTree(system, services);
-        
     }
-}
+}

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
-public class GetSystemUseCase(ISystemRepository repository)
+public class GetSystemUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task<SystemResource?> ExecuteAsync(string name)
     {

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/GetSystemsUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
-public class GetSystemsUseCase(ISystemRepository repository)
+public class GetSystemsUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task<IReadOnlyList<SystemResource>> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/SystemReportUseCase.cs

@@ -14,7 +14,7 @@ public record SystemReportRow(
     string? RunsOn
 );
 
-public class SystemReportUseCase(ISystemRepository repository)
+public class SystemReportUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task<SystemReport> ExecuteAsync()
     {

+ 1 - 1
RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemUseCase.cs

@@ -1,6 +1,6 @@
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
-public class UpdateSystemUseCase(ISystemRepository repository)
+public class UpdateSystemUseCase(ISystemRepository repository) : IUseCase
 {
     public async Task ExecuteAsync(
         string name,

+ 22 - 0
RackPeek.Domain/ServiceCollectionExtensions.cs

@@ -0,0 +1,22 @@
+using System.Reflection;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace RackPeek.Domain;
+
+public static class ServiceCollectionExtensions
+{
+    public static IServiceCollection AddUseCases(
+        this IServiceCollection services)
+    {
+        var usecases = Assembly.GetAssembly(typeof(IUseCase))
+            ?.GetTypes()
+            .Where(t =>
+                !t.IsAbstract &&
+                typeof(IUseCase).IsAssignableFrom(t)
+            );
+
+        foreach (var type in usecases) services.AddScoped(type);
+
+        return services;
+    }
+}

+ 36 - 259
RackPeek/CliBootstrap.cs

@@ -1,6 +1,5 @@
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Commands;
 using RackPeek.Commands.AccessPoints;
 using RackPeek.Commands.Desktops;
 using RackPeek.Commands.Desktops.Cpus;
@@ -16,25 +15,10 @@ using RackPeek.Commands.Services;
 using RackPeek.Commands.Switches;
 using RackPeek.Commands.Systems;
 using RackPeek.Commands.Ups;
+using RackPeek.Domain;
 using RackPeek.Domain.Resources.Hardware;
-using RackPeek.Domain.Resources.Hardware.AccessPoints;
-using RackPeek.Domain.Resources.Hardware.Desktops;
-using RackPeek.Domain.Resources.Hardware.Desktops.Cpus;
-using RackPeek.Domain.Resources.Hardware.Desktops.Drives;
-using RackPeek.Domain.Resources.Hardware.Desktops.Gpus;
-using RackPeek.Domain.Resources.Hardware.Desktops.Nics;
-using RackPeek.Domain.Resources.Hardware.Reports;
-using RackPeek.Domain.Resources.Hardware.Servers;
-using RackPeek.Domain.Resources.Hardware.Servers.Cpus;
-using RackPeek.Domain.Resources.Hardware.Servers.Drives;
-using RackPeek.Domain.Resources.Hardware.Servers.Gpus;
-using RackPeek.Domain.Resources.Hardware.Servers.Nics;
-using RackPeek.Domain.Resources.Hardware.Switches;
-using RackPeek.Domain.Resources.Hardware.UpsUnits;
 using RackPeek.Domain.Resources.Services;
-using RackPeek.Domain.Resources.Services.UseCases;
 using RackPeek.Domain.Resources.SystemResources;
-using RackPeek.Domain.Resources.SystemResources.UseCases;
 using RackPeek.Yaml;
 using Spectre.Console.Cli;
 
@@ -46,14 +30,29 @@ public static class CliBootstrap
         CommandApp app,
         IServiceCollection services,
         IConfiguration configuration,
-        string[] yamlFiles
+        string yamlDir
     )
     {
-        services.AddSingleton<IConfiguration>(configuration);
+        services.AddSingleton(configuration);
 
         var collection = new YamlResourceCollection();
         var basePath = configuration["HardwarePath"] ?? Directory.GetCurrentDirectory();
 
+        // Resolve yamlDir as relative to basePath
+        var yamlPath = Path.IsPathRooted(yamlDir)
+            ? yamlDir
+            : Path.Combine(basePath, yamlDir);
+
+        if (!Directory.Exists(yamlPath))
+            throw new DirectoryNotFoundException(
+                $"YAML directory not found: {yamlPath}"
+            );
+
+        // Load all .yml and .yaml files
+        var yamlFiles = Directory.EnumerateFiles(yamlPath, "*.yml")
+            .Concat(Directory.EnumerateFiles(yamlPath, "*.yaml"))
+            .ToArray();
+        
         collection.LoadFiles(yamlFiles.Select(f => Path.Combine(basePath, f)));
 
         // Infrastructure
@@ -62,223 +61,14 @@ public static class CliBootstrap
         services.AddScoped<IServiceRepository>(_ => new YamlServiceRepository(collection));
 
         // Application
-        services.AddScoped<ServerHardwareReportUseCase>();
-        services.AddScoped<ServerReportCommand>();
-        services.AddScoped<AccessPointHardwareReportUseCase>();
-        services.AddScoped<AccessPointReportCommand>();
-        services.AddScoped<SwitchHardwareReportUseCase>();
-        services.AddScoped<SwitchReportCommand>();
-        services.AddScoped<UpsHardwareReportUseCase>();
-        services.AddScoped<UpsReportCommand>();
-        services.AddScoped<DesktopHardwareReportUseCase>();
-        services.AddScoped<DesktopReportCommand>();
-
-        services.AddScoped<AddServerUseCase>();
-        services.AddScoped<ServerAddCommand>();
-
-        services.AddScoped<DeleteServerUseCase>();
-        services.AddScoped<ServerDeleteCommand>();
-
-        services.AddScoped<DescribeServerUseCase>();
-        services.AddScoped<ServerDescribeCommand>();
-
-        services.AddScoped<GetServerUseCase>();
-        services.AddScoped<ServerGetByNameCommand>();
-
-        services.AddScoped<UpdateServerUseCase>();
-        services.AddScoped<ServerSetCommand>();
-        services.AddScoped<GetServerSystemTreeUseCase>();
-        services.AddScoped<ServerTreeCommand>();
-
-        // CPU use cases
-        services.AddScoped<AddCpuUseCase>();
-        services.AddScoped<UpdateCpuUseCase>();
-        services.AddScoped<RemoveCpuUseCase>();
-
-        // Drive use cases
-        services.AddScoped<AddDrivesUseCase>();
-        services.AddScoped<UpdateDriveUseCase>();
-        services.AddScoped<RemoveDriveUseCase>();
-
-        // GPU use cases
-        services.AddScoped<AddGpuUseCase>();
-        services.AddScoped<UpdateGpuUseCase>();
-        services.AddScoped<RemoveGpuUseCase>();
-
-
-        // CPU commands
-        services.AddScoped<ServerCpuAddCommand>();
-        services.AddScoped<ServerCpuSetCommand>();
-        services.AddScoped<ServerCpuRemoveCommand>();
-
-        // Switch commands
-        services.AddScoped<SwitchAddCommand>();
-        services.AddScoped<SwitchDeleteCommand>();
-        services.AddScoped<SwitchDescribeCommand>();
-        services.AddScoped<SwitchGetByNameCommand>();
-        services.AddScoped<SwitchGetCommand>();
-        services.AddScoped<SwitchSetCommand>();
-
-        // Switch Usecases
-        services.AddScoped<AddSwitchUseCase>();
-        services.AddScoped<DeleteSwitchUseCase>();
-        services.AddScoped<GetSwitchUseCase>();
-        services.AddScoped<GetSwitchesUseCase>();
-        services.AddScoped<UpdateSwitchUseCase>();
-        services.AddScoped<DescribeSwitchUseCase>();
-
-        // NIC use cases
-        services.AddScoped<AddNicUseCase>();
-        services.AddScoped<UpdateNicUseCase>();
-        services.AddScoped<RemoveNicUseCase>();
-
-        // NIC commands
-        services.AddScoped<ServerNicAddCommand>();
-        services.AddScoped<ServerNicUpdateCommand>();
-        services.AddScoped<ServerNicRemoveCommand>();
-
-        // Drive commands
-        services.AddScoped<ServerDriveAddCommand>();
-        services.AddScoped<ServerDriveUpdateCommand>();
-        services.AddScoped<ServerDriveRemoveCommand>();
-
-        // GPU commands
-        services.AddScoped<ServerGpuAddCommand>();
-        services.AddScoped<ServerGpuUpdateCommand>();
-        services.AddScoped<ServerGpuRemoveCommand>();
-
-        // System use cases
-        services.AddScoped<AddSystemUseCase>();
-        services.AddScoped<DeleteSystemUseCase>();
-        services.AddScoped<DescribeSystemUseCase>();
-        services.AddScoped<GetSystemsUseCase>();
-        services.AddScoped<GetSystemUseCase>();
-        services.AddScoped<UpdateSystemUseCase>();
-        services.AddScoped<SystemReportUseCase>();
-        services.AddScoped<GetSystemServiceTreeUseCase>();
-
-        // System commands
-        services.AddScoped<SystemSetCommand>();
-        services.AddScoped<SystemGetCommand>();
-        services.AddScoped<SystemGetByNameCommand>();
-        services.AddScoped<SystemDescribeCommand>();
-        services.AddScoped<SystemDeleteCommand>();
-        services.AddScoped<SystemAddCommand>();
-        services.AddScoped<SystemReportCommand>();
-        services.AddScoped<SystemTreeCommand>();
-
-        // AccessPoint use cases
-        services.AddScoped<AddAccessPointUseCase>();
-        services.AddScoped<DeleteAccessPointUseCase>();
-        services.AddScoped<GetAccessPointUseCase>();
-        services.AddScoped<GetAccessPointsUseCase>();
-        services.AddScoped<UpdateAccessPointUseCase>();
-        services.AddScoped<DescribeAccessPointUseCase>();
-
-        // AccessPoint commands
-        services.AddScoped<AccessPointAddCommand>();
-        services.AddScoped<AccessPointDeleteCommand>();
-        services.AddScoped<AccessPointDescribeCommand>();
-        services.AddScoped<AccessPointGetByNameCommand>();
-        services.AddScoped<AccessPointGetCommand>();
-        services.AddScoped<AccessPointSetCommand>();
-
-        // UPS use cases
-        services.AddScoped<AddUpsUseCase>();
-        services.AddScoped<DeleteUpsUseCase>();
-        services.AddScoped<GetUpsUnitUseCase>();
-        services.AddScoped<GetUpsUseCase>();
-        services.AddScoped<UpdateUpsUseCase>();
-        services.AddScoped<DescribeUpsUseCase>();
-
-        // UPS commands
-        services.AddScoped<UpsAddCommand>();
-        services.AddScoped<UpsDeleteCommand>();
-        services.AddScoped<UpsDescribeCommand>();
-        services.AddScoped<UpsGetByNameCommand>();
-        services.AddScoped<UpsGetCommand>();
-        services.AddScoped<UpsSetCommand>();
-
-        // Desktop use cases
-        services.AddScoped<AddDesktopUseCase>();
-        services.AddScoped<DeleteDesktopUseCase>();
-        services.AddScoped<DescribeDesktopUseCase>();
-        services.AddScoped<GetDesktopUseCase>();
-        services.AddScoped<GetDesktopsUseCase>();
-        services.AddScoped<UpdateDesktopUseCase>();
-
-// Desktop CPU use cases
-        services.AddScoped<AddDesktopCpuUseCase>();
-        services.AddScoped<UpdateDesktopCpuUseCase>();
-        services.AddScoped<RemoveDesktopCpuUseCase>();
-
-// Desktop Drive use cases
-        services.AddScoped<AddDesktopDriveUseCase>();
-        services.AddScoped<UpdateDesktopDriveUseCase>();
-        services.AddScoped<RemoveDesktopDriveUseCase>();
-
-// Desktop GPU use cases
-        services.AddScoped<AddDesktopGpuUseCase>();
-        services.AddScoped<UpdateDesktopGpuUseCase>();
-        services.AddScoped<RemoveDesktopGpuUseCase>();
-
-// Desktop NIC use cases
-        services.AddScoped<AddDesktopNicUseCase>();
-        services.AddScoped<UpdateDesktopNicUseCase>();
-        services.AddScoped<RemoveDesktopNicUseCase>();
-
-// Desktop CRUD commands
-        services.AddScoped<DesktopAddCommand>();
-        services.AddScoped<DesktopDeleteCommand>();
-        services.AddScoped<DesktopDescribeCommand>();
-        services.AddScoped<DesktopGetByNameCommand>();
-        services.AddScoped<DesktopGetCommand>();
-        services.AddScoped<DesktopSetCommand>();
-
-// Desktop CPU commands
-        services.AddScoped<DesktopCpuAddCommand>();
-        services.AddScoped<DesktopCpuSetCommand>();
-        services.AddScoped<DesktopCpuRemoveCommand>();
-
-// Desktop Drive commands
-        services.AddScoped<DesktopDriveAddCommand>();
-        services.AddScoped<DesktopDriveSetCommand>();
-        services.AddScoped<DesktopDriveRemoveCommand>();
-
-// Desktop GPU commands
-        services.AddScoped<DesktopGpuAddCommand>();
-        services.AddScoped<DesktopGpuSetCommand>();
-        services.AddScoped<DesktopGpuRemoveCommand>();
-
-// Desktop NIC commands
-        services.AddScoped<DesktopNicAddCommand>();
-        services.AddScoped<DesktopNicSetCommand>();
-        services.AddScoped<DesktopNicRemoveCommand>();
-
-        // Service use cases
-        services.AddScoped<AddServiceUseCase>();
-        services.AddScoped<DeleteServiceUseCase>();
-        services.AddScoped<DescribeServiceUseCase>();
-        services.AddScoped<GetServiceUseCase>();
-        services.AddScoped<GetServiceUseCase>();
-        services.AddScoped<UpdateServiceUseCase>();
-        services.AddScoped<ServiceReportUseCase>();
-        services.AddScoped<ServiceSubnetsUseCase>();
-
-        // Service commands
-        services.AddScoped<ServiceSetCommand>();
-        services.AddScoped<ServiceGetCommand>();
-        services.AddScoped<ServiceGetByNameCommand>();
-        services.AddScoped<ServiceDescribeCommand>();
-        services.AddScoped<ServiceDeleteCommand>();
-        services.AddScoped<ServiceAddCommand>();
-        services.AddScoped<ServiceReportCommand>();
-        services.AddScoped<ServiceSubnetsCommand>();
-        
+        services.AddUseCases();
+        services.AddCommands();
+
         // Spectre bootstrap
         app.Configure(config =>
         {
             config.SetApplicationName("rpk");
+            config.ValidateExamples();
 
             // ----------------------------
             // Server commands (CRUD-style)
@@ -361,30 +151,31 @@ public static class CliBootstrap
                             .WithDescription("Remove a GPU from a server");
                     });
                 });
-
-                config.AddBranch("switches", server =>
+            });
+                
+            config.AddBranch("switches", switches =>
                 {
-                    server.SetDescription("Manage switches");
+                    switches.SetDescription("Manage switches");
 
-                    server.AddCommand<SwitchReportCommand>("summary")
+                    switches.AddCommand<SwitchReportCommand>("summary")
                         .WithDescription("Show switch hardware report");
 
-                    server.AddCommand<SwitchAddCommand>("add")
+                    switches.AddCommand<SwitchAddCommand>("add")
                         .WithDescription("Add a new switch");
 
-                    server.AddCommand<SwitchGetCommand>("list")
+                    switches.AddCommand<SwitchGetCommand>("list")
                         .WithDescription("List switches");
 
-                    server.AddCommand<SwitchGetByNameCommand>("get")
+                    switches.AddCommand<SwitchGetByNameCommand>("get")
                         .WithDescription("Get a switches by name");
 
-                    server.AddCommand<SwitchDescribeCommand>("describe")
+                    switches.AddCommand<SwitchDescribeCommand>("describe")
                         .WithDescription("Show detailed information about a switch");
 
-                    server.AddCommand<SwitchSetCommand>("set")
+                    switches.AddCommand<SwitchSetCommand>("set")
                         .WithDescription("Update switch properties");
 
-                    server.AddCommand<SwitchDeleteCommand>("del")
+                    switches.AddCommand<SwitchDeleteCommand>("del")
                         .WithDescription("Delete a switch");
                 });
 
@@ -412,7 +203,7 @@ public static class CliBootstrap
 
                     system.AddCommand<SystemDeleteCommand>("del")
                         .WithDescription("Delete a system");
-                    
+
                     system.AddCommand<SystemTreeCommand>("tree")
                         .WithDescription("Displays a dependency tree for the system.");
                 });
@@ -478,6 +269,8 @@ public static class CliBootstrap
                     desktops.AddCommand<DesktopDescribeCommand>("describe");
                     desktops.AddCommand<DesktopSetCommand>("set");
                     desktops.AddCommand<DesktopDeleteCommand>("del");
+                    desktops.AddCommand<DesktopReportCommand>("summary")
+                        .WithDescription("Show desktop hardware report");
 
                     // CPU
                     desktops.AddBranch("cpu", cpu =>
@@ -541,23 +334,7 @@ public static class CliBootstrap
                     
                     service.AddCommand<ServiceSubnetsCommand>("subnets")
                         .WithDescription("List service subnets or filter by CIDR");
-
                 });
-
-                // ----------------------------
-                // Reports (read-only summaries)
-                // ----------------------------
-                config.AddCommand<AccessPointReportCommand>("ap")
-                    .WithDescription("Show access point hardware report");
-
-                config.AddCommand<DesktopReportCommand>("desktops")
-                    .WithDescription("Show desktop hardware report");
-
-                config.AddCommand<UpsReportCommand>("ups")
-                    .WithDescription("Show UPS hardware report");
-
-                config.ValidateExamples();
-            });
         });
     }
 }

+ 1 - 1
RackPeek/Commands/AccessPoints/AccessPointGetByNameCommand.cs

@@ -26,7 +26,7 @@ public class AccessPointGetByNameCommand(
         }
 
         AnsiConsole.MarkupLine(
-            $"[green]{ap.Name}[/]  Model: {ap.Model ?? "Unknown"}, Speed: {(ap.Speed?.ToString() ?? "Unknown")}Gbps");
+            $"[green]{ap.Name}[/]  Model: {ap.Model ?? "Unknown"}, Speed: {ap.Speed?.ToString() ?? "Unknown"}Gbps");
 
         return 0;
     }

+ 1 - 1
RackPeek/Commands/AccessPoints/AccessPointGetCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Hardware.Reports;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using Spectre.Console;
 using Spectre.Console.Cli;
 

+ 2 - 2
RackPeek/Commands/AccessPointReportCommand.cs → RackPeek/Commands/AccessPoints/AccessPointReportCommand.cs

@@ -1,10 +1,10 @@
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
-using RackPeek.Domain.Resources.Hardware.Reports;
+using RackPeek.Domain.Resources.Hardware.AccessPoints;
 using Spectre.Console;
 using Spectre.Console.Cli;
 
-namespace RackPeek.Commands;
+namespace RackPeek.Commands.AccessPoints;
 
 public class AccessPointReportCommand(
     ILogger<AccessPointReportCommand> logger,

+ 2 - 2
RackPeek/Commands/DesktopReportCommand.cs → RackPeek/Commands/Desktops/DesktopReportCommand.cs

@@ -1,10 +1,10 @@
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
-using RackPeek.Domain.Resources.Hardware.Reports;
+using RackPeek.Domain.Resources.Hardware.Desktops;
 using Spectre.Console;
 using Spectre.Console.Cli;
 
-namespace RackPeek.Commands;
+namespace RackPeek.Commands.Desktops;
 
 public class DesktopReportCommand(
     ILogger<DesktopReportCommand> logger,

+ 1 - 1
RackPeek/Commands/Servers/ServerGetCommand.cs

@@ -1,5 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
-using RackPeek.Domain.Resources.Hardware.Reports;
+using RackPeek.Domain.Resources.Hardware.Servers;
 using Spectre.Console;
 using Spectre.Console.Cli;
 

+ 1 - 1
RackPeek/Commands/Servers/ServerReportCommand.cs

@@ -1,6 +1,6 @@
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
-using RackPeek.Domain.Resources.Hardware.Reports;
+using RackPeek.Domain.Resources.Hardware.Servers;
 using Spectre.Console;
 using Spectre.Console.Cli;
 

+ 1 - 4
RackPeek/Commands/Servers/ServerTreeCommand.cs

@@ -24,10 +24,7 @@ public sealed class ServerTreeCommand(GetServerSystemTreeUseCase useCase) : Asyn
         foreach (var system in tree.Systems)
         {
             var systemNode = root.AddNode($"[green]System:[/] {system.System.Name}");
-            foreach (var service in system.Services)
-            {
-                systemNode.AddNode($"[green]Service:[/] {service.Name}");
-            }
+            foreach (var service in system.Services) systemNode.AddNode($"[green]Service:[/] {service.Name}");
         }
 
         AnsiConsole.Write(root);

+ 1 - 1
RackPeek/Commands/Services/ServiceAddCommand.cs

@@ -8,7 +8,7 @@ namespace RackPeek.Commands.Services;
 
 public class ServiceAddSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")] 
+    [CommandArgument(0, "<name>")]
     [Description("The name of the service.")]
     public string Name { get; set; } = default!;
 }

+ 1 - 1
RackPeek/Commands/Services/ServiceDescribeCommand.cs

@@ -38,7 +38,7 @@ public class ServiceDescribeCommand(
         grid.AddRow("Port:", service.Port?.ToString() ?? "Unknown");
         grid.AddRow("Protocol:", service.Protocol ?? "Unknown");
         grid.AddRow("Url:", service.Url ?? "Unknown");
-        grid.AddRow("Runs On:", service.RunsOn ?? "Unknown");
+        grid.AddRow("Runs On:", ServicesFormatExtensions.FormatRunsOn(service.RunsOnSystemHost, service.RunsOnPhysicalHost));
 
         AnsiConsole.Write(
             new Panel(grid)

+ 1 - 1
RackPeek/Commands/Services/ServiceGetByNameCommand.cs

@@ -26,7 +26,7 @@ public class ServiceGetByNameCommand(
         }
 
         AnsiConsole.MarkupLine(
-            $"[green]{Service.Name}[/]  Ip: {Service.Ip ?? "Unknown"}, Port: {Service.Port.ToString() ?? "Unknown"}, Protocol: {Service.Protocol ?? "Unknown"}, Url: {Service.Url ?? "Unknown"}, RunsOn: {Service.RunsOn ?? "Unknown"}");
+            $"[green]{Service.Name}[/]  Ip: {Service.Ip ?? "Unknown"}, Port: {Service.Port.ToString() ?? "Unknown"}, Protocol: {Service.Protocol ?? "Unknown"}, Url: {Service.Url ?? "Unknown"}, RunsOn: {ServicesFormatExtensions.FormatRunsOn(Service.RunsOnSystemHost, Service.RunsOnPhysicalHost)}");
         return 0;
     }
 }

+ 1 - 1
RackPeek/Commands/Services/ServiceGetCommand.cs

@@ -40,7 +40,7 @@ public class ServiceGetCommand(
                 s.Port.ToString() ?? "",
                 s.Protocol ?? "",
                 s.Url ?? "",
-                s.RunsOn ?? "Unknown"
+                ServicesFormatExtensions.FormatRunsOn(s.RunsOnSystemHost, s.RunsOnPhysicalHost)
             );
 
         AnsiConsole.Write(table);

+ 1 - 1
RackPeek/Commands/Services/ServiceNameSettings.cs

@@ -5,7 +5,7 @@ namespace RackPeek.Commands.Services;
 
 public class ServiceNameSettings : CommandSettings
 {
-    [CommandArgument(0, "<name>")] 
+    [CommandArgument(0, "<name>")]
     [Description("The name of the service.")]
     public string Name { get; set; } = default!;
 }

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio