HardwareDeserializationTests.cs 12 KB

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