浏览代码

Server Commands Written

James 1 月之前
父节点
当前提交
aeb88cc07a

+ 50 - 0
Tests/EndToEnd/ServerTests/ServerCommandTests.cs

@@ -0,0 +1,50 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServerCommandTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> ExecuteAsync(params string[] args)
+    {
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task describe_outputs_expected_information()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+        await ExecuteAsync("servers", "set", "srv01", "--ram", "64");
+
+        var (output, _) = await ExecuteAsync("servers", "describe", "srv01");
+
+        Assert.Contains("srv01", output);
+        Assert.Contains("64", output);
+    }
+
+    [Fact]
+    public async Task help_commands_do_not_throw()
+    {
+        Assert.Contains("Manage servers", (await ExecuteAsync("servers", "--help")).output);
+        Assert.Contains("Add a new server", (await ExecuteAsync("servers", "add", "--help")).output);
+        Assert.Contains("List all servers", (await ExecuteAsync("servers", "get", "--help")).output);
+        Assert.Contains("Display detailed information", (await ExecuteAsync("servers", "describe", "--help")).output);
+        Assert.Contains("Update properties", (await ExecuteAsync("servers", "set", "--help")).output);
+        Assert.Contains("Delete a server", (await ExecuteAsync("servers", "del", "--help")).output);
+        Assert.Contains("Display the dependency tree", (await ExecuteAsync("servers", "tree", "--help")).output);
+
+        Assert.Contains("Manage CPUs", (await ExecuteAsync("servers", "cpu", "--help")).output);
+        Assert.Contains("Manage drives", (await ExecuteAsync("servers", "drive", "--help")).output);
+        Assert.Contains("Manage GPUs", (await ExecuteAsync("servers", "gpu", "--help")).output);
+        Assert.Contains("Manage network interface cards", (await ExecuteAsync("servers", "nic", "--help")).output);
+    }
+}

+ 123 - 0
Tests/EndToEnd/ServerTests/ServerErrorTests.cs

