schema.v3.json 8.9 KB

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