Bladeren bron

Sync published JSON schemas with runtime behavior (#310, #311)

The schemas under schemas/ and the copies under Tests/schemas had
drifted: the test copies were maintained (system.ip, server/desktop
ports, the connections section, correct v3 $id) while the published
files — the ones external validators use — were stale. So RackPeek
accepted documents the published schema rejected (system.ip, #310)
and the published v3 still described nics although the domain, API,
serializer and fixtures all use ports (#311; the v2->v3 migration
renames nics to ports, v2 correctly keeps nics).

- Publish the maintained schema content: v2 gains system.ip; v3 gains
  system.ip (with the same IPv4 pattern the network def uses),
  server/desktop ports, the top-level connections section, and its
  correct $id (it still carried the copy-pasted v2 id).
- Remove the duplicate Tests/schemas copies: the test project now
  links schemas/ directly, so the published and validated schemas can
  never drift apart again. The v3 system fixture already exercises
  ip, locking the property in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tim Jones 14 uur geleden
bovenliggende
commit
edb1b51c6c
6 gewijzigde bestanden met toevoegingen van 933 en 2225 verwijderingen
  1. 3 1
      Tests/Tests.csproj
  2. 0 606
      Tests/schemas/schema.v1.json
  3. 0 624
      Tests/schemas/schema.v2.json
  4. 0 692
      Tests/schemas/schema.v3.json
  5. 431 143
      schemas/v2/schema.v2.json
  6. 499 159
      schemas/v3/schema.v3.json

+ 3 - 1
Tests/Tests.csproj

@@ -39,7 +39,9 @@
         <Folder Include="EndToEnd\ServiceTests\"/>
         <Folder Include="EndToEnd\ServiceTests\"/>
     </ItemGroup>
     </ItemGroup>
     <ItemGroup>
     <ItemGroup>
-        <None Include="schemas\**\*.json" CopyToOutputDirectory="PreserveNewest"/>
+        <!-- Validate against the published schemas directly so the test and
+             published copies can never drift apart again (#310, #311). -->
+        <None Include="..\schemas\**\*.json" Link="schemas\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest"/>
         <None Include="TestConfigs\**\*.yaml" CopyToOutputDirectory="PreserveNewest"/>
         <None Include="TestConfigs\**\*.yaml" CopyToOutputDirectory="PreserveNewest"/>
         <None Update="TestConfigs\v3\01-server.yaml">
         <None Update="TestConfigs\v3\01-server.yaml">
             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 0 - 606
Tests/schemas/schema.v1.json

@@ -1,606 +0,0 @@
-{
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "$id": "https://timmoth.github.io/RackPeek/schemas/v1/schema.v1.json",
-  "title": "RackPeek Infrastructure Specification",
-  "type": "object",
-  "additionalProperties": false,
-  "required": [
-    "version",
-    "resources"
-  ],
-  "properties": {
-    "version": {
-      "type": "integer",
-      "const": 1
-    },
-    "resources": {
-      "type": "array",
-      "items": {
-        "$ref": "#/$defs/resource"
-      }
-    }
-  },
-  "$defs": {
-    "labels": {
-      "type": "object",
-      "additionalProperties": {
-        "type": "string"
-      }
-    },
-    "resourceBase": {
-      "type": "object",
-      "required": [
-        "kind",
-        "name"
-      ],
-      "properties": {
-        "kind": {
-          "type": "string"
-        },
-        "name": {
-          "type": "string",
-          "minLength": 1
-        },
-        "tags": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "default": []
-        },
-        "labels": {
-          "$ref": "#/$defs/labels",
-          "default": {}
-        },
-        "notes": {
-          "type": [
-            "string",
-            "null"
-          ]
-        },
-        "runsOn": {
-          "type": [
-            "string",
-            "null"
-          ]
-        }
-      }
-    },
-    "resource": {
-      "oneOf": [
-        {
-          "$ref": "#/$defs/server"
-        },
-        {
-          "$ref": "#/$defs/firewall"
-        },
-        {
-          "$ref": "#/$defs/router"
-        },
-        {
-          "$ref": "#/$defs/switch"
-        },
-        {
-          "$ref": "#/$defs/accessPoint"
-        },
-        {
-          "$ref": "#/$defs/ups"
-        },
-        {
-          "$ref": "#/$defs/desktop"
-        },
-        {
-          "$ref": "#/$defs/laptop"
-        },
-        {
-          "$ref": "#/$defs/service"
-        },
-        {
-          "$ref": "#/$defs/system"
-        }
-      ]
-    },
-    "ram": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "size": {
-          "type": "number",
-          "minimum": 0
-        },
-        "mts": {
-          "type": "integer",
-          "minimum": 0
-        }
-      }
-    },
-    "cpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "cores": {
-          "type": "integer",
-          "minimum": 1
-        },
-        "threads": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "drive": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "nvme",
-            "ssd",
-            "hdd",
-            "sas",
-            "sata",
-            "usb",
-            "sdcard",
-            "micro-sd"
-          ]
-        },
-        "size": {
-          "type": "number",
-          "minimum": 1
-        }
-      }
-    },
-    "gpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "vram": {
-          "type": "number",
-          "minimum": 0
-        }
-      }
-    },
-    "nic": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "rj45",
-            "sfp",
-            "sfp+",
-            "sfp28",
-            "sfp56",
-            "qsfp+",
-            "qsfp28",
-            "qsfp56",
-            "qsfp-dd",
-            "osfp",
-            "xfp",
-            "cx4",
-            "mgmt"
-          ]
-        },
-        "speed": {
-          "type": "number",
-          "minimum": 0
-        },
-        "ports": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "port": {
-      "type": "object",
-      "required": [
-        "type",
-        "speed",
-        "count"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string"
-        },
-        "speed": {
-          "type": "number",
-          "minimum": 0
-        },
-        "count": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "network": {
-      "type": "object",
-      "required": [
-        "ip",
-        "port",
-        "protocol"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "ip": {
-          "type": "string",
-          "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}$"
-        },
-        "port": {
-          "type": "integer",
-          "minimum": 1,
-          "maximum": 65535
-        },
-        "protocol": {
-          "type": "string",
-          "enum": [
-            "TCP",
-            "UDP"
-          ]
-        },
-        "url": {
-          "type": "string",
-          "format": "uri"
-        }
-      }
-    },
-    "server": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Server"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "ipmi": {
-              "type": "boolean"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "nics": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/nic"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "desktop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Desktop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "nics": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/nic"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "laptop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Laptop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "firewall": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Firewall"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "router": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Router"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "switch": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Switch"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "accessPoint": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "AccessPoint"
-            },
-            "model": {
-              "type": "string"
-            },
-            "speed": {
-              "type": "number",
-              "minimum": 0
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "ups": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Ups"
-            },
-            "model": {
-              "type": "string"
-            },
-            "va": {
-              "type": "integer",
-              "minimum": 1
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "service": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "network"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Service"
-            },
-            "network": {
-              "$ref": "#/$defs/network"
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "system": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "type",
-            "os",
-            "cores",
-            "ram"
-          ],
-          "properties": {
-            "kind": {
-              "const": "System"
-            },
-            "type": {
-              "type": "string",
-              "enum": [
-                "baremetal",
-                "Baremetal",
-                "hypervisor",
-                "Hypervisor",
-                "vm",
-                "VM",
-                "container",
-                "embedded",
-                "cloud",
-                "other"
-              ]
-            },
-            "os": {
-              "type": "string"
-            },
-            "cores": {
-              "type": "integer",
-              "minimum": 1
-            },
-            "ram": {
-              "type": "number",
-              "minimum": 0
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    }
-  }
-}

