schema.v1.json 8.7 KB

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