[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$id":"https://containerlab.dev/clab.schema.json","$schema":"http://json-schema.org/draft-07/schema#","title":"Containerlab topology definition file","definitions":{"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","juniper_vmx","juniper_vqfx","juniper_vsrx","juniper_vjunosrouter","juniper_vjunosswitch","juniper_vjunosevolved","cisco_xrv","cisco_xrv9k","arista_veos","cisco_csr1000v","paloalto_panos","mikrotik_ros","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","cumulus_cvx","huawei_vrp","openbsd","freebsd","generic_vm","fortinet_fortigate","k8s-kind","fdio_vpp","vyosnetworks_vyos"]},"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"},"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","description":"environment variables","markdownDescription":"[environment variables](https://containerlab.dev/manual/nodes/#env)","patternProperties":{".+":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"user":{"description":"user to use within the container","markdownDescription":"[user](https://containerlab.dev/manual/nodes/#user) to use within the container","anyOf":[{"type":"string","minItems":1},{"type":"number","minItems":1}]},"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":"#/definitions/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","ignite"]},"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":"#/definitions/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":"#/definitions/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"},"sandbox":{"type":"string","description":"ignite's sandbox image name"},"kernel":{"type":"string","description":"ignite's kernel image name"},"extras":{"type":"object","$ref":"#/definitions/extras-config"},"config":{"$ref":"#/definitions/config-config"},"stages":{"type":"object","$ref":"#/definitions/stages-config"},"dns":{"type":"object","$ref":"#/definitions/dns-config"},"certificate":{"type":"object","$ref":"#/definitions/certificate-config"},"healthcheck":{"type":"object","$ref":"#/definitions/healthcheck-config"},"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}},"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"]},"then":{"properties":{"type":{"type":"string","enum":["ixsa1","ixrd1","ixrd2","ixrd3","ixrd2l","ixrd3l","ixrd4","ixrd5","ixrh2","ixrh3","ixrh4","ixrh432d","ixrh5","ixrh564d","ixrh564o","ixr6","ixr6e","ixr10","ixr10e","ixr18e","sxr1x44s","sxr1d32d","ixrx1b","ixrx3b"]}}}},{"if":{"properties":{"kind":{"pattern":"(nokia_sros)"}},"required":["kind"]},"then":{"properties":{"type":{"type":"string","anyOf":[{"enum":["sr-1","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":"^((lc|cp):\\s)?((cpu|ram|max_nics)=\\d+|slot=[A-Z]|chassis=[^\\s]+|card=.*|\\s)+$"}]}}}}],"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":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/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":"#/definitions/link-endpoint"}},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/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":"#/definitions/link-endpoint"},"host-interface":{"$ref":"#/definitions/link-host-interface"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/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":"#/definitions/link-endpoint"},"host-interface":{"$ref":"#/definitions/mtu"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/labels"}},"required":["type","endpoint","host-interface"],"additionalProperties":false},"link-type-host":{"type":"object","description":"","properties":{"type":{"type":"string","const":"host"},"endpoint":{"$ref":"#/definitions/link-endpoint"},"host-interface":{"$ref":"#/definitions/link-host-interface"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/labels"}},"required":["type","endpoint","host-interface"],"additionalProperties":false},"link-type-vxlan":{"type":"object","description":"","properties":{"type":{"type":"string","const":"vxlan"},"endpoint":{"$ref":"#/definitions/link-endpoint"},"remote":{"$ref":"#/definitions/link-vxlan-remote"},"vni":{"$ref":"#/definitions/link-vxlan-vni"},"udp-port":{"$ref":"#/definitions/link-vxlan-udpport"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/labels"}},"required":["type","endpoint","remote","vni","udp-port"],"additionalProperties":false},"link-type-vxlan-stitched":{"type":"object","description":"","properties":{"type":{"type":"string","const":"vxlan-stitch"},"endpoint":{"$ref":"#/definitions/link-endpoint"},"remote":{"$ref":"#/definitions/link-vxlan-remote"},"vni":{"$ref":"#/definitions/link-vxlan-vni"},"udp-port":{"$ref":"#/definitions/link-vxlan-udpport"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/labels"}},"required":["type","endpoint","remote","vni","udp-port"],"additionalProperties":false},"link-type-dummy":{"type":"object","description":"","properties":{"type":{"type":"string","const":"dummy"},"endpoint":{"$ref":"#/definitions/link-endpoint"},"mtu":{"$ref":"#/definitions/mtu"},"vars":{"$ref":"#/definitions/link-vars"},"labels":{"$ref":"#/definitions/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})"}},"required":["node","interface"],"additionalProperties":false},"link-vxlan-remote":{"anyOf":[{"$ref":"#/definitions/ipv4-addr"},{"$ref":"#/definitions/ipv6-addr"}]},"link-vxlan-vni":{"type":"integer","description":"VXLAN VNI","minimum":1,"maximum":16777215},"link-vxlan-udpport":{"type":"integer","description":"Remote 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"},"labels":{"type":"object","description":"container labels","markdownDescription":"container [labels](https://containerlab.dev/manual/nodes/#labels)","patternProperties":{".+":{"anyOf":[{"type":"string","minItems":1},{"type":"number","minItems":1}]}}},"link-host-interface":{"type":"string","description":"link-scoped variables used by config engine","markdownDescription":"link-scoped variables used by config engine"},"extras-config":{"type":"object","description":"node's extra configurations","properties":{"srl-agents":{"type":"array","description":"list of SR Linux agent's config files to be copied to the NOS filesystem","markdownDescription":"list of [SR Linux agent's config files](https://containerlab.dev/manual/kinds/srl/#user-defined-custom-agents-for-sr-linux-nodes) to be copied to the NOS filesystem","minItems":1,"items":{"type":"string"},"uniqueItems":true},"mysocket-proxy":{"type":"string","description":"http/s proxy to be used by mysocketctl"}},"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"}},"additionalProperties":false,"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"]}]}}]},"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":"#/definitions/wait-for-config"},"exec":{"$ref":"#/definitions/stage-exec"}},"additionalProperties":false},"create-links":{"type":"object","description":"create stage configuration","properties":{"wait-for":{"$ref":"#/definitions/wait-for-config"},"exec":{"$ref":"#/definitions/stage-exec"}},"additionalProperties":false},"configure":{"type":"object","description":"create stage configuration","properties":{"wait-for":{"$ref":"#/definitions/wait-for-config"},"exec":{"$ref":"#/definitions/stage-exec"}},"additionalProperties":false},"healthy":{"type":"object","description":"create stage configuration","properties":{"wait-for":{"$ref":"#/definitions/wait-for-config"},"exec":{"$ref":"#/definitions/stage-exec"}},"additionalProperties":false},"exit":{"type":"object","description":"create stage configuration","properties":{"wait-for":{"$ref":"#/definitions/wait-for-config"},"exec":{"$ref":"#/definitions/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":"#/definitions/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":"#/definitions/stage-exec-list"},"on-exit":{"$ref":"#/definitions/stage-exec-list"}},"additionalProperties":false},{"type":"array","description":"List of exec commands as objects, each containing `command`, `target`, and `phase`","items":{"type":"object","additionalProperties":false,"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)"}},"required":["command","phase"]}}]},"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}]+)?$"}},"type":"object","properties":{"name":{"description":"topology name","type":"string"},"prefix":{"description":"lab prefix","type":"string","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":"#/definitions/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":"#/definitions/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":"#/definitions/mtu"}},"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","patternProperties":{".*":{"oneOf":[{"type":"null"},{"$ref":"#/definitions/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":"#/definitions/node-config"},"arista_ceos":{"$ref":"#/definitions/node-config"},"vyosnetworks_vyos":{"$ref":"#/definitions/node-config"},"juniper_crpd":{"$ref":"#/definitions/node-config"},"sonic-vs":{"$ref":"#/definitions/node-config"},"sonic-vm":{"$ref":"#/definitions/node-config"},"dell_ftosv":{"$ref":"#/definitions/node-config"},"dell_sonic":{"$ref":"#/definitions/node-config"},"nokia_sros":{"$ref":"#/definitions/node-config"},"juniper_vmx":{"$ref":"#/definitions/node-config"},"juniper_vsrx":{"$ref":"#/definitions/node-config"},"juniper_vjunosrouter":{"$ref":"#/definitions/node-config"},"juniper_vjunosswitch":{"$ref":"#/definitions/node-config"},"juniper_vjunosevolved":{"$ref":"#/definitions/node-config"},"aruba_aoscx":{"$ref":"#/definitions/node-config"},"cisco_xrv":{"$ref":"#/definitions/node-config"},"cisco_xrv9k":{"$ref":"#/definitions/node-config"},"cisco_nxos":{"$ref":"#/definitions/node-config"},"cisco_csr":{"$ref":"#/definitions/node-config"},"cisco_cat9kv":{"$ref":"#/definitions/node-config"},"cisco_ftdv":{"$ref":"#/definitions/node-config"},"cisco_iol":{"$ref":"#/definitions/node-config"},"linux":{"$ref":"#/definitions/node-config"},"bridge":{"$ref":"#/definitions/node-config"},"ovs-bridge":{"$ref":"#/definitions/node-config"},"host":{"$ref":"#/definitions/node-config"},"ipinfusion_ocnos":{"$ref":"#/definitions/node-config"},"keysight_ixia-c-one":{"$ref":"#/definitions/node-config"},"checkpoint_cloudguard":{"$ref":"#/definitions/node-config"},"ext-container":{"$ref":"#/definitions/node-config"},"cisco_xrd":{"$ref":"#/definitions/node-config"},"rare":{"$ref":"#/definitions/node-config"},"cisco_8000":{"$ref":"#/definitions/node-config"},"cisco_c8000v":{"$ref":"#/definitions/node-config"},"cumulus_cvx":{"$ref":"#/definitions/node-config"},"openbsd":{"$ref":"#/definitions/node-config"},"freebsd":{"$ref":"#/definitions/node-config"},"huawei_vrp":{"$ref":"#/definitions/node-config"},"generic_vm":{"$ref":"#/definitions/node-config"},"fdio_vpp":{"$ref":"#/definitions/node-config"}},"additionalProperties":false},"defaults":{"$ref":"#/definitions/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":"#/definitions/link-config-short"},{"$ref":"#/definitions/link-type-veth"},{"$ref":"#/definitions/link-type-mgmt-net"},{"$ref":"#/definitions/link-type-macvlan"},{"$ref":"#/definitions/link-type-host"},{"$ref":"#/definitions/link-type-vxlan"},{"$ref":"#/definitions/link-type-vxlan-stitched"},{"$ref":"#/definitions/link-type-dummy"}]}}},"additionalProperties":false,"required":["nodes"]},"settings":{"description":"Global containerlab settings","markdownDescription":"Global [containerlab settings]()","type":"object","properties":{"certificate-authority":{"$ref":"#/definitions/certificate-authority-config"}},"additionalProperties":false}},"additionalProperties":false,"required":["name","topology"]}
</schema>

[User] Provide a JSON object that satisfies the schema "Containerlab topology definition file". Here are the required top‑level fields: name, topology. Return only the valid JSON object.

Containerlab topology definition file

topology node configuration container

topology [node](https://containerlab.dev/manual/nodes/) configuration container

container image to use for this node

container [image](https://containerlab.dev/manual/nodes/#image) to use for this node

policy for pulling the referenced container image

container [image-pull-policy](https://containerlab.dev/manual/nodes/#image-pull-policy) to use for this node

always Always never Never ifnotpresent IfNotPresent

restart policy for the referenced container image

container [restart-policy](https://containerlab.dev/manual/nodes/#restart-policy) to use for this node

no No on-failure On-failure Always always unless-stopped Unless-stopped

kind of this node

[kind](https://containerlab.dev/manual/nodes/#kind) of this node

path to a license file

path to a [license](https://containerlab.dev/manual/nodes/#license) file

type is a per-node property that can select a special type of a node

grouping parameter of a node. A free form string that is mainly used in sorting elements when graphing

path to a [license](https://containerlab.dev/manual/nodes/#group) file

path to a startup config file (if supported by the kind)

path to a startup [config file](https://containerlab.dev/manual/nodes/#startup-config) (if supported by the kind)

Optional startup delay (seconds) to apply

Optional [startup delay](https://containerlab.dev/manual/nodes/#startup-delay) in seconds

Set to `true` to make the node to boot with a startup-config even if the config file is present in the lab directory

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

Set to `true` to remove the node automatically, instead of auto-restarting

Set to `true` to [remove the node/container automatically](https://containerlab.dev/manual/nodes/#auto-remove), instead of auto-restarting it

list of commands to execute post deploy

list of [commands to execute](https://containerlab.dev/manual/nodes/#exec) post deploy

list of file/directory bindings

list of file/directory [bindings](https://containerlab.dev/manual/nodes/#binds)

list of port mappings

list of [port](https://containerlab.dev/manual/nodes/#ports) mappings

environment variables

user to use within the container

[user](https://containerlab.dev/manual/nodes/#user) to use within the container

container's entrypoint

command to launch container with

[command](https://containerlab.dev/manual/nodes/#cmd) to launch container with

Runtime used to launch the container node

[Runtime](https://containerlab.dev/manual/nodes/#runtime) for the node

IPv4 management address of the node (e.g. 172.10.10.11)

[IPv4 management address](https://containerlab.dev/manual/nodes/#mgmt-ipv4) of the node (e.g. 172.10.10.11)

IPv6 management address of the node (e.g. 172.10.10.11)

[IPv6 management address](https://containerlab.dev/manual/nodes/#mgmt-ipv6) of the node (e.g. 172.10.10.11)

node network mode (can only be set host, defaults to bridge)

node [network mode](https://containerlab.dev/manual/nodes/#network-mode) (can only be set host, defaults to bridge)

number of vcpu to allocate for this node/container

Allowed [CPU](https://containerlab.dev/manual/nodes/#cpu) usage by the node/container

memory limit for this node/container

Allowed [Memory](https://containerlab.dev/manual/nodes/#memory) usage by the node/container

CPU cores to use by this node/container

[CPU cores](https://containerlab.dev/manual/nodes/#cpu-set) to be used by the node/container

ignite's sandbox image name

ignite's kernel image name

list of additional network aliases for the node

list of [aliases](https://containerlab.dev/manual/nodes/#aliases) for the node

type of a node

link configuration container

endpoints list

Link definition to support the veth interfaces

Link definition to support the veth interfaces

Endpoints for the links

Link definition for management network interfaces

Link definition describing a macvlan link endpoint configuration

Common link endpoint object for extended link configs

VXLAN VNI

Remote UDP port

link-scoped variables used by config engine

link-scoped variables used by config engine

container labels

node's extra configurations

list of SR Linux agent's config files to be copied to the NOS filesystem

list of [SR Linux agent's config files](https://containerlab.dev/manual/kinds/srl/#user-defined-custom-agents-for-sr-linux-nodes) to be copied to the NOS filesystem

http/s proxy to be used by mysocketctl

containerlab config engine parameters

config variables passed to config engine

config variables passed to config engine

Node's Certificate configuration option

Node's [Certificate configuration options](https://containerlab.dev/manual/nodes/#certificate)

Set to `true` to generate a TLS certificate for the node

Set to `true` to [generate a TLS certificate for the node](https://containerlab.dev/manual/nodes/#certificate)

list of subject alternative names (SAN) to use for this node

list of [subject alternative names](https://containerlab.dev/manual/nodes/#subject-alternative-names) to use for this node

size of the to be generated key

Duration for how long the certificate issued by the CA will be valid.

Node's Healthcheck configuration option

Node's [Healthcheck configuration options](https://containerlab.dev/manual/nodes/#healthcheck)

test command

test execution interval

test execution retries

test execution timeout in seconds

time in seconds to wait before starting the healthcheck

Node's DNS configuration option

Node's [DNS configuration options](https://containerlab.dev/manual/nodes/#dns)

DNS server addresses

DNS search domains

DNS options

Certificate Authority

Path to the CA certificate file. If set, it is expected that the CA certificate already exists by that path

Path to the CA key file. If set, it is expected that the CA certificate already exists by that path

Key size. Can only be set if the external CA certificate is not provided

CA certificate validity duration. Can only be set if the external CA certificate is not provided

node's stages configurations

create stage configuration

create stage configuration

create stage configuration

create stage configuration

create stage configuration

node name to wait for

phase to wait for

Dependency list for the node

create create-links configure healthy exit

per-stage exec configuration

List of exec commands as objects, each containing `command`, `target`, and `phase`

Shell command to execute

Location to run the command (e.g. 'container', 'host')

Phase to execute this command (on-enter or on-exit)

list of commands to execute

MTU for the custom network

[MTU](https://containerlab.dev/manual/network/#mtu) in Bytes for the custom management network

IPv4 address

IPv6 address

topology name

lab prefix

configuration container for management network

configuration container for [management network](https://containerlab.dev/manual/network/#management-network)

management network name

Set bridge to use for the management network (instead of the default generated bridge).

Set [bridge](https://containerlab.dev/manual/network/#bridge-name) to use for the management network (instead of the default generated bridge).

IPv4 subnet to use for the custom management network. e.g. 172.100.100.0/24

[IPv4 subnet](https://containerlab.dev/manual/network/#user-defined-addresses) to use for the custom management network. e.g. 172.100.100.0/24

IPv6 subnet to use for the custom management network. e.g. 3fff:172:100:100::/64

[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

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

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

IPv4 range out of the ipv4-subnet to use for the custom management network. e.g. 172.100.100.128/25

[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

IPv6 range out of the ipv6-subnet to use for the custom management network. e.g. 3fff:172:100:100:8000::/65

[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

MTU for the custom network

topology configuration container

topology nodes configuration container

topology [nodes](https://containerlab.dev/manual/nodes/) configuration container

topology kinds configuration container

topology [kinds](https://containerlab.dev/manual/topo-def-file/#kinds) configuration container

topology links section

Global containerlab settings

Provide a JSON object that satisfies the schema "Containerlab topology definition file". Here are the required top‑level fields: name, topology. Return only the valid JSON object.