HardwareDeserializationTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. using RackPeek.Domain.Persistence;
  2. using RackPeek.Domain.Persistence.Yaml;
  3. using RackPeek.Domain.Resources.Hardware;
  4. using RackPeek.Domain.Resources.Models;
  5. using RackPeek.Yaml;
  6. namespace Tests.Yaml;
  7. public class HardwareDeserializationTests
  8. {
  9. public async Task<IHardwareRepository> CreateSut(string yaml)
  10. {
  11. var tempDir = Path.Combine(
  12. Path.GetTempPath(),
  13. "RackPeekTests",
  14. Guid.NewGuid().ToString("N"));
  15. Directory.CreateDirectory(tempDir);
  16. var filePath = Path.Combine(tempDir, "config.yaml");
  17. await File.WriteAllTextAsync(filePath, yaml);
  18. var yamlResourceCollection = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), new ResourceCollection());
  19. await yamlResourceCollection.LoadAsync();
  20. return new YamlHardwareRepository(yamlResourceCollection);
  21. }
  22. [Theory]
  23. [InlineData("Server", typeof(Server))]
  24. [InlineData("Switch", typeof(Switch))]
  25. [InlineData("Firewall", typeof(Firewall))]
  26. [InlineData("Desktop", typeof(Desktop))]
  27. [InlineData("Laptop", typeof(Laptop))]
  28. [InlineData("Router", typeof(Router))]
  29. [InlineData("AccessPoint", typeof(AccessPoint))]
  30. [InlineData("Ups", typeof(Ups))]
  31. public async Task deserialize_yaml_kind(string kind, Type type)
  32. {
  33. // Given
  34. var yaml = $@"
  35. resources:
  36. - kind: {kind}
  37. ";
  38. var sut = await CreateSut(yaml);
  39. // When
  40. var resources = await sut.GetAllAsync();
  41. // Then
  42. var hardware = Assert.Single(resources);
  43. Assert.IsType(type, hardware);
  44. }
  45. [Fact]
  46. public async Task deserialize_yaml_kind_server()
  47. {
  48. // Given
  49. var yaml = @"
  50. resources:
  51. - kind: Server
  52. name: dell-c6400-node01
  53. cpus:
  54. - model: Intel(R) Xeon(R) CPU E3-1270 v6
  55. cores: 4
  56. threads: 8
  57. ram:
  58. size: 32gb
  59. Mts: 2400
  60. drives:
  61. - type: hdd
  62. size: 2Tb
  63. - type: ssd
  64. size: 256gb
  65. gpus:
  66. - model: NVIDIA Tesla T4
  67. vram: 16gb
  68. nics:
  69. - type: rj45
  70. speed: 1gb
  71. ports: 2
  72. - type: sfp+
  73. speed: 10gb
  74. ports: 2
  75. ipmi: true
  76. ";
  77. var sut = await CreateSut(yaml);
  78. // When
  79. var resources = await sut.GetAllAsync();
  80. // Then
  81. var hardware = Assert.Single(resources);
  82. Assert.IsType<Server>(hardware);
  83. var server = hardware as Server;
  84. Assert.NotNull(server);
  85. Assert.Equal("dell-c6400-node01", server.Name);
  86. // Cpu
  87. Assert.NotNull(server.Cpus);
  88. var cpu = server.Cpus[0];
  89. Assert.Equal("Intel(R) Xeon(R) CPU E3-1270 v6", cpu.Model);
  90. Assert.Equal(4, cpu.Cores);
  91. Assert.Equal(8, cpu.Threads);
  92. // Ram
  93. Assert.NotNull(server.Ram);
  94. Assert.Equal(32, server.Ram.Size);
  95. Assert.Equal(2400, server.Ram.Mts);
  96. // Drives
  97. Assert.NotNull(server.Drives);
  98. var hdd = server.Drives[0];
  99. Assert.Equal("hdd", hdd.Type);
  100. Assert.Equal(2048, hdd.Size);
  101. var ssd = server.Drives[1];
  102. Assert.Equal("ssd", ssd.Type);
  103. Assert.Equal(256, ssd.Size);
  104. //GPUs
  105. Assert.NotNull(server.Gpus);
  106. var gpu = server.Gpus[0];
  107. Assert.Equal("NVIDIA Tesla T4", gpu.Model);
  108. Assert.Equal(16, gpu.Vram);
  109. // ipmi
  110. Assert.True(server.Ipmi);
  111. // Nics
  112. Assert.NotNull(server.Nics);
  113. var nic0 = server.Nics[0];
  114. Assert.Equal("rj45", nic0.Type);
  115. Assert.Equal(1, nic0.Speed);
  116. Assert.Equal(2, nic0.Ports);
  117. var nic1 = server.Nics[1];
  118. Assert.Equal("sfp+", nic1.Type);
  119. Assert.Equal(10, nic1.Speed);
  120. Assert.Equal(2, nic1.Ports);
  121. }
  122. [Fact]
  123. public async Task deserialize_yaml_kind_switch()
  124. {
  125. // Given
  126. var yaml = @"
  127. resources:
  128. - kind: Switch
  129. name: netgear-s24
  130. model: GS324
  131. ports:
  132. - type: rj45
  133. speed: 1gb
  134. count: 8
  135. - type: sfp
  136. speed: 10gb
  137. count: 2
  138. managed: true
  139. poe: true
  140. ";
  141. var sut = await CreateSut(yaml);
  142. // When
  143. var resources = await sut.GetAllAsync();
  144. // Then
  145. var hardware = Assert.Single(resources);
  146. Assert.IsType<Switch>(hardware);
  147. var sw = hardware as Switch;
  148. Assert.NotNull(sw);
  149. Assert.Equal("netgear-s24", sw.Name);
  150. Assert.Equal("GS324", sw.Model);
  151. Assert.Equal(true, sw.Managed);
  152. Assert.Equal(true, sw.Poe);
  153. // Nics
  154. Assert.NotNull(sw.Ports);
  155. var nic0 = sw.Ports[0];
  156. Assert.Equal("rj45", nic0.Type);
  157. Assert.Equal(1, nic0.Speed);
  158. Assert.Equal(8, nic0.Count);
  159. var nic1 = sw.Ports[1];
  160. Assert.Equal("sfp", nic1.Type);
  161. Assert.Equal(10, nic1.Speed);
  162. Assert.Equal(2, nic1.Count);
  163. }
  164. [Fact]
  165. public async Task deserialize_yaml_kind_firewall()
  166. {
  167. // Given
  168. var yaml = @"
  169. resources:
  170. - kind: Firewall
  171. name: pfsense
  172. model: pfSense-1100
  173. ports:
  174. - type: rj45
  175. speed: 1gb
  176. count: 8
  177. - type: sfp
  178. speed: 10gb
  179. count: 2
  180. managed: true
  181. poe: true
  182. ";
  183. var sut = await CreateSut(yaml);
  184. // When
  185. var resources = await sut.GetAllAsync();
  186. // Then
  187. var hardware = Assert.Single(resources);
  188. Assert.IsType<Firewall>(hardware);
  189. var fw = hardware as Firewall;
  190. Assert.NotNull(fw);
  191. Assert.Equal("pfsense", fw.Name);
  192. Assert.Equal("pfSense-1100", fw.Model);
  193. Assert.Equal(true, fw.Managed);
  194. Assert.Equal(true, fw.Poe);
  195. // Nics
  196. Assert.NotNull(fw.Ports);
  197. var nic0 = fw.Ports[0];
  198. Assert.Equal("rj45", nic0.Type);
  199. Assert.Equal(1, nic0.Speed);
  200. Assert.Equal(8, nic0.Count);
  201. var nic1 = fw.Ports[1];
  202. Assert.Equal("sfp", nic1.Type);
  203. Assert.Equal(10, nic1.Speed);
  204. Assert.Equal(2, nic1.Count);
  205. }
  206. [Fact]
  207. public async Task deserialize_yaml_kind_router()
  208. {
  209. // Given
  210. var yaml = @"
  211. resources:
  212. - kind: Router
  213. name: ubiquiti-edge-router
  214. model: ER-4
  215. ports:
  216. - type: rj45
  217. speed: 1gb
  218. count: 8
  219. - type: sfp
  220. speed: 10gb
  221. count: 2
  222. managed: true
  223. poe: true
  224. ";
  225. var sut = await CreateSut(yaml);
  226. // When
  227. var resources = await sut.GetAllAsync();
  228. // Then
  229. var hardware = Assert.Single(resources);
  230. Assert.IsType<Router>(hardware);
  231. var router = hardware as Router;
  232. Assert.NotNull(router);
  233. Assert.Equal("ubiquiti-edge-router", router.Name);
  234. Assert.Equal("ER-4", router.Model);
  235. Assert.Equal(true, router.Managed);
  236. Assert.Equal(true, router.Poe);
  237. // Nics
  238. Assert.NotNull(router.Ports);
  239. var nic0 = router.Ports[0];
  240. Assert.Equal("rj45", nic0.Type);
  241. Assert.Equal(1, nic0.Speed);
  242. Assert.Equal(8, nic0.Count);
  243. var nic1 = router.Ports[1];
  244. Assert.Equal("sfp", nic1.Type);
  245. Assert.Equal(10, nic1.Speed);
  246. Assert.Equal(2, nic1.Count);
  247. }
  248. [Fact]
  249. public async Task deserialize_yaml_kind_desktop()
  250. {
  251. // Given
  252. var yaml = @"
  253. resources:
  254. - kind: Desktop
  255. name: dell-optiplex
  256. cpus:
  257. - model: Intel(R) Core(TM) i5-9500
  258. cores: 6
  259. threads: 6
  260. ram:
  261. size: 16gb
  262. mts: 2666
  263. drives:
  264. - type: ssd
  265. size: 512gb
  266. nics:
  267. - type: rj45
  268. speed: 1gb
  269. ports: 1
  270. gpus:
  271. - model: RTX 3080
  272. vram: 12gb
  273. ";
  274. var sut = await CreateSut(yaml);
  275. // When
  276. var resources = await sut.GetAllAsync();
  277. // Then
  278. var hardware = Assert.Single(resources);
  279. Assert.IsType<Desktop>(hardware);
  280. var desktop = hardware as Desktop;
  281. Assert.NotNull(desktop);
  282. Assert.Equal("dell-optiplex", desktop.Name);
  283. // CPU
  284. Assert.NotNull(desktop.Cpus);
  285. Assert.Equal("Intel(R) Core(TM) i5-9500", desktop.Cpus[0].Model);
  286. Assert.Equal(6, desktop.Cpus[0].Cores);
  287. Assert.Equal(6, desktop.Cpus[0].Threads);
  288. // RAM
  289. Assert.NotNull(desktop.Ram);
  290. Assert.Equal(16, desktop.Ram.Size);
  291. Assert.Equal(2666, desktop.Ram.Mts);
  292. // Drives
  293. Assert.NotNull(desktop.Drives);
  294. Assert.Equal("ssd", desktop.Drives[0].Type);
  295. Assert.Equal(512, desktop.Drives[0].Size);
  296. // NIC
  297. Assert.NotNull(desktop.Nics);
  298. Assert.Equal("rj45", desktop.Nics[0].Type);
  299. Assert.Equal(1, desktop.Nics[0].Speed);
  300. Assert.Equal(1, desktop.Nics[0].Ports);
  301. }
  302. [Fact]
  303. public async Task deserialize_yaml_kind_laptop()
  304. {
  305. // Given
  306. var yaml = @"
  307. resources:
  308. - kind: Laptop
  309. name: thinkpad-x1
  310. cpus:
  311. - model: Intel(R) Core(TM) i7-10510U
  312. cores: 4
  313. threads: 8
  314. ram:
  315. size: 16gb
  316. mts: 2666
  317. drives:
  318. - type: ssd
  319. size: 1tb
  320. gpus:
  321. - model: RTX 3080
  322. vram: 12gb
  323. ";
  324. var sut = await CreateSut(yaml);
  325. // When
  326. var resources = await sut.GetAllAsync();
  327. // Then
  328. var hardware = Assert.Single(resources);
  329. Assert.IsType<Laptop>(hardware);
  330. var laptop = hardware as Laptop;
  331. Assert.NotNull(laptop);
  332. Assert.Equal("thinkpad-x1", laptop.Name);
  333. // CPU
  334. Assert.NotNull(laptop.Cpus);
  335. Assert.Equal("Intel(R) Core(TM) i7-10510U", laptop.Cpus[0].Model);
  336. Assert.Equal(4, laptop.Cpus[0].Cores);
  337. Assert.Equal(8, laptop.Cpus[0].Threads);
  338. // RAM
  339. Assert.NotNull(laptop.Ram);
  340. Assert.Equal(16, laptop.Ram.Size);
  341. Assert.Equal(2666, laptop.Ram.Mts);
  342. // Drives
  343. Assert.NotNull(laptop.Drives);
  344. Assert.Equal("ssd", laptop.Drives[0].Type);
  345. Assert.Equal(1024, laptop.Drives[0].Size);
  346. }
  347. [Fact]
  348. public async Task deserialize_yaml_kind_accesspoint()
  349. {
  350. // Given
  351. var yaml = @"
  352. resources:
  353. - kind: AccessPoint
  354. name: lounge-ap
  355. model: Unifi-Ap-Pro
  356. speed: 2.5Gb
  357. ";
  358. var sut = await CreateSut(yaml);
  359. // When
  360. var resources = await sut.GetAllAsync();
  361. // Then
  362. var hardware = Assert.Single(resources);
  363. Assert.IsType<AccessPoint>(hardware);
  364. var accessPoint = hardware as AccessPoint;
  365. Assert.NotNull(accessPoint);
  366. Assert.Equal("lounge-ap", accessPoint.Name);
  367. Assert.Equal("Unifi-Ap-Pro", accessPoint.Model);
  368. Assert.Equal(2.5, accessPoint.Speed);
  369. }
  370. [Fact]
  371. public async Task deserialize_yaml_kind_ups()
  372. {
  373. // Given
  374. var yaml = @"
  375. resources:
  376. - kind: Ups
  377. name: rack-ups
  378. model: Volta
  379. va: 2200
  380. ";
  381. var sut = await CreateSut(yaml);
  382. // When
  383. var resources = await sut.GetAllAsync();
  384. // Then
  385. var hardware = Assert.Single(resources);
  386. Assert.IsType<Ups>(hardware);
  387. var ups = hardware as Ups;
  388. Assert.NotNull(ups);
  389. Assert.Equal("rack-ups", ups.Name);
  390. Assert.Equal("Volta", ups.Model);
  391. Assert.Equal(2200, ups.Va);
  392. }
  393. }