schema.v4.json 15 KB

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