schema.v3.json 14 KB

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