schema.v4.json 15 KB

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