schema.v1.json 12 KB

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