DeleteResourceTests.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. using Tests.EndToEnd.Infra;
  2. using Xunit.Abstractions;
  3. namespace Tests.EndToEnd;
  4. [Collection("Yaml CLI tests")]
  5. public class DeleteResourceTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
  6. : IClassFixture<TempYamlCliFixture> {
  7. private async Task<(string output, string yaml)> ExecuteAsync(params string[] args) {
  8. outputHelper.WriteLine($"rpk {string.Join(" ", args)}");
  9. var output = await YamlCliTestHost.RunAsync(
  10. args,
  11. fs.Root,
  12. outputHelper,
  13. "config.yaml");
  14. outputHelper.WriteLine(output);
  15. var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
  16. return (output, yaml);
  17. }
  18. [Fact]
  19. public async Task deleting_resource_removes_connections_from_endpoint_a() {
  20. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  21. await ExecuteAsync("servers", "add", "srv01");
  22. await ExecuteAsync("servers", "add", "srv02");
  23. await ExecuteAsync(
  24. "servers", "nic", "add", "srv01",
  25. "--type", "RJ45",
  26. "--speed", "10",
  27. "--ports", "2");
  28. await ExecuteAsync(
  29. "servers", "nic", "add", "srv02",
  30. "--type", "RJ45",
  31. "--speed", "10",
  32. "--ports", "2");
  33. await ExecuteAsync(
  34. "connections", "add",
  35. "srv01", "0", "0",
  36. "srv02", "0", "0",
  37. "--label", "test-connection");
  38. (var output, var yaml) = await ExecuteAsync("servers", "del", "srv01");
  39. Assert.Contains("Server 'srv01' deleted.", output);
  40. // Connection referencing deleted resource is removed
  41. Assert.DoesNotContain("test-connection", yaml);
  42. // srv02 should still exist
  43. Assert.Contains("srv02", yaml);
  44. Assert.DoesNotContain("srv01", yaml);
  45. }
  46. [Fact]
  47. public async Task deleting_resource_removes_connections_from_endpoint_b() {
  48. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  49. await ExecuteAsync("servers", "add", "srv01");
  50. await ExecuteAsync("servers", "add", "srv02");
  51. await ExecuteAsync(
  52. "servers", "nic", "add", "srv01",
  53. "--type", "RJ45",
  54. "--speed", "10",
  55. "--ports", "2");
  56. await ExecuteAsync(
  57. "servers", "nic", "add", "srv02",
  58. "--type", "RJ45",
  59. "--speed", "10",
  60. "--ports", "2");
  61. await ExecuteAsync(
  62. "connections", "add",
  63. "srv01", "0", "0",
  64. "srv02", "0", "0",
  65. "--label", "test-connection");
  66. (var output, var yaml) = await ExecuteAsync("servers", "del", "srv02");
  67. Assert.Contains("Server 'srv02' deleted.", output);
  68. // Connection referencing deleted resource is removed
  69. Assert.DoesNotContain("test-connection", yaml);
  70. // srv01 should still exist
  71. Assert.Contains("srv01", yaml);
  72. Assert.DoesNotContain("srv02", yaml);
  73. }
  74. [Fact]
  75. public async Task deleting_resource_removes_dependant_runs_on() {
  76. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  77. await ExecuteAsync("servers", "add", "srv01");
  78. await ExecuteAsync("systems", "add", "sys01");
  79. await ExecuteAsync("systems", "set", "sys01", "--runs-on", "srv01");
  80. (var output, var yaml) = await ExecuteAsync("servers", "del", "srv01");
  81. Assert.Contains("Server 'srv01' deleted.", output);
  82. // System should still exist but without runs-on reference
  83. Assert.Contains("sys01", yaml);
  84. // The runs-on reference should be removed from the system
  85. Assert.DoesNotContain("srv01", yaml);
  86. }
  87. [Fact]
  88. public async Task deleting_resource_typed_in_different_case_removes_dependant_runs_on() {
  89. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  90. await ExecuteAsync("servers", "add", "Srv01");
  91. await ExecuteAsync("systems", "add", "sys01");
  92. await ExecuteAsync("systems", "set", "sys01", "--runs-on", "Srv01");
  93. (var output, var yaml) = await ExecuteAsync("servers", "del", "srv01");
  94. Assert.Contains("Server 'srv01' deleted.", output);
  95. Assert.Contains("sys01", yaml);
  96. // The runs-on reference should be removed even though the name was typed in a different case
  97. Assert.DoesNotContain("Srv01", yaml, StringComparison.OrdinalIgnoreCase);
  98. }
  99. [Fact]
  100. public async Task deleting_resource_typed_in_different_case_removes_connections() {
  101. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  102. await ExecuteAsync("servers", "add", "Srv01");
  103. await ExecuteAsync("servers", "add", "Srv02");
  104. await ExecuteAsync(
  105. "servers", "nic", "add", "Srv01",
  106. "--type", "RJ45",
  107. "--speed", "10",
  108. "--ports", "2");
  109. await ExecuteAsync(
  110. "servers", "nic", "add", "Srv02",
  111. "--type", "RJ45",
  112. "--speed", "10",
  113. "--ports", "2");
  114. await ExecuteAsync(
  115. "connections", "add",
  116. "Srv01", "0", "0",
  117. "Srv02", "0", "0",
  118. "--label", "mixed-case-connection");
  119. (var output, var yaml) = await ExecuteAsync("servers", "del", "srv01");
  120. Assert.Contains("Server 'srv01' deleted.", output);
  121. Assert.Contains("Srv02", yaml);
  122. Assert.DoesNotContain("mixed-case-connection", yaml);
  123. Assert.DoesNotContain("Srv01", yaml, StringComparison.OrdinalIgnoreCase);
  124. }
  125. [Fact]
  126. public async Task deleting_resource_with_multiple_connections_removes_all() {
  127. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  128. await ExecuteAsync("switches", "add", "sw01");
  129. await ExecuteAsync("switches", "add", "sw02");
  130. await ExecuteAsync("switches", "add", "sw03");
  131. await ExecuteAsync(
  132. "switches", "port", "add", "sw01",
  133. "--type", "SFP+",
  134. "--speed", "25",
  135. "--count", "3");
  136. await ExecuteAsync(
  137. "switches", "port", "add", "sw02",
  138. "--type", "SFP+",
  139. "--speed", "25",
  140. "--count", "2");
  141. await ExecuteAsync(
  142. "switches", "port", "add", "sw03",
  143. "--type", "SFP+",
  144. "--speed", "25",
  145. "--count", "2");
  146. await ExecuteAsync(
  147. "connections", "add",
  148. "sw01", "0", "0",
  149. "sw02", "0", "0",
  150. "--label", "sw01-to-sw02");
  151. await ExecuteAsync(
  152. "connections", "add",
  153. "sw01", "0", "1",
  154. "sw03", "0", "0",
  155. "--label", "sw01-to-sw03");
  156. (var output, var yaml) = await ExecuteAsync("switches", "del", "sw01");
  157. Assert.Contains("Switch 'sw01' deleted.", output);
  158. Assert.Contains("sw02", yaml);
  159. Assert.Contains("sw03", yaml);
  160. // Both connections referencing sw01 should be removed
  161. Assert.DoesNotContain("sw01-to-sw02", yaml);
  162. Assert.DoesNotContain("sw01-to-sw03", yaml);
  163. }
  164. [Fact]
  165. public async Task deleting_resource_removes_connection_when_both_endpoints_referenced() {
  166. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  167. await ExecuteAsync("servers", "add", "srv01");
  168. await ExecuteAsync("servers", "add", "srv02");
  169. await ExecuteAsync(
  170. "servers", "nic", "add", "srv01",
  171. "--type", "RJ45",
  172. "--speed", "10",
  173. "--ports", "2");
  174. await ExecuteAsync(
  175. "servers", "nic", "add", "srv02",
  176. "--type", "RJ45",
  177. "--speed", "10",
  178. "--ports", "2");
  179. await ExecuteAsync(
  180. "connections", "add",
  181. "srv01", "0", "0",
  182. "srv02", "0", "0",
  183. "--label", "bi-directional-link");
  184. await ExecuteAsync("servers", "del", "srv01");
  185. var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
  186. // srv02 should remain
  187. Assert.Contains("srv02", yaml);
  188. // Connection referencing deleted resource should be removed
  189. Assert.DoesNotContain("srv01", yaml);
  190. // Connection label should be gone since the connection is removed
  191. Assert.DoesNotContain("bi-directional-link", yaml);
  192. }
  193. }