schema.v3.json 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. {
  2. "$schema": "https://json-schema.org/draft/2020-12/schema",
  3. "$id": "https://timmoth.github.io/RackPeek/schemas/v3/schema.v3.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": 3
  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. "port": {
  190. "type": "object",
  191. "required": [
  192. "type",
  193. "speed",
  194. "count"
  195. ],
  196. "additionalProperties": false,
  197. "properties": {
  198. "type": {
  199. "type": "string",
  200. "enum": [
  201. "rj45",
  202. "sfp",
  203. "sfp+",
  204. "sfp28",
  205. "sfp56",
  206. "qsfp+",
  207. "qsfp28",
  208. "qsfp56",
  209. "qsfp-dd",
  210. "osfp",
  211. "xfp",
  212. "cx4",
  213. "mgmt"
  214. ]
  215. },
  216. "speed": {
  217. "type": "number",
  218. "minimum": 0
  219. },
  220. "count": {
  221. "type": "integer",
  222. "minimum": 1
  223. }
  224. }
  225. },
  226. "network": {
  227. "type": "object",
  228. "required": [
  229. "ip",
  230. "port",
  231. "protocol"
  232. ],
  233. "additionalProperties": false,
  234. "properties": {
  235. "ip": {
  236. "type": "string",
  237. "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}$"
  238. },
  239. "port": {
  240. "type": "integer",
  241. "minimum": 1,
  242. "maximum": 65535
  243. },
  244. "protocol": {
  245. "type": "string",
  246. "enum": [
  247. "TCP",
  248. "UDP"
  249. ]
  250. },
  251. "url": {
  252. "type": "string",
  253. "format": "uri"
  254. }
  255. }
  256. },
  257. "server": {
  258. "allOf": [
  259. {
  260. "$ref": "#/$defs/resourceBase"
  261. },
  262. {
  263. "type": "object",
  264. "properties": {
  265. "kind": {
  266. "const": "Server"
  267. },
  268. "ram": {
  269. "$ref": "#/$defs/ram"
  270. },
  271. "ipmi": {
  272. "type": "boolean"
  273. },
  274. "cpus": {
  275. "type": "array",
  276. "items": {
  277. "$ref": "#/$defs/cpu"
  278. }
  279. },
  280. "drives": {
  281. "type": "array",
  282. "items": {
  283. "$ref": "#/$defs/drive"
  284. }
  285. },
  286. "gpus": {
  287. "type": "array",
  288. "items": {
  289. "$ref": "#/$defs/gpu"
  290. }
  291. },
  292. "ports": {
  293. "type": "array",
  294. "items": {
  295. "$ref": "#/$defs/port"
  296. }
  297. }
  298. }
  299. }
  300. ],
  301. "unevaluatedProperties": false
  302. },
  303. "desktop": {
  304. "allOf": [
  305. {
  306. "$ref": "#/$defs/resourceBase"
  307. },
  308. {
  309. "type": "object",
  310. "properties": {
  311. "kind": {
  312. "const": "Desktop"
  313. },
  314. "ram": {
  315. "$ref": "#/$defs/ram"
  316. },
  317. "cpus": {
  318. "type": "array",
  319. "items": {
  320. "$ref": "#/$defs/cpu"
  321. }
  322. },
  323. "drives": {
  324. "type": "array",
  325. "items": {
  326. "$ref": "#/$defs/drive"
  327. }
  328. },
  329. "gpus": {
  330. "type": "array",
  331. "items": {
  332. "$ref": "#/$defs/gpu"
  333. }
  334. },
  335. "ports": {
  336. "type": "array",
  337. "items": {
  338. "$ref": "#/$defs/port"
  339. }
  340. }
  341. }
  342. }
  343. ],
  344. "unevaluatedProperties": false
  345. },
  346. "laptop": {
  347. "allOf": [
  348. {
  349. "$ref": "#/$defs/resourceBase"
  350. },
  351. {
  352. "type": "object",
  353. "properties": {
  354. "kind": {
  355. "const": "Laptop"
  356. },
  357. "ram": {
  358. "$ref": "#/$defs/ram"
  359. },
  360. "cpus": {
  361. "type": "array",
  362. "items": {
  363. "$ref": "#/$defs/cpu"
  364. }
  365. },
  366. "drives": {
  367. "type": "array",
  368. "items": {
  369. "$ref": "#/$defs/drive"
  370. }
  371. }
  372. }
  373. }
  374. ],
  375. "unevaluatedProperties": false
  376. },
  377. "firewall": {
  378. "allOf": [
  379. {
  380. "$ref": "#/$defs/resourceBase"
  381. },
  382. {
  383. "type": "object",
  384. "required": [
  385. "ports"
  386. ],
  387. "properties": {
  388. "kind": {
  389. "const": "Firewall"
  390. },
  391. "model": {
  392. "type": "string"
  393. },
  394. "managed": {
  395. "type": "boolean"
  396. },
  397. "poe": {
  398. "type": "boolean"
  399. },
  400. "ports": {
  401. "type": "array",
  402. "items": {
  403. "$ref": "#/$defs/port"
  404. }
  405. }
  406. }
  407. }
  408. ],
  409. "unevaluatedProperties": false
  410. },
  411. "router": {
  412. "allOf": [
  413. {
  414. "$ref": "#/$defs/resourceBase"
  415. },
  416. {
  417. "type": "object",
  418. "required": [
  419. "ports"
  420. ],
  421. "properties": {
  422. "kind": {
  423. "const": "Router"
  424. },
  425. "model": {
  426. "type": "string"
  427. },
  428. "managed": {
  429. "type": "boolean"
  430. },
  431. "poe": {
  432. "type": "boolean"
  433. },
  434. "ports": {
  435. "type": "array",
  436. "items": {
  437. "$ref": "#/$defs/port"
  438. }
  439. }
  440. }
  441. }
  442. ],
  443. "unevaluatedProperties": false
  444. },
  445. "switch": {
  446. "allOf": [
  447. {
  448. "$ref": "#/$defs/resourceBase"
  449. },
  450. {
  451. "type": "object",
  452. "required": [
  453. "ports"
  454. ],
  455. "properties": {
  456. "kind": {
  457. "const": "Switch"
  458. },
  459. "model": {
  460. "type": "string"
  461. },
  462. "managed": {
  463. "type": "boolean"
  464. },
  465. "poe": {
  466. "type": "boolean"
  467. },
  468. "ports": {
  469. "type": "array",
  470. "items": {
  471. "$ref": "#/$defs/port"
  472. }
  473. }
  474. }
  475. }
  476. ],
  477. "unevaluatedProperties": false
  478. },
  479. "accessPoint": {
  480. "allOf": [
  481. {
  482. "$ref": "#/$defs/resourceBase"
  483. },
  484. {
  485. "type": "object",
  486. "properties": {
  487. "kind": {
  488. "const": "AccessPoint"
  489. },
  490. "model": {
  491. "type": "string"
  492. },
  493. "speed": {
  494. "type": "number",
  495. "minimum": 0
  496. }
  497. }
  498. }
  499. ],
  500. "unevaluatedProperties": false
  501. },
  502. "ups": {
  503. "allOf": [
  504. {
  505. "$ref": "#/$defs/resourceBase"
  506. },
  507. {
  508. "type": "object",
  509. "properties": {
  510. "kind": {
  511. "const": "Ups"
  512. },
  513. "model": {
  514. "type": "string"
  515. },
  516. "va": {
  517. "type": "integer",
  518. "minimum": 1
  519. }
  520. }
  521. }
  522. ],
  523. "unevaluatedProperties": false
  524. },
  525. "service": {
  526. "allOf": [
  527. {
  528. "$ref": "#/$defs/resourceBase"
  529. },
  530. {
  531. "type": "object",
  532. "required": [
  533. "network"
  534. ],
  535. "properties": {
  536. "kind": {
  537. "const": "Service"
  538. },
  539. "network": {
  540. "$ref": "#/$defs/network"
  541. }
  542. }
  543. }
  544. ],
  545. "unevaluatedProperties": false
  546. },
  547. "system": {
  548. "allOf": [
  549. {
  550. "$ref": "#/$defs/resourceBase"
  551. },
  552. {
  553. "type": "object",
  554. "required": [
  555. "type",
  556. "os",
  557. "cores",
  558. "ram"
  559. ],
  560. "properties": {
  561. "kind": {
  562. "const": "System"
  563. },
  564. "type": {
  565. "type": "string",
  566. "enum": [
  567. "baremetal",
  568. "Baremetal",
  569. "cluster",
  570. "Cluster",
  571. "hypervisor",
  572. "Hypervisor",
  573. "vm",
  574. "VM",
  575. "container",
  576. "embedded",
  577. "cloud",
  578. "other"
  579. ]
  580. },
  581. "ip": {
  582. "type": "string"
  583. },
  584. "os": {
  585. "type": "string"
  586. },
  587. "cores": {
  588. "type": "integer",
  589. "minimum": 1
  590. },
  591. "ram": {
  592. "type": "number",
  593. "minimum": 0
  594. },
  595. "drives": {
  596. "type": "array",
  597. "items": {
  598. "$ref": "#/$defs/drive"
  599. }
  600. }
  601. }
  602. }
  603. ],
  604. "unevaluatedProperties": false
  605. }
  606. }
  607. }