schema.v3.json 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  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": ["array", "null"],
  24. "items": {
  25. "$ref": "#/$defs/connection"
  26. }
  27. }
  28. },
  29. "$defs": {
  30. "labels": {
  31. "type": "object",
  32. "additionalProperties": {
  33. "type": "string"
  34. }
  35. },
  36. "runsOn": {
  37. "type": ["array", "null"],
  38. "items": {
  39. "type": "string",
  40. "minLength": 1
  41. }
  42. },
  43. "resourceBase": {
  44. "type": "object",
  45. "required": [
  46. "kind",
  47. "name"
  48. ],
  49. "properties": {
  50. "kind": {
  51. "type": "string"
  52. },
  53. "name": {
  54. "type": "string",
  55. "minLength": 1
  56. },
  57. "tags": {
  58. "type": "array",
  59. "items": {
  60. "type": "string"
  61. },
  62. "default": []
  63. },
  64. "labels": {
  65. "$ref": "#/$defs/labels",
  66. "default": {}
  67. },
  68. "notes": {
  69. "type": [
  70. "string",
  71. "null"
  72. ]
  73. },
  74. "runsOn": {
  75. "$ref": "#/$defs/runsOn"
  76. }
  77. }
  78. },
  79. "resource": {
  80. "oneOf": [
  81. { "$ref": "#/$defs/server" },
  82. { "$ref": "#/$defs/firewall" },
  83. { "$ref": "#/$defs/router" },
  84. { "$ref": "#/$defs/switch" },
  85. { "$ref": "#/$defs/accessPoint" },
  86. { "$ref": "#/$defs/ups" },
  87. { "$ref": "#/$defs/desktop" },
  88. { "$ref": "#/$defs/laptop" },
  89. { "$ref": "#/$defs/service" },
  90. { "$ref": "#/$defs/system" }
  91. ]
  92. },
  93. "portReference": {
  94. "type": "object",
  95. "required": [
  96. "resource",
  97. "portGroup",
  98. "portIndex"
  99. ],
  100. "additionalProperties": false,
  101. "properties": {
  102. "resource": {
  103. "type": "string",
  104. "minLength": 1
  105. },
  106. "portGroup": {
  107. "type": "integer",
  108. "minimum": 0
  109. },
  110. "portIndex": {
  111. "type": "integer",
  112. "minimum": 0
  113. }
  114. }
  115. },
  116. "connection": {
  117. "type": "object",
  118. "required": [
  119. "a",
  120. "b"
  121. ],
  122. "additionalProperties": false,
  123. "properties": {
  124. "a": {
  125. "$ref": "#/$defs/portReference"
  126. },
  127. "b": {
  128. "$ref": "#/$defs/portReference"
  129. },
  130. "label": {
  131. "type": ["string", "null"]
  132. },
  133. "notes": {
  134. "type": ["string", "null"]
  135. }
  136. }
  137. },
  138. "ram": {
  139. "type": "object",
  140. "required": ["size"],
  141. "additionalProperties": false,
  142. "properties": {
  143. "size": {
  144. "type": "number",
  145. "minimum": 0
  146. },
  147. "mts": {
  148. "type": "integer",
  149. "minimum": 0
  150. }
  151. }
  152. },
  153. "cpu": {
  154. "type": "object",
  155. "additionalProperties": false,
  156. "properties": {
  157. "model": { "type": "string" },
  158. "cores": { "type": "integer", "minimum": 1 },
  159. "threads": { "type": "integer", "minimum": 1 }
  160. }
  161. },
  162. "drive": {
  163. "type": "object",
  164. "required": ["size"],
  165. "additionalProperties": false,
  166. "properties": {
  167. "type": {
  168. "type": "string",
  169. "enum": [
  170. "nvme",
  171. "ssd",
  172. "hdd",
  173. "sas",
  174. "sata",
  175. "usb",
  176. "sdcard",
  177. "micro-sd"
  178. ]
  179. },
  180. "size": {
  181. "type": "number",
  182. "minimum": 1
  183. }
  184. }
  185. },
  186. "gpu": {
  187. "type": "object",
  188. "additionalProperties": false,
  189. "properties": {
  190. "model": { "type": "string" },
  191. "vram": { "type": "number", "minimum": 0 }
  192. }
  193. },
  194. "port": {
  195. "type": "object",
  196. "required": ["type", "speed", "count"],
  197. "additionalProperties": false,
  198. "properties": {
  199. "type": {
  200. "type": "string",
  201. "enum": [
  202. "rj45",
  203. "sfp",
  204. "sfp+",
  205. "sfp28",
  206. "sfp56",
  207. "qsfp+",
  208. "qsfp28",
  209. "qsfp56",
  210. "qsfp-dd",
  211. "osfp",
  212. "xfp",
  213. "cx4",
  214. "mgmt"
  215. ]
  216. },
  217. "speed": {
  218. "type": "number",
  219. "minimum": 0
  220. },
  221. "count": {
  222. "type": "integer",
  223. "minimum": 1
  224. }
  225. }
  226. },
  227. "network": {
  228. "type": "object",
  229. "required": ["ip", "port", "protocol"],
  230. "additionalProperties": false,
  231. "properties": {
  232. "ip": {
  233. "type": "string",
  234. "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}$"
  235. },
  236. "port": {
  237. "type": "integer",
  238. "minimum": 1,
  239. "maximum": 65535
  240. },
  241. "protocol": {
  242. "type": "string",
  243. "enum": ["TCP", "UDP"]
  244. },
  245. "url": {
  246. "type": "string",
  247. "format": "uri"
  248. }
  249. }
  250. },
  251. "server": {
  252. "allOf": [
  253. { "$ref": "#/$defs/resourceBase" },
  254. {
  255. "type": "object",
  256. "properties": {
  257. "kind": { "const": "Server" },
  258. "ram": { "$ref": "#/$defs/ram" },
  259. "ipmi": { "type": "boolean" },
  260. "cpus": {
  261. "type": "array",
  262. "items": { "$ref": "#/$defs/cpu" }
  263. },
  264. "drives": {
  265. "type": "array",
  266. "items": { "$ref": "#/$defs/drive" }
  267. },
  268. "gpus": {
  269. "type": "array",
  270. "items": { "$ref": "#/$defs/gpu" }
  271. },
  272. "ports": {
  273. "type": "array",
  274. "items": { "$ref": "#/$defs/port" }
  275. }
  276. }
  277. }
  278. ],
  279. "unevaluatedProperties": false
  280. },
  281. "desktop": {
  282. "allOf": [
  283. { "$ref": "#/$defs/resourceBase" },
  284. {
  285. "type": "object",
  286. "properties": {
  287. "kind": { "const": "Desktop" },
  288. "ram": { "$ref": "#/$defs/ram" },
  289. "cpus": {
  290. "type": "array",
  291. "items": { "$ref": "#/$defs/cpu" }
  292. },
  293. "drives": {
  294. "type": "array",
  295. "items": { "$ref": "#/$defs/drive" }
  296. },
  297. "gpus": {
  298. "type": "array",
  299. "items": { "$ref": "#/$defs/gpu" }
  300. },
  301. "ports": {
  302. "type": "array",
  303. "items": { "$ref": "#/$defs/port" }
  304. }
  305. }
  306. }
  307. ],
  308. "unevaluatedProperties": false
  309. },
  310. "laptop": {
  311. "allOf": [
  312. { "$ref": "#/$defs/resourceBase" },
  313. {
  314. "type": "object",
  315. "properties": {
  316. "kind": { "const": "Laptop" },
  317. "ram": { "$ref": "#/$defs/ram" },
  318. "cpus": {
  319. "type": "array",
  320. "items": { "$ref": "#/$defs/cpu" }
  321. },
  322. "drives": {
  323. "type": "array",
  324. "items": { "$ref": "#/$defs/drive" }
  325. }
  326. }
  327. }
  328. ],
  329. "unevaluatedProperties": false
  330. },
  331. "firewall": {
  332. "allOf": [
  333. { "$ref": "#/$defs/resourceBase" },
  334. {
  335. "type": "object",
  336. "required": ["ports"],
  337. "properties": {
  338. "kind": { "const": "Firewall" },
  339. "model": { "type": "string" },
  340. "managed": { "type": "boolean" },
  341. "poe": { "type": "boolean" },
  342. "ports": {
  343. "type": "array",
  344. "items": { "$ref": "#/$defs/port" }
  345. }
  346. }
  347. }
  348. ],
  349. "unevaluatedProperties": false
  350. },
  351. "router": {
  352. "allOf": [
  353. { "$ref": "#/$defs/resourceBase" },
  354. {
  355. "type": "object",
  356. "required": ["ports"],
  357. "properties": {
  358. "kind": { "const": "Router" },
  359. "model": { "type": "string" },
  360. "managed": { "type": "boolean" },
  361. "poe": { "type": "boolean" },
  362. "ports": {
  363. "type": "array",
  364. "items": { "$ref": "#/$defs/port" }
  365. }
  366. }
  367. }
  368. ],
  369. "unevaluatedProperties": false
  370. },
  371. "switch": {
  372. "allOf": [
  373. { "$ref": "#/$defs/resourceBase" },
  374. {
  375. "type": "object",
  376. "required": ["ports"],
  377. "properties": {
  378. "kind": { "const": "Switch" },
  379. "model": { "type": "string" },
  380. "managed": { "type": "boolean" },
  381. "poe": { "type": "boolean" },
  382. "ports": {
  383. "type": "array",
  384. "items": { "$ref": "#/$defs/port" }
  385. }
  386. }
  387. }
  388. ],
  389. "unevaluatedProperties": false
  390. },
  391. "accessPoint": {
  392. "allOf": [
  393. { "$ref": "#/$defs/resourceBase" },
  394. {
  395. "type": "object",
  396. "properties": {
  397. "kind": { "const": "AccessPoint" },
  398. "model": { "type": "string" },
  399. "speed": { "type": "number", "minimum": 0 },
  400. "ports": {
  401. "type": "array",
  402. "items": { "$ref": "#/$defs/port" }
  403. }
  404. }
  405. }
  406. ],
  407. "unevaluatedProperties": false
  408. },
  409. "ups": {
  410. "allOf": [
  411. { "$ref": "#/$defs/resourceBase" },
  412. {
  413. "type": "object",
  414. "properties": {
  415. "kind": { "const": "Ups" },
  416. "model": { "type": "string" },
  417. "va": { "type": "integer", "minimum": 1 }
  418. }
  419. }
  420. ],
  421. "unevaluatedProperties": false
  422. },
  423. "service": {
  424. "allOf": [
  425. { "$ref": "#/$defs/resourceBase" },
  426. {
  427. "type": "object",
  428. "required": ["network"],
  429. "properties": {
  430. "kind": { "const": "Service" },
  431. "network": { "$ref": "#/$defs/network" }
  432. }
  433. }
  434. ],
  435. "unevaluatedProperties": false
  436. },
  437. "system": {
  438. "allOf": [
  439. { "$ref": "#/$defs/resourceBase" },
  440. {
  441. "type": "object",
  442. "required": [
  443. "type",
  444. "os",
  445. "cores",
  446. "ram"
  447. ],
  448. "properties": {
  449. "kind": { "const": "System" },
  450. "type": {
  451. "type": "string",
  452. "enum": [
  453. "baremetal",
  454. "Baremetal",
  455. "cluster",
  456. "Cluster",
  457. "hypervisor",
  458. "Hypervisor",
  459. "vm",
  460. "VM",
  461. "container",
  462. "embedded",
  463. "cloud",
  464. "other"
  465. ]
  466. },
  467. "ip": { "type": "string" },
  468. "os": { "type": "string" },
  469. "cores": {
  470. "type": "integer",
  471. "minimum": 1
  472. },
  473. "ram": {
  474. "type": "number",
  475. "minimum": 0
  476. },
  477. "drives": {
  478. "type": "array",
  479. "items": { "$ref": "#/$defs/drive" }
  480. }
  481. }
  482. }
  483. ],
  484. "unevaluatedProperties": false
  485. }
  486. }
  487. }