@@ -0,0 +1,123 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServerErrorTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> ExecuteAsync(params string[] args)
+    {
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task adding_duplicate_server_returns_error()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+        var (output, _) = await ExecuteAsync("servers", "add", "srv01");
+        Assert.Contains("already exists", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task get_missing_server_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("servers", "get", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_missing_server_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("servers", "set", "ghost", "--ram", "64");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task delete_missing_server_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("servers", "del", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // CPU errors
+    [Fact]
+    public async Task cpu_add_missing_server_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "servers", "cpu", "add", "ghost",
+            "--model", "Xeon",
+            "--cores", "8",
+            "--threads", "16"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task cpu_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+
+        var (output, _) = await ExecuteAsync(
+            "servers", "cpu", "set", "srv01",
+            "--index", "5",
+            "--model", "Xeon"
+        );
+
+        Assert.Contains("Not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // Drive errors
+    [Fact]
+    public async Task drive_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+
+        var (output, _) = await ExecuteAsync(
+            "servers", "drive", "set", "srv01",
+            "--index", "3",
+            "--type", "ssd"
+        );
+
+        Assert.Contains("Not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // GPU errors
+    [Fact]
+    public async Task gpu_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+
+        var (output, _) = await ExecuteAsync(
+            "servers", "gpu", "set", "srv01",
+            "--index", "2",
+            "--model", "A2000"
+        );
+
+        Assert.Contains("Not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // NIC errors
+    [Fact]
+    public async Task nic_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("servers", "add", "srv01");
+
+        var (output, _) = await ExecuteAsync(
+            "servers", "nic", "set", "srv01",
+            "--index", "4",
+            "--type", "ethernet"
+        );
+
+        Assert.Contains("Validation error", output, StringComparison.OrdinalIgnoreCase);
+    }
+}

+ 141 - 0
Tests/EndToEnd/ServerTests/ServerWorkflowTests.cs

@@ -0,0 +1,141 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServerWorkflowTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> ExecuteAsync(params string[] args)
+    {
+        outputHelper.WriteLine($"rpk {string.Join(" ", args)}");
+
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        outputHelper.WriteLine(output);
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task servers_cli_workflow_test()
+    {
+        await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
+
+        // Add server
+        var (output, yaml) = await ExecuteAsync("servers", "add", "srv01");
+        Assert.Equal("Server 'srv01' added.\n", output);
+        Assert.Contains("name: srv01", yaml);
+
+        // Update server
+        (output, yaml) = await ExecuteAsync(
+            "servers", "set", "srv01",
+            "--ram", "128",
+            "--ram_mts", "3200",
+            "--ipmi", "True"
+        );
+        Assert.Equal("Server 'srv01' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 1
+                     resources:
+                     - kind: Server
+                       ram:
+                         size: 128
+                         mts: 3200
+                       ipmi: true
+                       name: srv01
+
+                     """, yaml);
+
+        // Add CPU
+        (output, yaml) = await ExecuteAsync(
+            "servers", "cpu", "add", "srv01",
+            "--model", "Intel Xeon Silver 4310",
+            "--cores", "12",
+            "--threads", "24"
+        );
+        Assert.Equal("CPU added to 'srv01'.\n", output);
+
+        // Add Drive
+        (output, yaml) = await ExecuteAsync(
+            "servers", "drive", "add", "srv01",
+            "--type", "ssd",
+            "--size", "1024"
+        );
+        Assert.Equal("Drive added to 'srv01'.\n", output);
+
+        // Add GPU
+        (output, yaml) = await ExecuteAsync(
+            "servers", "gpu", "add", "srv01",
+            "--model", "NVIDIA A2000",
+            "--vram", "6"
+        );
+        Assert.Equal("GPU added to 'srv01'.\n", output);
+
+        // Add NIC
+        (output, yaml) = await ExecuteAsync(
+            "servers", "nic", "add", "srv01",
+            "--type", "RJ45",
+            "--speed", "10",
+            "--ports", "2"
+        );
+        Assert.Equal("NIC added to 'srv01'.\n", output);
+
+        // Get server
+        (output, yaml) = await ExecuteAsync("servers", "get", "srv01");
+        Assert.Equal(
+            "srv01  RAM: 128 GB, IPMI: yes\n",
+            output
+        );
+        
+
+        
+    // Summary (strict table)
+        (output, yaml) = await ExecuteAsync("servers", "summary");
+        
+        Assert.Equal("""
+                     ╭───────┬────────────┬───────┬────────┬────────────┬───────┬────────────┬──────╮
+                     │ Name  │ CPU        │ C/T   │ RAM    │ Storage    │ NICs  │ GPUs       │ IPMI │
+                     ├───────┼────────────┼───────┼────────┼────────────┼───────┼────────────┼──────┤
+                     │ srv01 │ 1× Intel   │ 12/24 │ 128 GB │ 1024 GB    │ 2×10G │ 1× NVIDIA  │ yes  │
+                     │       │ Xeon       │       │        │ (SSD 1024  │       │ A2000 (6   │      │
+                     │       │ Silver     │       │        │ / HDD 0)   │       │ GB VRAM)   │      │
+                     │       │ 4310       │       │        │            │       │            │      │
+                     ╰───────┴────────────┴───────┴────────┴────────────┴───────┴────────────┴──────╯
+                     
+                     """, output);
+                     
+
+        // Describe (strict)
+        (output, yaml) = await ExecuteAsync("servers", "describe", "srv01");
+        Assert.Equal("""
+                    ╭─Server───────────────────────────────╮
+                    │ Name  srv01                          │
+                    │ IPMI  yes                            │
+                    │ RAM   128 GB                         │
+                    │ CPU   Intel Xeon Silver 4310 (12/24) │
+                    ╰──────────────────────────────────────╯
+
+                    """, output);
+                     
+
+        // Tree (loose)
+        (output, yaml) = await ExecuteAsync("servers", "tree", "srv01");
+        Assert.Contains("srv01", output);
+        
+
+        // Delete server
+        (output, yaml) = await ExecuteAsync("servers", "del", "srv01");
+        Assert.Equal("""
+                     Server 'srv01' deleted.
+
+                     """, output);
+    }
+}

+ 0 - 4
Tests/Tests.csproj

@@ -26,8 +26,4 @@
         <ProjectReference Include="..\Shared.Rcl\Shared.Rcl.csproj"/>
     </ItemGroup>
 
-    <ItemGroup>
-      <Folder Include="EndToEnd\ServerTests\" />
-    </ItemGroup>
-
 </Project>