+ 0 - 624
Tests/schemas/schema.v2.json

@@ -1,624 +0,0 @@
-{
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "$id": "https://timmoth.github.io/RackPeek/schemas/v2/schema.v2.json",
-  "title": "RackPeek Infrastructure Specification",
-  "type": "object",
-  "additionalProperties": false,
-  "required": [
-    "version",
-    "resources"
-  ],
-  "properties": {
-    "version": {
-      "type": "integer",
-      "const": 2
-    },
-    "resources": {
-      "type": "array",
-      "items": {
-        "$ref": "#/$defs/resource"
-      }
-    }
-  },
-  "$defs": {
-    "labels": {
-      "type": "object",
-      "additionalProperties": {
-        "type": "string"
-      }
-    },
-    "runsOn": {
-      "type": [
-        "array",
-        "null"
-      ],
-      "items": {
-        "type": "string",
-        "minLength": 1
-      }
-    },
-    "resourceBase": {
-      "type": "object",
-      "required": [
-        "kind",
-        "name"
-      ],
-      "properties": {
-        "kind": {
-          "type": "string"
-        },
-        "name": {
-          "type": "string",
-          "minLength": 1
-        },
-        "tags": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "default": []
-        },
-        "labels": {
-          "$ref": "#/$defs/labels",
-          "default": {}
-        },
-        "notes": {
-          "type": [
-            "string",
-            "null"
-          ]
-        },
-        "runsOn": {
-          "type": [
-            "array",
-            "null"
-          ],
-          "items": {
-            "type": "string"
-          }
-        }
-      }
-    },
-    "resource": {
-      "oneOf": [
-        {
-          "$ref": "#/$defs/server"
-        },
-        {
-          "$ref": "#/$defs/firewall"
-        },
-        {
-          "$ref": "#/$defs/router"
-        },
-        {
-          "$ref": "#/$defs/switch"
-        },
-        {
-          "$ref": "#/$defs/accessPoint"
-        },
-        {
-          "$ref": "#/$defs/ups"
-        },
-        {
-          "$ref": "#/$defs/desktop"
-        },
-        {
-          "$ref": "#/$defs/laptop"
-        },
-        {
-          "$ref": "#/$defs/service"
-        },
-        {
-          "$ref": "#/$defs/system"
-        }
-      ]
-    },
-    "ram": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "size": {
-          "type": "number",
-          "minimum": 0
-        },
-        "mts": {
-          "type": "integer",
-          "minimum": 0
-        }
-      }
-    },
-    "cpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "cores": {
-          "type": "integer",
-          "minimum": 1
-        },
-        "threads": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "drive": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "nvme",
-            "ssd",
-            "hdd",
-            "sas",
-            "sata",
-            "usb",
-            "sdcard",
-            "micro-sd"
-          ]
-        },
-        "size": {
-          "type": "number",
-          "minimum": 1
-        }
-      }
-    },
-    "gpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "vram": {
-          "type": "number",
-          "minimum": 0
-        }
-      }
-    },
-    "nic": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "rj45",
-            "sfp",
-            "sfp+",
-            "sfp28",
-            "sfp56",
-            "qsfp+",
-            "qsfp28",
-            "qsfp56",
-            "qsfp-dd",
-            "osfp",
-            "xfp",
-            "cx4",
-            "mgmt"
-          ]
-        },
-        "speed": {
-          "type": "number",
-          "minimum": 0
-        },
-        "ports": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "port": {
-      "type": "object",
-      "required": [
-        "type",
-        "speed",
-        "count"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string"
-        },
-        "speed": {
-          "type": "number",
-          "minimum": 0
-        },
-        "count": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "network": {
-      "type": "object",
-      "required": [
-        "ip",
-        "port",
-        "protocol"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "ip": {
-          "type": "string",
-          "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}$"
-        },
-        "port": {
-          "type": "integer",
-          "minimum": 1,
-          "maximum": 65535
-        },
-        "protocol": {
-          "type": "string",
-          "enum": [
-            "TCP",
-            "UDP"
-          ]
-        },
-        "url": {
-          "type": "string",
-          "format": "uri"
-        }
-      }
-    },
-    "server": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Server"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "ipmi": {
-              "type": "boolean"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "nics": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/nic"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "desktop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Desktop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "nics": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/nic"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "laptop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Laptop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "firewall": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Firewall"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "router": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Router"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "switch": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Switch"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "accessPoint": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "AccessPoint"
-            },
-            "model": {
-              "type": "string"
-            },
-            "speed": {
-              "type": "number",
-              "minimum": 0
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "ups": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Ups"
-            },
-            "model": {
-              "type": "string"
-            },
-            "va": {
-              "type": "integer",
-              "minimum": 1
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "service": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "network"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Service"
-            },
-            "network": {
-              "$ref": "#/$defs/network"
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "system": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "type",
-            "os",
-            "cores",
-            "ram"
-          ],
-          "properties": {
-            "kind": {
-              "const": "System"
-            },
-            "type": {
-              "type": "string",
-              "enum": [
-                "baremetal",
-                "Baremetal",
-                "cluster",
-                "Cluster",
-                "hypervisor",
-                "Hypervisor",
-                "vm",
-                "VM",
-                "container",
-                "embedded",
-                "cloud",
-                "other"
-              ]
-            },
-            "ip": {
-              "type": "string"
-            },
-            "os": {
-              "type": "string"
-            },
-            "cores": {
-              "type": "integer",
-              "minimum": 1
-            },
-            "ram": {
-              "type": "number",
-              "minimum": 0
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    }
-  }
-}

