schema.v3.json 13 KB

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