├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .editorconfig ├── .env ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── documentation.md │ ├── enhancement.md │ └── validation.md ├── dependabot.yml ├── get-container-tags.sh └── workflows │ ├── devcontainer-build.yml │ ├── devcontainer-devc.yml │ ├── devcontainer-release.yml │ ├── integration.yml │ ├── pypi.yml │ ├── test-pypi.yml │ └── tests.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pylintrc ├── .readthedocs.yaml ├── .yamllint ├── LICENSE.md ├── MANIFEST.in ├── README.md ├── docs ├── Makefile ├── _static │ ├── css │ │ └── custom.css │ └── images │ │ └── favicon.png ├── _templates │ ├── breadcrumbs.html │ ├── footer.html │ └── layout.html ├── addressing.md ├── caveats.md ├── cli-overview.md ├── components.md ├── conf.py ├── custom-config-templates.md ├── customize.md ├── defaults.md ├── dev │ ├── advanced.md │ ├── clab-netns.md │ ├── config │ │ ├── bfd.md │ │ ├── bgp.md │ │ ├── deploy.md │ │ ├── gateway.md │ │ ├── index.md │ │ ├── initial.md │ │ ├── ospf.md │ │ ├── routing.md │ │ ├── vlan.md │ │ └── vrf.md │ ├── device-box.md │ ├── device-features.md │ ├── device-platform.md │ ├── devices.md │ ├── doubt.md │ ├── extools.md │ ├── groups-pre-transform.md │ ├── guidelines.md │ ├── integration-tests.md │ ├── module-attributes.md │ ├── plugins.md │ ├── quirks.md │ ├── tests.md │ ├── transform.md │ ├── unnumbered.md │ ├── validation.md │ ├── versioning.md │ ├── vlan-interface-attributes.md │ └── vlan-vrf-vxlan-evpn-transform.md ├── example │ ├── addr-builtin.txt │ ├── addr-complex.txt │ ├── addr-custom-pools.txt │ ├── addr-ipv6.txt │ ├── addr-static.txt │ ├── addressing-tutorial.md │ ├── bridge.md │ ├── external.md │ ├── github.md │ ├── link-definition.md │ ├── linux.md │ ├── release.md │ ├── selecting-vlan-mode.md │ ├── topo-tutorial.png │ ├── vlan-addressing.md │ └── vrf-tutorial.md ├── extend-attributes.md ├── extool │ ├── edgeshark.md │ ├── graphite.md │ ├── nso.md │ └── suzieq.md ├── extools.md ├── groups.md ├── high-level-architecture.png ├── index.md ├── install.md ├── install │ ├── clone.md │ ├── cloud.md │ ├── linux-architecture.png │ ├── linux.md │ ├── ubuntu-on-desktop-os.png │ ├── ubuntu-vm.md │ ├── ubuntu.md │ └── virtual-box-architecture.png ├── labs │ ├── arubacx.md │ ├── arubacx.txt │ ├── asav.md │ ├── asav.txt │ ├── cat8000v.md │ ├── cat8000v.txt │ ├── ceos.md │ ├── clab.md │ ├── csr.md │ ├── csr.txt │ ├── cumulus_nvue.md │ ├── dellos10.md │ ├── dellos10.txt │ ├── eos.md │ ├── eos.txt │ ├── external.md │ ├── fortios.md │ ├── fortios.txt │ ├── iosv.md │ ├── iosv.txt │ ├── iosvl2.md │ ├── iosvl2.txt │ ├── iosxr.md │ ├── iosxr.txt │ ├── libvirt-box-caveats.md │ ├── libvirt.md │ ├── linux.md │ ├── multi-provider.md │ ├── nxos.md │ ├── nxos.txt │ ├── routeros7.md │ ├── routeros7.txt │ ├── sonic.md │ ├── sonic.txt │ ├── virtualbox.md │ ├── vptx.md │ ├── vptx.txt │ ├── vsrx.md │ └── vsrx.txt ├── links.md ├── make.bat ├── module-reference.md ├── module │ ├── SR-Simple.png │ ├── bfd.md │ ├── bgp.md │ ├── bgp_example │ │ ├── ebgp.md │ │ ├── ibgp.md │ │ └── simple.md │ ├── dhcp.md │ ├── eigrp.md │ ├── evpn.md │ ├── gateway.md │ ├── isis.md │ ├── lag-topologies.png │ ├── lag.md │ ├── mpls.md │ ├── ospf.md │ ├── ripv2.md │ ├── routing.md │ ├── routing_protocols.md │ ├── sr-mpls.md │ ├── srv6.md │ ├── stp.md │ ├── vlan.md │ ├── vrf.md │ └── vxlan.md ├── modules.md ├── netlab │ ├── capture.md │ ├── clab.md │ ├── clab_build.png │ ├── cli.md │ ├── collect.md │ ├── config.md │ ├── connect.md │ ├── create.md │ ├── create.png │ ├── defaults.md │ ├── down.md │ ├── exec.md │ ├── graph.md │ ├── initial.md │ ├── initial.png │ ├── inspect.md │ ├── install-warnings.png │ ├── install.md │ ├── libvirt.md │ ├── netlab-validate-example.png │ ├── report.md │ ├── restart.md │ ├── show.md │ ├── status.md │ ├── test.md │ ├── up.md │ ├── up.png │ ├── usage.md │ └── validate.md ├── node-roles.md ├── nodes.md ├── outputs │ ├── ansible.md │ ├── d2.md │ ├── devices.md │ ├── graph.md │ ├── index.md │ ├── provider.md │ ├── report.md │ └── yaml-or-json.md ├── platforms.md ├── plugins.md ├── plugins │ ├── bgp.domain.md │ ├── bgp.originate.md │ ├── bgp.policy.md │ ├── bgp.session.md │ ├── bonding.md │ ├── check.config.md │ ├── ebgp.multihop.md │ ├── fabric.md │ ├── firewall.zonebased.md │ ├── mlag.vtep.md │ ├── multilab.md │ ├── node.clone.md │ ├── topology_bgp.domain.png │ └── vrrp.version.md ├── prefix.md ├── providers.md ├── release-archive.md ├── release.md ├── release │ ├── 0.3.md │ ├── 0.4.md │ ├── 0.5.md │ ├── 0.6.md │ ├── 0.7.md │ ├── 0.8.md │ ├── 0.9.md │ ├── 1.0.md │ ├── 1.1.md │ ├── 1.2.md │ ├── 1.3.md │ ├── 1.4.md │ ├── 1.5.md │ ├── 1.6.md │ ├── 1.7.md │ ├── 1.8.md │ ├── 1.9.md │ └── 2.0.md ├── requirements.txt ├── roadmap │ ├── external-interface.md │ ├── index.md │ ├── tools.md │ └── usage.md ├── topo-bandwidth.png ├── topology-overview.md ├── topology-reference.md ├── topology │ ├── hierarchy.md │ └── validate.md └── tutorials.md ├── legacy ├── README.md └── setup.py ├── mypy.ini ├── netlab ├── netsim ├── __init__.py ├── ansible │ ├── collect-configs.ansible │ ├── config.ansible │ ├── create-config.ansible │ ├── device-ready.ansible │ ├── initial-config.ansible │ ├── missing.yml │ ├── reload-config.ansible │ ├── tasks │ │ ├── create-config.yml │ │ ├── create-custom-config.yml │ │ ├── deploy-config │ │ │ ├── arcos.yml │ │ │ ├── arubacx.yml │ │ │ ├── asa.yml │ │ │ ├── cumulus.yml │ │ │ ├── cumulus_nvue.yml │ │ │ ├── dellos10.yml │ │ │ ├── eos.yml │ │ │ ├── frr.yml │ │ │ ├── ios.yml │ │ │ ├── iosxr.yml │ │ │ ├── junos.yml │ │ │ ├── linux-clab.yml │ │ │ ├── linux.yml │ │ │ ├── missing.yml │ │ │ ├── none.yml │ │ │ ├── nxos.yml │ │ │ ├── routeros.yml │ │ │ ├── routeros7.yml │ │ │ ├── sonic.yml │ │ │ ├── srlinux.yml │ │ │ ├── sros.yml │ │ │ └── vyos.yml │ │ ├── deploy-custom-config.yml │ │ ├── deploy-module.yml │ │ ├── fetch-config │ │ │ ├── arcos.yml │ │ │ ├── arubacx.yml │ │ │ ├── asa.yml │ │ │ ├── cumulus.yml │ │ │ ├── cumulus_nvue.yml │ │ │ ├── dellos10.yml │ │ │ ├── eos.yml │ │ │ ├── fortinet.fortios.fortios.yml │ │ │ ├── frr.yml │ │ │ ├── ios.yml │ │ │ ├── iosxr.yml │ │ │ ├── junos.yml │ │ │ ├── nxos.yml │ │ │ ├── routeros.yml │ │ │ ├── routeros7.yml │ │ │ ├── sonic.yml │ │ │ ├── srlinux.yml │ │ │ ├── sros.yml │ │ │ └── vyos.yml │ │ ├── fortinet.fortios.fortios │ │ │ ├── initial.yml │ │ │ └── ospf.yml │ │ ├── frr │ │ │ ├── deploy-config.yml │ │ │ └── initial-clab.yml │ │ ├── initial-config.yml │ │ ├── linux │ │ │ └── dhcp.yml │ │ ├── readiness-check │ │ │ ├── arubacx-clab.yml │ │ │ ├── cat8000v-clab.yml │ │ │ ├── csr-clab.yml │ │ │ ├── dellos10-clab.yml │ │ │ ├── eos-clab.yml │ │ │ ├── iol-clab.yml │ │ │ ├── ioll2-clab.yml │ │ │ ├── ios-clab.yml │ │ │ ├── iosxr-clab.yml │ │ │ ├── iosxr-libvirt.yml │ │ │ ├── nxos-clab.yml │ │ │ ├── nxos.yml │ │ │ ├── routeros7.yml │ │ │ ├── sros.yml │ │ │ ├── vjunos-router-clab.yml │ │ │ ├── vjunos-router.yml │ │ │ ├── vjunos-switch-clab.yml │ │ │ ├── vjunos-switch.yml │ │ │ ├── vm-clab-ssh-check.yml │ │ │ ├── vmx-clab.yml │ │ │ ├── vptx-clab.yml │ │ │ ├── vptx.yml │ │ │ └── vsrx-clab.yml │ │ ├── reload-config │ │ │ ├── _copy_config.yml │ │ │ ├── eos.yml │ │ │ ├── ios.yml │ │ │ └── srlinux.yml │ │ ├── vmx │ │ │ └── initial.yml │ │ └── wait-for-ready.yml │ └── templates │ │ ├── bfd │ │ ├── arubacx.j2 │ │ ├── bird.j2 │ │ ├── cumulus.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── none.j2 │ │ ├── nxos.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ │ ├── bgp │ │ ├── arubacx.j2 │ │ ├── arubacx.macro.j2 │ │ ├── asa.j2 │ │ ├── asa.macro.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── cumulus_nvue.macro.j2 │ │ ├── dellos10.j2 │ │ ├── dellos10.macro.j2 │ │ ├── eos.j2 │ │ ├── eos.macro.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── ios.macro.j2 │ │ ├── iosxr.j2 │ │ ├── junos.j2 │ │ ├── junos.macro.j2 │ │ ├── junos.policy.j2 │ │ ├── none.j2 │ │ ├── nxos.j2 │ │ ├── routeros.j2 │ │ ├── routeros.macro.j2 │ │ ├── routeros7.j2 │ │ ├── routeros7.macro.j2 │ │ ├── sonic.j2 │ │ ├── srlinux.j2 │ │ ├── srlinux.macro.j2 │ │ ├── sros.gnmi.macro.j2 │ │ ├── sros.j2 │ │ ├── sros.openconfig.j2 │ │ ├── vyos.j2 │ │ └── vyos.macro.j2 │ │ ├── dhcp │ │ ├── cumulus.j2 │ │ ├── dnsmasq.j2 │ │ ├── eos.j2 │ │ ├── eos.server.j2 │ │ ├── ios.j2 │ │ ├── ios.server.j2 │ │ ├── linux-isc-dhcp-relay.j2 │ │ └── linux.j2 │ │ ├── eigrp │ │ ├── ios.j2 │ │ └── nxos.j2 │ │ ├── evpn │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.evpn-config.j2 │ │ ├── frr.j2 │ │ ├── nxos.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ ├── vjunos-switch.j2 │ │ └── vyos.j2 │ │ ├── gateway │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── frr.vrrp-config.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── nxos.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ │ ├── initial │ │ ├── arcos.j2 │ │ ├── arubacx.j2 │ │ ├── arubacx.vlan.j2 │ │ ├── arubacx.vrf.j2 │ │ ├── asa.j2 │ │ ├── bird-clab.j2 │ │ ├── cat8000v.vlan.j2 │ │ ├── csr.vlan.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── dellos10.vrf.j2 │ │ ├── eos.j2 │ │ ├── eos.vrf.j2 │ │ ├── frr.j2 │ │ ├── frr │ │ │ └── daemons.j2 │ │ ├── iol.vlan.j2 │ │ ├── ioll2.vlan.j2 │ │ ├── ios.j2 │ │ ├── ios.vlan.j2 │ │ ├── ios.vrf.j2 │ │ ├── iosvl2.vlan.j2 │ │ ├── iosxr.j2 │ │ ├── junos.j2 │ │ ├── junos.vlan.j2 │ │ ├── junos.vrf.j2 │ │ ├── linux-clab.j2 │ │ ├── linux.j2 │ │ ├── linux │ │ │ ├── bash_profile.j2 │ │ │ ├── create-bond.j2 │ │ │ ├── hosts-common.j2 │ │ │ ├── hosts.j2 │ │ │ ├── packages.j2 │ │ │ ├── ubuntu.j2 │ │ │ ├── vanilla-ifconfig.j2 │ │ │ └── vanilla.j2 │ │ ├── nxos.j2 │ │ ├── nxos.vrf.j2 │ │ ├── routeros.j2 │ │ ├── routeros.vlan.j2 │ │ ├── routeros.vrf.j2 │ │ ├── routeros7.j2 │ │ ├── routeros7.vlan.j2 │ │ ├── routeros7.vrf.j2 │ │ ├── sonic.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ ├── sros.openconfig.j2 │ │ ├── vyos.j2 │ │ ├── vyos.vlan.j2 │ │ └── vyos.vrf.j2 │ │ ├── isis │ │ ├── asa.j2 │ │ ├── eos.j2 │ │ ├── eos.macro.j2 │ │ ├── frr.j2 │ │ ├── frr.macro.j2 │ │ ├── ios.j2 │ │ ├── iosxr.j2 │ │ ├── junos.j2 │ │ ├── nxos.j2 │ │ ├── srlinux.j2 │ │ ├── srlinux.macro.j2 │ │ ├── sros.j2 │ │ ├── sros.openconfig.j2 │ │ └── vyos.j2 │ │ ├── lag │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── linux-clab.j2 │ │ └── linux.j2 │ │ ├── missing.j2 │ │ ├── mpls │ │ ├── arubacx.j2 │ │ ├── arubacx.ldp.j2 │ │ ├── arubacx.mplsvpn.j2 │ │ ├── eos.6pe.j2 │ │ ├── eos.bgp-lu.j2 │ │ ├── eos.j2 │ │ ├── eos.ldp.j2 │ │ ├── eos.mplsvpn.j2 │ │ ├── frr.frr-config.j2 │ │ ├── frr.j2 │ │ ├── frr.ldp.j2 │ │ ├── frr.mplsvpn.j2 │ │ ├── ios.6pe.j2 │ │ ├── ios.bgp-lu.j2 │ │ ├── ios.j2 │ │ ├── ios.ldp.j2 │ │ ├── ios.mplsvpn.j2 │ │ ├── junos.j2 │ │ ├── junos.ldp.j2 │ │ ├── junos.mplsvpn.j2 │ │ ├── routeros.j2 │ │ ├── routeros.ldp.j2 │ │ ├── routeros.mplsvpn.j2 │ │ ├── routeros7.j2 │ │ ├── routeros7.ldp.j2 │ │ ├── routeros7.mplsvpn.j2 │ │ ├── srlinux.j2 │ │ ├── srlinux.ldp.j2 │ │ ├── sros.bgp.j2 │ │ ├── sros.j2 │ │ ├── sros.ldp.j2 │ │ ├── sros.mplsvpn.j2 │ │ ├── vyos.j2 │ │ ├── vyos.ldp.j2 │ │ └── vyos.mplsvpn.j2 │ │ ├── normalize │ │ ├── eos.j2 │ │ ├── ioll2.j2 │ │ └── iosvl2.j2 │ │ ├── ospf │ │ ├── arcos.j2 │ │ ├── arubacx.j2 │ │ ├── arubacx.ospfv2.j2 │ │ ├── arubacx.ospfv3.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus.ospfv2.j2 │ │ ├── cumulus.ospfv3.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── dellos10.macro.j2 │ │ ├── dellos10.ospfv2.j2 │ │ ├── dellos10.ospfv3.j2 │ │ ├── eos.j2 │ │ ├── eos.ospfv2.j2 │ │ ├── eos.ospfv3.j2 │ │ ├── fortinet.fortios.fortios.j2 │ │ ├── frr.j2 │ │ ├── frr.ospfv2.j2 │ │ ├── frr.ospfv3.j2 │ │ ├── ios.j2 │ │ ├── ios.ospfv2.j2 │ │ ├── ios.ospfv3.j2 │ │ ├── iosxr.j2 │ │ ├── iosxr.ospfv2.j2 │ │ ├── iosxr.ospfv3.j2 │ │ ├── junos.j2 │ │ ├── junos.macro.j2 │ │ ├── none.j2 │ │ ├── nxos.j2 │ │ ├── nxos.ospfv2.j2 │ │ ├── nxos.ospfv3.j2 │ │ ├── routeros.j2 │ │ ├── routeros7.j2 │ │ ├── routeros7.ospf-include.j2 │ │ ├── srlinux.j2 │ │ ├── srlinux.macro.j2 │ │ ├── sros.j2 │ │ ├── sros.openconfig.j2 │ │ ├── vyos.default.j2 │ │ ├── vyos.j2 │ │ ├── vyos.ospfv2.j2 │ │ └── vyos.ospfv3.j2 │ │ ├── ripv2 │ │ ├── cumulus.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── frr.macro.j2 │ │ ├── ios.j2 │ │ ├── ios.macro.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ │ ├── routing │ │ ├── _default.ios.j2 │ │ ├── _prefix_list_ios.j2 │ │ ├── _prefix_list_junos.j2 │ │ ├── _prefix_list_vyos.j2 │ │ ├── _redistribute.cumulus_nvue.j2 │ │ ├── _redistribute.eos.j2 │ │ ├── _redistribute.frr.j2 │ │ ├── _redistribute.ios.j2 │ │ ├── _redistribute.srlinux.j2 │ │ ├── _route_map_ios.j2 │ │ ├── _route_policy_junos.j2 │ │ ├── _route_policy_vyos.j2 │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── linux-clab.j2 │ │ ├── linux.j2 │ │ ├── linux │ │ │ ├── ubuntu.j2 │ │ │ └── vanilla.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ │ ├── sr │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── sros.openconfig.j2 │ │ ├── srv6 │ │ ├── frr.bgp.j2 │ │ ├── frr.j2 │ │ └── sros.j2 │ │ ├── stp │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ └── frr.j2 │ │ ├── vlan │ │ ├── arubacx.j2 │ │ ├── cat8000v.j2 │ │ ├── csr.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── iol.j2 │ │ ├── ioll2.j2 │ │ ├── ios.j2 │ │ ├── iosvl2.j2 │ │ ├── linux-clab.j2 │ │ ├── nxos.j2 │ │ ├── routeros.j2 │ │ ├── routeros7.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ ├── vjunos-router.j2 │ │ ├── vjunos-switch.j2 │ │ ├── vmx.j2 │ │ ├── vptx.j2 │ │ ├── vsrx.j2 │ │ └── vyos.j2 │ │ ├── vrf │ │ ├── arubacx.bgp-macro.j2 │ │ ├── arubacx.bgp.j2 │ │ ├── arubacx.j2 │ │ ├── arubacx.ospfv2-vrf.j2 │ │ ├── arubacx.ospfv3-vrf.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.bgp-macro.j2 │ │ ├── dellos10.bgp.j2 │ │ ├── dellos10.j2 │ │ ├── dellos10.ospfv2-vrf.j2 │ │ ├── eos.bgp-macro.j2 │ │ ├── eos.bgp.j2 │ │ ├── eos.j2 │ │ ├── frr.bgp.j2 │ │ ├── frr.frr-config.j2 │ │ ├── frr.j2 │ │ ├── ios.bgp-macro.j2 │ │ ├── ios.bgp.j2 │ │ ├── ios.j2 │ │ ├── junos.bgp.j2 │ │ ├── junos.j2 │ │ ├── junos.ospf-macro.j2 │ │ ├── nxos.bgp.j2 │ │ ├── nxos.j2 │ │ ├── nxos.ospfv2-vrf.j2 │ │ ├── routeros.bgp-macro.j2 │ │ ├── routeros.bgp.j2 │ │ ├── routeros.j2 │ │ ├── routeros.ospfv2-vrf.j2 │ │ ├── routeros7.bgp-macro.j2 │ │ ├── routeros7.bgp.j2 │ │ ├── routeros7.j2 │ │ ├── routeros7.ospf-include.j2 │ │ ├── routeros7.ospfv2-vrf.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ ├── vyos.bgp-macro.j2 │ │ ├── vyos.bgp.j2 │ │ ├── vyos.default.j2 │ │ ├── vyos.j2 │ │ ├── vyos.ospfv2-vrf.j2 │ │ └── vyos.ospfv3-vrf.j2 │ │ └── vxlan │ │ ├── arubacx.j2 │ │ ├── csr.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── nxos.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ ├── vjunos-switch.j2 │ │ └── vyos.j2 ├── api │ └── __init__.py ├── augment │ ├── __init__.py │ ├── addressing.py │ ├── components.py │ ├── config.py │ ├── devices.py │ ├── groups.py │ ├── links.py │ ├── main.py │ ├── nodes.py │ ├── plugin.py │ ├── tools.py │ ├── topology.py │ └── validate.py ├── cli │ ├── __init__.py │ ├── _nodeset.py │ ├── alias.txt │ ├── ansible.py │ ├── capture.py │ ├── clab.py │ ├── clab_actions │ │ ├── __init__.py │ │ ├── build.py │ │ ├── cleanup.py │ │ └── tarball.py │ ├── collect.py │ ├── config.py │ ├── connect.py │ ├── create.py │ ├── defaults.py │ ├── down.py │ ├── empty.yml │ ├── exec.py │ ├── external_commands.py │ ├── graph.py │ ├── help.py │ ├── initial.py │ ├── inspect.py │ ├── install.py │ ├── libvirt.py │ ├── libvirt_actions │ │ ├── __init__.py │ │ ├── config.py │ │ └── package.py │ ├── read.py │ ├── report.py │ ├── restart.py │ ├── show-usage.txt │ ├── show.py │ ├── show_commands │ │ ├── __init__.py │ │ ├── attributes.py │ │ ├── defaults.py │ │ ├── devices.py │ │ ├── images.py │ │ ├── module_support.py │ │ ├── modules.py │ │ ├── outputs.py │ │ ├── providers.py │ │ └── reports.py │ ├── status.py │ ├── test.py │ ├── up.py │ ├── usage.py │ ├── usage.txt │ ├── usage_actions │ │ ├── __init__.py │ │ ├── show.py │ │ └── utils.py │ ├── validate.py │ └── version.py ├── common.py ├── daemons │ ├── bird.yml │ ├── bird │ │ ├── Dockerfile │ │ ├── Dockerfile.v3 │ │ ├── bgp.j2 │ │ ├── bird.j2 │ │ ├── ospf.j2 │ │ ├── protocols.j2 │ │ └── radv.j2 │ ├── dnsmasq.yml │ └── dnsmasq │ │ ├── Dockerfile │ │ ├── dhcp.j2 │ │ └── dnsmasq.j2 ├── data │ ├── __init__.py │ ├── filemaps.py │ ├── global_vars.py │ ├── types.py │ └── validate.py ├── defaults │ ├── addressing.yml │ ├── attributes.yml │ ├── automation.yml │ ├── const.yml │ ├── hints.yml │ ├── multilab.yml │ ├── netlab.yml │ ├── paths.yml │ ├── ports.yml │ └── warnings.yml ├── devices │ ├── __init__.py │ ├── _common.py │ ├── arubacx.py │ ├── arubacx.yml │ ├── asav.py │ ├── asav.yml │ ├── bird.py │ ├── cat8000v.py │ ├── cat8000v.yml │ ├── csr.py │ ├── csr.yml │ ├── cumulus.py │ ├── cumulus.yml │ ├── cumulus_nvue.py │ ├── cumulus_nvue.yml │ ├── dellos10.py │ ├── dellos10.yml │ ├── eos.py │ ├── eos.yml │ ├── fortios.yml │ ├── frr.py │ ├── frr.yml │ ├── iol.py │ ├── iol.yml │ ├── ioll2.py │ ├── ioll2.yml │ ├── ios.yml │ ├── iosv.py │ ├── iosv.yml │ ├── iosvl2.py │ ├── iosvl2.yml │ ├── iosxr.yml │ ├── junos.py │ ├── junos.yml │ ├── linux.py │ ├── linux.yml │ ├── none.yml │ ├── nxos.py │ ├── nxos.yml │ ├── routeros.yml │ ├── routeros7.yml │ ├── sonic.yml │ ├── srlinux.py │ ├── srlinux.yml │ ├── sros.yml │ ├── unknown.py │ ├── unknown.yml │ ├── vjunos-router.py │ ├── vjunos-router.yml │ ├── vjunos-switch.py │ ├── vjunos-switch.yml │ ├── vmx.py │ ├── vmx.yml │ ├── vptx.py │ ├── vptx.yml │ ├── vsrx.py │ ├── vsrx.yml │ └── vyos.yml ├── extra │ ├── bgp.domain │ │ ├── defaults.yml │ │ └── plugin.py │ ├── bgp.originate │ │ ├── defaults.yml │ │ └── plugin.py │ ├── bgp.policy │ │ ├── _route_map_ios.j2 │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── defaults.yml │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── plugin.py │ │ ├── simple-attributes.yml │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ ├── bgp.session │ │ ├── _sample_bfd_template.j2 │ │ ├── arubacx.j2 │ │ ├── bird.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── defaults.yml │ │ ├── dellos10.j2 │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── nxos.j2 │ │ ├── plugin.py │ │ ├── routeros7.j2 │ │ ├── srlinux.j2 │ │ ├── sros.j2 │ │ └── vyos.j2 │ ├── bonding │ │ ├── defaults.yml │ │ ├── frr.j2 │ │ ├── linux-clab.j2 │ │ ├── linux.j2 │ │ └── plugin.py │ ├── check.config │ │ └── plugin.py │ ├── ebgp.multihop │ │ ├── arubacx.j2 │ │ ├── cumulus.j2 │ │ ├── cumulus_nvue.j2 │ │ ├── defaults.yml │ │ ├── ebgp-multihop-load-balancing.yml │ │ ├── eos.j2 │ │ ├── frr.j2 │ │ ├── ios.j2 │ │ ├── junos.j2 │ │ ├── plugin.py │ │ ├── srlinux.j2 │ │ └── sros.j2 │ ├── ebgp.utils │ │ └── plugin.py │ ├── fabric │ │ ├── defaults.yml │ │ └── plugin.py │ ├── firewall.zonebased │ │ ├── defaults.yml │ │ ├── plugin.py │ │ ├── vsrx.j2 │ │ └── vyos.j2 │ ├── mlag.vtep │ │ ├── defaults.yml │ │ └── plugin.py │ ├── multilab │ │ └── __init__.py │ ├── node.clone │ │ ├── defaults.yml │ │ └── plugin.py │ ├── none │ │ └── none.j2 │ ├── proxy-arp │ │ ├── plugin.py │ │ ├── srlinux.j2 │ │ └── sros.j2 │ ├── test.fixup │ │ └── plugin.py │ ├── test.vrf_check │ │ └── plugin.py │ └── vrrp.version │ │ ├── cumulus_nvue.j2 │ │ ├── defaults.yml │ │ ├── dellos10.j2 │ │ └── plugin.py ├── install │ ├── ansible.sh │ ├── containerlab.sh │ ├── grpc.sh │ ├── libvirt.sh │ ├── libvirt │ │ ├── arubacx.txt │ │ ├── asav.txt │ │ ├── asav.xml.j2 │ │ ├── asav │ │ │ └── day0-config │ │ ├── cat8000v.txt │ │ ├── cat8000v.xml.j2 │ │ ├── cat8000v │ │ │ └── iosxe_config.txt │ │ ├── csr.txt │ │ ├── dellos10.txt │ │ ├── dellos10 │ │ │ └── run.sh │ │ ├── eos.txt │ │ ├── eos.xml.j2 │ │ ├── fortios.txt │ │ ├── fortios.xml.j2 │ │ ├── iosv.txt │ │ ├── iosv.xml.j2 │ │ ├── iosvl2.txt │ │ ├── iosxr.txt │ │ ├── iosxr │ │ │ └── iosxr_config.txt │ │ ├── nxos.txt │ │ ├── nxos.xml.j2 │ │ ├── routeros7.txt │ │ ├── sonic.txt │ │ ├── sonic.xml.j2 │ │ ├── vptx.txt │ │ ├── vptx.xml.j2 │ │ ├── vptx │ │ │ ├── juniper.conf │ │ │ ├── make-config.sh │ │ │ └── run.sh │ │ ├── vsrx.txt │ │ └── vsrx │ │ │ └── juniper.conf │ └── ubuntu.sh ├── modules │ ├── __init__.py │ ├── _dataplane.py │ ├── _routing.py │ ├── bfd.py │ ├── bfd.yml │ ├── bgp.py │ ├── bgp.yml │ ├── dhcp.py │ ├── dhcp.yml │ ├── eigrp.py │ ├── eigrp.yml │ ├── evpn.py │ ├── evpn.yml │ ├── gateway.py │ ├── gateway.yml │ ├── initial.yml │ ├── isis.py │ ├── isis.yml │ ├── lag.py │ ├── lag.yml │ ├── mpls.py │ ├── mpls.yml │ ├── ospf.py │ ├── ospf.yml │ ├── ripv2.py │ ├── ripv2.yml │ ├── routing.py │ ├── routing.yml │ ├── sr.py │ ├── sr.yml │ ├── srv6.py │ ├── srv6.yml │ ├── stp.py │ ├── stp.yml │ ├── vlan.py │ ├── vlan.yml │ ├── vrf.py │ ├── vrf.yml │ ├── vxlan.py │ └── vxlan.yml ├── outputs │ ├── __init__.py │ ├── ansible.py │ ├── common.py │ ├── d2.py │ ├── d2.yml │ ├── devices.py │ ├── format.py │ ├── graph.py │ ├── graph.yml │ ├── graphite.py │ ├── json.py │ ├── none.py │ ├── provider.py │ ├── report.py │ ├── tools.py │ └── yaml.py ├── providers │ ├── __init__.py │ ├── clab.py │ ├── clab.yml │ ├── external.py │ ├── external.yml │ ├── libvirt.py │ ├── libvirt.yml │ ├── virtualbox.py │ └── virtualbox.yml ├── reports │ ├── addressing-link.html.j2 │ ├── addressing-node.html.j2 │ ├── addressing.html.j2 │ ├── addressing.j2 │ ├── addressing.md.j2 │ ├── bgp-asn.html.j2 │ ├── bgp-asn.md.j2 │ ├── bgp-neighbor-short.md.j2 │ ├── bgp-neighbor.html.j2 │ ├── bgp-neighbor.md.j2 │ ├── bgp-prefix.include.j2 │ ├── bgp.html.j2 │ ├── bgp.j2 │ ├── ipaddr.include.html.j2 │ ├── ipaddr.include.j2 │ ├── mgmt.html.j2 │ ├── mgmt.j2 │ ├── ospf-areas.html.j2 │ ├── ospf-areas.j2 │ ├── ospf-areas.md.j2 │ ├── ospf-utils.include.j2 │ ├── page.html.j2 │ ├── wiring-columns.include.j2 │ ├── wiring.html.j2 │ ├── wiring.j2 │ └── wiring.md.j2 ├── roles │ ├── __init__.py │ ├── bridge.py │ ├── host.py │ └── router.py ├── templates │ ├── ansible.cfg.j2 │ ├── provider │ │ ├── clab │ │ │ ├── clab.j2 │ │ │ ├── cumulus │ │ │ │ ├── hosts-common.j2 │ │ │ │ ├── hosts.j2 │ │ │ │ └── interfaces.j2 │ │ │ ├── eos │ │ │ │ └── ceos-config.j2 │ │ │ ├── frr │ │ │ │ ├── daemons.j2 │ │ │ │ ├── hosts-common.j2 │ │ │ │ └── hosts.j2 │ │ │ └── linux │ │ │ │ ├── hosts-common.j2 │ │ │ │ └── hosts.j2 │ │ ├── external │ │ │ └── external.j2 │ │ ├── libvirt │ │ │ ├── Vagrantfile.j2 │ │ │ ├── _debian_vagrant_password.j2 │ │ │ ├── arcos-domain.j2 │ │ │ ├── arubacx-domain.j2 │ │ │ ├── asav-domain.j2 │ │ │ ├── cat8000v-domain.j2 │ │ │ ├── csr-domain.j2 │ │ │ ├── cumulus-domain.j2 │ │ │ ├── cumulus_nvue-domain.j2 │ │ │ ├── define-domain.j2 │ │ │ ├── dellos10-domain.j2 │ │ │ ├── eos-domain.j2 │ │ │ ├── fortios-domain.j2 │ │ │ ├── forwarded-ports.j2 │ │ │ ├── frr-domain.j2 │ │ │ ├── iosv-domain.j2 │ │ │ ├── iosvl2-domain.j2 │ │ │ ├── iosxr-domain.j2 │ │ │ ├── libvirt-bridge.j2 │ │ │ ├── libvirt-tunnel.j2 │ │ │ ├── linux-domain.j2 │ │ │ ├── none-domain.j2 │ │ │ ├── nxos-domain.j2 │ │ │ ├── routeros-domain.j2 │ │ │ ├── routeros7-domain.j2 │ │ │ ├── sonic-domain.j2 │ │ │ ├── vagrant-libvirt.xml │ │ │ ├── vptx-domain.j2 │ │ │ ├── vsrx-domain.j2 │ │ │ └── vyos-domain.j2 │ │ └── virtualbox │ │ │ ├── Vagrantfile.j2 │ │ │ ├── arcos-domain.j2 │ │ │ ├── cumulus-domain.j2 │ │ │ ├── eos-domain.j2 │ │ │ ├── frr-domain.j2 │ │ │ ├── linux-domain.j2 │ │ │ ├── nxos-domain.j2 │ │ │ ├── virtualbox-network.j2 │ │ │ ├── virtualbox-ports.j2 │ │ │ └── vsrx-domain.j2 │ └── tests │ │ ├── clab.yml │ │ ├── grpc.yml │ │ ├── libvirt.yml │ │ └── virtualbox.yml ├── tools │ ├── __init__.py │ ├── edgeshark.yml │ ├── graphite.py │ ├── graphite.yml │ ├── nso.yml │ ├── suzieq.yml │ └── suzieq │ │ ├── suzieq-cfg.yml │ │ └── suzieq.inventory.j2 ├── topology-defaults.yml ├── utils │ ├── __init__.py │ ├── callback.py │ ├── files.py │ ├── linuxbridge.py │ ├── log.py │ ├── read.py │ ├── routing.py │ ├── sort.py │ ├── stats.py │ ├── status.py │ ├── strings.py │ ├── templates.py │ └── versioning.py └── validate │ ├── __init__.py │ ├── _common.py │ ├── bgp │ ├── __init__.py │ ├── eos.py │ └── frr.py │ ├── cumulus.py │ ├── eos.py │ ├── frr.py │ ├── isis │ ├── __init__.py │ └── frr.py │ ├── linux.py │ ├── ospf │ ├── __init__.py │ ├── eos.py │ └── frr.py │ └── route │ ├── __init__.py │ └── frr.py ├── requirements-dev.txt ├── requirements.txt ├── setup.py ├── setup.sh └── tests ├── .gitignore ├── check-integration-tests.sh ├── compare-transformation-test-case.py ├── coverage.sh ├── create-error-tests.sh ├── create-transformation-test-case.py ├── create-transformation-tests.sh ├── errors ├── addr-errors-intf.log ├── addr-errors-intf.yml ├── addr-errors.log ├── addr-errors.yml ├── addr-link-prefix-invalid-af.log ├── addr-link-prefix-invalid-af.yml ├── addr-no-mgmt-start.log ├── addr-no-mgmt-start.yml ├── addr-no-pools.log ├── addr-no-pools.yml ├── addr-pool-errors.log ├── addr-pool-errors.yml ├── addr-pool-overload.log ├── addr-pool-overload.yml ├── addrs-mgmt-no-start.log ├── addrs-mgmt-no-start.yml ├── anycast-params.log ├── anycast-params.yml ├── anycast-prefix.log ├── anycast-prefix.yml ├── attr-valid-with.log ├── attr-valid-with.yml ├── bf-bgp-as-set-empty.log ├── bf-bgp-as-set-empty.yml ├── bgp-4octet-asdot.log ├── bgp-4octet-asdot.yml ├── bgp-as-list-attr.log ├── bgp-as-list-attr.yml ├── bgp-as-list-not-dict.log ├── bgp-as-list-not-dict.yml ├── bgp-as-list-semantics.log ├── bgp-as-list-semantics.yml ├── bgp-auto-group-overlap.log ├── bgp-auto-group-overlap.yml ├── bgp-auto-group.log ├── bgp-auto-group.yml ├── bgp-cluster-id.log ├── bgp-cluster-id.yml ├── bgp-community-kw.log ├── bgp-community-kw.yml ├── bgp-community.log ├── bgp-community.yml ├── bgp-no-defaults.log ├── bgp-no-defaults.yml ├── bgp-no-params.log ├── bgp-no-params.yml ├── bgp-policy-autobw.log ├── bgp-policy-autobw.yml ├── bgp-policy-mix.log ├── bgp-policy-mix.yml ├── bgp.session-missing-bgp.log ├── bgp.session-missing-bgp.yml ├── bridge.log ├── bridge.yml ├── component-links.log ├── component-links.yml ├── device-data-invalid.log ├── device-data-invalid.yml ├── device-defaults-missing.log ├── device-defaults-missing.yml ├── device-image-datatype.log ├── device-image-datatype.yml ├── device-image-missing.log ├── device-image-missing.yml ├── dup-mgmt-addr.log ├── dup-mgmt-addr.yml ├── duplicate-yaml-section.log ├── duplicate-yaml-section.yml ├── evpn-asym-irb.log ├── evpn-asym-irb.yml ├── gateway-global-params.log ├── gateway-global-params.yml ├── group-device-no-members.log ├── group-device-no-members.yml ├── group-invalid-attr-type.log ├── group-invalid-attr-type.yml ├── group-invalid-device.log ├── group-invalid-device.yml ├── group-invalid-node-config.log ├── group-invalid-node-config.yml ├── groups-duplicate.log ├── groups-duplicate.yml ├── groups-invalid-name.log ├── groups-invalid-name.yml ├── groups-recursive.log ├── groups-recursive.yml ├── ia-bfd.log ├── ia-bfd.yml ├── ia-eigrp.log ├── ia-eigrp.yml ├── ia-isis.log ├── ia-isis.yml ├── ia-node.log ├── ia-node.yml ├── ia-ospf-links.log ├── ia-ospf-links.yml ├── ia-ospf-nodes.log ├── ia-ospf-nodes.yml ├── ia-top.log ├── ia-top.yml ├── ia-vlan.log ├── ia-vlan.yml ├── ia-vrf.log ├── ia-vrf.yml ├── ifname-dup.log ├── ifname-dup.yml ├── invalid-group-all-members.log ├── invalid-group-all-members.yml ├── invalid-group-attribute.log ├── invalid-group-attribute.yml ├── invalid-group-element.log ├── invalid-group-element.yml ├── invalid-group-member-element.log ├── invalid-group-member-element.yml ├── invalid-group-member.log ├── invalid-group-member.yml ├── invalid-group-not-dict.log ├── invalid-group-not-dict.yml ├── invalid-group-vars-element.log ├── invalid-group-vars-element.yml ├── invalid-module.log ├── invalid-module.yml ├── invalid-provider.log ├── invalid-provider.yml ├── invalid-yaml.log ├── invalid-yaml.yml ├── isis-capability.log ├── isis-capability.yml ├── link-group-invalid-attr.log ├── link-group-invalid-attr.yml ├── link-invalid-attr.log ├── link-invalid-attr.yml ├── link-invalid-format.log ├── link-invalid-format.yml ├── link-invalid-group.log ├── link-invalid-group.yml ├── link-invalid-node-addr.log ├── link-invalid-node-addr.yml ├── link-invalid-type.log ├── link-invalid-type.yml ├── link-p2p-too-many-nodes.log ├── link-p2p-too-many-nodes.yml ├── mgmt-subnet.log ├── mgmt-subnet.yml ├── module-device-provider.log ├── module-device-provider.yml ├── module-device-requirements.log ├── module-device-requirements.yml ├── module-missing-prerequisite.log ├── module-missing-prerequisite.yml ├── module-unsupported-device.log ├── module-unsupported-device.yml ├── module-wrong-attr.log ├── module-wrong-attr.yml ├── module-wrong-group-data.log ├── module-wrong-group-data.yml ├── mtu.log ├── mtu.yml ├── multicast-mac.log ├── multicast-mac.yml ├── no-mgmt-addr.log ├── no-mgmt-addr.yml ├── no-nodes.log ├── no-nodes.yml ├── node-dict-invalid-data.log ├── node-dict-invalid-data.yml ├── node-empty.log ├── node-empty.yml ├── node-invalid-name.log ├── node-invalid-name.yml ├── node-list-no-name.log ├── node-list-no-name.yml ├── node-no-device.log ├── node-no-device.yml ├── node-unmanaged-device-type.log ├── node-unmanaged-device-type.yml ├── node-wrong-device.log ├── node-wrong-device.yml ├── ospf-network-type.log ├── ospf-network-type.yml ├── ospf-unnumbered.log ├── ospf-unnumbered.yml ├── rid-no-pool.log ├── rid-no-pool.yml ├── rid-pool-no-ipv4.log ├── rid-pool-no-ipv4.yml ├── rid-pool-overflow.log ├── rid-pool-overflow.yml ├── rp-invalid-data-types-1.log ├── rp-invalid-data-types-1.yml ├── rp-invalid-data-types-2.log ├── rp-invalid-data-types-2.yml ├── rp-set-unsupported.log ├── rp-set-unsupported.yml ├── rp-static-include.log ├── rp-static-include.yml ├── rp-static-nonsense.log ├── rp-static-nonsense.yml ├── rp-static-vrf.log ├── rp-static-vrf.yml ├── rp-vrf-static.log ├── rt-node-module-inconsistent-list.log ├── rt-node-module-inconsistent-list.yml ├── rt-vlan-native-routed.log ├── rt-vlan-native-routed.yml ├── stp-on-l3-intf.log ├── stp-on-l3-intf.yml ├── tools-invalid-tool-type.log ├── tools-invalid-tool-type.yml ├── tools-invalid-type.log ├── tools-invalid-type.yml ├── unnumbered-capability.log ├── unnumbered-capability.yml ├── unnumbered-gw.log ├── unnumbered-gw.yml ├── validate-bool.log ├── validate-bool.yml ├── validate-int.log ├── validate-int.yml ├── validate-list.log ├── validate-list.yml ├── validate-string.log ├── validate-string.yml ├── validation-checks.log ├── validation-checks.yml ├── vlan-attribute-error.log ├── vlan-attribute-error.yml ├── vlan-invalid-attr.log ├── vlan-invalid-attr.yml ├── vlan-invalid-name.log ├── vlan-invalid-name.yml ├── vlan-link-error.log ├── vlan-link-error.yml ├── vlan-node-error.log ├── vlan-node-error.yml ├── vlan-trunk-attribute-error.log ├── vlan-trunk-attribute-error.yml ├── vlan-vlans-not-dict.log ├── vlan-vlans-not-dict.yml ├── vrf-invalid-attr.log ├── vrf-invalid-attr.yml ├── vrf-invalid-datatype.log ├── vrf-invalid-datatype.yml ├── vrf-invalid-name.log ├── vrf-invalid-name.yml ├── vrf-loopback-global.log ├── vrf-loopback-global.yml ├── vrf-unnumbered.log ├── vrf-unnumbered.yml ├── vrf-vrfs-not-dict.log ├── vrf-vrfs-not-dict.yml ├── vxlan-no-link-664.log ├── vxlan-no-link-664.yml ├── wrong-type-with-alt.log └── wrong-type-with-alt.yml ├── integration-legacy ├── evpn │ ├── README.md │ ├── mpls-bridging.yml │ ├── mpls-symmetric-irb.yml │ ├── mpls-vlan-bundle.yml │ ├── vxlan-symmetric-irb-proxy-arp.yml │ └── vxlan-vlan-bundle.yml ├── fabric │ ├── add_hosts.yml │ ├── debug.yml │ ├── ebgp.yml │ ├── ibgp.yml │ └── simple.yml ├── gateway │ ├── anycast │ │ ├── lan-subnet.yml │ │ └── vlan.yml │ └── vrrp │ │ ├── lan-subnet.yml │ │ └── vlan.yml ├── mpls │ ├── 6pe.yml │ ├── ldp.yml │ └── multivendor-mpls.yml └── platform │ ├── ceos.yml │ ├── cumulus.yml │ ├── dellos10.yml │ ├── fortinet.yml │ ├── frr-clab.yml │ ├── routeros.yml │ ├── srlinux.yml │ ├── sros-srlinux.yml │ └── vyos.yml ├── integration ├── bgp.multihop │ ├── 01-global.yml │ ├── 02-vrf.yml │ ├── x-01-global-ipv4.yml │ └── x-03-localas_ibgp.yml ├── bgp.policy │ ├── 10-bgp-bandwidth-auto.yml │ ├── 11-bgp-bandwidth-value.yml │ ├── 12-bgp-bandwidth-value-out.yml │ ├── 21-locpref.yml │ ├── 22-locpref-unnumbered.yml │ ├── 31-med.yml │ ├── 32-med-unnumbered.yml │ ├── 41-prepend.yml │ ├── 42-prepend-unnumbered.yml │ ├── 51-weight.yml │ └── defaults-ds.yml ├── bgp.session │ ├── 01-allowas-in.yml │ ├── 02-as-override.yml │ ├── 04-default-originate.yml │ ├── 05-gtsm.yml │ ├── 06-passive.yml │ ├── 07-password.yml │ ├── 08-remove-private-as.yml │ ├── 10-timers.yml │ ├── 11-rs-client.yml │ ├── 12-rs.yml │ ├── 13-bfd.yml │ ├── 24-default-unnumbered.yml │ ├── README.md │ └── static_bfd │ │ └── eos.j2 ├── bgp │ ├── 01-ebgp-session.yml │ ├── 02-ibgp-ebgp-session.yml │ ├── 03-ibgp-rr.yml │ ├── 04-originate.yml │ ├── 05-community.yml │ ├── 06-unnumbered.yml │ ├── 07-ebgp-localas.yml │ ├── 08-ibgp-localas.yml │ ├── 09-vrf-localas.yml │ ├── 11-ipv6-ebgp.yml │ ├── 12-ipv6-ibgp-ebgp.yml │ ├── 13-ipv6-ibgp-rr.yml │ ├── 14-ipv6-originate.yml │ ├── 16-ipv6-unnumbered.yml │ ├── 20-dual-stack-activate.yml │ ├── 21-dual-stack-unnumbered.yml │ ├── 22-dual-stack-rfc8950.yml │ ├── 30-import-ds-ospf.yml │ ├── 31-import-policy.yml │ ├── README.md │ ├── bgp-xact.j2 │ ├── bgp.domain.yml │ ├── defaults-ipv6.yml │ └── frr-community.j2 ├── device-module-test ├── dhcp │ ├── 01-ipv4-client.yml │ ├── 02-ipv6-client.yml │ ├── 03-ipv4-server.yml │ ├── 04-ipv6-server.yml │ ├── 11-ipv4-relay.yml │ ├── 12-ipv6-relay.yml │ ├── 21-ipv4-relay-vrf-global.yml │ ├── 31-ipv4-client-ospf.yml │ ├── 32-ipv6-client-ospf.yml │ └── bounce.cumulus.j2 ├── eigrp │ ├── 01-eigrp-ipv4.yml │ └── 02-eigrp-ipv6.yml ├── evpn │ ├── 01-vxlan-bridging.yml │ ├── 02-vxlan-asymmetric-irb.yml │ ├── 03-vxlan-symmetric-irb.yml │ ├── 04-vxlan-central-routing.yml │ ├── 05-vxlan-l3only.yml │ ├── 10-vxlan-rr.yml │ ├── 11-vxlan-ebgp.yml │ ├── 12-vxlan-ibgp-ebgp.yml │ ├── 13-vxlan-ebgp-allowas.yml │ ├── 14-vxlan-ebgp-ebgp.yml │ ├── 15-vxlan-ebgp-unnumbered.yml │ ├── 20-vxlan-irb-ospf.yml │ ├── 21-bgp-ce-router.yml │ ├── 22-ospf-ce-router.yml │ ├── 30-cs-bridging.yml │ ├── anycast-check │ │ └── plugin.py │ ├── topology-defaults.yml │ └── x-03-vxlan-symmetric-irb-same-vendor.yml ├── firewall.zonebased │ └── 01-default-zone-policy.yml ├── gateway │ ├── 01-anycast.yml │ ├── 02-vrrp.yml │ ├── 03-vrrp-vlan.yml │ ├── ifdown │ │ ├── eos.j2 │ │ └── frr.j2 │ ├── linkdown │ │ └── linux.j2 │ └── vrrp-priority │ │ ├── eos.j2 │ │ └── frr.j2 ├── initial │ ├── 01-interfaces.yml │ ├── 02-loopback.yml │ ├── 03-unnumbered.yml │ ├── 04-mtu.yml │ ├── 05-host.yml │ ├── 06-bridge.yml │ ├── 07-router.yml │ └── README.md ├── isis │ ├── 01-ipv4.yml │ ├── 02-ipv6.yml │ ├── 03-dual-stack.yml │ ├── 10-network.yml │ ├── 11-cost.yml │ ├── 12-passive.yml │ ├── 21-import-ds.yml │ ├── 30-vrf.yml │ ├── defaults-ds.yml │ ├── defaults-ipv6.yml │ └── topology-defaults.yml ├── lag │ ├── 01-l3-lag.yml │ ├── 02-lag-vlan-trunk.yml │ ├── 03-l3-lag-passive.yml │ ├── 04-lag-vlan-routed-trunk.yml │ ├── 10-mlag.yml │ ├── 11-mlag-anycast.yml │ ├── ifdown │ │ └── eos.j2 │ └── x-12-mlag-dual-cross.yml ├── mlag.vtep │ ├── 01-vxlan-bridging.yml │ └── 02-evpn-vxlan-bridging.yml ├── mpls │ ├── 01-ldp-p.yml │ ├── 02-ldp-pe.yml │ ├── 10-vpn-connected.yml │ ├── 11-vpn-cs.yml │ ├── 12-vpn-bgp.yml │ ├── 13-vpn-ospf.yml │ └── 20-vpnv6-connected.yml ├── ospf │ ├── ospfv2 │ │ ├── 01-network.yml │ │ ├── 02-areas.yml │ │ ├── 03-cost.yml │ │ ├── 04-passive.yml │ │ ├── 05-unnumbered.yml │ │ ├── 06-vlan-mtu.yml │ │ ├── 10-import.yml │ │ ├── 11-import-policy.yml │ │ ├── 20-default.yml │ │ ├── 21-default-policy.yml │ │ ├── 22-default-vrf.yml │ │ ├── 30-timers.yml │ │ ├── 31-priority.yml │ │ ├── 32-password.yml │ │ ├── README.md │ │ ├── bfd.yml │ │ ├── bgp_default.j2 │ │ └── bgp_loopback.j2 │ └── ospfv3 │ │ ├── 01-network.yml │ │ ├── 02-areas.yml │ │ ├── 03-cost.yml │ │ ├── 04-passive.yml │ │ ├── 05-unnumbered.yml │ │ ├── 06-lb-prefix.yml │ │ ├── 07-vlan-mtu.yml │ │ ├── 10-import.yml │ │ ├── 11-import-policy.yml │ │ ├── 20-default.yml │ │ ├── 21-default-policy.yml │ │ ├── 22-default-vrf.yml │ │ ├── 30-timers.yml │ │ ├── 31-priority.yml │ │ ├── README.md │ │ ├── bfd.yml │ │ ├── bgp_default.j2 │ │ ├── bgp_loopback.j2 │ │ └── topology-defaults.yml ├── ripv2 │ ├── 01-ipv4.yml │ ├── 02-ipv6.yml │ ├── 10-passive-ipv4.yml │ ├── 11-passive-ipv6.yml │ ├── 21-import-ds.yml │ ├── 31-vrf-ipv4.yml │ ├── 32-vrf-ipv6.yml │ ├── ipv6-defaults.yml │ └── topology-defaults.yml ├── routing │ ├── 01-locpref.yml │ ├── 03-med-out.yml │ ├── 05-prepend-out.yml │ ├── 06-weight.yml │ ├── 07-community.yml │ ├── 07a-community-append.yml │ ├── 07b-community-delete.yml │ ├── 07c-community-delete-list.yml │ ├── 08-community-large.yml │ ├── 10-match-prefix.yml │ ├── 11-match-aspath.yml │ ├── 12-match-community.yml │ ├── 20-static.yml │ ├── 21-static-vrf.yml │ ├── 22-static-inter-vrf.yml │ ├── 23-static-indirect.yml │ ├── 24-static-indirect-inter-vrf.yml │ ├── bgp-xact.j2 │ └── defaults-ds.yml ├── sr │ ├── 01-isis-ipv4-p.yml │ ├── 02-isis-ipv4-pe.yml │ ├── 11-isis-ipv6-p.yml │ ├── 12-isis-ipv6-pe.yml │ ├── defaults-ipv6.yml │ └── topology-defaults.yml ├── srv6 │ ├── 02-isis-ipv4-bgp-vpn.yml │ ├── 12-isis-ipv6-bgp-vpn.yml │ ├── x-01-isis-ipv4-bgp.yml │ └── x-11-isis-ipv6-bgp.yml ├── stp │ ├── 01-stp-priority.yml │ ├── 02-stp-trunk.yml │ ├── 03-stp-port-priority.yml │ ├── 04-stp-disable.yml │ ├── 11-pvrst.yml │ ├── 12-pvrst-vlan-disable.yml │ └── 20-stp-port-type.yml ├── validate │ ├── 01-bgp-session.yml │ ├── 02-bgp-prefix-peer-nh.yml │ ├── 03-bgp-attributes.yml │ ├── 04-bgp-community.yml │ ├── 10-ospf-session.yml │ ├── 11-ospfv2-prefix.yml │ ├── 12-ospfv3-prefix.yml │ ├── defaults-ds.yml │ └── frr-bgp-attributes.j2 ├── vlan │ ├── 01-vlan-bridge-single.yml │ ├── 02-vlan-bridge-multiple.yml │ ├── 21-vlan-irb-single.yml │ ├── 22-vlan-irb-multiple.yml │ ├── 23-vlan-mixed-multiple.yml │ ├── 31-s2-native.py │ ├── 31-vlan-bridge-trunk.yml │ ├── 32-vlan-bridge-trunk-router.yml │ ├── 33-vlan-irb-trunk.yml │ ├── 41-s2-green.py │ ├── 41-vlan-bridge-native.yml │ ├── 42-vlan-irb-native.yml │ ├── 51-vlan-routed-trunk.yml │ ├── 52-vlan-vrf-lite.yml │ ├── 61-vlan-routed-native.yml │ ├── 62-vlan-mixed-trunk.yml │ ├── 63-vlan-mixed-native.yml │ ├── 70-vlan-1-trunk.yml │ ├── README.md │ ├── topology-defaults.yml │ └── x-43-vlan-trunk-vlan-1.yml ├── vrf │ ├── 01-multi-vrf.yml │ ├── 02-multi-vrf-ipv6.yml │ ├── 03-multi-vrf-loopback.yml │ ├── 04-multi-vrf-loopback-ipv6.yml │ ├── 11-multi-vrf-ospf.yml │ ├── 12-multi-vrf-bgp.yml │ ├── 13-multi-vrf-bgp-loopback.yml │ ├── 14-multi-vrf-unnumbered.yml │ ├── 15-multi-vrf-mixed.yml │ ├── 16-vrf-bgp-community.yml │ ├── 21-multi-vrf-ospfv3.yml │ ├── 22-multi-vrf-bgp-ipv6.yml │ ├── 23-multi-vrf-mixed-ipv6.yml │ ├── 31-vrf-common-hosts.yml │ ├── 32-vrf-common-hosts-ipv6.yml │ ├── 33-vrf-common-ospf.yml │ ├── 34-vrf-common-mixed.yml │ ├── README.md │ ├── bgp-xact.j2 │ ├── defaults-ipv6-only.yml │ └── frr-community.j2 ├── vxlan │ ├── 01-vxlan-bridging.yml │ ├── 02-vxlan-bridging-multinode.yml │ ├── 03-vxlan-irb.yml │ ├── 04-vxlan-irb-ospf.yml │ ├── 05-vxlan-router-stick.yml │ ├── 07-vxlan-bridging-v6only.yml │ ├── 08-vxlan-alt-vtep.yml │ └── README.md └── wait_times.yml ├── platform-integration ├── clab │ ├── 01-links.yml │ └── 02-mac-ip.yml ├── components │ └── 01-links.yml ├── libvirt │ ├── 01-links.yml │ ├── 02-mac-ip.yml │ └── 03-authentication.yml ├── multilab │ └── topology.yml ├── multiprovider │ ├── 01-libvirt-clab-p2p-links.yml │ ├── 02-libvirt-clab-lan.yml │ ├── 10-libvirt-clab-ssh.yml │ └── alpine_ssh.j2 ├── unmanaged │ ├── 01-libvirt.yml │ ├── 02-clab.yml │ └── 03-hybrid.yml └── vagrant-batches │ └── topology.yml ├── providers ├── clab.yml └── vbox.yml ├── run-error-tests.sh ├── run-integration-tests.sh ├── run-tests.sh ├── run-typing.sh ├── run-xerr.sh ├── run-xform.sh ├── run-yamllint.sh ├── test_transformation.py ├── topology ├── expected │ ├── 6pe.yml │ ├── addressing-ipv6-only.yml │ ├── addressing-ipv6-prefix.yml │ ├── addressing-lan.yml │ ├── addressing-p2p.yml │ ├── addressing-prefix.yml │ ├── anycast-gateway.yml │ ├── bgp-af-rt-929.yml │ ├── bgp-anycast.yml │ ├── bgp-autogroup.yml │ ├── bgp-community.yml │ ├── bgp-ibgp.yml │ ├── bgp-interface-disable.yml │ ├── bgp-members.yml │ ├── bgp-rs-2as.yml │ ├── bgp-sessions.yml │ ├── bgp-unnumbered-dual-stack.yml │ ├── bgp-unnumbered.yml │ ├── bgp-vrf-local-as.yml │ ├── bgp.yml │ ├── clab-attributes.yml │ ├── components.yml │ ├── device-module-defaults.yml │ ├── device-node-defaults.yml │ ├── dhcp-server-on-segment.yml │ ├── dhcp-vlan.yml │ ├── dual-stack.yml │ ├── ebgp.utils.yml │ ├── eigrp-feature-test.yml │ ├── evpn-asymmetric-irb-ospf.yml │ ├── evpn-hub-spoke.yml │ ├── evpn-l3vni-only.yml │ ├── evpn-node-vrf.yml │ ├── evpn-vlan-attr.yml │ ├── evpn-vxlan.yml │ ├── extra-attr-link.yml │ ├── fabric-ebgp.yml │ ├── group-ansible-variables.yml │ ├── group-data-vlan.yml │ ├── group-data-vrf.yml │ ├── groups-auto-create.yml │ ├── groups-hierarchy.yml │ ├── groups-node-data.yml │ ├── groups-node.yml │ ├── groups-simple.yml │ ├── groups-vlan-vrf.yml │ ├── id.yml │ ├── igp-af.yml │ ├── igp-ospf-isis-eigrp-disable.yml │ ├── isis-bfd-test.yml │ ├── isis-feature-test.yml │ ├── lag-l2.yml │ ├── lag-l3-access-vlan.yml │ ├── lag-l3.yml │ ├── lag-mlag-m_to_m.yml │ ├── lag-mlag.yml │ ├── lag-vlan-trunk.yml │ ├── libvirt-clab-complex.yml │ ├── link-bw.yml │ ├── link-empty.yml │ ├── link-formats.yml │ ├── link-group.yml │ ├── link-loopback.yml │ ├── link-tunnel.yml │ ├── link-without-prefix.yml │ ├── links-as-dict.yml │ ├── module-node-global-params.yml │ ├── module-node-global.yml │ ├── module-node-only.yml │ ├── module-node-params.yml │ ├── module-reorder.yml │ ├── mpls-vpn-simple.yml │ ├── mpls.yml │ ├── node.clone-plugin-lag.yml │ ├── node.clone-plugin.yml │ ├── nodes-strings.yml │ ├── null-vrfs.yml │ ├── ospf-bfd-test.yml │ ├── ospf.yml │ ├── paths.yml │ ├── removed-attr-inheritance.yml │ ├── rp-aspath-numbers.yml │ ├── rp-clist-expansion.yml │ ├── rp-normalize-merge.yml │ ├── rp-prefix-expansion.yml │ ├── rp-static-gw.yml │ ├── rp-static.yml │ ├── rt-vlan-anycast.yml │ ├── rt-vlan-mode-link-route.yml │ ├── rt-vlan-native-routed.yml │ ├── rt-vlan-no-gateway.yml │ ├── rt-vlan-role-unnumbered.yml │ ├── rt-vlan-trunk-partial-overlap.yml │ ├── stp-mstp.yml │ ├── stp-port-type.yml │ ├── stp.yml │ ├── tools.yml │ ├── unmanaged-device.yml │ ├── unnumbered.yml │ ├── vbox.yml │ ├── vlan-access-links.yml │ ├── vlan-access-neighbors.yml │ ├── vlan-access-node.yml │ ├── vlan-access-single.yml │ ├── vlan-bridge-trunk-router.yml │ ├── vlan-coverage.yml │ ├── vlan-mode-priority.yml │ ├── vlan-native-routed.yml │ ├── vlan-routed-access.yml │ ├── vlan-routed-multiprovider.yml │ ├── vlan-routed-vrf.yml │ ├── vlan-routed.yml │ ├── vlan-router-stick.yml │ ├── vlan-trunk-native.yml │ ├── vlan-vrf-lite.yml │ ├── vlan-vrrp.yml │ ├── vrf-igp.yml │ ├── vrf-leaking-loop.yml │ ├── vrf-links.yml │ ├── vrf-loopback.yml │ ├── vrf-routing-blocks.yml │ ├── vrf.yml │ ├── vrrp-interface-granularity.yml │ ├── vxlan-router-stick.yml │ ├── vxlan-static.yml │ └── vxlan-vrf-lite.yml └── input │ ├── 6pe.yml │ ├── addressing-ipv6-only.yml │ ├── addressing-ipv6-prefix.yml │ ├── addressing-lan.yml │ ├── addressing-p2p.yml │ ├── addressing-prefix.yml │ ├── anycast-gateway.yml │ ├── bgp-af-rt-929.yml │ ├── bgp-anycast.yml │ ├── bgp-autogroup.yml │ ├── bgp-community.yml │ ├── bgp-ibgp.yml │ ├── bgp-interface-disable.yml │ ├── bgp-members.yml │ ├── bgp-rs-2as.yml │ ├── bgp-sessions.yml │ ├── bgp-unnumbered-dual-stack.yml │ ├── bgp-unnumbered.yml │ ├── bgp-vrf-local-as.yml │ ├── bgp.yml │ ├── clab-attributes.yml │ ├── components.yml │ ├── device-module-defaults.yml │ ├── device-node-defaults.yml │ ├── dhcp-server-on-segment.yml │ ├── dhcp-vlan.yml │ ├── dual-stack.yml │ ├── ebgp.utils.yml │ ├── eigrp-feature-test.yml │ ├── evpn-asymmetric-irb-ospf.yml │ ├── evpn-hub-spoke.yml │ ├── evpn-l3vni-only.yml │ ├── evpn-node-vrf.yml │ ├── evpn-vlan-attr.yml │ ├── evpn-vxlan.yml │ ├── extra-attr-link.yml │ ├── fabric-ebgp.yml │ ├── group-ansible-variables.yml │ ├── group-data-vlan.yml │ ├── group-data-vrf.yml │ ├── groups-auto-create.yml │ ├── groups-hierarchy.yml │ ├── groups-node-data.yml │ ├── groups-node.yml │ ├── groups-simple.yml │ ├── groups-vlan-vrf.yml │ ├── id.yml │ ├── igp-af.yml │ ├── igp-ospf-isis-eigrp-disable.yml │ ├── isis-bfd-test.yml │ ├── isis-feature-test.yml │ ├── lag-l2.yml │ ├── lag-l3-access-vlan.yml │ ├── lag-l3.yml │ ├── lag-mlag-m_to_m.yml │ ├── lag-mlag.yml │ ├── lag-vlan-trunk.yml │ ├── libvirt-clab-complex.yml │ ├── link-bw.yml │ ├── link-empty.yml │ ├── link-formats.yml │ ├── link-group.yml │ ├── link-loopback.yml │ ├── link-tunnel.yml │ ├── link-without-prefix.yml │ ├── links-as-dict.yml │ ├── module-node-duplicate.xx │ ├── module-node-global-params.yml │ ├── module-node-global.yml │ ├── module-node-only.yml │ ├── module-node-params.yml │ ├── module-reorder.yml │ ├── mpls-vpn-simple.yml │ ├── mpls.yml │ ├── node.clone-plugin-lag.yml │ ├── node.clone-plugin.yml │ ├── nodes-strings.yml │ ├── null-vrfs.yml │ ├── ospf-bfd-test.yml │ ├── ospf.yml │ ├── paths.yml │ ├── removed-attr-inheritance.yml │ ├── rp-aspath-numbers.yml │ ├── rp-clist-expansion.yml │ ├── rp-normalize-merge.yml │ ├── rp-prefix-expansion.yml │ ├── rp-static-gw.yml │ ├── rp-static.yml │ ├── rt-vlan-anycast.yml │ ├── rt-vlan-mode-link-route.yml │ ├── rt-vlan-native-routed.yml │ ├── rt-vlan-no-gateway.yml │ ├── rt-vlan-role-unnumbered.yml │ ├── rt-vlan-trunk-partial-overlap.yml │ ├── stp-port-type.yml │ ├── stp.yml │ ├── tools.yml │ ├── unmanaged-device.yml │ ├── unnumbered.yml │ ├── vbox.yml │ ├── vlan-access-links.yml │ ├── vlan-access-neighbors.yml │ ├── vlan-access-node.yml │ ├── vlan-access-single.yml │ ├── vlan-bridge-trunk-router.yml │ ├── vlan-coverage.yml │ ├── vlan-mode-priority.yml │ ├── vlan-native-routed.yml │ ├── vlan-routed-access.yml │ ├── vlan-routed-multiprovider.yml │ ├── vlan-routed-vrf.yml │ ├── vlan-routed.yml │ ├── vlan-router-stick.yml │ ├── vlan-trunk-native.yml │ ├── vlan-vrf-lite.yml │ ├── vlan-vrrp.yml │ ├── vrf-igp.yml │ ├── vrf-leaking-loop.yml │ ├── vrf-links.yml │ ├── vrf-loopback.yml │ ├── vrf-routing-blocks.yml │ ├── vrf.yml │ ├── vrrp-interface-granularity.yml │ ├── vxlan-router-stick.yml │ ├── vxlan-static.yml │ └── vxlan-vrf-lite.yml ├── utils.py ├── validation ├── 10-bgp-neighbor.yml └── bgp-xact.j2 ├── warn-topology-addr.yml └── yaml-reformat.py /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.py] 2 | indent_style = space 3 | indent_size = 2 -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | PYTHONPATH=./lib/create-topology 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement suggestion 3 | about: Have an idea that would make netlab better? Please document it, or start a discussion. 4 | labels: enhancement 5 | assignees: '' 6 | 7 | --- 8 | 9 | Please describe your idea in as many details as possible, including changes to the lab topology data model (if required). 10 | 11 | If you're unsure whether your idea makes sense, you might want to start a discussion first. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/validation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Integration test validation failure 3 | about: Use this one to submit bug reports based on validation failures 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | A clear and concise description of what the bug is. 10 | 11 | * Test topology: URL 12 | * Validation results: URL 13 | -------------------------------------------------------------------------------- /.github/get-container-tags.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | TAG=${1#release_} 4 | XTAG=latest 5 | if [[ $TAG == *"dev"* ]]; then 6 | XTAG=dev 7 | echo "PIP_OPTIONS=--pre" 8 | else 9 | echo "PIP_OPTIONS=" 10 | fi 11 | echo "IMAGE_TAG=$TAG,$XTAG" 12 | -------------------------------------------------------------------------------- /.github/workflows/devcontainer-devc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Build netlab devcontainer with :devc tag whenever a push is made in the 'devc' branch 3 | 4 | on: 5 | push: 6 | branches: [ devc ] 7 | 8 | env: 9 | REGISTRY: ghcr.io 10 | 11 | jobs: 12 | build: 13 | uses: ./.github/workflows/devcontainer-build.yml 14 | with: 15 | docker-tags: devc 16 | pip-options: --pre 17 | secrets: 18 | GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }} 19 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | repos: 3 | - repo: local 4 | hooks: 5 | - id: yamllint 6 | name: yamllint 7 | description: This hook runs yamllint. 8 | entry: yamllint 9 | language: python 10 | types: [ file, yaml ] 11 | 12 | - id: ci_tests 13 | name: ci_tests 14 | stages: [ pre-push ] 15 | description: This hook runs before push 16 | entry: tests/run-tests.sh ci 17 | language: script 18 | types_or: [ yaml, python3 ] 19 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [FORMAT] 2 | indent-string=' ' 3 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # Read the Docs configuration file 2 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 3 | 4 | version: 2 5 | 6 | # Build documentation in the docs/ directory with Sphinx 7 | sphinx: 8 | configuration: docs/conf.py 9 | 10 | # Optionally set the version of Python and requirements required to build your docs 11 | python: 12 | install: 13 | - requirements: docs/requirements.txt 14 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | --- 2 | extends: default 3 | 4 | rules: 5 | braces: 6 | max-spaces-inside: 1 7 | colons: 8 | max-spaces-after: -1 9 | brackets: 10 | max-spaces-inside: 1 11 | indentation: 12 | indent-sequences: false 13 | truthy: false 14 | line-length: 15 | max: 120 16 | allow-non-breakable-words: true 17 | allow-non-breakable-inline-mappings: true 18 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include netsim/ansible * 2 | recursive-include netsim/extra * 3 | recursive-include netsim/templates * 4 | recursive-include netsim/daemons * 5 | recursive-include netsim/install * 6 | recursive-include netsim *.yml 7 | include requirements.txt 8 | include netsim/cli/usage.txt 9 | include netsim/cli/show-usage.txt 10 | include netsim/cli/alias.txt 11 | -------------------------------------------------------------------------------- /docs/_static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/_static/images/favicon.png -------------------------------------------------------------------------------- /docs/_templates/breadcrumbs.html: -------------------------------------------------------------------------------- 1 | {% extends "!breadcrumbs.html" %} 2 | {{ super }} 3 | {%- block breadcrumbs %} 4 |
6 | © Copyright {{ copyright }}. Powered by Sphinx, sphinx-rtd-theme and sphinx-rtd-dark-mode. Hosted on 7 | Cloudflare Pages. 8 |
> 9 | {%- endblock %} -------------------------------------------------------------------------------- /docs/example/topo-tutorial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/example/topo-tutorial.png -------------------------------------------------------------------------------- /docs/high-level-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/high-level-architecture.png -------------------------------------------------------------------------------- /docs/install/linux-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/install/linux-architecture.png -------------------------------------------------------------------------------- /docs/install/ubuntu-on-desktop-os.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/install/ubuntu-on-desktop-os.png -------------------------------------------------------------------------------- /docs/install/virtual-box-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/install/virtual-box-architecture.png -------------------------------------------------------------------------------- /docs/labs/arubacx.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/arubacx.txt -------------------------------------------------------------------------------- /docs/labs/asav.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/asav.txt -------------------------------------------------------------------------------- /docs/labs/cat8000v.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/cat8000v.txt -------------------------------------------------------------------------------- /docs/labs/csr.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/csr.txt -------------------------------------------------------------------------------- /docs/labs/dellos10.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/dellos10.txt -------------------------------------------------------------------------------- /docs/labs/eos.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/eos.txt -------------------------------------------------------------------------------- /docs/labs/fortios.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/fortios.txt -------------------------------------------------------------------------------- /docs/labs/iosv.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/iosv.txt -------------------------------------------------------------------------------- /docs/labs/iosvl2.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/iosvl2.txt -------------------------------------------------------------------------------- /docs/labs/iosxr.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/iosxr.txt -------------------------------------------------------------------------------- /docs/labs/nxos.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/nxos.txt -------------------------------------------------------------------------------- /docs/labs/routeros7.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/routeros7.txt -------------------------------------------------------------------------------- /docs/labs/sonic.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/sonic.txt -------------------------------------------------------------------------------- /docs/labs/vptx.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/vptx.txt -------------------------------------------------------------------------------- /docs/labs/vsrx.txt: -------------------------------------------------------------------------------- 1 | ../../netsim/install/libvirt/vsrx.txt -------------------------------------------------------------------------------- /docs/module/SR-Simple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/module/SR-Simple.png -------------------------------------------------------------------------------- /docs/module/lag-topologies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/module/lag-topologies.png -------------------------------------------------------------------------------- /docs/netlab/clab_build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/clab_build.png -------------------------------------------------------------------------------- /docs/netlab/create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/create.png -------------------------------------------------------------------------------- /docs/netlab/initial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/initial.png -------------------------------------------------------------------------------- /docs/netlab/install-warnings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/install-warnings.png -------------------------------------------------------------------------------- /docs/netlab/netlab-validate-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/netlab-validate-example.png -------------------------------------------------------------------------------- /docs/netlab/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/netlab/up.png -------------------------------------------------------------------------------- /docs/plugins/topology_bgp.domain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/plugins/topology_bgp.domain.png -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | # 2 | # Module versions updated on 2023-06-12 to deal with cross-references in Markdown tables 3 | # 4 | sphinx==6.2.1 5 | recommonmark==0.7.1 6 | myst-parser==1.0.0 7 | sphinx-rtd-theme==1.3.0 8 | sphinx-rtd-dark-mode==1.3.0 9 | markdown==3.4.3 10 | -------------------------------------------------------------------------------- /docs/roadmap/index.md: -------------------------------------------------------------------------------- 1 | # Roadmap Proposals 2 | 3 | These documents describe potential future _netlab_ functionality. Please feel free to make them better ;) 4 | 5 | ```eval_rst 6 | .. toctree:: 7 | :maxdepth: 1 8 | 9 | tools.md 10 | external-interface.md 11 | usage.md 12 | ``` 13 | -------------------------------------------------------------------------------- /docs/topo-bandwidth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/docs/topo-bandwidth.png -------------------------------------------------------------------------------- /legacy/README.md: -------------------------------------------------------------------------------- 1 | netsim-tools has been renamed to netlab in August 2022. 2 | 3 | The Python package netsim-tools has been renamed to networklab and is 4 | installed as a dependency of netsim-tools every time you install or 5 | upgrade netsim-tools, but we won't keep that dependency active foreer. 6 | 7 | Please stop using netsim-tools package and use networklab package. 8 | -------------------------------------------------------------------------------- /mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | disallow_untyped_defs = True 3 | 4 | [mypy-box] 5 | ignore_missing_imports = True 6 | 7 | [mypy-netaddr] 8 | ignore_missing_imports = True 9 | -------------------------------------------------------------------------------- /netlab: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # 3 | # Main netsim-tools CLI command 4 | # 5 | import sys 6 | 7 | try: 8 | import netsim 9 | import netsim.cli 10 | except: 11 | print("Cannot import netsim Python module, netlab installation is broken") 12 | sys.exit(1) 13 | 14 | netsim.cli.lab_commands(__file__) 15 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/arcos.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Push Candidate Config 3 | template: 4 | src: '{{ config_template }}' 5 | dest: '/tmp/.{{ inventory_hostname }}.txt' 6 | 7 | - name: Apply candidate config 8 | arrcus.arcos.arcos_config: 9 | src: "/tmp/.{{ inventory_hostname }}.txt" 10 | load_operation: merge 11 | comment: "initial config pushed by netsim" 12 | delete_src_file: true 13 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/asa.yml: -------------------------------------------------------------------------------- 1 | - name: "asa_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | asa_config: 3 | src: "{{ config_template }}" 4 | tags: [print_action, always] 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/eos.yml: -------------------------------------------------------------------------------- 1 | - name: "eos_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | eos_config: 3 | src: "{{ config_template }}" 4 | tags: [ print_action, always ] 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/ios.yml: -------------------------------------------------------------------------------- 1 | - name: "ios_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | ios_config: 3 | src: "{{ config_template }}" 4 | tags: [ print_action, always ] 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/iosxr.yml: -------------------------------------------------------------------------------- 1 | - name: "iosxr_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | iosxr_config: 3 | src: "{{ config_template }}" 4 | tags: [ print_action, always ] 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/junos.yml: -------------------------------------------------------------------------------- 1 | - name: "junos_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | junos_config: 3 | src: "{{ config_template }}" 4 | tags: [ print_action, always ] 5 | vars: 6 | ansible_command_timeout: 300 7 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/linux.yml: -------------------------------------------------------------------------------- 1 | - template: 2 | src: "{{ config_template }}" 3 | dest: /tmp/config.sh 4 | - name: "Execute /tmp/config.sh to deploy {{ netsim_action }} config from {{ config_template }}" 5 | command: "{{ docker_shell|default('bash') }} /tmp/config.sh" 6 | become: true 7 | tags: [ print_action, always ] 8 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/missing.yml: -------------------------------------------------------------------------------- 1 | ../../missing.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/none.yml: -------------------------------------------------------------------------------- 1 | - debug: 2 | msg: "Deploying config template {{ config_template }} for action {{ netsim_action|default('???') }}" 3 | tags: [ print_action ] 4 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/nxos.yml: -------------------------------------------------------------------------------- 1 | - name: "nxos_config: deploying {{ netsim_action }} from {{ config_template }}" 2 | nxos_config: 3 | src: "{{ config_template }}" 4 | tags: [ print_action, always ] 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/deploy-config/routeros7.yml: -------------------------------------------------------------------------------- 1 | - name: "load {{ netsim_action }} from {{ config_template }}" 2 | set_fact: 3 | cfg_data: "{{ lookup('template', config_template) }}" 4 | 5 | - name: Run commands on CHR 6 | routeros_command: 7 | commands: 8 | "{{ cfg_data.splitlines()|select() }}" 9 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/arcos.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: save config 3 | shell: echo 'show run' | confd_cli 4 | register: arcos_run_config 5 | 6 | - set_fact: 7 | ansible_net_config: "{{ arcos_run_config.stdout }}" 8 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/arubacx.yml: -------------------------------------------------------------------------------- 1 | # fetch ArubaCX configuration 2 | # 3 | --- 4 | - arubanetworks.aoscx.aoscx_command: 5 | commands: 6 | - no page 7 | - show running-config 8 | register: conf_output 9 | 10 | - set_fact: 11 | ansible_net_config: "{{ conf_output.stdout | default([]) | join('') }}\n" 12 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/asa.yml: -------------------------------------------------------------------------------- 1 | # fetch Cisco ASA configuration using asa_facts module 2 | # 3 | --- 4 | - cisco.asa.asa_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/cumulus_nvue.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Fetch Cumulus NVUE yaml configuration files 3 | # 4 | - name: save cumulus nvue config to file on switch 5 | shell: nv config show > /tmp/config_save.yaml 6 | 7 | - name: fetch cumulus yaml config from switch 8 | fetch: 9 | src: "/tmp/config_save.yaml" 10 | dest: "{{ config_dir }}/{{ inventory_hostname }}/" 11 | flat: true 12 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/dellos10.yml: -------------------------------------------------------------------------------- 1 | # fetch Dell OS10 configuration using os10_facts module 2 | # 3 | --- 4 | - dellemc.os10.os10_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/eos.yml: -------------------------------------------------------------------------------- 1 | # fetch Arista EOS configuration using eos_facts module 2 | # 3 | --- 4 | - arista.eos.eos_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/fortinet.fortios.fortios.yml: -------------------------------------------------------------------------------- 1 | # fetch Fortinet FortiOS configuration using fortios_monitor_fact module 2 | # 3 | --- 4 | - name: save fortios config 5 | fortinet.fortios.fortios_monitor_fact: 6 | selector: 'system_config_backup' 7 | vdom: "{{ vdom }}" 8 | params: 9 | scope: 'global' 10 | register: fortios_run_config 11 | 12 | - set_fact: 13 | ansible_net_config: "{{ fortios_run_config.meta.raw }}" 14 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/ios.yml: -------------------------------------------------------------------------------- 1 | # fetch Cisco IOS configuration using ios_facts module 2 | # 3 | --- 4 | - cisco.ios.ios_facts: 5 | gather_subset: config 6 | 7 | - set_fact: 8 | ansible_net_config: >- 9 | {{ "!" + (ansible_net_config|split("!"))[1:]|join("!") }} 10 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/iosxr.yml: -------------------------------------------------------------------------------- 1 | # fetch Cisco IOS XR configuration using iosxr_facts module 2 | # 3 | --- 4 | - iosxr_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/junos.yml: -------------------------------------------------------------------------------- 1 | # fetch Cisco IOS configuration using ios_facts module 2 | # 3 | --- 4 | - junipernetworks.junos.junos_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/nxos.yml: -------------------------------------------------------------------------------- 1 | # fetch Arista EOS configuration using ios_facts module 2 | # 3 | --- 4 | - cisco.nxos.nxos_facts: 5 | gather_subset: config 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/routeros.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - routeros_command: 3 | commands: /export 4 | register: ros_exp_config 5 | 6 | - set_fact: 7 | ansible_net_config: "{{ ros_exp_config.stdout_lines[0] | reject('match', '^$') | list | join('\n') }}\n" 8 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/routeros7.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - routeros_command: 3 | commands: /export 4 | register: ros_exp_config 5 | 6 | - set_fact: 7 | ansible_net_config: "{{ ros_exp_config.stdout_lines[0] | reject('match', '^$') | list | join('\n') }}\n" 8 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fetch-config/vyos.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Fetch VyOS boot configuration files 3 | # 4 | - fetch: 5 | src: "{{ item }}" 6 | dest: "{{ config_dir }}/{{ inventory_hostname }}/" 7 | flat: yes 8 | become: True 9 | loop: 10 | - /config/config.boot 11 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/fortinet.fortios.fortios/ospf.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Configure OSPF 3 | fortinet.fortios.fortios_router_ospf: 4 | vdom: "{{ vdom }}" 5 | router_ospf: "{{ lookup('template',config_template)|from_yaml }}" 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/frr/deploy-config.yml: -------------------------------------------------------------------------------- 1 | ../deploy-config/frr.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/arubacx-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/cat8000v-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/csr-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/dellos10-clab.yml: -------------------------------------------------------------------------------- 1 | - name: Wait a minute for OS10 to start waking up 2 | pause: 3 | minutes: 1 4 | 5 | - name: Wait for SSH server on OS10 to become ready 6 | include_tasks: vm-clab-ssh-check.yml 7 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/eos-clab.yml: -------------------------------------------------------------------------------- 1 | - name: Wait for cEOS SSH daemon to start 2 | wait_for_connection: 3 | timeout: 60 4 | when: ansible_connection == 'network_cli' 5 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/iol-clab.yml: -------------------------------------------------------------------------------- 1 | ./vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/ioll2-clab.yml: -------------------------------------------------------------------------------- 1 | ./vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/ios-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/iosxr-clab.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Waiting up to 10 minutes for XRd SSH daemon to start 3 | wait_for_connection: 4 | timeout: 600 5 | when: ansible_connection == 'network_cli' 6 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/nxos-clab.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Wait for NXOS VM in a container to wake up 3 | # 4 | --- 5 | - name: Wait for SSH server 6 | include_tasks: vm-clab-ssh-check.yml 7 | 8 | - name: Wait for Eth1/1 interface 9 | include_tasks: nxos.yml 10 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/nxos.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Wait for Eth1/1 to appear 3 | nxos_command: 4 | commands: 5 | - show interface brief 6 | wait_for: 7 | - result[0] contains Eth1 8 | interval: 5 9 | retries: 20 10 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vjunos-router-clab.yml: -------------------------------------------------------------------------------- 1 | vjunos-switch-clab.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vjunos-router.yml: -------------------------------------------------------------------------------- 1 | vjunos-switch.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vjunos-switch-clab.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Wait for SSH server 3 | include_tasks: vm-clab-ssh-check.yml 4 | 5 | - name: Wait for ge-0/0/0 interface 6 | include_tasks: vjunos-switch.yml 7 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vjunos-switch.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Wait for ge-0/0/0 to appear 3 | junos_command: 4 | commands: 5 | - show interfaces terse 6 | wait_for: 7 | - result[0] contains ge-0/0/0 8 | interval: 5 9 | retries: 30 10 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vmx-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vptx-clab.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Wait for SSH server 3 | include_tasks: vm-clab-ssh-check.yml 4 | 5 | - name: Wait for et-0/0/0 interface 6 | include_tasks: vptx.yml 7 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vptx.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Wait for et-0/0/0 to appear 3 | junos_command: 4 | commands: 5 | - show interfaces terse 6 | wait_for: 7 | - result[0] contains et-0/0/0 8 | interval: 5 9 | retries: 60 10 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/readiness-check/vsrx-clab.yml: -------------------------------------------------------------------------------- 1 | vm-clab-ssh-check.yml -------------------------------------------------------------------------------- /netsim/ansible/tasks/reload-config/eos.yml: -------------------------------------------------------------------------------- 1 | - name: Copy replacement configuration to Arista EOS device 2 | include_tasks: _copy_config.yml 3 | vars: 4 | netlab_device_disk: "" 5 | 6 | - name: Replace running configuration 7 | eos_command: 8 | commands: "configure replace flash:replace-config" 9 | -------------------------------------------------------------------------------- /netsim/ansible/tasks/reload-config/ios.yml: -------------------------------------------------------------------------------- 1 | - name: "Config SCP server on Cisco IOS" 2 | ios_config: 3 | lines: 4 | - ip scp server enable 5 | 6 | - name: Copy replacement configuration to Cisco IOS device 7 | include_tasks: _copy_config.yml 8 | vars: 9 | netlab_device_disk: "nvram:" 10 | 11 | - name: Replace running configuration 12 | ios_command: 13 | commands: "configure replace nvram:replace-config force" 14 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/bird.j2: -------------------------------------------------------------------------------- 1 | # Bird BFD configuration is in daemon/bird/protocols.j2 -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/cumulus.j2: -------------------------------------------------------------------------------- 1 | ! BFD is configured on OSPF interfaces and BGP neighbors 2 | ! ... nothing to see here ;) 3 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/dellos10.j2: -------------------------------------------------------------------------------- 1 | ! 2 | ! Dell OS10 only supports a single global configuration, not different timer intervals per interface 3 | ! 4 | bfd interval {{ bfd.min_tx|default(500) }} min_rx {{ bfd.min_rx|default(500) }} multiplier {{ bfd.multiplier|default(3) }} role active 5 | bfd enable 6 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/frr.j2: -------------------------------------------------------------------------------- 1 | ! BFD is configured on OSPF interfaces and BGP neighbors 2 | ! ... nothing to see here ;) 3 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/junos.j2: -------------------------------------------------------------------------------- 1 | {# Nothing to see here (yet) #} 2 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bfd/none.j2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/netsim/ansible/templates/bfd/none.j2 -------------------------------------------------------------------------------- /netsim/ansible/templates/bgp/cumulus.j2: -------------------------------------------------------------------------------- 1 | {% include "frr.j2" %} 2 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bgp/cumulus_nvue.j2: -------------------------------------------------------------------------------- 1 | {% from "bgp/cumulus_nvue.macro.j2" import bgp_in_vrf with context %} 2 | - set: 3 | router: 4 | bgp: 5 | enable: on 6 | autonomous-system: {{ bgp.as }} 7 | {% if bgp.router_id|ipv4 %} 8 | router-id: {{ bgp.router_id }} 9 | {% endif %} 10 | {{ bgp_in_vrf('default', { 'bgp': bgp, 'loopback': loopback, 'af': af } ) }} 11 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bgp/junos.macro.j2: -------------------------------------------------------------------------------- 1 | 2 | {# 3 | Macro for BGP neighbor policy application 4 | Uses custom neigh._junos_policy.xxx attributes 5 | #} 6 | {% macro bgp_neighbor_policy(n) %} 7 | {% for p_direction in ['import', 'export'] %} 8 | {% if n._junos_policy[p_direction]|default([]) %} 9 | {{p_direction}} [ {{ n._junos_policy[p_direction]|join(' ') }} ]; 10 | {% endif %} 11 | {% endfor %} 12 | {%- endmacro %} 13 | -------------------------------------------------------------------------------- /netsim/ansible/templates/bgp/none.j2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipspace/netlab/88ab0d08c9979836e27618a191b722af63e97ded/netsim/ansible/templates/bgp/none.j2 -------------------------------------------------------------------------------- /netsim/ansible/templates/bgp/sonic.j2: -------------------------------------------------------------------------------- 1 | ! 2 | no router bgp 3 | ! 4 | {% include "frr.j2" +%} 5 | -------------------------------------------------------------------------------- /netsim/ansible/templates/dhcp/dnsmasq.j2: -------------------------------------------------------------------------------- 1 | ../../../daemons/dnsmasq/dnsmasq.j2 -------------------------------------------------------------------------------- /netsim/ansible/templates/evpn/frr.j2: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | set -e 4 | cat >/tmp/evpn_config <