schema.v2.json 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. {
  2. "$schema": "https://json-schema.org/draft/2020-12/schema",
  3. "$id": "https://timmoth.github.io/RackPeek/schemas/v2/schema.v2.json",
  4. "title": "RackPeek Infrastructure Specification",
  5. "type": "object",
  6. "additionalProperties": false,
  7. "required": [
  8. "version",
  9. "resources"
  10. ],
  11. "properties": {
  12. "version": {
  13. "type": "integer",
  14. "const": 2
  15. },
  16. "resources": {
  17. "type": "array",
  18. "items": {
  19. "$ref": "#/$defs/resource"
  20. }
  21. }
  22. },
  23. "$defs": {
  24. "labels": {
  25. "type": "object",
  26. "additionalProperties": {
  27. "type": "string"
  28. }
  29. },
  30. "runsOn": {
  31. "type": [
  32. "array",
  33. "null"
  34. ],
  35. "items": {
  36. "type": "string",
  37. "minLength": 1
  38. }
  39. },
  40. "resourceBase": {
  41. "type": "object",
  42. "required": [
  43. "kind",
  44. "name"
  45. ],
  46. "properties": {
  47. "kind": {
  48. "type": "string"
  49. },
  50. "name": {
  51. "type": "string",
  52. "minLength": 1
  53. },
  54. "tags": {
  55. "type": "array",
  56. "items": {
  57. "type": "string"
  58. },
  59. "default": []
  60. },
  61. "labels": {
  62. "$ref": "#/$defs/labels",
  63. "default": {}
  64. },
  65. "notes": {
  66. "type": [
  67. "string",
  68. "null"
  69. ]
  70. },
  71. "runsOn": {
  72. "type": [
  73. "array",
  74. "null"
  75. ],
  76. "items": {
  77. "type": "string"
  78. }
  79. }
  80. }
  81. },
  82. "resource": {
  83. "oneOf": [
  84. {
  85. "$ref": "#/$defs/server"
  86. },
  87. {
  88. "$ref": "#/$defs/firewall"
  89. },
  90. {
  91. "$ref": "#/$defs/router"
  92. },
  93. {
  94. "$ref": "#/$defs/switch"
  95. },
  96. {
  97. "$ref": "#/$defs/accessPoint"
  98. },
  99. {
  100. "$ref": "#/$defs/ups"
  101. },
  102. {
  103. "$ref": "#/$defs/desktop"
  104. },
  105. {
  106. "$ref": "#/$defs/laptop"
  107. },
  108. {
  109. "$ref": "#/$defs/service"
  110. },
  111. {
  112. "$ref": "#/$defs/system"
  113. }
  114. ]
  115. },
  116. "ram": {
  117. "type": "object",
  118. "required": [
  119. "size"
  120. ],
  121. "additionalProperties": false,
  122. "properties": {
  123. "size": {
  124. "type": "number",
  125. "minimum": 0
  126. },
  127. "mts": {
  128. "type": "integer",
  129. "minimum": 0
  130. }
  131. }
  132. },
  133. "cpu": {
  134. "type": "object",
  135. "additionalProperties": false,
  136. "properties": {
  137. "model": {
  138. "type": "string"
  139. },
  140. "cores": {
  141. "type": "integer",
  142. "minimum": 1
  143. },
  144. "threads": {
  145. "type": "integer",
  146. "minimum": 1
  147. }
  148. }
  149. },
  150. "drive": {
  151. "type": "object",
  152. "required": [
  153. "size"
  154. ],
  155. "additionalProperties": false,
  156. "properties": {
  157. "type": {
  158. "type": "string",
  159. "enum": [
  160. "nvme",
  161. "ssd",
  162. "hdd",
  163. "sas",
  164. "sata",
  165. "usb",
  166. "sdcard",
  167. "micro-sd"
  168. ]
  169. },
  170. "size": {
  171. "type": "number",
  172. "minimum": 1
  173. }
  174. }
  175. },
  176. "gpu": {
  177. "type": "object",
  178. "additionalProperties": false,
  179. "properties": {
  180. "model": {
  181. "type": "string"
  182. },
  183. "vram": {
  184. "type": "number",
  185. "minimum": 0
  186. }
  187. }
  188. },
  189. "nic": {
  190. "type": "object",
  191. "additionalProperties": false,
  192. "properties": {
  193. "type": {
  194. "type": "string",
  195. "enum": [
  196. "rj45",
  197. "sfp",
  198. "sfp+",
  199. "sfp28",
  200. "sfp56",
  201. "qsfp+",
  202. "qsfp28",
  203. "qsfp56",
  204. "qsfp-dd",
  205. "osfp",
  206. "xfp",
  207. "cx4",
  208. "mgmt"
  209. ]
  210. },
  211. "speed": {
  212. "type": "number",
  213. "minimum": 0
  214. },
  215. "ports": {
  216. "type": "integer",
  217. "minimum": 1
  218. }
  219. }
  220. },
  221. "port": {
  222. "type": "object",
  223. "required": [
  224. "type",
  225. "speed",
  226. "count"
  227. ],
  228. "additionalProperties": false,
  229. "properties": {
  230. "type": {
  231. "type": "string"
  232. },
  233. "speed": {
  234. "type": "number",
  235. "minimum": 0
  236. },
  237. "count": {
  238. "type": "integer",
  239. "minimum": 1
  240. }
  241. }
  242. },
  243. "network": {
  244. "type": "object",
  245. "required": [
  246. "ip",
  247. "port",
  248. "protocol"
  249. ],
  250. "additionalProperties": false,
  251. "properties": {
  252. "ip": {
  253. "type": "string",
  254. "pattern": "^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}$"
  255. },
  256. "port": {
  257. "type": "integer",
  258. "minimum": 1,
  259. "maximum": 65535
  260. },
  261. "protocol": {
  262. "type": "string",
  263. "enum": [
  264. "TCP",
  265. "UDP"
  266. ]
  267. },
  268. "url": {
  269. "type": "string",
  270. "format": "uri"
  271. }
  272. }
  273. },
  274. "server": {
  275. "allOf": [
  276. {
  277. "$ref": "#/$defs/resourceBase"
  278. },
  279. {
  280. "type": "object",
  281. "properties": {
  282. "kind": {
  283. "const": "Server"
  284. },
  285. "ram": {
  286. "$ref": "#/$defs/ram"
  287. },
  288. "ipmi": {
  289. "type": "boolean"
  290. },
  291. "cpus": {
  292. "type": "array",
  293. "items": {
  294. "$ref": "#/$defs/cpu"
  295. }
  296. },
  297. "drives": {
  298. "type": "array",
  299. "items": {
  300. "$ref": "#/$defs/drive"
  301. }
  302. },
  303. "gpus": {
  304. "type": "array",
  305. "items": {
  306. "$ref": "#/$defs/gpu"
  307. }
  308. },
  309. "nics": {
  310. "type": "array",
  311. "items": {
  312. "$ref": "#/$defs/nic"
  313. }
  314. }
  315. }
  316. }
  317. ],
  318. "unevaluatedProperties": false
  319. },
  320. "desktop": {
  321. "allOf": [
  322. {
  323. "$ref": "#/$defs/resourceBase"
  324. },
  325. {
  326. "type": "object",
  327. "properties": {
  328. "kind": {
  329. "const": "Desktop"
  330. },
  331. "ram": {
  332. "$ref": "#/$defs/ram"
  333. },
  334. "cpus": {
  335. "type": "array",
  336. "items": {
  337. "$ref": "#/$defs/cpu"
  338. }
  339. },
  340. "drives": {
  341. "type": "array",
  342. "items": {
  343. "$ref": "#/$defs/drive"
  344. }
  345. },
  346. "gpus": {
  347. "type": "array",
  348. "items": {
  349. "$ref": "#/$defs/gpu"
  350. }
  351. },
  352. "nics": {
  353. "type": "array",
  354. "items": {
  355. "$ref": "#/$defs/nic"
  356. }
  357. }
  358. }
  359. }
  360. ],
  361. "unevaluatedProperties": false
  362. },
  363. "laptop": {
  364. "allOf": [
  365. {
  366. "$ref": "#/$defs/resourceBase"
  367. },
  368. {
  369. "type": "object",
  370. "properties": {
  371. "kind": {
  372. "const": "Laptop"
  373. },
  374. "ram": {
  375. "$ref": "#/$defs/ram"
  376. },
  377. "cpus": {
  378. "type": "array",
  379. "items": {
  380. "$ref": "#/$defs/cpu"
  381. }
  382. },
  383. "drives": {
  384. "type": "array",
  385. "items": {
  386. "$ref": "#/$defs/drive"
  387. }
  388. }
  389. }
  390. }
  391. ],
  392. "unevaluatedProperties": false
  393. },
  394. "firewall": {
  395. "allOf": [
  396. {
  397. "$ref": "#/$defs/resourceBase"
  398. },
  399. {
  400. "type": "object",
  401. "required": [
  402. "ports"
  403. ],
  404. "properties": {
  405. "kind": {
  406. "const": "Firewall"
  407. },
  408. "model": {
  409. "type": "string"
  410. },
  411. "managed": {
  412. "type": "boolean"
  413. },
  414. "poe": {
  415. "type": "boolean"
  416. },
  417. "ports": {
  418. "type": "array",
  419. "items": {
  420. "$ref": "#/$defs/port"
  421. }
  422. }
  423. }
  424. }
  425. ],
  426. "unevaluatedProperties": false
  427. },
  428. "router": {
  429. "allOf": [
  430. {
  431. "$ref": "#/$defs/resourceBase"
  432. },
  433. {
  434. "type": "object",
  435. "required": [
  436. "ports"
  437. ],
  438. "properties": {
  439. "kind": {
  440. "const": "Router"
  441. },
  442. "model": {
  443. "type": "string"
  444. },
  445. "managed": {
  446. "type": "boolean"
  447. },
  448. "poe": {
  449. "type": "boolean"
  450. },
  451. "ports": {
  452. "type": "array",
  453. "items": {
  454. "$ref": "#/$defs/port"
  455. }
  456. }
  457. }
  458. }
  459. ],
  460. "unevaluatedProperties": false
  461. },
  462. "switch": {
  463. "allOf": [
  464. {
  465. "$ref": "#/$defs/resourceBase"
  466. },
  467. {
  468. "type": "object",
  469. "required": [
  470. "ports"
  471. ],
  472. "properties": {
  473. "kind": {
  474. "const": "Switch"
  475. },
  476. "model": {
  477. "type": "string"
  478. },
  479. "managed": {
  480. "type": "boolean"
  481. },
  482. "poe": {
  483. "type": "boolean"
  484. },
  485. "ports": {
  486. "type": "array",
  487. "items": {
  488. "$ref": "#/$defs/port"
  489. }
  490. }
  491. }
  492. }
  493. ],
  494. "unevaluatedProperties": false
  495. },
  496. "accessPoint": {
  497. "allOf": [
  498. {
  499. "$ref": "#/$defs/resourceBase"
  500. },
  501. {
  502. "type": "object",
  503. "properties": {
  504. "kind": {
  505. "const": "AccessPoint"
  506. },
  507. "model": {
  508. "type": "string"
  509. },
  510. "speed": {
  511. "type": "number",
  512. "minimum": 0
  513. }
  514. }
  515. }
  516. ],
  517. "unevaluatedProperties": false
  518. },
  519. "ups": {
  520. "allOf": [
  521. {
  522. "$ref": "#/$defs/resourceBase"
  523. },
  524. {
  525. "type": "object",
  526. "properties": {
  527. "kind": {
  528. "const": "Ups"
  529. },
  530. "model": {
  531. "type": "string"
  532. },
  533. "va": {
  534. "type": "integer",
  535. "minimum": 1
  536. }
  537. }
  538. }
  539. ],
  540. "unevaluatedProperties": false
  541. },
  542. "service": {
  543. "allOf": [
  544. {
  545. "$ref": "#/$defs/resourceBase"
  546. },
  547. {
  548. "type": "object",
  549. "required": [
  550. "network"
  551. ],
  552. "properties": {
  553. "kind": {
  554. "const": "Service"
  555. },
  556. "network": {
  557. "$ref": "#/$defs/network"
  558. }
  559. }
  560. }
  561. ],
  562. "unevaluatedProperties": false
  563. },
  564. "system": {
  565. "allOf": [
  566. {
  567. "$ref": "#/$defs/resourceBase"
  568. },
  569. {
  570. "type": "object",
  571. "required": [
  572. "type",
  573. "os",
  574. "cores",
  575. "ram"
  576. ],
  577. "properties": {
  578. "kind": {
  579. "const": "System"
  580. },
  581. "type": {
  582. "type": "string",
  583. "enum": [
  584. "baremetal",
  585. "Baremetal",
  586. "cluster",
  587. "Cluster",
  588. "hypervisor",
  589. "Hypervisor",
  590. "vm",
  591. "VM",
  592. "container",
  593. "embedded",
  594. "cloud",
  595. "other"
  596. ]
  597. },
  598. "ip": {
  599. "type": "string"
  600. },
  601. "os": {
  602. "type": "string"
  603. },
  604. "cores": {
  605. "type": "integer",
  606. "minimum": 1
  607. },
  608. "ram": {
  609. "type": "number",
  610. "minimum": 0
  611. },
  612. "drives": {
  613. "type": "array",
  614. "items": {
  615. "$ref": "#/$defs/drive"
  616. }
  617. }
  618. }
  619. }
  620. ],
  621. "unevaluatedProperties": false
  622. }
  623. }
  624. }