+ 0 - 692
Tests/schemas/schema.v3.json

@@ -1,692 +0,0 @@
-{
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "$id": "https://timmoth.github.io/RackPeek/schemas/v3/schema.v3.json",
-  "title": "RackPeek Infrastructure Specification",
-  "type": "object",
-  "additionalProperties": false,
-  "required": [
-    "version",
-    "resources"
-  ],
-  "properties": {
-    "version": {
-      "type": "integer",
-      "const": 3
-    },
-    "resources": {
-      "type": "array",
-      "items": {
-        "$ref": "#/$defs/resource"
-      }
-    },
-    "connections": {
-      "type": [
-        "array",
-        "null"
-      ],
-      "items": {
-        "$ref": "#/$defs/connection"
-      }
-    }
-  },
-  "$defs": {
-    "labels": {
-      "type": "object",
-      "additionalProperties": {
-        "type": "string"
-      }
-    },
-    "runsOn": {
-      "type": [
-        "array",
-        "null"
-      ],
-      "items": {
-        "type": "string",
-        "minLength": 1
-      }
-    },
-    "resourceBase": {
-      "type": "object",
-      "required": [
-        "kind",
-        "name"
-      ],
-      "properties": {
-        "kind": {
-          "type": "string"
-        },
-        "name": {
-          "type": "string",
-          "minLength": 1
-        },
-        "tags": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "default": []
-        },
-        "labels": {
-          "$ref": "#/$defs/labels",
-          "default": {}
-        },
-        "notes": {
-          "type": [
-            "string",
-            "null"
-          ]
-        },
-        "runsOn": {
-          "$ref": "#/$defs/runsOn"
-        }
-      }
-    },
-    "resource": {
-      "oneOf": [
-        {
-          "$ref": "#/$defs/server"
-        },
-        {
-          "$ref": "#/$defs/firewall"
-        },
-        {
-          "$ref": "#/$defs/router"
-        },
-        {
-          "$ref": "#/$defs/switch"
-        },
-        {
-          "$ref": "#/$defs/accessPoint"
-        },
-        {
-          "$ref": "#/$defs/ups"
-        },
-        {
-          "$ref": "#/$defs/other"
-        },
-        {
-          "$ref": "#/$defs/desktop"
-        },
-        {
-          "$ref": "#/$defs/laptop"
-        },
-        {
-          "$ref": "#/$defs/service"
-        },
-        {
-          "$ref": "#/$defs/system"
-        }
-      ]
-    },
-    "portReference": {
-      "type": "object",
-      "required": [
-        "resource",
-        "portGroup",
-        "portIndex"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "resource": {
-          "type": "string",
-          "minLength": 1
-        },
-        "portGroup": {
-          "type": "integer",
-          "minimum": 0
-        },
-        "portIndex": {
-          "type": "integer",
-          "minimum": 0
-        }
-      }
-    },
-    "connection": {
-      "type": "object",
-      "required": [
-        "a",
-        "b"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "a": {
-          "$ref": "#/$defs/portReference"
-        },
-        "b": {
-          "$ref": "#/$defs/portReference"
-        },
-        "label": {
-          "type": [
-            "string",
-            "null"
-          ]
-        },
-        "notes": {
-          "type": [
-            "string",
-            "null"
-          ]
-        }
-      }
-    },
-    "ram": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "size": {
-          "type": "number",
-          "minimum": 0
-        },
-        "mts": {
-          "type": "integer",
-          "minimum": 0
-        }
-      }
-    },
-    "cpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "cores": {
-          "type": "integer",
-          "minimum": 1
-        },
-        "threads": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "drive": {
-      "type": "object",
-      "required": [
-        "size"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "nvme",
-            "ssd",
-            "hdd",
-            "sas",
-            "sata",
-            "usb",
-            "sdcard",
-            "micro-sd"
-          ]
-        },
-        "size": {
-          "type": "number",
-          "minimum": 1
-        }
-      }
-    },
-    "gpu": {
-      "type": "object",
-      "additionalProperties": false,
-      "properties": {
-        "model": {
-          "type": "string"
-        },
-        "vram": {
-          "type": "number",
-          "minimum": 0
-        }
-      }
-    },
-    "port": {
-      "type": "object",
-      "required": [
-        "type",
-        "speed",
-        "count"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "type": {
-          "type": "string",
-          "enum": [
-            "rj45",
-            "sfp",
-            "sfp+",
-            "sfp28",
-            "sfp56",
-            "qsfp+",
-            "qsfp28",
-            "qsfp56",
-            "qsfp-dd",
-            "osfp",
-            "xfp",
-            "cx4",
-            "mgmt"
-          ]
-        },
-        "speed": {
-          "type": "number",
-          "minimum": 0
-        },
-        "count": {
-          "type": "integer",
-          "minimum": 1
-        }
-      }
-    },
-    "network": {
-      "type": "object",
-      "required": [
-        "ip",
-        "port",
-        "protocol"
-      ],
-      "additionalProperties": false,
-      "properties": {
-        "ip": {
-          "type": "string",
-          "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}$"
-        },
-        "port": {
-          "type": "integer",
-          "minimum": 1,
-          "maximum": 65535
-        },
-        "protocol": {
-          "type": "string",
-          "enum": [
-            "TCP",
-            "UDP"
-          ]
-        },
-        "url": {
-          "type": "string",
-          "format": "uri"
-        }
-      }
-    },
-    "server": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Server"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "ipmi": {
-              "type": "boolean"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "desktop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Desktop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            },
-            "gpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/gpu"
-              }
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "laptop": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Laptop"
-            },
-            "ram": {
-              "$ref": "#/$defs/ram"
-            },
-            "cpus": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/cpu"
-              }
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "firewall": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Firewall"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "router": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Router"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "switch": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "ports"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Switch"
-            },
-            "model": {
-              "type": "string"
-            },
-            "managed": {
-              "type": "boolean"
-            },
-            "poe": {
-              "type": "boolean"
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "accessPoint": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "AccessPoint"
-            },
-            "model": {
-              "type": "string"
-            },
-            "speed": {
-              "type": "number",
-              "minimum": 0
-            },
-            "ports": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/port"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "ups": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Ups"
-            },
-            "model": {
-              "type": "string"
-            },
-            "va": {
-              "type": "integer",
-              "minimum": 1
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "other": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "kind": {
-              "const": "Other"
-            },
-            "model": {
-              "type": "string"
-            },
-            "description": {
-              "type": "string"
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "service": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "network"
-          ],
-          "properties": {
-            "kind": {
-              "const": "Service"
-            },
-            "network": {
-              "$ref": "#/$defs/network"
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    },
-    "system": {
-      "allOf": [
-        {
-          "$ref": "#/$defs/resourceBase"
-        },
-        {
-          "type": "object",
-          "required": [
-            "type",
-            "os",
-            "cores",
-            "ram"
-          ],
-          "properties": {
-            "kind": {
-              "const": "System"
-            },
-            "type": {
-              "type": "string",
-              "enum": [
-                "baremetal",
-                "Baremetal",
-                "cluster",
-                "Cluster",
-                "hypervisor",
-                "Hypervisor",
-                "vm",
-                "VM",
-                "container",
-                "embedded",
-                "cloud",
-                "other"
-              ]
-            },
-            "ip": {
-              "type": "string"
-            },
-            "os": {
-              "type": "string"
-            },
-            "cores": {
-              "type": "integer",
-              "minimum": 1
-            },
-            "ram": {
-              "type": "number",
-              "minimum": 0
-            },
-            "drives": {
-              "type": "array",
-              "items": {
-                "$ref": "#/$defs/drive"
-              }
-            }
-          }
-        }
-      ],
-      "unevaluatedProperties": false
-    }
-  }
-}

