GenerateAnsibleInventoryTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. using Tests.EndToEnd.Infra;
  2. using Xunit.Abstractions;
  3. namespace Tests.EndToEnd;
  4. [Collection("Yaml CLI tests")]
  5. public class GenerateAnsibleInventoryTests(
  6. TempYamlCliFixture fs,
  7. ITestOutputHelper outputHelper)
  8. : IClassFixture<TempYamlCliFixture> {
  9. private async Task<(string output, string yaml)> ExecuteAsync(params string[] args) {
  10. outputHelper.WriteLine($"rpk {string.Join(" ", args)}");
  11. var output = await YamlCliTestHost.RunAsync(
  12. args,
  13. fs.Root,
  14. outputHelper,
  15. "config.yaml");
  16. outputHelper.WriteLine(output);
  17. var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
  18. return (output, yaml);
  19. }
  20. [Fact]
  21. public async Task generate_ansible_inventory_empty_config() {
  22. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  23. version: 1
  24. resources: []
  25. """);
  26. (var output, _) = await ExecuteAsync("ansible", "inventory");
  27. Assert.Contains("Generated Inventory", output);
  28. }
  29. [Fact]
  30. public async Task generate_ansible_inventory_single_system_ini_format() {
  31. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  32. version: 1
  33. resources:
  34. - kind: System
  35. type: vm
  36. name: web-server-01
  37. os: ubuntu-22.04
  38. cores: 2
  39. ram: 4
  40. labels:
  41. ansible_host: 192.168.1.100
  42. ansible_user: admin
  43. env: production
  44. """);
  45. (var output, _) = await ExecuteAsync("ansible", "inventory", "--group-labels", "env");
  46. Assert.Contains("Generated Inventory", output);
  47. Assert.Contains("web-server-01", output);
  48. Assert.Contains("ansible_host=192.168.1.100", output);
  49. Assert.Contains("ansible_user=admin", output);
  50. Assert.Contains("[env_production]", output);
  51. }
  52. [Fact]
  53. public async Task generate_ansible_inventory_with_tag_grouping() {
  54. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  55. version: 1
  56. resources:
  57. - kind: System
  58. type: vm
  59. name: web-prod-01
  60. os: ubuntu-22.04
  61. cores: 2
  62. ram: 4
  63. tags: [production, web]
  64. labels:
  65. ansible_host: 10.0.1.10
  66. ansible_user: ubuntu
  67. - kind: System
  68. type: vm
  69. name: web-prod-02
  70. os: ubuntu-22.04
  71. cores: 2
  72. ram: 4
  73. tags: [production, web]
  74. labels:
  75. ansible_host: 10.0.1.11
  76. ansible_user: ubuntu
  77. - kind: System
  78. type: vm
  79. name: db-staging-01
  80. os: postgres-15
  81. cores: 4
  82. ram: 8
  83. tags: [staging, database]
  84. labels:
  85. ansible_host: 10.0.2.20
  86. ansible_user: postgres
  87. """);
  88. (var output, _) = await ExecuteAsync(
  89. "ansible", "inventory",
  90. "--group-tags", "production,staging,web,database");
  91. Assert.Contains("[production]", output);
  92. Assert.Contains("[staging]", output);
  93. Assert.Contains("[web]", output);
  94. Assert.Contains("[database]", output);
  95. Assert.Contains("web-prod-01", output);
  96. Assert.Contains("web-prod-02", output);
  97. Assert.Contains("db-staging-01", output);
  98. }
  99. [Fact]
  100. public async Task generate_ansible_inventory_with_label_grouping() {
  101. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  102. version: 1
  103. resources:
  104. - kind: System
  105. type: vm
  106. name: server-east-01
  107. os: debian-12
  108. cores: 2
  109. ram: 4
  110. labels:
  111. ansible_host: 10.0.1.10
  112. region: us-east
  113. - kind: System
  114. type: vm
  115. name: server-west-01
  116. os: debian-12
  117. cores: 2
  118. ram: 4
  119. labels:
  120. ansible_host: 10.0.2.10
  121. region: us-west
  122. - kind: System
  123. type: vm
  124. name: server-eu-01
  125. os: debian-12
  126. cores: 2
  127. ram: 4
  128. labels:
  129. ansible_host: 10.0.3.10
  130. region: eu-central
  131. """);
  132. (var output, _) = await ExecuteAsync(
  133. "ansible", "inventory",
  134. "--group-labels", "region");
  135. Assert.Contains("[region_us_east]", output);
  136. Assert.Contains("[region_us_west]", output);
  137. Assert.Contains("[region_eu_central]", output);
  138. Assert.Contains("server-east-01", output);
  139. Assert.Contains("server-west-01", output);
  140. Assert.Contains("server-eu-01", output);
  141. }
  142. [Fact]
  143. public async Task generate_ansible_inventory_with_global_vars() {
  144. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  145. version: 1
  146. resources:
  147. - kind: System
  148. type: vm
  149. name: app-server-01
  150. os: ubuntu-22.04
  151. cores: 2
  152. ram: 4
  153. labels:
  154. ansible_host: 192.168.1.50
  155. ansible_user: deploy
  156. env: prod
  157. """);
  158. (var output, _) = await ExecuteAsync(
  159. "ansible", "inventory",
  160. "--group-labels", "env",
  161. "--global-var", "ansible_ssh_common_args='-o StrictHostKeyChecking=no'",
  162. "--global-var", "python_version=3.10",
  163. "--global-var", "app_name=myapp");
  164. Assert.Contains("Generated Inventory", output);
  165. Assert.Contains("ansible_ssh_common_args", output);
  166. Assert.Contains("StrictHostKeyChecking=no", output);
  167. Assert.Contains("python_version=3.10", output);
  168. Assert.Contains("app_name=myapp", output);
  169. Assert.Contains("app-server-01", output);
  170. }
  171. [Fact]
  172. public async Task generate_ansible_inventory_yaml_format() {
  173. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  174. version: 1
  175. resources:
  176. - kind: System
  177. type: vm
  178. name: ansible-test-host
  179. os: ubuntu-22.04
  180. cores: 2
  181. ram: 4
  182. labels:
  183. ansible_host: 172.16.0.100
  184. ansible_user: root
  185. env: test
  186. """);
  187. (var output, _) = await ExecuteAsync("ansible", "inventory", "--format", "yaml", "--group-labels", "env");
  188. Assert.Contains("Generated Inventory", output);
  189. Assert.Contains("all:", output);
  190. Assert.Contains("children:", output);
  191. Assert.Contains("ansible-test-host:", output);
  192. Assert.Contains("ansible_host: 172.16.0.100", output);
  193. Assert.DoesNotContain("[all:vars]", output);
  194. }
  195. [Fact]
  196. public async Task generate_ansible_inventory_combined_grouping() {
  197. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  198. version: 1
  199. resources:
  200. - kind: System
  201. type: vm
  202. name: prod-web-01
  203. os: ubuntu-22.04
  204. cores: 2
  205. ram: 4
  206. tags: [production]
  207. labels:
  208. ansible_host: 10.0.1.10
  209. env: production
  210. tier: web
  211. - kind: System
  212. type: vm
  213. name: prod-db-01
  214. os: postgres-15
  215. cores: 4
  216. ram: 8
  217. tags: [production]
  218. labels:
  219. ansible_host: 10.0.1.20
  220. env: production
  221. tier: database
  222. """);
  223. (var output, _) = await ExecuteAsync(
  224. "ansible", "inventory",
  225. "--group-tags", "production",
  226. "--group-labels", "env,tier");
  227. Assert.Contains("[production]", output);
  228. Assert.Contains("[env_production]", output);
  229. Assert.Contains("[tier_web]", output);
  230. Assert.Contains("[tier_database]", output);
  231. Assert.Contains("prod-web-01", output);
  232. Assert.Contains("prod-db-01", output);
  233. }
  234. [Fact]
  235. public async Task generate_ansible_inventory_mixed_resources() {
  236. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  237. version: 1
  238. resources:
  239. - kind: Server
  240. name: srv-prod-01
  241. labels:
  242. ansible_host: 192.168.1.10
  243. ansible_user: root
  244. env: production
  245. - kind: System
  246. type: vm
  247. name: vm-dev-01
  248. os: ubuntu-22.04
  249. cores: 2
  250. ram: 4
  251. labels:
  252. ansible_host: 192.168.1.20
  253. ansible_user: developer
  254. env: development
  255. - kind: Desktop
  256. name: dtp-admin-01
  257. labels:
  258. ansible_host: 192.168.1.30
  259. ansible_user: admin
  260. env: production
  261. - kind: Laptop
  262. name: ltp-remote-01
  263. labels:
  264. ansible_host: 192.168.1.40
  265. ansible_user: remote
  266. env: remote
  267. - kind: Switch
  268. name: sw-access-01
  269. labels:
  270. ansible_host: 192.168.1.50
  271. ansible_user: network
  272. env: network
  273. """);
  274. (var output, _) = await ExecuteAsync("ansible", "inventory", "--group-labels", "env");
  275. Assert.Contains("Generated Inventory", output);
  276. Assert.Contains("srv-prod-01", output);
  277. Assert.Contains("vm-dev-01", output);
  278. Assert.Contains("dtp-admin-01", output);
  279. Assert.Contains("ltp-remote-01", output);
  280. Assert.Contains("sw-access-01", output);
  281. }
  282. [Fact]
  283. public async Task generate_ansible_inventory_with_multiple_labels() {
  284. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  285. version: 1
  286. resources:
  287. - kind: System
  288. type: vm
  289. name: multi-label-host
  290. os: ubuntu-22.04
  291. cores: 2
  292. ram: 4
  293. labels:
  294. ansible_host: 10.0.0.1
  295. ansible_user: sysadmin
  296. environment: prod
  297. team: backend
  298. os: ubuntu
  299. """);
  300. (var output, _) = await ExecuteAsync(
  301. "ansible", "inventory",
  302. "--group-labels", "environment,team,os");
  303. Assert.Contains("[environment_prod]", output);
  304. Assert.Contains("[team_backend]", output);
  305. Assert.Contains("[os_ubuntu]", output);
  306. Assert.Contains("multi-label-host", output);
  307. }
  308. [Fact]
  309. public async Task generate_ansible_inventory_ansible_var_labels() {
  310. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  311. version: 1
  312. resources:
  313. - kind: System
  314. type: vm
  315. name: web-server-01
  316. os: ubuntu-22.04
  317. cores: 2
  318. ram: 4
  319. labels:
  320. ansible_host: 192.168.1.100
  321. ansible_user: deploy
  322. ansible_become: "yes"
  323. ansible_var_python_path: /usr/bin/python3
  324. ansible_var_site: production
  325. ansible_var_app_env: prod
  326. env: prod
  327. """);
  328. (var output, _) = await ExecuteAsync("ansible", "inventory", "--group-labels", "env");
  329. Assert.Contains("web-server-01", output);
  330. Assert.Contains("ansible_host=192.168.1.100", output);
  331. Assert.Contains("ansible_user=deploy", output);
  332. Assert.Contains("ansible_become=yes", output);
  333. Assert.Contains("python_path=/usr/bin/python3", output);
  334. Assert.Contains("site=production", output);
  335. Assert.Contains("app_env=prod", output);
  336. }
  337. [Fact]
  338. public async Task generate_ansible_inventory_yaml_format_with_ansible_vars() {
  339. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), """
  340. version: 1
  341. resources:
  342. - kind: System
  343. type: vm
  344. name: ansible-var-test
  345. os: ubuntu-22.04
  346. cores: 2
  347. ram: 4
  348. labels:
  349. ansible_host: 10.0.0.50
  350. ansible_var_custom_var: custom_value
  351. ansible_var_number: "42"
  352. env: test
  353. """);
  354. (var output, _) = await ExecuteAsync(
  355. "ansible", "inventory",
  356. "--format", "yaml",
  357. "--group-labels", "env");
  358. Assert.Contains("ansible-var-test:", output);
  359. Assert.Contains("ansible_host: 10.0.0.50", output);
  360. Assert.Contains("custom_var: custom_value", output);
  361. Assert.Contains("number: 42", output);
  362. }
  363. }