{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/containerlab/latest.json",
  "title": "Containerlab topology definition file",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/srl-labs/containerlab/main/schemas/clab.schema.json",
    "sourceSha256": "9647771f31920ea5651a13b5187e20147f72a9ce663e8bd32d9502cb3e1764fa",
    "fileMatch": [
      "*-clab.yaml",
      "*-clab.yml",
      "*.clab.yaml",
      "*.clab.yml"
    ],
    "parsers": [
      "yaml"
    ]
  },
  "type": "object",
  "properties": {
    "name": {
      "description": "topology name",
      "type": "string",
      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-._]*$"
    },
    "prefix": {
      "description": "lab prefix",
      "type": "string",
      "pattern": "^$|^__lab-name$|^[a-zA-Z0-9][a-zA-Z0-9-._]*$",
      "markdownDescription": "[lab prefix](https://containerlab.dev/manual/topo-def-file/#prefix)"
    },
    "mgmt": {
      "description": "configuration container for management network",
      "markdownDescription": "configuration container for [management network](https://containerlab.dev/manual/network/#management-network)",
      "type": "object",
      "properties": {
        "network": {
          "description": "management network name",
          "markdownDescription": "[management network name](https://containerlab.dev/manual/network/#network-name)",
          "type": "string"
        },
        "bridge": {
          "description": "Set bridge to use for the management network (instead of the default generated bridge).",
          "markdownDescription": "Set [bridge](https://containerlab.dev/manual/network/#bridge-name) to use for the management network (instead of the default generated bridge).",
          "type": "string"
        },
        "ipv4-subnet": {
          "description": "IPv4 subnet to use for the custom management network. e.g. 172.100.100.0/24",
          "markdownDescription": "[IPv4 subnet](https://containerlab.dev/manual/network/#user-defined-addresses) to use for the custom management network. e.g. 172.100.100.0/24",
          "type": "string",
          "pattern": "(^.+/[0-9]{1,2}$)|(auto)"
        },
        "ipv6-subnet": {
          "description": "IPv6 subnet to use for the custom management network. e.g. 3fff:172:100:100::/64",
          "markdownDescription": "[IPv6 subnet](https://containerlab.dev/manual/network/#user-defined-addresses) to be used for the custom management network. e.g. 3fff:172:100:100::/64",
          "type": "string",
          "pattern": "(^.+/[0-9]{1,3}$)|(auto)"
        },
        "ipv4-gw": {
          "description": "IPv4 gateway address that will be set on a bridge used for the management network. Will be set to the first available IP address by default",
          "markdownDescription": "IPv4 gateway address that will be set on a bridge used for the management network. Will be set to the first available IP address by default",
          "$ref": "#/$defs/ipv4-addr"
        },
        "ipv6-gw": {
          "description": "IPv6 gateway address that will be set on a bridge used for the management network. Will be set to the first available IP address by default",
          "markdownDescription": "IPv6 gateway address that will be set on a bridge used for the management network. Will be set to the first available IP address by default",
          "type": "string",
          "$ref": "#/$defs/ipv6-addr"
        },
        "ipv4-range": {
          "description": "IPv4 range out of the ipv4-subnet to use for the custom management network. e.g. 172.100.100.128/25",
          "markdownDescription": "[IPv4 range](https://containerlab.dev/manual/network/#ip-range) out of the ipv4-subnet to use for the custom management network. e.g. 172.100.100.128/25",
          "type": "string",
          "pattern": "^.+/[0-9]{1,2}$"
        },
        "ipv6-range": {
          "description": "IPv6 range out of the ipv6-subnet to use for the custom management network. e.g. 3fff:172:100:100:8000::/65",
          "markdownDescription": "[IPv6 range](https://containerlab.dev/manual/network/#ip-range) out of the ipv6-subnet to use for the custom management network. e.g. 3fff:172:100:100:8000::/65",
          "type": "string",
          "pattern": "^((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\\p{N}\\p{L}]+)?$"
        },
        "mtu": {
          "description": "MTU for the custom network",
          "markdownDescription": "[MTU](https://containerlab.dev/manual/network/#mtu) in Bytes for the custom management network",
          "$ref": "#/$defs/mtu"
        },
        "external-access": {
          "type": "boolean",
          "description": "controls whether the management network has external access or not",
          "markdownDescription": "controls whether the [management network has external access](https://containerlab.dev/manual/network/#external-access) or not"
        },
        "driver-opts": {
          "type": "object",
          "description": "overrides for container runtime network driver options",
          "markdownDescription": "[driver-opts](https://containerlab.dev/manual/network/#bridge-network-driver-options) lets you set overrides for the network driver of the container runtime",
          "patternProperties": {
            ".+": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            }
          }
        }
      },
      "minProperties": 1,
      "additionalProperties": false
    },
    "topology": {
      "description": "topology configuration container",
      "markdownDescription": "[topology](https://containerlab.dev/manual/topo-def-file/) configuration container",
      "type": "object",
      "properties": {
        "nodes": {
          "description": "topology nodes configuration container",
          "markdownDescription": "topology [nodes](https://containerlab.dev/manual/nodes/) configuration container",
          "type": "object",
          "additionalProperties": false,
          "patternProperties": {
            "^[a-zA-Z0-9][a-zA-Z0-9-._|]*$": {
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/$defs/node-config"
                }
              ]
            }
          }
        },
        "groups": {
          "description": "topology groups configuration container",
          "markdownDescription": "topology [groups](https://containerlab.dev/manual/topo-def-file/#groups) configuration container",
          "type": "object",
          "patternProperties": {
            ".*": {
              "$ref": "#/$defs/node-config"
            }
          }
        },
        "kinds": {
          "description": "topology kinds configuration container",
          "markdownDescription": "topology [kinds](https://containerlab.dev/manual/topo-def-file/#kinds) configuration container",
          "type": "object",
          "properties": {
            "nokia_srlinux": {
              "$ref": "#/$defs/node-config"
            },
            "nokia_srsim": {
              "$ref": "#/$defs/node-config"
            },
            "nokia_sros": {
              "$ref": "#/$defs/node-config"
            },
            "arista_ceos": {
              "$ref": "#/$defs/node-config"
            },
            "vyosnetworks_vyos": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_crpd": {
              "$ref": "#/$defs/node-config"
            },
            "sonic-vs": {
              "$ref": "#/$defs/node-config"
            },
            "sonic-vm": {
              "$ref": "#/$defs/node-config"
            },
            "dell_ftosv": {
              "$ref": "#/$defs/node-config"
            },
            "dell_sonic": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_vmx": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_vsrx": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_vjunosrouter": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_vjunosswitch": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_vjunosevolved": {
              "$ref": "#/$defs/node-config"
            },
            "cjunosevolved": {
              "$ref": "#/$defs/node-config"
            },
            "juniper_cjunosevolved": {
              "$ref": "#/$defs/node-config"
            },
            "aruba_aoscx": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_xrd": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_xrv": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_xrv9k": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_nxos": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_n9kv": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_csr": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_cat9kv": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_ftdv": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_iol": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_c8000": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_c8000v": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_sdwan": {
              "$ref": "#/$defs/node-config"
            },
            "cisco_asav": {
              "$ref": "#/$defs/node-config"
            },
            "linux": {
              "$ref": "#/$defs/node-config"
            },
            "bridge": {
              "$ref": "#/$defs/node-config"
            },
            "ovs-bridge": {
              "$ref": "#/$defs/node-config"
            },
            "host": {
              "$ref": "#/$defs/node-config"
            },
            "ipinfusion_ocnos": {
              "$ref": "#/$defs/node-config"
            },
            "keysight_ixia-c-one": {
              "$ref": "#/$defs/node-config"
            },
            "checkpoint_cloudguard": {
              "$ref": "#/$defs/node-config"
            },
            "ext-container": {
              "$ref": "#/$defs/node-config"
            },
            "rare": {
              "$ref": "#/$defs/node-config"
            },
            "cumulus_cvx": {
              "$ref": "#/$defs/node-config"
            },
            "openbsd": {
              "$ref": "#/$defs/node-config"
            },
            "freebsd": {
              "$ref": "#/$defs/node-config"
            },
            "openwrt": {
              "$ref": "#/$defs/node-config"
            },
            "huawei_vrp": {
              "$ref": "#/$defs/node-config"
            },
            "generic_vm": {
              "$ref": "#/$defs/node-config"
            },
            "fdio_vpp": {
              "$ref": "#/$defs/node-config"
            },
            "arrcus_arcos": {
              "$ref": "#/$defs/node-config"
            },
            "mikrotik_ros": {
              "$ref": "#/$defs/node-config"
            },
            "6wind_vsr": {
              "$ref": "#/$defs/node-config"
            },
            "spirent_stc": {
              "$ref": "#/$defs/node-config"
            },
            "veesix_osvbng": {
              "$ref": "#/$defs/node-config"
            },
            "ostinato": {
              "$ref": "#/$defs/node-config"
            }
          },
          "additionalProperties": false
        },
        "defaults": {
          "$ref": "#/$defs/node-config"
        },
        "links": {
          "type": "array",
          "description": "topology links section",
          "markdownDescription": "[topology links](https://containerlab.dev/manual/topo-def-file/#links)",
          "minItems": 1,
          "items": {
            "anyOf": [
              {
                "$ref": "#/$defs/link-config-short"
              },
              {
                "$ref": "#/$defs/link-type-veth"
              },
              {
                "$ref": "#/$defs/link-type-mgmt-net"
              },
              {
                "$ref": "#/$defs/link-type-macvlan"
              },
              {
                "$ref": "#/$defs/link-type-host"
              },
              {
                "$ref": "#/$defs/link-type-vxlan"
              },
              {
                "$ref": "#/$defs/link-type-vxlan-stitched"
              },
              {
                "$ref": "#/$defs/link-type-dummy"
              }
            ]
          }
        }
      },
      "required": [
        "nodes"
      ],
      "additionalProperties": false
    },
    "settings": {
      "description": "Global containerlab settings",
      "markdownDescription": "Global [containerlab settings]()",
      "type": "object",
      "properties": {
        "certificate-authority": {
          "$ref": "#/$defs/certificate-authority-config"
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false,
  "required": [
    "name",
    "topology"
  ],
  "$defs": {
    "env": {
      "type": "object",
      "description": "environment variables",
      "markdownDescription": "[environment variables](https://containerlab.dev/manual/nodes/#env)",
      "patternProperties": {
        ".+": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            }
          ]
        }
      }
    },
    "node-config": {
      "type": "object",
      "description": "topology node configuration container",
      "markdownDescription": "topology [node](https://containerlab.dev/manual/nodes/) configuration container",
      "properties": {
        "image": {
          "type": "string",
          "description": "container image to use for this node",
          "markdownDescription": "container [image](https://containerlab.dev/manual/nodes/#image) to use for this node"
        },
        "image-pull-policy": {
          "type": "string",
          "description": "policy for pulling the referenced container image",
          "markdownDescription": "container [image-pull-policy](https://containerlab.dev/manual/nodes/#image-pull-policy) to use for this node",
          "enum": [
            "always",
            "Always",
            "never",
            "Never",
            "ifnotpresent",
            "IfNotPresent"
          ]
        },
        "restart-policy": {
          "type": "string",
          "description": "restart policy for the referenced container image",
          "markdownDescription": "container [restart-policy](https://containerlab.dev/manual/nodes/#restart-policy) to use for this node",
          "enum": [
            "no",
            "No",
            "on-failure",
            "On-failure",
            "Always",
            "always",
            "unless-stopped",
            "Unless-stopped"
          ]
        },
        "kind": {
          "type": "string",
          "description": "kind of this node",
          "markdownDescription": "[kind](https://containerlab.dev/manual/nodes/#kind) of this node",
          "enum": [
            "nokia_srlinux",
            "arista_ceos",
            "juniper_crpd",
            "sonic-vs",
            "sonic-vm",
            "nokia_sros",
            "nokia_srsim",
            "juniper_vmx",
            "juniper_vqfx",
            "juniper_vsrx",
            "juniper_vjunosrouter",
            "juniper_vjunosswitch",
            "juniper_vjunosevolved",
            "cisco_xrv",
            "cisco_xrv9k",
            "arista_veos",
            "cisco_csr1000v",
            "paloalto_panos",
            "mikrotik_ros",
            "6wind_vsr",
            "cisco_n9kv",
            "cisco_ftdv",
            "dell_ftosv",
            "dell_sonic",
            "aruba_aoscx",
            "linux",
            "bridge",
            "ovs-bridge",
            "border0",
            "host",
            "keysight_ixia-c-one",
            "ipinfusion_ocnos",
            "checkpoint_cloudguard",
            "ext-container",
            "rare",
            "cisco_xrd",
            "cisco_c8000",
            "cisco_c8000v",
            "cisco_cat9kv",
            "cisco_iol",
            "cisco_asav",
            "cisco_vios",
            "cumulus_cvx",
            "huawei_vrp",
            "openbsd",
            "freebsd",
            "generic_vm",
            "fortinet_fortigate",
            "k8s-kind",
            "fdio_vpp",
            "vyosnetworks_vyos",
            "juniper_cjunosevolved",
            "arrcus_arcos",
            "f5_bigip-ve",
            "cisco_sdwan",
            "openwrt",
            "spirent_stc",
            "veesix_osvbng",
            "ostinato"
          ]
        },
        "license": {
          "type": "string",
          "description": "path to a license file",
          "markdownDescription": "path to a [license](https://containerlab.dev/manual/nodes/#license) file"
        },
        "type": {
          "type": "string",
          "description": "type is a per-node property that can select a special type of a node",
          "markdownDescription": "node's [type](https://containerlab.dev/manual/nodes/#type) file"
        },
        "group": {
          "type": "string",
          "description": "grouping parameter of a node. A free form string that is mainly used in sorting elements when graphing",
          "markdownDescription": "path to a [license](https://containerlab.dev/manual/nodes/#group) file"
        },
        "startup-config": {
          "type": "string",
          "description": "path to a startup config file (if supported by the kind)",
          "markdownDescription": "path to a startup [config file](https://containerlab.dev/manual/nodes/#startup-config) (if supported by the kind)"
        },
        "startup-delay": {
          "type": "integer",
          "description": "Optional startup delay (seconds) to apply",
          "markdownDescription": "Optional [startup delay](https://containerlab.dev/manual/nodes/#startup-delay) in seconds"
        },
        "enforce-startup-config": {
          "type": "boolean",
          "description": "Set to `true` to make the node to boot with a startup-config even if the config file is present in the lab directory",
          "markdownDescription": "Set to `true` to [make the node to boot with a startup-config](https://containerlab.dev/manual/nodes/#enforce-startup-config) even if the config file is present in the lab directory"
        },
        "suppress-startup-config": {
          "type": "boolean",
          "description": "Set to `true` to prevent a startup-config file from being created (in a Zero-Touch Provisioning lab, for example)",
          "markdownDescription": "Set to `true` to [prevent a startup-config file from being created](https://containerlab.dev/manual/nodes/#suppress-startup-config) By default, containerlab will create a startup-config when initially creating a lab."
        },
        "auto-remove": {
          "type": "boolean",
          "description": "Set to `true` to remove the node automatically, instead of auto-restarting",
          "markdownDescription": "Set to `true` to [remove the node/container automatically](https://containerlab.dev/manual/nodes/#auto-remove), instead of auto-restarting it"
        },
        "exec": {
          "type": "array",
          "description": "list of commands to execute post deploy",
          "markdownDescription": "list of [commands to execute](https://containerlab.dev/manual/nodes/#exec) post deploy",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "binds": {
          "type": "array",
          "description": "list of file/directory bindings",
          "markdownDescription": "list of file/directory [bindings](https://containerlab.dev/manual/nodes/#binds)",
          "minItems": 1,
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "ports": {
          "type": "array",
          "description": "list of port mappings",
          "markdownDescription": "list of [port](https://containerlab.dev/manual/nodes/#ports) mappings",
          "minItems": 0,
          "items": {
            "type": "string",
            "pattern": "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\\p{N}\\p{L}]+)?:([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]):([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$|^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\\p{N}\\p{L}]+)?:([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]):([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])+(/tcp|/udp|/sctp)$|^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]):([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$|^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]):([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])+(/tcp|/udp|/sctp)$|^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$|^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]):([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])+(/tcp|/udp|/sctp)?$"
          },
          "uniqueItems": true
        },
        "env": {
          "type": "object",
          "$ref": "#/$defs/env"
        },
        "env-files": {
          "type": "array",
          "description": "list of external files containing environment variables",
          "markdownDescription": "list of external files containing [environment variables](https://containerlab.dev/manual/nodes/#env-files)",
          "minItems": 1,
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "user": {
          "description": "user to use within the container",
          "markdownDescription": "[user](https://containerlab.dev/manual/nodes/#user) to use within the container",
          "anyOf": [
            {
              "type": "string",
              "minLength": 1
            },
            {
              "type": "number",
              "minimum": 0
            }
          ]
        },
        "entrypoint": {
          "type": "string",
          "description": "container's entrypoint",
          "markdownDescription": "container's [entrypoint](https://containerlab.dev/manual/nodes/#entrypoint)"
        },
        "cmd": {
          "type": "string",
          "description": "command to launch container with",
          "markdownDescription": "[command](https://containerlab.dev/manual/nodes/#cmd) to launch container with"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        },
        "runtime": {
          "type": "string",
          "description": "Runtime used to launch the container node",
          "markdownDescription": "[Runtime](https://containerlab.dev/manual/nodes/#runtime) for the node",
          "enum": [
            "docker",
            "podman"
          ]
        },
        "mgmt-ipv4": {
          "description": "IPv4 management address of the node (e.g. 172.10.10.11)",
          "markdownDescription": "[IPv4 management address](https://containerlab.dev/manual/nodes/#mgmt-ipv4) of the node (e.g. 172.10.10.11)",
          "$ref": "#/$defs/ipv4-addr"
        },
        "mgmt-ipv6": {
          "description": "IPv6 management address of the node (e.g. 172.10.10.11)",
          "markdownDescription": "[IPv6 management address](https://containerlab.dev/manual/nodes/#mgmt-ipv6) of the node (e.g. 172.10.10.11)",
          "$ref": "#/$defs/ipv6-addr"
        },
        "network-mode": {
          "type": "string",
          "description": "node network mode (can only be set host, defaults to bridge)",
          "markdownDescription": "node [network mode](https://containerlab.dev/manual/nodes/#network-mode) (can only be set host, defaults to bridge)",
          "pattern": "^(host)|(container:\\S+)|(none)$"
        },
        "cpu": {
          "type": "number",
          "description": "number of vcpu to allocate for this node/container",
          "markdownDescription": "Allowed [CPU](https://containerlab.dev/manual/nodes/#cpu) usage by the node/container",
          "minimum": 0
        },
        "memory": {
          "type": "string",
          "description": "memory limit for this node/container",
          "markdownDescription": "Allowed [Memory](https://containerlab.dev/manual/nodes/#memory) usage by the node/container"
        },
        "cpu-set": {
          "type": "string",
          "description": "CPU cores to use by this node/container",
          "markdownDescription": "[CPU cores](https://containerlab.dev/manual/nodes/#cpu-set) to be used by the node/container"
        },
        "extras": {
          "type": "object",
          "$ref": "#/$defs/extras-config"
        },
        "config": {
          "$ref": "#/$defs/config-config"
        },
        "stages": {
          "type": "object",
          "$ref": "#/$defs/stages-config"
        },
        "dns": {
          "type": "object",
          "$ref": "#/$defs/dns-config"
        },
        "certificate": {
          "type": "object",
          "$ref": "#/$defs/certificate-config"
        },
        "healthcheck": {
          "type": "object",
          "$ref": "#/$defs/healthcheck-config"
        },
        "components": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "slot": {
                "description": "Set component physical position on a distributed chassis",
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[ABab]$"
                  },
                  {
                    "type": "integer",
                    "minimum": 1
                  }
                ]
              },
              "type": {
                "description": "Set component type"
              },
              "sfm": {
                "description": "Set SFM type (SR OS specific).",
                "$ref": "#/$defs/sros-sfm-types"
              },
              "xiom": {
                "type": "array",
                "description": "Define list of XIOMs (SR OS Specific). Each XIOM must have values of 'slot' and 'type'. MDAs must be defined under the XIOM.",
                "items": {
                  "type": "object",
                  "properties": {
                    "slot": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "type": {
                      "$ref": "#/$defs/sros-xiom-types"
                    },
                    "mda": {
                      "type": "array",
                      "description": "Define list of MDAs under this XIOM. Each defined MDA must have values of 'slot' and 'type'",
                      "items": {
                        "type": "object",
                        "properties": {
                          "slot": {
                            "type": "integer",
                            "minimum": 1
                          },
                          "type": {
                            "$ref": "#/$defs/sros-xiom-mda-types"
                          }
                        },
                        "required": [
                          "slot",
                          "type"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "slot",
                    "type"
                  ],
                  "additionalProperties": false
                },
                "uniqueItems": true
              },
              "mda": {
                "type": "array",
                "description": "Define list of MDAs (SR OS Specific). Each defined MDA must have values of 'slot' and 'type'",
                "items": {
                  "type": "object",
                  "properties": {
                    "slot": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "type": {
                      "description": "Set MDA type (SR OS specific)",
                      "$ref": "#/$defs/sros-mda-types"
                    }
                  },
                  "required": [
                    "slot",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "env": {
                "type": "object",
                "$ref": "#/$defs/env"
              }
            },
            "allOf": [
              {
                "if": {
                  "properties": {
                    "slot": {
                      "type": "string"
                    }
                  }
                },
                "then": {
                  "properties": {
                    "type": {
                      "$ref": "#/$defs/sros-cpm-types"
                    }
                  }
                },
                "else": {
                  "properties": {
                    "type": {
                      "$ref": "#/$defs/sros-card-types"
                    }
                  }
                }
              }
            ],
            "additionalProperties": false
          },
          "uniqueItems": true,
          "description": "List of node components, used for multicontainer systems",
          "markdownDescription": "Dependency list for Components"
        },
        "aliases": {
          "type": "array",
          "description": "list of additional network aliases for the node",
          "markdownDescription": "list of [aliases](https://containerlab.dev/manual/nodes/#aliases) for the node",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "shm-size": {
          "type": "string",
          "description": "shared memory size limit allocated to the container. Supported memory suffixes (case insensitive): b, kib, kb, mib, mb, gib, gb",
          "markdownDescription": "[shared memory size limit](https://containerlab.dev/manual/nodes/#shm-size) allocated to the container (e.g. 256MB). Supported memory suffixes (case insensitive): b, kib, kb, mib, mb, gib, gb",
          "pattern": "^[0-9]+(\\.?[0-9]*)?\\s*([bB]|[kK][iI]?[bB]|[mM][iI]?[bB]|[gG][iI]?[bB])?$"
        },
        "cap-add": {
          "type": "array",
          "description": "list of capabilities to add to the container",
          "markdownDescription": "list of [capabilities](https://containerlab.dev/manual/nodes/#cap-add) to add to the container",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "sysctls": {
          "type": "object",
          "description": "sysctl kernel parameters to set in the container",
          "markdownDescription": "[sysctl kernel parameters](https://containerlab.dev/manual/nodes/#sysctls) to set in the container",
          "patternProperties": {
            ".+": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                }
              ]
            }
          }
        },
        "devices": {
          "type": "array",
          "description": "list of host devices to add to the container",
          "markdownDescription": "list of [host devices](https://containerlab.dev/manual/nodes/#devices) to add to the container",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        }
      },
      "allOf": [
        {
          "properties": {
            "type": {
              "type": "string",
              "description": "type of a node",
              "markdownDescription": "node [type](https://containerlab.dev/manual/nodes/#type)"
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "pattern": "(nokia_srlinux)"
              }
            },
            "required": [
              "kind"
            ],
            "type": "object"
          },
          "then": {
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "ixsa1",
                  "ixs-a1",
                  "ixrd1",
                  "ixr-d1",
                  "ixrd2",
                  "ixr-d2",
                  "ixrd3",
                  "ixr-d3",
                  "ixrd2l",
                  "ixr-d2l",
                  "ixrd3l",
                  "ixr-d3l",
                  "ixrd4",
                  "ixr-d4",
                  "ixrd5",
                  "ixr-d5",
                  "ixrh2",
                  "ixr-h2",
                  "ixrh3",
                  "ixr-h3",
                  "ixrh4",
                  "ixr-h4",
                  "ixrh432d",
                  "ixr-h4-32d",
                  "ixrh5",
                  "ixr-h5",
                  "ixrh564d",
                  "ixr-h5-64d",
                  "ixrh564o",
                  "ixr-h5-64o",
                  "ixr6",
                  "ixr-6",
                  "ixr6e",
                  "ixr-6e",
                  "ixr10",
                  "ixr-10",
                  "ixr10e",
                  "ixr-10e",
                  "ixr18e",
                  "ixr-18e",
                  "sxr1x44s",
                  "sxr-1x-44s",
                  "sxr1d32d",
                  "sxr-1d-32d",
                  "sxr-1-32d",
                  "ixrx1b",
                  "ixr-x1b",
                  "ixrx3b",
                  "ixr-x3b",
                  "ixr-x4"
                ]
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "pattern": "(nokia_sros)"
              }
            },
            "required": [
              "kind"
            ],
            "type": "object"
          },
          "then": {
            "properties": {
              "type": {
                "type": "string",
                "anyOf": [
                  {
                    "enum": [
                      "sr-1",
                      "sr-1-24d",
                      "sr-1e",
                      "sr-1e-sec",
                      "sr-1s",
                      "sr-1s-macsec",
                      "sr-2s",
                      "sr-7s",
                      "sr-7s-fp4",
                      "sr-14s",
                      "sr-a4",
                      "ixr-e-small",
                      "ixr-e-big",
                      "ixr-e2",
                      "ixr-ec",
                      "ixr-r6",
                      "ixr-s"
                    ]
                  },
                  {
                    "pattern": "^\\s*(?:(?:cp|lc):\\s+)?(?:(?:(?:min_)?(?:cpu|ram|max_nics)=\\d+|slot=[A-Za-z0-9]+|chassis=[^\\s_][^\\s]*|card=[^\\s_][^\\s]*|mda/\\d+=[^\\s]+)(?:\\s+|$))+(?:\\s*___\\s*(?:(?:cp|lc):\\s+)?(?:(?:(?:min_)?(?:cpu|ram|max_nics)=\\d+|slot=[A-Za-z0-9]+|chassis=[^\\s_][^\\s]*|card=[^\\s_][^\\s]*|mda/\\d+=[^\\s]+)(?:\\s+|$))+)*\\s*$"
                  }
                ]
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "pattern": "(nokia_srsim)"
              }
            },
            "required": [
              "kind"
            ],
            "type": "object"
          },
          "then": {
            "properties": {
              "type": {
                "type": "string",
                "anyOf": [
                  {
                    "enum": [
                      "dms-1-24d",
                      "ixr-10",
                      "ixr-6",
                      "ixr-e2c",
                      "ixr-e2",
                      "ixr-e2n",
                      "ixr-ec",
                      "ixr-e",
                      "ixr-r4",
                      "ixr-r6dl",
                      "ixr-r6d",
                      "ixr-r6",
                      "ixr-s",
                      "ixr-x3",
                      "ixr-x",
                      "sar-1",
                      "sar-hm",
                      "sar-hmc",
                      "sr-1-24d",
                      "sr-12e",
                      "sr-12",
                      "sr-1-46s",
                      "sr-14s",
                      "sr-1-92s",
                      "sr-1e",
                      "sr-1se",
                      "sr-1s",
                      "sr-1-48d",
                      "sr-1x-48d",
                      "sr-1x-92s",
                      "sr-1",
                      "sr-2e",
                      "sr-2se",
                      "sr-2s",
                      "sr-3e",
                      "sr-7s",
                      "sr-7",
                      "sr-a4",
                      "sr-a8",
                      "vsr-i",
                      "xrs-20e",
                      "xrs-20",
                      "ess-7",
                      "ess-12"
                    ]
                  }
                ]
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "pattern": "(cisco_iol)"
              }
            },
            "required": [
              "kind"
            ],
            "type": "object"
          },
          "then": {
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "iol",
                  "l2"
                ]
              }
            }
          }
        }
      ],
      "additionalProperties": false
    },
    "link-config-short": {
      "type": "object",
      "description": "link configuration container",
      "markdownDescription": "link configuration container",
      "properties": {
        "endpoints": {
          "type": "array",
          "description": "endpoints list",
          "markdownDescription": "[endpoints](http://localhost:8000/manual/topo-def-file/#links) list",
          "minItems": 2,
          "items": {
            "type": "string",
            "pattern": "^\\S+:\\S+$"
          },
          "uniqueItems": true
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "ipv4": {
          "description": "Assign IPv4 per endpoint in brief links. Accepts ordered list of IPv4 prefixes as strings",
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "items": {
            "type": "string",
            "pattern": "^(?:$|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])/(?:[0-9]|[12][0-9]|3[0-2]))$"
          },
          "uniqueItems": true
        },
        "ipv6": {
          "description": "Assign IPv6 per endpoint in brief links. Accepts ordered list of IPv6 prefixes as strings",
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "items": {
            "type": "string",
            "pattern": "^(?:$|(?:(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,7}:|(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}|(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}|(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}|(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}|[A-Fa-f0-9]{1,4}:(?::[A-Fa-f0-9]{1,4}){1,6}|:(?:(?::[A-Fa-f0-9]{1,4}){1,7}|:))/(?:[0-9]|[1-9][0-9]|1[01][0-9]|12[0-8]))$"
          },
          "uniqueItems": true
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        }
      },
      "additionalProperties": false
    },
    "link-type-veth": {
      "type": "object",
      "description": "Link definition to support the veth interfaces",
      "markdownDescription": "Link definition to support the veth interfaces",
      "properties": {
        "type": {
          "type": "string",
          "const": "veth"
        },
        "endpoints": {
          "type": "array",
          "description": "Endpoints for the links",
          "minItems": 2,
          "maxItems": 2,
          "items": {
            "$ref": "#/$defs/link-endpoint"
          }
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "ipv4": {
          "description": "Assign IPv4 per endpoint. Accepts ordered list of IPv4 prefixes as strings",
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "items": {
            "type": "string",
            "pattern": "^(?:$|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])/(?:[0-9]|[12][0-9]|3[0-2]))$"
          },
          "uniqueItems": true
        },
        "ipv6": {
          "description": "Assign IPv6 per endpoint. Accepts ordered list of IPv6 prefixes as strings",
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "items": {
            "type": "string",
            "pattern": "^(?:$|(?:(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,7}:|(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}|(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}|(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}|(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}|[A-Fa-f0-9]{1,4}:(?::[A-Fa-f0-9]{1,4}){1,6}|:(?:(?::[A-Fa-f0-9]{1,4}){1,7}|:))/(?:[0-9]|[1-9][0-9]|1[01][0-9]|12[0-8]))$"
          },
          "uniqueItems": true
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoints"
      ],
      "additionalItems": false
    },
    "link-type-mgmt-net": {
      "type": "object",
      "description": "Link definition for management network interfaces",
      "properties": {
        "type": {
          "type": "string",
          "const": "mgmt-net"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "host-interface": {
          "$ref": "#/$defs/link-host-interface"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint",
        "host-interface"
      ],
      "additionalProperties": false
    },
    "link-type-macvlan": {
      "type": "object",
      "description": "Link definition describing a macvlan link endpoint configuration",
      "properties": {
        "type": {
          "type": "string",
          "const": "macvlan"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "host-interface": {
          "$ref": "#/$defs/link-host-interface"
        },
        "mode": {
          "$ref": "#/$defs/link-macvlan-mode"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint",
        "host-interface"
      ],
      "additionalProperties": false
    },
    "link-type-host": {
      "type": "object",
      "description": "",
      "properties": {
        "type": {
          "type": "string",
          "const": "host"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "host-interface": {
          "$ref": "#/$defs/link-host-interface"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint",
        "host-interface"
      ],
      "additionalProperties": false
    },
    "link-type-vxlan": {
      "type": "object",
      "description": "",
      "properties": {
        "type": {
          "type": "string",
          "const": "vxlan"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "remote": {
          "$ref": "#/$defs/link-vxlan-remote"
        },
        "vni": {
          "$ref": "#/$defs/link-vxlan-vni"
        },
        "dst-port": {
          "$ref": "#/$defs/link-vxlan-dstport"
        },
        "src-port": {
          "$ref": "#/$defs/link-vxlan-srcport"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint",
        "remote",
        "vni",
        "dst-port"
      ],
      "additionalProperties": false
    },
    "link-type-vxlan-stitched": {
      "type": "object",
      "description": "",
      "properties": {
        "type": {
          "type": "string",
          "const": "vxlan-stitch"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "remote": {
          "$ref": "#/$defs/link-vxlan-remote"
        },
        "vni": {
          "$ref": "#/$defs/link-vxlan-vni"
        },
        "dst-port": {
          "$ref": "#/$defs/link-vxlan-dstport"
        },
        "src-port": {
          "$ref": "#/$defs/link-vxlan-srcport"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint",
        "remote",
        "vni",
        "dst-port"
      ],
      "additionalProperties": false
    },
    "link-type-dummy": {
      "type": "object",
      "description": "",
      "properties": {
        "type": {
          "type": "string",
          "const": "dummy"
        },
        "endpoint": {
          "$ref": "#/$defs/link-endpoint"
        },
        "mtu": {
          "$ref": "#/$defs/mtu"
        },
        "vars": {
          "$ref": "#/$defs/link-vars"
        },
        "labels": {
          "$ref": "#/$defs/labels"
        }
      },
      "required": [
        "type",
        "endpoint"
      ],
      "additionalProperties": false
    },
    "link-endpoint": {
      "type": "object",
      "description": "Common link endpoint object for extended link configs",
      "properties": {
        "node": {
          "type": "string",
          "description": ""
        },
        "interface": {
          "type": "string",
          "description": ""
        },
        "mac": {
          "type": "string",
          "description": "",
          "pattern": "^(?:[0-9A-Fa-f]{2}[:-]){5}(?:[0-9A-Fa-f]{2})"
        },
        "ipv4": {
          "$ref": "#/$defs/ipv4-prefix",
          "description": "IPv4 address (in CIDR notation) to configure on this interface",
          "markdownDescription": "Interface IPv4 address in CIDR notation, e.g. 10.0.0.1/24"
        },
        "ipv6": {
          "$ref": "#/$defs/ipv6-prefix",
          "description": "IPv6 address (in CIDR notation) to configure on this interface",
          "markdownDescription": "Interface IPv6 address in CIDR notation, e.g. 2001:db8::1/64"
        },
        "vars": {
          "$ref": "#/$defs/endpoint-vars"
        }
      },
      "required": [
        "node",
        "interface"
      ],
      "additionalProperties": false
    },
    "endpoint-vars": {
      "type": "object",
      "description": "per-endpoint variables",
      "additionalProperties": true
    },
    "link-vxlan-remote": {
      "anyOf": [
        {
          "$ref": "#/$defs/ipv4-addr"
        },
        {
          "$ref": "#/$defs/ipv6-addr"
        }
      ]
    },
    "link-vxlan-vni": {
      "type": "integer",
      "description": "VXLAN VNI",
      "minimum": 1,
      "maximum": 16777215
    },
    "link-vxlan-dstport": {
      "type": "integer",
      "description": "Destination UDP port",
      "minimum": 1,
      "maximum": 65535
    },
    "link-vxlan-srcport": {
      "type": "integer",
      "description": "Source UDP port",
      "minimum": 1,
      "maximum": 65535
    },
    "link-vars": {
      "type": "object",
      "description": "link-scoped variables used by config engine",
      "markdownDescription": "link-scoped variables used by config engine",
      "additionalProperties": true
    },
    "labels": {
      "type": "object",
      "description": "container labels",
      "markdownDescription": "container [labels](https://containerlab.dev/manual/nodes/#labels)",
      "patternProperties": {
        ".+": {
          "anyOf": [
            {
              "type": "string",
              "minLength": 1
            },
            {
              "type": "number",
              "minimum": 0
            }
          ]
        }
      }
    },
    "link-host-interface": {
      "type": "string",
      "description": "Name of the host interface",
      "markdownDescription": "Name of the host interface"
    },
    "link-macvlan-mode": {
      "type": "string",
      "description": "MACVLAN operating mode",
      "markdownDescription": "MACVLAN operating mode",
      "enum": [
        "private",
        "vepa",
        "bridge",
        "passthru",
        "source"
      ]
    },
    "extras-config": {
      "type": "object",
      "description": "node's extra configurations",
      "properties": {
        "ceos-copy-to-flash": {
          "type": "array",
          "description": "list of cEOS-specific configuration or override files to be copied to the flash directory and evaluated on startup",
          "markdownDescription": "list of [cEOS-specific configuration or override files](https://containerlab.dev/manual/kinds/ceos/#copy-to-flash) to be copied to the flash directory and evaluated on startup",
          "minItems": 1,
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        }
      },
      "additionalProperties": false
    },
    "config-config": {
      "type": "object",
      "description": "containerlab config engine parameters",
      "properties": {
        "vars": {
          "type": "object",
          "description": "config variables passed to config engine",
          "markdownDescription": "config variables passed to config engine"
        }
      },
      "additionalProperties": false
    },
    "certificate-config": {
      "type": "object",
      "description": "Node's Certificate configuration option",
      "markdownDescription": "Node's [Certificate configuration options](https://containerlab.dev/manual/nodes/#certificate)",
      "properties": {
        "issue": {
          "description": "Set to `true` to generate a TLS certificate for the node",
          "markdownDescription": "Set to `true` to [generate a TLS certificate for the node](https://containerlab.dev/manual/nodes/#certificate)"
        },
        "sans": {
          "type": "array",
          "description": "list of subject alternative names (SAN) to use for this node",
          "markdownDescription": "list of [subject alternative names](https://containerlab.dev/manual/nodes/#subject-alternative-names) to use for this node",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "key-size": {
          "type": "integer",
          "description": "size of the to be generated key",
          "markdownDescription": "size of the to be generated key"
        },
        "validity-duration": {
          "type": "string",
          "description": "Duration for how long the certificate issued by the CA will be valid.",
          "markdownDescription": "Duration for how long the certificate issued by the CA will be valid."
        }
      },
      "additionalProperties": false
    },
    "healthcheck-config": {
      "type": "object",
      "description": "Node's Healthcheck configuration option",
      "markdownDescription": "Node's [Healthcheck configuration options](https://containerlab.dev/manual/nodes/#healthcheck)",
      "properties": {
        "test": {
          "type": "array",
          "description": "test command",
          "items": {
            "type": "string"
          }
        },
        "interval": {
          "type": "integer",
          "description": "test execution interval",
          "markdownDescription": "test execution interval"
        },
        "retries": {
          "type": "integer",
          "description": "test execution retries",
          "markdownDescription": "test execution retries"
        },
        "timeout": {
          "type": "integer",
          "description": "test execution timeout in seconds",
          "markdownDescription": "test execution timeout in seconds"
        },
        "start-period": {
          "type": "integer",
          "description": "time in seconds to wait before starting the healthcheck"
        }
      },
      "additionalProperties": false
    },
    "dns-config": {
      "type": "object",
      "description": "Node's DNS configuration option",
      "markdownDescription": "Node's [DNS configuration options](https://containerlab.dev/manual/nodes/#dns)",
      "properties": {
        "servers": {
          "type": "array",
          "description": "DNS server addresses",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "search": {
          "type": "array",
          "description": "DNS search domains",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        },
        "options": {
          "type": "array",
          "description": "DNS options",
          "items": {
            "type": "string"
          },
          "uniqueItems": true
        }
      },
      "additionalProperties": false
    },
    "certificate-authority-config": {
      "type": "object",
      "description": "Certificate Authority",
      "markdownDescription": "",
      "properties": {
        "cert": {
          "type": "string",
          "description": "Path to the CA certificate file. If set, it is expected that the CA certificate already exists by that path"
        },
        "key": {
          "type": "string",
          "description": "Path to the CA key file. If set, it is expected that the CA certificate already exists by that path"
        },
        "key-size": {
          "type": "integer",
          "description": "Key size. Can only be set if the external CA certificate is not provided"
        },
        "validity-duration": {
          "type": "string",
          "description": "CA certificate validity duration. Can only be set if the external CA certificate is not provided"
        }
      },
      "oneOf": [
        {
          "required": [
            "cert",
            "key"
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "key-size"
                ]
              },
              {
                "required": [
                  "validity-duration"
                ]
              }
            ]
          }
        },
        {
          "anyOf": [
            {
              "required": [
                "key-size"
              ]
            },
            {
              "required": [
                "validity-duration"
              ]
            }
          ],
          "not": {
            "anyOf": [
              {
                "required": [
                  "cert"
                ]
              },
              {
                "required": [
                  "key"
                ]
              }
            ]
          }
        }
      ],
      "additionalProperties": false
    },
    "stages-config": {
      "type": "object",
      "description": "node's stages configurations",
      "markdownDescription": "node's [stages](https://containerlab.dev/manual/nodes/#stages) configurations",
      "properties": {
        "create": {
          "type": "object",
          "description": "create stage configuration",
          "properties": {
            "wait-for": {
              "$ref": "#/$defs/wait-for-config"
            },
            "exec": {
              "$ref": "#/$defs/stage-exec"
            }
          },
          "additionalProperties": false
        },
        "create-links": {
          "type": "object",
          "description": "create stage configuration",
          "properties": {
            "wait-for": {
              "$ref": "#/$defs/wait-for-config"
            },
            "exec": {
              "$ref": "#/$defs/stage-exec"
            }
          },
          "additionalProperties": false
        },
        "configure": {
          "type": "object",
          "description": "create stage configuration",
          "properties": {
            "wait-for": {
              "$ref": "#/$defs/wait-for-config"
            },
            "exec": {
              "$ref": "#/$defs/stage-exec"
            }
          },
          "additionalProperties": false
        },
        "healthy": {
          "type": "object",
          "description": "create stage configuration",
          "properties": {
            "wait-for": {
              "$ref": "#/$defs/wait-for-config"
            },
            "exec": {
              "$ref": "#/$defs/stage-exec"
            }
          },
          "additionalProperties": false
        },
        "exit": {
          "type": "object",
          "description": "create stage configuration",
          "properties": {
            "wait-for": {
              "$ref": "#/$defs/wait-for-config"
            },
            "exec": {
              "$ref": "#/$defs/stage-exec"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "wait-for-config": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "node name to wait for"
          },
          "stage": {
            "type": "string",
            "description": "phase to wait for",
            "$ref": "#/$defs/stages-enum"
          }
        },
        "additionalProperties": false
      },
      "uniqueItems": true,
      "description": "Dependency list for the node",
      "markdownDescription": "Dependency list for the node"
    },
    "stages-enum": {
      "type": "string",
      "enum": [
        "create",
        "create-links",
        "configure",
        "healthy",
        "exit"
      ]
    },
    "stage-exec": {
      "description": "per-stage exec configuration",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "on-enter": {
              "$ref": "#/$defs/stage-exec-list"
            },
            "on-exit": {
              "$ref": "#/$defs/stage-exec-list"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "array",
          "description": "List of exec commands as objects, each containing `command`, `target`, and `phase`",
          "items": {
            "type": "object",
            "required": [
              "command",
              "phase"
            ],
            "properties": {
              "command": {
                "type": "string",
                "description": "Shell command to execute"
              },
              "target": {
                "type": "string",
                "description": "Location to run the command (e.g. 'container', 'host')",
                "default": "container"
              },
              "phase": {
                "type": "string",
                "enum": [
                  "on-enter",
                  "on-exit"
                ],
                "description": "Phase to execute this command (on-enter or on-exit)"
              }
            },
            "additionalProperties": false
          }
        }
      ]
    },
    "stage-exec-list": {
      "type": "array",
      "description": "list of commands to execute",
      "markdownDescription": "list of [commands to execute](https://containerlab.dev/manual/nodes/#exec)",
      "minItems": 1,
      "items": {
        "type": "string"
      }
    },
    "mtu": {
      "description": "MTU for the custom network",
      "markdownDescription": "[MTU](https://containerlab.dev/manual/network/#mtu) in Bytes for the custom management network",
      "type": "number",
      "maximum": 65535,
      "minimum": 1,
      "default": 1500
    },
    "ipv4-addr": {
      "description": "IPv4 address",
      "markdownDescription": "IPv4 address",
      "type": "string",
      "pattern": "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\\p{N}\\p{L}]+)?$"
    },
    "ipv6-addr": {
      "description": "IPv6 address",
      "markdownDescription": "IPv6 address",
      "type": "string",
      "pattern": "^((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\\p{N}\\p{L}]+)?$"
    },
    "ipv4-prefix": {
      "description": "IPv4 address in CIDR notation",
      "markdownDescription": "IPv4 address in CIDR notation, e.g. 10.0.0.1/24",
      "type": "string",
      "pattern": "^(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])/(?:[0-9]|[12][0-9]|3[0-2])$"
    },
    "ipv6-prefix": {
      "description": "IPv6 address in CIDR notation",
      "markdownDescription": "IPv6 address in CIDR notation, e.g. 2001:db8::1/64",
      "type": "string",
      "pattern": "^(?:(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,7}:|(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}|(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}|(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}|(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}|(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}|[A-Fa-f0-9]{1,4}:(?::[A-Fa-f0-9]{1,4}){1,6}|:(?:(?::[A-Fa-f0-9]{1,4}){1,7}|:))/(?:[0-9]|[1-9][0-9]|1[01][0-9]|12[0-8])$"
    },
    "sros-card-types": {
      "type": "string",
      "description": "Card types for SR OS",
      "enum": [
        "cpm-1se/imm36-800g-qsfpdd",
        "cpm-1x/dms24-800g-qsfpdd-1",
        "cpm-1x/i24-800g-qsfpdd-1",
        "cpm-1x/i40-200g-sfpdd+6-800g-qsfpdd-1",
        "cpm-1x/i48-400g-qsfpdd-1",
        "cpm-1x/i48-800g-qsfpdd-1x",
        "cpm-1x/i80-200g-sfpdd+12-400g-qsfpdd-1",
        "cpm-1x/i80-200g-sfpdd+12-800g-qsfpdd-1x",
        "cpm-ixr-e-gnss/imm14-10g-sfp++4-1g-tx",
        "cpm-ixr-e-gnss/imm24-sfp++8-sfp28+2-qsfp28",
        "cpm-ixr-e/imm14-10g-sfp++4-1g-tx",
        "cpm-ixr-e/imm24-sfp++8-sfp28+2-qsfp28",
        "cpm-ixr-e2",
        "cpm-ixr-e2c",
        "cpm-ixr-e2n/imm4-sfp+4-sfp+",
        "cpm-ixr-e3c/imm4-qsfp28+16-sfp28+8-sfp56",
        "cpm-ixr-e3x/imm16-sfp112+15-sfp56+6-qsfpdd",
        "cpm-ixr-ec",
        "cpm-ixr-s/imm48-sfp++6-qsfp28",
        "cpm-ixr-x/imm32-qsfp28+4-qsfpdd",
        "cpm-ixr-x/imm6-qsfpdd+48-sfp56",
        "cpm-sar-hm",
        "cpm-sar-hmc",
        "dms24-800g-qsfpdd-1",
        "i24-800g-qsfpdd-1",
        "i40-200g-sfpdd+6-800g-qsfpdd-1",
        "i48-400g-qsfpdd-1",
        "i48-800g-qsfpdd-1x",
        "i80-200g-sfpdd+12-400g-qsfpdd-1",
        "i80-200g-sfpdd+12-800g-qsfpdd-1x",
        "imm-2pac-fp3",
        "imm12-sfp28+2-qsfp28",
        "imm14-10g-sfp++4-1g-tx",
        "imm2-qsfpdd+2-qsfp28+24-sfp28",
        "imm24-sfp++8-sfp28+2-qsfp28",
        "imm32-qsfp28+4-qsfpdd",
        "imm36-100g-qsfp28",
        "imm36-800g-qsfpdd",
        "imm36-qsfpdd",
        "imm4-100gb-cfp4",
        "imm4-100gb-cxp",
        "imm4-1g-tx+20-1g-sfp+6-10g-sfp+",
        "imm40-10gb-sfp",
        "imm40-10gb-sfp-ptp",
        "imm48-1gb-sfp-c",
        "imm48-sfp++6-qsfp28",
        "imm48-sfp+2-qsfp28",
        "imm6-qsfpdd+48-sfp56",
        "iom-1",
        "iom-a",
        "iom-e",
        "iom-ixr-r4",
        "iom-ixr-r6",
        "iom-ixr-r6d",
        "iom-sar",
        "iom-sar-hm",
        "iom-sar-hmc",
        "iom-v",
        "iom4-e",
        "iom4-e-b",
        "iom4-e-hs",
        "iom5-e",
        "xcm-14s",
        "xcm-14s-b",
        "xcm-1s",
        "xcm-2s",
        "xcm-2se",
        "xcm-7s",
        "xcm-7s-b",
        "xcm-x20",
        "xcm2-14s",
        "xcm2-7s",
        "xcm2-x20",
        "xcmc-2se"
      ]
    },
    "sros-cpm-types": {
      "type": "string",
      "description": "CPM card types for SR OS",
      "enum": [
        "cpiom-ixr-r6",
        "cpiom-ixr-r6d",
        "cpm-1",
        "cpm-1s",
        "cpm-1se",
        "cpm-1se/imm36-800g-qsfpdd",
        "cpm-1x",
        "cpm-1x/dms24-800g-qsfpdd-1",
        "cpm-1x/i24-800g-qsfpdd-1",
        "cpm-1x/i40-200g-sfpdd+6-800g-qsfpdd-1",
        "cpm-1x/i48-400g-qsfpdd-1",
        "cpm-1x/i48-800g-qsfpdd-1x",
        "cpm-1x/i80-200g-sfpdd+12-400g-qsfpdd-1",
        "cpm-1x/i80-200g-sfpdd+12-800g-qsfpdd-1x",
        "cpm-2s",
        "cpm-2se",
        "cpm-a",
        "cpm-e",
        "cpm-ixr",
        "cpm-ixr-e",
        "cpm-ixr-e-gnss",
        "cpm-ixr-e-gnss/imm14-10g-sfp++4-1g-tx",
        "cpm-ixr-e-gnss/imm24-sfp++8-sfp28+2-qsfp28",
        "cpm-ixr-e/imm14-10g-sfp++4-1g-tx",
        "cpm-ixr-e/imm24-sfp++8-sfp28+2-qsfp28",
        "cpm-ixr-e2",
        "cpm-ixr-e2c",
        "cpm-ixr-e2n/imm4-sfp+4-sfp+",
        "cpm-ixr-e3c/imm4-qsfp28+16-sfp28+8-sfp56",
        "cpm-ixr-e3x/imm16-sfp112+15-sfp56+6-qsfpdd",
        "cpm-ixr-ec",
        "cpm-ixr-r4",
        "cpm-ixr-s",
        "cpm-ixr-s/imm48-sfp++6-qsfp28",
        "cpm-ixr-x",
        "cpm-ixr-x/imm32-qsfp28+4-qsfpdd",
        "cpm-ixr-x/imm6-qsfpdd+48-sfp56",
        "cpm-s",
        "cpm-sar",
        "cpm-sar-hm",
        "cpm-sar-hmc",
        "cpm-v",
        "cpm-v/iom-v",
        "cpm-x20",
        "cpm2-s",
        "cpm2-x20",
        "cpm5",
        "iom-sar"
      ]
    },
    "sros-mda-types": {
      "type": "string",
      "description": "MDA types for SR OS",
      "enum": [
        "a32-chds1v2",
        "d24-800g-qsfpdd-1",
        "i1-wlan",
        "i2-cellular",
        "i2-sdi",
        "i3-10/100eth-tx",
        "i6-10/100eth-tx",
        "isa-aa-v",
        "isa-bb-v",
        "isa-ms-v",
        "isa-tunnel-v",
        "isa2-aa",
        "isa2-bb",
        "isa2-tunnel",
        "isa2-video",
        "m1-400g-qsfpdd+1-100g-qsfp28",
        "m10-10g-sfp+",
        "m10-1g-sfp+2-10g-sfp+",
        "m10-50g-sfp56",
        "m10-sfp++6-sfp",
        "m12-sfp28+2-qsfp28",
        "m14-10g-sfp++4-1g-tx",
        "m18-25g-sfp28",
        "m2-100g-qsfp28+16-10g-sfp+",
        "m2-cfp2",
        "m2-qsfpdd+2-qsfp28+24-sfp28",
        "m20-10g-sfp+",
        "m20-1g-csfp",
        "m20-v",
        "m24-800g-qsfpdd-1",
        "m24-sfp++8-sfp28+2-qsfp28",
        "m32-1g-csfp",
        "m32-qsfp28+4-qsfpdd",
        "m36-100g-qsfp28",
        "m36-qsfpdd",
        "m4-100g-cfp4",
        "m4-10g-sfp++1-100g-cfp2",
        "m4-1g-tx+20-1g-sfp+6-10g-sfp+",
        "m40-10g-sfp",
        "m40-10g-sfp-ptp",
        "m40-200g-sfpdd+6-800g-qsfpdd-1",
        "m46-10g-sfp+",
        "m48-400g-qsfpdd-1",
        "m48-800g-qsfpdd-1x",
        "m48-sfp++6-qsfp28",
        "m48-sfp+2-qsfp28",
        "m5-100g-qsfp28",
        "m5e2-100g-qsfp28+2-800g-qdd",
        "m5e8-100g-sfp112+2-800g-qdd",
        "m6-10g-sfp++1-100g-qsfp28",
        "m6-10g-sfp++4-25g-sfp28",
        "m6-qsfpdd+48-sfp56",
        "m80-1g-csfp",
        "m80-200g-sfpdd+12-400g-qsfpdd-1",
        "m80-200g-sfpdd+12-800g-qsfpdd-1x",
        "ma2-10gb-sfp+12-1gb-sfp",
        "ma20-1gb-tx",
        "ma4-10gb-sfp+",
        "ma44-1gb-csfp",
        "maxp1-100gb-cfp",
        "maxp1-100gb-cfp2",
        "maxp1-100gb-cfp4",
        "maxp10-10/1gb-msec-sfp+",
        "maxp10-10gb-sfp+",
        "me-isa2-ms",
        "me-isa2-ms-e",
        "me1-100gb-cfp2",
        "me10-10gb-sfp+",
        "me12-10/1gb-sfp+",
        "me12-100gb-qsfp28",
        "me16-25gb-sfp28+2-100gb-qsfp-b",
        "me16-25gb-sfp28+2-100gb-qsfp28",
        "me2-100gb-ms-qsfp28",
        "me2-100gb-qsfp28",
        "me3-200gb-cfp2-dco",
        "me3-400gb-qsfpdd",
        "me40-1gb-csfp",
        "me6-100gb-qsfp28",
        "me6-10gb-sfp+",
        "me6-400gb-qsfpdd",
        "me8-10/25gb-sfp28",
        "ms36-800g-qsfpdd",
        "p-isa2-ms",
        "p-isa2-ms-e",
        "p1-100g-cfp",
        "p10-10g-sfp",
        "p20-1gb-sfp",
        "p6-10g-sfp",
        "s18-100gb-qsfp28",
        "s36-100gb-qsfp28",
        "s36-100gb-qsfp28-3.6t",
        "s36-400gb-qsfpdd",
        "x12-400g-qsfpdd",
        "x2-s36-800g-qsfpdd-12.0t",
        "x2-s36-800g-qsfpdd-18.0t",
        "x24-100g-qsfp28",
        "x4-100g-cfp2",
        "x40-10g-sfp",
        "x40-10g-sfp-ptp",
        "x6-200g-cfp2-dco",
        "x6-400g-cfp8"
      ]
    },
    "sros-xiom-types": {
      "type": "string",
      "description": "XIOM types for SR OS",
      "enum": [
        "iom-s-1.5t",
        "iom-s-3.0t",
        "iom2-s-3.0t",
        "iom2-s-6.0t",
        "iom2-se-3.0t",
        "iom2-se-6.0t",
        "x2-s36-400g-qsfp112-3.0t",
        "x2-s36-800g-qsfpdd-6.0t"
      ]
    },
    "sros-xiom-mda-types": {
      "type": "string",
      "description": "XIOM MDA types for SR OS",
      "enum": [
        "ms6-200gb-cfp2-dco",
        "ms3-200gb-cfp2-dco",
        "ms16-100gb-sfpdd+4-100gb-qsfp28",
        "ms18-100gb-qsfp28",
        "ms4-400gb-qsfpdd+4-100gb-qsfp28",
        "ms24-10/100gb-sfpdd",
        "ms2-400gb-qsfpdd+2-100gb-qsfp28",
        "ms8-100gb-sfpdd+2-100gb-qsfp28",
        "ms16-sdd+4-qsfp28-b",
        "ms8-sdd+2-qsfp28-b",
        "mse24-200g-sfpdd",
        "mse6-800g-cfp2-dco",
        "mse14-800g+4-400g",
        "m36-800g-qsfpdd",
        "mse6-800g-qsfpdd",
        "m36-400g-qsfp112",
        "ms2-100g-qsfp28+2-800g-qsfpdd",
        "ms8-100g-sfp112+2-800g-qsfpdd",
        "ms4-400g-qsfpdd+4-100g-qsfp28"
      ]
    },
    "sros-sfm-types": {
      "type": "string",
      "description": "SFM types for SR OS",
      "enum": [
        "m-sfm5-12",
        "m-sfm5-12e",
        "m-sfm5-7",
        "m-sfm6-12e",
        "m-sfm6-7/12",
        "sfm-2s",
        "sfm-2se",
        "sfm-ixr-10",
        "sfm-ixr-6",
        "sfm-s",
        "sfm-x20",
        "sfm-x20-b",
        "sfm-x20s-b",
        "sfm2-s",
        "sfm2-x20s"
      ]
    }
  }
}