+ 431 - 143
schemas/v2/schema.v2.json

@@ -4,104 +4,188 @@
   "title": "RackPeek Infrastructure Specification",
   "title": "RackPeek Infrastructure Specification",
   "type": "object",
   "type": "object",
   "additionalProperties": false,
   "additionalProperties": false,
-  "required": ["version", "resources"],
+  "required": [
+    "version",
+    "resources"
+  ],
   "properties": {
   "properties": {
-    "version": { "type": "integer", "const": 2 },
+    "version": {
+      "type": "integer",
+      "const": 2
+    },
     "resources": {
     "resources": {
       "type": "array",
       "type": "array",
-      "items": { "$ref": "#/$defs/resource" }
+      "items": {
+        "$ref": "#/$defs/resource"
+      }
     }
     }
   },
   },
-
   "$defs": {
   "$defs": {
     "labels": {
     "labels": {
       "type": "object",
       "type": "object",
-      "additionalProperties": { "type": "string" }
+      "additionalProperties": {
+        "type": "string"
+      }
     },
     },
-
     "runsOn": {
     "runsOn": {
-      "type": ["array", "null"],
+      "type": [
+        "array",
+        "null"
+      ],
       "items": {
       "items": {
         "type": "string",
         "type": "string",
         "minLength": 1
         "minLength": 1
       }
       }
     },
     },
-
     "resourceBase": {
     "resourceBase": {
       "type": "object",
       "type": "object",
-      "required": ["kind", "name"],
+      "required": [
+        "kind",
+        "name"
+      ],
       "properties": {
       "properties": {
-        "kind": { "type": "string" },
-        "name": { "type": "string", "minLength": 1 },
-
-        "tags": { "type": "array", "items": { "type": "string" }, "default": [] },
-        "labels": { "$ref": "#/$defs/labels", "default": {} },
-        "notes": { "type": ["string", "null"] },
-
+        "kind": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string",
+          "minLength": 1
+        },
+        "tags": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "default": []
+        },
+        "labels": {
+          "$ref": "#/$defs/labels",
+          "default": {}
+        },
+        "notes": {
+          "type": [
+            "string",
+            "null"
+          ]
+        },
         "runsOn": {
         "runsOn": {
-          "type": ["array", "null"],
-          "items": { "type": "string" }
+          "type": [
+            "array",
+            "null"
+          ],
+          "items": {
+            "type": "string"
+          }
         }
         }
       }
       }
     },
     },
