schema.v3.json 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. {
  2. "$schema": "https://json-schema.org/draft/2020-12/schema",
  3. "$id": "https://timmoth.github.io/RackPeek/schemas/v2/schema.v2.json",
  4. "title": "RackPeek Infrastructure Specification",
  5. "type": "object",
  6. "additionalProperties": false,
  7. "required": ["version", "resources"],
  8. "properties": {
  9. "version": { "type": "integer", "const": 2 },
  10. "resources": {
  11. "type": "array",
  12. "items": { "$ref": "#/$defs/resource" }
  13. }
  14. },
  15. "$defs": {
  16. "labels": {
  17. "type": "object",
  18. "additionalProperties": { "type": "string" }
  19. },
  20. "runsOn": {
  21. "type": ["array", "null"],
  22. "items": {
  23. "type": "string",
  24. "minLength": 1
  25. }
  26. },
  27. "resourceBase": {
  28. "type": "object",
  29. "required": ["kind", "name"],
  30. "properties": {
  31. "kind": { "type": "string" },
  32. "name": { "type": "string", "minLength": 1 },
  33. "tags": { "type": "array", "items": { "type": "string" }, "default": [] },
  34. "labels": { "$ref": "#/$defs/labels", "default": {} },
  35. "notes": { "type": ["string", "null"] },
  36. "runsOn": {
  37. "type": ["array", "null"],
  38. "items": { "type": "string" }
  39. }
  40. }
  41. },
  42. "resource": {
  43. "oneOf": [
  44. { "$ref": "#/$defs/server" },
  45. { "$ref": "#/$defs/firewall" },
  46. { "$ref": "#/$defs/router" },
  47. { "$ref": "#/$defs/switch" },
  48. { "$ref": "#/$defs/accessPoint" },
  49. { "$ref": "#/$defs/ups" },
  50. { "$ref": "#/$defs/other" },
  51. { "$ref": "#/$defs/desktop" },
  52. { "$ref": "#/$defs/laptop" },
  53. { "$ref": "#/$defs/service" },
  54. { "$ref": "#/$defs/system" }
  55. ]
  56. },
  57. "ram": {
  58. "type": "object",
  59. "required": ["size"],
  60. "additionalProperties": false,
  61. "properties": {
  62. "size": { "type": "number", "minimum": 0 },
  63. "mts": { "type": "integer", "minimum": 0 }
  64. }
  65. },
  66. "cpu": {
  67. "type": "object",
  68. "additionalProperties": false,
  69. "properties": {
  70. "model": { "type": "string" },
  71. "cores": { "type": "integer", "minimum": 1 },
  72. "threads": { "type": "integer", "minimum": 1 }
  73. }
  74. },
  75. "drive": {
  76. "type": "object",
  77. "required": ["size"],
  78. "additionalProperties": false,
  79. "properties": {
  80. "type": {
  81. "type": "string",
  82. "enum": ["nvme", "ssd", "hdd", "sas", "sata", "usb", "sdcard", "micro-sd"]
  83. },
  84. "size": { "type": "number", "minimum": 1 }
  85. }
  86. },
  87. "gpu": {
  88. "type": "object",
  89. "additionalProperties": false,
  90. "properties": {
  91. "model": { "type": "string" },
  92. "vram": { "type": "number", "minimum": 0 }
  93. }
  94. },
  95. "nic": {
  96. "type": "object",
  97. "additionalProperties": false,
  98. "properties": {
  99. "type": {
  100. "type": "string",
  101. "enum": [
  102. "rj45", "sfp", "sfp+", "sfp28", "sfp56",
  103. "qsfp+", "qsfp28", "qsfp56", "qsfp-dd",
  104. "osfp", "xfp", "cx4", "mgmt"
  105. ]
  106. },
  107. "speed": { "type": "number", "minimum": 0 },
  108. "ports": { "type": "integer", "minimum": 1 }
  109. }
  110. },
  111. "port": {
  112. "type": "object",
  113. "required": ["type", "speed", "count"],
  114. "additionalProperties": false,
  115. "properties": {
  116. "type": { "type": "string" },
  117. "speed": { "type": "number", "minimum": 0 },
  118. "count": { "type": "integer", "minimum": 1 }
  119. }
  120. },
  121. "network": {
  122. "type": "object",
  123. "required": ["ip", "port", "protocol"],
  124. "additionalProperties": false,
  125. "properties": {
  126. "ip": {
  127. "type": "string",
  128. "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}$"
  129. },
  130. "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
  131. "protocol": { "type": "string", "enum": ["TCP", "UDP"] },
  132. "url": { "type": "string", "format": "uri" }
  133. }
  134. },
  135. "server": {
  136. "allOf": [
  137. { "$ref": "#/$defs/resourceBase" },
  138. {
  139. "type": "object",
  140. "properties": {
  141. "kind": { "const": "Server" },
  142. "ram": { "$ref": "#/$defs/ram" },
  143. "ipmi": { "type": "boolean" },
  144. "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
  145. "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
  146. "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
  147. "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
  148. }
  149. }
  150. ],
  151. "unevaluatedProperties": false
  152. },
  153. "desktop": {
  154. "allOf": [
  155. { "$ref": "#/$defs/resourceBase" },
  156. {
  157. "type": "object",
  158. "properties": {
  159. "kind": { "const": "Desktop" },
  160. "ram": { "$ref": "#/$defs/ram" },
  161. "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
  162. "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
  163. "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
  164. "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
  165. }
  166. }
  167. ],
  168. "unevaluatedProperties": false
  169. },
  170. "laptop": {
  171. "allOf": [
  172. { "$ref": "#/$defs/resourceBase" },
  173. {
  174. "type": "object",
  175. "properties": {
  176. "kind": { "const": "Laptop" },
  177. "ram": { "$ref": "#/$defs/ram" },
  178. "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
  179. "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
  180. }
  181. }
  182. ],
  183. "unevaluatedProperties": false
  184. },
  185. "firewall": {
  186. "allOf": [
  187. { "$ref": "#/$defs/resourceBase" },
  188. {
  189. "type": "object",
  190. "required": ["ports"],
  191. "properties": {
  192. "kind": { "const": "Firewall" },
  193. "model": { "type": "string" },
  194. "managed": { "type": "boolean" },
  195. "poe": { "type": "boolean" },
  196. "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
  197. }
  198. }
  199. ],
  200. "unevaluatedProperties": false
  201. },
  202. "router": {
  203. "allOf": [
  204. { "$ref": "#/$defs/resourceBase" },
  205. {
  206. "type": "object",
  207. "required": ["ports"],
  208. "properties": {
  209. "kind": { "const": "Router" },
  210. "model": { "type": "string" },
  211. "managed": { "type": "boolean" },
  212. "poe": { "type": "boolean" },
  213. "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
  214. }
  215. }
  216. ],
  217. "unevaluatedProperties": false
  218. },
  219. "switch": {
  220. "allOf": [
  221. { "$ref": "#/$defs/resourceBase" },
  222. {
  223. "type": "object",
  224. "required": ["ports"],
  225. "properties": {
  226. "kind": { "const": "Switch" },
  227. "model": { "type": "string" },
  228. "managed": { "type": "boolean" },
  229. "poe": { "type": "boolean" },
  230. "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
  231. }
  232. }
  233. ],
  234. "unevaluatedProperties": false
  235. },
  236. "accessPoint": {
  237. "allOf": [
  238. { "$ref": "#/$defs/resourceBase" },
  239. {
  240. "type": "object",
  241. "properties": {
  242. "kind": { "const": "AccessPoint" },
  243. "model": { "type": "string" },
  244. "speed": { "type": "number", "minimum": 0 }
  245. }
  246. }
  247. ],
  248. "unevaluatedProperties": false
  249. },
  250. "ups": {
  251. "allOf": [
  252. { "$ref": "#/$defs/resourceBase" },
  253. {
  254. "type": "object",
  255. "properties": {
  256. "kind": { "const": "Ups" },
  257. "model": { "type": "string" },
  258. "va": { "type": "integer", "minimum": 1 }
  259. }
  260. }
  261. ],
  262. "unevaluatedProperties": false
  263. },
  264. "other": {
  265. "allOf": [
  266. { "$ref": "#/$defs/resourceBase" },
  267. {
  268. "type": "object",
  269. "properties": {
  270. "kind": { "const": "Other" },
  271. "model": { "type": "string" },
  272. "description": { "type": "string" }
  273. }
  274. }
  275. ],
  276. "unevaluatedProperties": false
  277. },
  278. "service": {
  279. "allOf": [
  280. { "$ref": "#/$defs/resourceBase" },
  281. {
  282. "type": "object",
  283. "required": ["network"],
  284. "properties": {
  285. "kind": { "const": "Service" },
  286. "network": { "$ref": "#/$defs/network" }
  287. }
  288. }
  289. ],
  290. "unevaluatedProperties": false
  291. },
  292. "system": {
  293. "allOf": [
  294. { "$ref": "#/$defs/resourceBase" },
  295. {
  296. "type": "object",
  297. "required": ["type", "os", "cores", "ram"],
  298. "properties": {
  299. "kind": { "const": "System" },
  300. "type": {
  301. "type": "string",
  302. "enum": [
  303. "baremetal", "Baremetal",
  304. "hypervisor", "Hypervisor",
  305. "vm", "VM",
  306. "container", "embedded", "cloud", "other"
  307. ]
  308. },
  309. "os": { "type": "string" },
  310. "cores": { "type": "integer", "minimum": 1 },
  311. "ram": { "type": "number", "minimum": 0 },
  312. "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
  313. }
  314. }
  315. ],
  316. "unevaluatedProperties": false
  317. }
  318. }
  319. }