-
     "resource": {
     "resource": {
       "oneOf": [
       "oneOf": [
-        { "$ref": "#/$defs/server" },
-        { "$ref": "#/$defs/firewall" },
-        { "$ref": "#/$defs/router" },
-        { "$ref": "#/$defs/switch" },
-        { "$ref": "#/$defs/accessPoint" },
-        { "$ref": "#/$defs/ups" },
-        { "$ref": "#/$defs/desktop" },
-        { "$ref": "#/$defs/laptop" },
-        { "$ref": "#/$defs/service" },
-        { "$ref": "#/$defs/system" }
+        {
+          "$ref": "#/$defs/server"
+        },
+        {
+          "$ref": "#/$defs/firewall"
+        },
+        {
+          "$ref": "#/$defs/router"
+        },
+        {
+          "$ref": "#/$defs/switch"
+        },
+        {
+          "$ref": "#/$defs/accessPoint"
+        },
+        {
+          "$ref": "#/$defs/ups"
+        },
+        {
+          "$ref": "#/$defs/desktop"
+        },
+        {
+          "$ref": "#/$defs/laptop"
+        },
+        {
+          "$ref": "#/$defs/service"
+        },
+        {
+          "$ref": "#/$defs/system"
+        }
       ]
       ]
     },
     },
-
     "ram": {
     "ram": {
       "type": "object",
       "type": "object",
-      "required": ["size"],
+      "required": [
+        "size"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "size": { "type": "number", "minimum": 0 },
-        "mts": { "type": "integer", "minimum": 0 }
+        "size": {
+          "type": "number",
+          "minimum": 0
+        },
+        "mts": {
+          "type": "integer",
+          "minimum": 0
+        }
       }
       }
     },
     },
-
     "cpu": {
     "cpu": {
       "type": "object",
       "type": "object",
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "model": { "type": "string" },
-        "cores": { "type": "integer", "minimum": 1 },
-        "threads": { "type": "integer", "minimum": 1 }
+        "model": {
+          "type": "string"
+        },
+        "cores": {
+          "type": "integer",
+          "minimum": 1
+        },
+        "threads": {
+          "type": "integer",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
     "drive": {
     "drive": {
       "type": "object",
       "type": "object",
-      "required": ["size"],
+      "required": [
+        "size"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
         "type": {
         "type": {
           "type": "string",
           "type": "string",
-          "enum": ["nvme", "ssd", "hdd", "sas", "sata", "usb", "sdcard", "micro-sd"]
+          "enum": [
+            "nvme",
+            "ssd",
+            "hdd",
+            "sas",
+            "sata",
+            "usb",
+            "sdcard",
+            "micro-sd"
+          ]
         },
         },
-        "size": { "type": "number", "minimum": 1 }
+        "size": {
+          "type": "number",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
     "gpu": {
     "gpu": {
       "type": "object",
       "type": "object",
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "model": { "type": "string" },
-        "vram": { "type": "number", "minimum": 0 }
+        "model": {
+          "type": "string"
+        },
+        "vram": {
+          "type": "number",
+          "minimum": 0
+        }
       }
       }
     },
     },
-
     "nic": {
     "nic": {
       "type": "object",
       "type": "object",
       "additionalProperties": false,
       "additionalProperties": false,
@@ -109,224 +193,428 @@
         "type": {
         "type": {
           "type": "string",
           "type": "string",
           "enum": [
           "enum": [
-            "rj45", "sfp", "sfp+", "sfp28", "sfp56",
-            "qsfp+", "qsfp28", "qsfp56", "qsfp-dd",
-            "osfp", "xfp", "cx4", "mgmt"
+            "rj45",
+            "sfp",
+            "sfp+",
+            "sfp28",
+            "sfp56",
+            "qsfp+",
+            "qsfp28",
+            "qsfp56",
+            "qsfp-dd",
+            "osfp",
+            "xfp",
+            "cx4",
+            "mgmt"
           ]
           ]
         },
         },
-        "speed": { "type": "number", "minimum": 0 },
-        "ports": { "type": "integer", "minimum": 1 }
+        "speed": {
+          "type": "number",
+          "minimum": 0
+        },
+        "ports": {
+          "type": "integer",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
     "port": {
     "port": {
       "type": "object",
       "type": "object",
-      "required": ["type", "speed", "count"],
+      "required": [
+        "type",
+        "speed",
+        "count"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "type": { "type": "string" },
-        "speed": { "type": "number", "minimum": 0 },
-        "count": { "type": "integer", "minimum": 1 }
+        "type": {
+          "type": "string"
+        },
+        "speed": {
+          "type": "number",
+          "minimum": 0
+        },
+        "count": {
+          "type": "integer",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
     "network": {
     "network": {
       "type": "object",
       "type": "object",
-      "required": ["ip", "port", "protocol"],
+      "required": [
+        "ip",
+        "port",
+        "protocol"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
         "ip": {
         "ip": {
           "type": "string",
           "type": "string",
           "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}$"
           "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}$"
         },
         },
-        "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
-        "protocol": { "type": "string", "enum": ["TCP", "UDP"] },
-        "url": { "type": "string", "format": "uri" }
+        "port": {
+          "type": "integer",
+          "minimum": 1,
+          "maximum": 65535
+        },
+        "protocol": {
+          "type": "string",
+          "enum": [
+            "TCP",
+            "UDP"
+          ]
+        },
+        "url": {
+          "type": "string",
+          "format": "uri"
+        }
       }
       }
     },
     },
-
     "server": {
     "server": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Server" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "ipmi": { "type": "boolean" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
-            "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
-            "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
+            "kind": {
+              "const": "Server"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "ipmi": {
+              "type": "boolean"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            },
+            "gpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/gpu"
+              }
+            },
+            "nics": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/nic"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "desktop": {
     "desktop": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Desktop" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
-            "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
-            "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
+            "kind": {
+              "const": "Desktop"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            },
+            "gpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/gpu"
+              }
+            },
+            "nics": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/nic"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "laptop": {
     "laptop": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Laptop" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
+            "kind": {
+              "const": "Laptop"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "firewall": {
     "firewall": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Firewall" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Firewall"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "router": {
     "router": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Router" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Router"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "switch": {
     "switch": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Switch" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Switch"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "accessPoint": {
     "accessPoint": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "AccessPoint" },
-
-            "model": { "type": "string" },
-            "speed": { "type": "number", "minimum": 0 }
+            "kind": {
+              "const": "AccessPoint"
+            },
+            "model": {
+              "type": "string"
+            },
+            "speed": {
+              "type": "number",
+              "minimum": 0
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "ups": {
     "ups": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Ups" },
-
-            "model": { "type": "string" },
-            "va": { "type": "integer", "minimum": 1 }
+            "kind": {
+              "const": "Ups"
+            },
+            "model": {
+              "type": "string"
+            },
+            "va": {
+              "type": "integer",
+              "minimum": 1
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "service": {
     "service": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["network"],
+          "required": [
+            "network"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Service" },
-            "network": { "$ref": "#/$defs/network" }
+            "kind": {
+              "const": "Service"
+            },
+            "network": {
+              "$ref": "#/$defs/network"
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "system": {
     "system": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["type", "os", "cores", "ram"],
+          "required": [
+            "type",
+            "os",
+            "cores",
+            "ram"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "System" },
-
+            "kind": {
+              "const": "System"
+            },
             "type": {
             "type": {
               "type": "string",
               "type": "string",
               "enum": [
               "enum": [
-                "baremetal", "Baremetal",
-                "hypervisor", "Hypervisor",
-                "vm", "VM",
-                "container", "embedded", "cloud", "other"
+                "baremetal",
+                "Baremetal",
+                "cluster",
+                "Cluster",
+                "hypervisor",
+                "Hypervisor",
+                "vm",
+                "VM",
+                "container",
+                "embedded",
+                "cloud",
+                "other"
               ]
               ]
             },
             },
-            "os": { "type": "string" },
-            "cores": { "type": "integer", "minimum": 1 },
-            "ram": { "type": "number", "minimum": 0 },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
+            "ip": {
+              "type": "string"
+            },
+            "os": {
+              "type": "string"
+            },
+            "cores": {
+              "type": "integer",
+              "minimum": 1
+            },
+            "ram": {
+              "type": "number",
+              "minimum": 0
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            }
           }
           }
         }
         }
       ],
       ],

+ 499 - 159
schemas/v3/schema.v3.json

@@ -1,353 +1,693 @@
 {
 {
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "$id": "https://timmoth.github.io/RackPeek/schemas/v2/schema.v2.json",
+  "$id": "https://timmoth.github.io/RackPeek/schemas/v3/schema.v3.json",
   "title": "RackPeek Infrastructure Specification",
   "title": "RackPeek Infrastructure Specification",
   "type": "object",
   "type": "object",
   "additionalProperties": false,
   "additionalProperties": false,
-  "required": ["version", "resources"],
+  "required": [
+    "version",
+    "resources"
+  ],
   "properties": {
   "properties": {
-    "version": { "type": "integer", "const": 2 },
+    "version": {
+      "type": "integer",
+      "const": 3
+    },
     "resources": {
     "resources": {
       "type": "array",
       "type": "array",
-      "items": { "$ref": "#/$defs/resource" }
+      "items": {
+        "$ref": "#/$defs/resource"
+      }
+    },
+    "connections": {
+      "type": [
+        "array",
+        "null"
+      ],
+      "items": {
+        "$ref": "#/$defs/connection"
+      }
     }
     }
   },
   },
-
   "$defs": {
   "$defs": {
     "labels": {
     "labels": {
       "type": "object",
       "type": "object",
-      "additionalProperties": { "type": "string" }
+      "additionalProperties": {
+        "type": "string"
+      }
     },
     },
-
     "runsOn": {
     "runsOn": {
-      "type": ["array", "null"],
+      "type": [
+        "array",
+        "null"
+      ],
       "items": {
       "items": {
         "type": "string",
         "type": "string",
         "minLength": 1
         "minLength": 1
       }
       }
     },
     },
-
     "resourceBase": {
     "resourceBase": {
       "type": "object",
       "type": "object",
-      "required": ["kind", "name"],
+      "required": [
+        "kind",
+        "name"
+      ],
       "properties": {
       "properties": {
-        "kind": { "type": "string" },
-        "name": { "type": "string", "minLength": 1 },
-
-        "tags": { "type": "array", "items": { "type": "string" }, "default": [] },
-        "labels": { "$ref": "#/$defs/labels", "default": {} },
-        "notes": { "type": ["string", "null"] },
-
+        "kind": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string",
+          "minLength": 1
+        },
+        "tags": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "default": []
+        },
+        "labels": {
+          "$ref": "#/$defs/labels",
+          "default": {}
+        },
+        "notes": {
+          "type": [
+            "string",
+            "null"
+          ]
+        },
         "runsOn": {
         "runsOn": {
-          "type": ["array", "null"],
-          "items": { "type": "string" }
+          "$ref": "#/$defs/runsOn"
         }
         }
       }
       }
     },
     },
-
     "resource": {
     "resource": {
       "oneOf": [
       "oneOf": [
-        { "$ref": "#/$defs/server" },
-        { "$ref": "#/$defs/firewall" },
-        { "$ref": "#/$defs/router" },
-        { "$ref": "#/$defs/switch" },
-        { "$ref": "#/$defs/accessPoint" },
-        { "$ref": "#/$defs/ups" },
-        { "$ref": "#/$defs/other" },
-        { "$ref": "#/$defs/desktop" },
-        { "$ref": "#/$defs/laptop" },
-        { "$ref": "#/$defs/service" },
-        { "$ref": "#/$defs/system" }
+        {
+          "$ref": "#/$defs/server"
+        },
+        {
+          "$ref": "#/$defs/firewall"
+        },
+        {
+          "$ref": "#/$defs/router"
+        },
+        {
+          "$ref": "#/$defs/switch"
+        },
+        {
+          "$ref": "#/$defs/accessPoint"
+        },
+        {
+          "$ref": "#/$defs/ups"
+        },
+        {
+          "$ref": "#/$defs/other"
+        },
+        {
+          "$ref": "#/$defs/desktop"
+        },
+        {
+          "$ref": "#/$defs/laptop"
+        },
+        {
+          "$ref": "#/$defs/service"
+        },
+        {
+          "$ref": "#/$defs/system"
+        }
       ]
       ]
     },
     },
-
-    "ram": {
+    "portReference": {
       "type": "object",
       "type": "object",
-      "required": ["size"],
+      "required": [
+        "resource",
+        "portGroup",
+        "portIndex"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "size": { "type": "number", "minimum": 0 },
-        "mts": { "type": "integer", "minimum": 0 }
+        "resource": {
+          "type": "string",
+          "minLength": 1
+        },
+        "portGroup": {
+          "type": "integer",
+          "minimum": 0
+        },
+        "portIndex": {
+          "type": "integer",
+          "minimum": 0
+        }
       }
       }
     },
     },
-
-    "cpu": {
+    "connection": {
       "type": "object",
       "type": "object",
+      "required": [
+        "a",
+        "b"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "model": { "type": "string" },
-        "cores": { "type": "integer", "minimum": 1 },
-        "threads": { "type": "integer", "minimum": 1 }
+        "a": {
+          "$ref": "#/$defs/portReference"
+        },
+        "b": {
+          "$ref": "#/$defs/portReference"
+        },
+        "label": {
+          "type": [
+            "string",
+            "null"
+          ]
+        },
+        "notes": {
+          "type": [
+            "string",
+            "null"
+          ]
+        }
       }
       }
     },
     },
-
-    "drive": {
+    "ram": {
       "type": "object",
       "type": "object",
-      "required": ["size"],
+      "required": [
+        "size"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "type": {
-          "type": "string",
-          "enum": ["nvme", "ssd", "hdd", "sas", "sata", "usb", "sdcard", "micro-sd"]
+        "size": {
+          "type": "number",
+          "minimum": 0
         },
         },
-        "size": { "type": "number", "minimum": 1 }
+        "mts": {
+          "type": "integer",
+          "minimum": 0
+        }
       }
       }
     },
     },
-
-    "gpu": {
+    "cpu": {
       "type": "object",
       "type": "object",
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "model": { "type": "string" },
-        "vram": { "type": "number", "minimum": 0 }
+        "model": {
+          "type": "string"
+        },
+        "cores": {
+          "type": "integer",
+          "minimum": 1
+        },
+        "threads": {
+          "type": "integer",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
-    "nic": {
+    "drive": {
       "type": "object",
       "type": "object",
+      "required": [
+        "size"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
         "type": {
         "type": {
           "type": "string",
           "type": "string",
           "enum": [
           "enum": [
-            "rj45", "sfp", "sfp+", "sfp28", "sfp56",
-            "qsfp+", "qsfp28", "qsfp56", "qsfp-dd",
-            "osfp", "xfp", "cx4", "mgmt"
+            "nvme",
+            "ssd",
+            "hdd",
+            "sas",
+            "sata",
+            "usb",
+            "sdcard",
+            "micro-sd"
           ]
           ]
         },
         },
-        "speed": { "type": "number", "minimum": 0 },
-        "ports": { "type": "integer", "minimum": 1 }
+        "size": {
+          "type": "number",
+          "minimum": 1
+        }
+      }
+    },
+    "gpu": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "model": {
+          "type": "string"
+        },
+        "vram": {
+          "type": "number",
+          "minimum": 0
+        }
       }
       }
     },
     },
-
     "port": {
     "port": {
       "type": "object",
       "type": "object",
-      "required": ["type", "speed", "count"],
+      "required": [
+        "type",
+        "speed",
+        "count"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
-        "type": { "type": "string" },
-        "speed": { "type": "number", "minimum": 0 },
-        "count": { "type": "integer", "minimum": 1 }
+        "type": {
+          "type": "string",
+          "enum": [
+            "rj45",
+            "sfp",
+            "sfp+",
+            "sfp28",
+            "sfp56",
+            "qsfp+",
+            "qsfp28",
+            "qsfp56",
+            "qsfp-dd",
+            "osfp",
+            "xfp",
+            "cx4",
+            "mgmt"
+          ]
+        },
+        "speed": {
+          "type": "number",
+          "minimum": 0
+        },
+        "count": {
+          "type": "integer",
+          "minimum": 1
+        }
       }
       }
     },
     },
-
     "network": {
     "network": {
       "type": "object",
       "type": "object",
-      "required": ["ip", "port", "protocol"],
+      "required": [
+        "ip",
+        "port",
+        "protocol"
+      ],
       "additionalProperties": false,
       "additionalProperties": false,
       "properties": {
       "properties": {
         "ip": {
         "ip": {
           "type": "string",
           "type": "string",
           "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}$"
           "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}$"
         },
         },
-        "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
-        "protocol": { "type": "string", "enum": ["TCP", "UDP"] },
-        "url": { "type": "string", "format": "uri" }
+        "port": {
+          "type": "integer",
+          "minimum": 1,
+          "maximum": 65535
+        },
+        "protocol": {
+          "type": "string",
+          "enum": [
+            "TCP",
+            "UDP"
+          ]
+        },
+        "url": {
+          "type": "string",
+          "format": "uri"
+        }
       }
       }
     },
     },
-
     "server": {
     "server": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Server" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "ipmi": { "type": "boolean" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
-            "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
-            "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
+            "kind": {
+              "const": "Server"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "ipmi": {
+              "type": "boolean"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            },
+            "gpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/gpu"
+              }
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "desktop": {
     "desktop": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Desktop" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } },
-            "gpus": { "type": "array", "items": { "$ref": "#/$defs/gpu" } },
-            "nics": { "type": "array", "items": { "$ref": "#/$defs/nic" } }
+            "kind": {
+              "const": "Desktop"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            },
+            "gpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/gpu"
+              }
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "laptop": {
     "laptop": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Laptop" },
-
-            "ram": { "$ref": "#/$defs/ram" },
-            "cpus": { "type": "array", "items": { "$ref": "#/$defs/cpu" } },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
+            "kind": {
+              "const": "Laptop"
+            },
+            "ram": {
+              "$ref": "#/$defs/ram"
+            },
+            "cpus": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/cpu"
+              }
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "firewall": {
     "firewall": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Firewall" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Firewall"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "router": {
     "router": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Router" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Router"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "switch": {
     "switch": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["ports"],
+          "required": [
+            "ports"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Switch" },
-
-            "model": { "type": "string" },
-            "managed": { "type": "boolean" },
-            "poe": { "type": "boolean" },
-            "ports": { "type": "array", "items": { "$ref": "#/$defs/port" } }
+            "kind": {
+              "const": "Switch"
+            },
+            "model": {
+              "type": "string"
+            },
+            "managed": {
+              "type": "boolean"
+            },
+            "poe": {
+              "type": "boolean"
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "accessPoint": {
     "accessPoint": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "AccessPoint" },
-
-            "model": { "type": "string" },
-            "speed": { "type": "number", "minimum": 0 }
+            "kind": {
+              "const": "AccessPoint"
+            },
+            "model": {
+              "type": "string"
+            },
+            "speed": {
+              "type": "number",
+              "minimum": 0
+            },
+            "ports": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/port"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "ups": {
     "ups": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Ups" },
-
-            "model": { "type": "string" },
-            "va": { "type": "integer", "minimum": 1 }
+            "kind": {
+              "const": "Ups"
+            },
+            "model": {
+              "type": "string"
+            },
+            "va": {
+              "type": "integer",
+              "minimum": 1
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "other": {
     "other": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
           "properties": {
           "properties": {
-            "kind": { "const": "Other" },
-
-            "model": { "type": "string" },
-            "description": { "type": "string" }
+            "kind": {
+              "const": "Other"
+            },
+            "model": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "service": {
     "service": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["network"],
+          "required": [
+            "network"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "Service" },
-            "network": { "$ref": "#/$defs/network" }
+            "kind": {
+              "const": "Service"
+            },
+            "network": {
+              "$ref": "#/$defs/network"
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     },
     },
-
     "system": {
     "system": {
       "allOf": [
       "allOf": [
-        { "$ref": "#/$defs/resourceBase" },
+        {
+          "$ref": "#/$defs/resourceBase"
+        },
         {
         {
           "type": "object",
           "type": "object",
-          "required": ["type", "os", "cores", "ram"],
+          "required": [
+            "type",
+            "os",
+            "cores",
+            "ram"
+          ],
           "properties": {
           "properties": {
-            "kind": { "const": "System" },
-
+            "kind": {
+              "const": "System"
+            },
             "type": {
             "type": {
               "type": "string",
               "type": "string",
               "enum": [
               "enum": [
-                "baremetal", "Baremetal",
-                "hypervisor", "Hypervisor",
-                "vm", "VM",
-                "container", "embedded", "cloud", "other"
+                "baremetal",
+                "Baremetal",
+                "cluster",
+                "Cluster",
+                "hypervisor",
+                "Hypervisor",
+                "vm",
+                "VM",
+                "container",
+                "embedded",
+                "cloud",
+                "other"
               ]
               ]
             },
             },
-            "os": { "type": "string" },
-            "cores": { "type": "integer", "minimum": 1 },
-            "ram": { "type": "number", "minimum": 0 },
-            "drives": { "type": "array", "items": { "$ref": "#/$defs/drive" } }
+            "ip": {
+              "type": "string",
+              "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}$"
+            },
+            "os": {
+              "type": "string"
+            },
+            "cores": {
+              "type": "integer",
+              "minimum": 1
+            },
+            "ram": {
+              "type": "number",
+              "minimum": 0
+            },
+            "drives": {
+              "type": "array",
+              "items": {
+                "$ref": "#/$defs/drive"
+              }
+            }
           }
           }
         }
         }
       ],
       ],
       "unevaluatedProperties": false
       "unevaluatedProperties": false
     }
     }
   }
   }
-}
+}