diff --git a/docs/caveats.md b/docs/caveats.md index 112b445e55..15fb16622a 100644 --- a/docs/caveats.md +++ b/docs/caveats.md @@ -330,6 +330,15 @@ Netlab enables VRRPv3 by default on Dell OS10, overriding any platform defaults. * You have to build the *dnsmasq* container image with the **netlab clab build dnsmasq** command. +(caveats-exos)= +## Extreme Networks EXOS + +* Netlab uses the now deprecated **community.network.exos_config** Ansible module to configure Extreme EXOS devices. This collection is not actively maintained anymore. To install you can still run: + +```shell +ansible-galaxy collection install community.network +``` + (caveats-fortios)= ## Fortinet FortiOS diff --git a/docs/labs/exos.md b/docs/labs/exos.md new file mode 100644 index 0000000000..380dcb63cb --- /dev/null +++ b/docs/labs/exos.md @@ -0,0 +1,28 @@ +(build-exos)= +# Building an Extreme Networks EXOS Vagrant Libvirt Box + +Extreme Networks EXOS is supported by the **netlab libvirt package** command. To build an EXOS box: + +* Create an empty directory on a Ubuntu machine with *libvirt* and *Vagrant*. +* Download EXOS disk image (.qcow2 file) into that directory. + +```{tip} +Select and download the QCOW2 image from [Extreme Networks github page](https://github.com/extremenetworks/Virtual_EXOS?tab=readme-ov-file#qcow2-files-for-gns3) + +Then copy the URL of the QCOW2 image and use `curl -O ` to download it. +``` + +* Execute **netlab libvirt package exos _virtual-disk-file-name_** and follow the instructions + +```{warning} +If you're using a *‌netlab* release older than 1.8.2, or if you're using a Linux distribution other than Ubuntu, please [read the box-building caveats first](libvirt-box-caveats.md). +``` + +## Initial Device Configuration + +During the box-building process you'll have to copy-paste initial device configuration. **netlab libvirt config exos** command displays the build recipe. + +```{eval-rst} +.. include:: exos.txt + :literal: +``` diff --git a/docs/labs/exos.txt b/docs/labs/exos.txt new file mode 120000 index 0000000000..6c1d149461 --- /dev/null +++ b/docs/labs/exos.txt @@ -0,0 +1 @@ +../../netsim/install/libvirt/exos.txt \ No newline at end of file diff --git a/docs/labs/libvirt.md b/docs/labs/libvirt.md index 4b52a7da39..bc43805ec1 100644 --- a/docs/labs/libvirt.md +++ b/docs/labs/libvirt.md @@ -87,6 +87,7 @@ These documents contain box-building recipes using the **netlab libvirt** utilit * [Cisco Nexus OS](nxos.md) * [Cumulus Linux 5.x](cumulus_nvue.md) * [Dell OS10](dellos10.md) by [Stefano Sasso](http://stefano.dscnet.org) +* [Extreme Networks EXOS](exos.md) by [Seb d'Argoeuves](https://noodlesops.space/about/) * [Fortinet FortiOS](fortios.md) - instructions based on the [work](https://blog.petecrocker.com/post/fortinet_vagrant_libvirt/) by [Pete Crocker](https://blog.petecrocker.com/about/) for 6.x/7.0 and updated for 7.4/7.6 in this [blog post](https://noodleops.space/2025-06/add-a-fortigate-in-your-virtual-lab-from-qcow-to-netlab-by-creating-a-vagrant-box/) by [Seb d'Argoeuves](https://noodlesops.space/about/). * [FRRouting](frr.md) (Debian VM with preinstalled **frr** package) * [Juniper vPTX](vptx.md) @@ -304,6 +305,7 @@ providers.libvirt.probe: [] cat8000v.md csr.md cumulus_nvue.md + exos.md fortios.md frr.md iosv.md diff --git a/docs/platforms.md b/docs/platforms.md index dacd162d69..04d06ba14a 100644 --- a/docs/platforms.md +++ b/docs/platforms.md @@ -29,6 +29,7 @@ | Cumulus Linux 4.x/5.x [❗](caveats-cumulus) | cumulus | end of life | | Cumulus Linux 5.x (NVUE) [❗](caveats-cumulus-nvue) | cumulus_nvue | minimal | | Dell OS10 [❗](caveats-os10) | dellos10 | full | +| Extreme Networks EXOS [❗](caveats-exos) | exos | minimal | | Fortinet FortiOS [❗](caveats-fortios) | fortios | minimal | | FRRouting (FRR) [❗](caveats-frr) | frr | full | | [Generic Linux host](generic-linux-devices) | linux | full | @@ -125,7 +126,8 @@ You cannot use all supported network devices with all virtualization providers. | Cumulus Linux | ✅ | ✅ | ✅[❗](caveats-cumulus) | | Cumulus Linux 5.x (NVUE) | ✅ | ✅ | ✅[❗](caveats-cumulus) | | Dell OS10 | [✅](build-dellos10) | ❌ | ✅ | -| Fortinet FortiOS | ✅ | ❌ | ✅ | +| Extreme Networks EXOS | [✅](build-exos) | ❌ | ✅[❗](clab-vrnetlab) | +| Fortinet FortiOS | [✅](build-fortios) | ❌ | ✅ | | FRR | [✅](build-frr)[❗](caveats-frr) | ✅[❗](caveats-frr) | ✅ | | Generic Linux (Ubuntu/Alpine) [❗](labs/linux.md) | ✅ | ✅ | ✅ | | Juniper cRPD | ❌ | ❌ | ✅ | @@ -152,25 +154,26 @@ Configuration files for Virtualbox and KVM/libvirt environments specify the numb | Virtual network device | netlab
device type | CPUs | memory | libvirt NIC model | | -------------------------- | ------------------ | ---: | -----: | -------------------------: | -| Arista vEOS | eos | 2 | 2048 | virtio | +| Arista vEOS | eos | 2 | 4096 | virtio | | Aruba AOS-CX | arubacx | 2 | 4096 | virtio | | Cisco ASAv | asav | 1 | 2048 | virtio | | Cisco Catalyst 8000v | cat8000v | 2 | 4096 | virtio | | Cisco CSR 1000v | csr | 2 | 4096 | virtio | -| Cisco IOSv | iosv | 1 | 512 | e1000 | -| Cisco IOSvL2 | iosvl2 | 1 | 1024 | e1000 | -| Cisco IOS XRv | iosxr | 2 | 8192 | e1000 | +| Cisco IOSv | iosv | 1 | 512 | e1000 | +| Cisco IOSvL2 | iosvl2 | 1 | 1024 | e1000 | +| Cisco IOS XRv | iosxr | 2 | 8192 | e1000 | | Cisco Nexus 9300v | nxos | 2 | 6144 [❗](caveats-nxos)| e1000 | | Cumulus Linux | cumulus | 2 | 1024 | virtio | | Cumulus Linux 5.x (NVUE) | cumulus_nvue | 2 | 1024 | virtio | -| Dell OS10 | dellos10 | 2 | 2048 | e1000 | +| Dell OS10 | dellos10 | 2 | 2048 | e1000 | +| Extreme Networks EXOS | exos | 1 | 1024 | rtl8139 | | Fortinet FortiOS | fortios | 1 | 2048 | virtio | | FRR | frr | 1 | 1024 | virtio | | Generic Linux host | linux | 1 | 1024 | virtio | | Juniper vSRX 3.0 | vsrx | 2 | 4096 | virtio | | Juniper vPTX | vptx | 4 | 8192 | virtio | | Mikrotik RouterOS 6 | routeros | 1 | 256 | virtio | -| Mikrotik RouterOS 7 | routeros7 | 2 | 256 | e1000 | +| Mikrotik RouterOS 7 | routeros7 | 2 | 256 | e1000 | | OpenBSD | openbsd | 1 | 1024 | virtio | | Sonic | sonic | 2 | 4096 | virtio | | VyOS | vyos | 2 | 1024 | virtio | @@ -194,6 +197,7 @@ Ansible playbooks included with **netlab** can deploy and collect device configu | Cisco Nexus OS | ✅ | ✅ | | Cumulus Linux | ✅ | ✅ | | Dell OS10 | ✅ | ✅ | ✅ | +| Extreme Networks EXOS | ✅ | ✅ | | Fortinet FortiOS | ✅ | ✅ | | FRR | ✅ [❗](caveats-frr) | ✅[❗](caveats-frr) | | Generic Linux | ✅ | ❌ | @@ -278,6 +282,7 @@ The following system-wide features are configured on supported network operating | Cumulus Linux | ✅ | ✅[^HIF] | ✅ | ✅ | ✅ | | Cumulus Linux 5.x (NVUE) | ✅ | ✅ | ✅ | ✅ | ✅ | | Dell OS10 | ✅ | ✅ | ✅ | ✅ | ✅ | +| Extreme Networks EXOS | ✅ | ❌ | ✅ | ✅ | ✅ | | Fortinet FortiOS | ✅ | ❌ | ✅ | ✅ | ✅ | | FRR | ✅ | ✅[^HIF] | ❌ | ✅ | ✅ | | Generic Linux | ✅ | ✅[^HIF] | ✅[❗](linux-lldp) | ✅ | ✅ | @@ -307,6 +312,7 @@ The following interface parameters are configured on supported network operating | Cumulus Linux | ✅ | ✅ | ✅ | ✅ | | Cumulus Linux 5.x (NVUE) | ✅ | ❌ | ✅ | ✅ | | Dell OS10 | ✅ | ❌ | ✅ | ✅ | +| Extreme Networks EXOS | ✅ | ❌ | ✅ | ❌ | | Fortinet FortiOS | ✅ | ✅ | ✅[❗](caveats-fortios) | ❌ | | FRR | ✅ | ✅ | ✅ | ✅ | | Generic Linux | ❌ | ❌ | ✅ | ❌ | @@ -334,6 +340,7 @@ The following interface addresses are supported on various platforms; most daemo | Cumulus Linux | ✅ | ✅ | ✅ | ❌ | | Cumulus Linux 5.x (NVUE) | ✅ | ✅ | ✅ | ❌ | | Dell OS10 | ✅ | ✅ | ❌ | ❌ | +| Extreme Networks EXOS | ✅ | ✅ | ❌ | ❌ | | Fortinet FortiOS | ✅ | ✅ | ❌ | ❌ | | FRR | ✅ | ✅ | ✅ | ✅ | | Generic Linux | ✅ | ✅ | ❌ | ❌ | diff --git a/netsim/ansible/tasks/deploy-config/exos.yml b/netsim/ansible/tasks/deploy-config/exos.yml new file mode 100644 index 0000000000..c29c9b08bb --- /dev/null +++ b/netsim/ansible/tasks/deploy-config/exos.yml @@ -0,0 +1,4 @@ +- name: "exos_config: deploying {{ netsim_action }} from {{ config_template }}" + community.network.exos_config: + src: "{{ config_template }}" + tags: [ print_action, always ] diff --git a/netsim/ansible/tasks/fetch-config/exos.yml b/netsim/ansible/tasks/fetch-config/exos.yml new file mode 100644 index 0000000000..929965fd52 --- /dev/null +++ b/netsim/ansible/tasks/fetch-config/exos.yml @@ -0,0 +1,3 @@ +--- +- community.network.exos_facts: + gather_subset: config diff --git a/netsim/ansible/templates/initial/exos.j2 b/netsim/ansible/templates/initial/exos.j2 new file mode 100644 index 0000000000..790159070b --- /dev/null +++ b/netsim/ansible/templates/initial/exos.j2 @@ -0,0 +1,51 @@ +configure snmp sysName {{ inventory_hostname.replace("_","-") }} + +enable lldp ports all +disable lldp ports Mgmt + +{% for vname in vrfs|default({}) %} +create virtual-router {{ vname }} type user +{% endfor %} + +{% for l in netlab_interfaces %} +{% set is_loopback = l.type|default('') == 'loopback' %} +{% set vlan_name = 'VLAN_LO' + l.ifindex|string if is_loopback else 'VLAN_P' + l.ifname %} +create vlan "{{ vlan_name }}" +{% if is_loopback %} +enable loopback-mode vlan {{ vlan_name }} +{% else %} +configure vlan {{ vlan_name }} add ports {{ l.ifname }} untagged +{% if l.name is defined %} +configure ports {{ l.ifname }} display-string {{ (l.name + ("-"+l.role if l.role is defined else "")) | replace('->','to') | replace(' ','_') }} +{% elif l.type == "stub" %} +configure ports {{ l.ifname }} display-string Stub +{% endif %} +{% if l.mtu is defined %} +enable jumbo-frame ports {{ l.ifname }} +{% endif %} +{% endif %} +{% if l.vrf is defined %} +configure vlan {{ vlan_name }} virtual-router {{ l.vrf }} +{% endif %} +{% if l.ipv4 is defined %} +{% if l.ipv4 is sameas True %} +! Unnumbered IPv4 not implemented for EXOS +{% elif l.ipv4 is string and l.ipv4|ansible.utils.ipv4 %} +configure vlan {{ vlan_name }} ipaddress {{ l.ipv4|ansible.utils.ipaddr('address') }} {{ l.ipv4|ansible.utils.ipaddr('netmask') }} +{% else %} +! Invalid IPv4 address {{ l.ipv4 }} +{% endif %} +{% endif %} +{% if l.ipv6 is defined %} +{% if l.ipv6 is sameas True %} +! Link-local-only IPv6 not implemented for EXOS +{% elif l.ipv6 is string and l.ipv6|ansible.utils.ipv6 %} +configure vlan {{ vlan_name }} ipaddress {{ l.ipv6|upper }} +{% else %} +! Invalid IPv6 address {{ l.ipv6 }} +{% endif %} +{% endif %} +{% if not is_loopback and l.mtu is defined %} +configure ip-mtu {{ l.mtu }} vlan {{ vlan_name }} +{% endif %} +{% endfor %} diff --git a/netsim/devices/exos.yml b/netsim/devices/exos.yml new file mode 100644 index 0000000000..fa18345641 --- /dev/null +++ b/netsim/devices/exos.yml @@ -0,0 +1,38 @@ +--- +description: Extreme EXOS +interface_name: "{ifindex}" +loopback_interface_name: loopback{ifindex} +ifindex_offset: 1 +mgmt_if: Mgmt +role: router +features: + initial: + min_mtu: 1500 + max_mtu: 9216 +libvirt: + create_template: exos.xml.j2 + image: netlab/exos +clab: + build: True + image: vrnetlab/extreme_exos + node: + kind: linux # kind not yet available in Containerlab + interface: + name: "eth{ifindex}" + group_vars: + ansible_user: vrnetlab + ansible_ssh_pass: VR-netlab9 +group_vars: + ansible_network_os: exos + ansible_connection: ansible.netcommon.network_cli + netlab_console_connection: ssh + netlab_initial: always + ansible_user: admin + ansible_ssh_pass: admin + netlab_ssh_args: >- + -o KexAlgorithms=+diffie-hellman-group-exchange-sha1 + -o PubkeyAcceptedKeyTypes=ssh-rsa + -o HostKeyAlgorithms=+ssh-rsa +external: + image: none +graphite.icon: switch diff --git a/netsim/install/libvirt/exos.txt b/netsim/install/libvirt/exos.txt new file mode 100644 index 0000000000..e90ec07d69 --- /dev/null +++ b/netsim/install/libvirt/exos.txt @@ -0,0 +1,61 @@ +Creating initial configuration for Extreme EXOS Vagrant box +=========================================================== + +* Wait for the 'login' prompt and 'Authentication Service (AAA) on the + master node is now available for login' message +* Log in as 'admin' (no password) + +Answers the never-ending list of setup questions: + +* Disable auto-provision: yes +* Management port: skip +* Disable MSTP: no +* Enable enhanced security: no +* Disable Telnet: yes +* Enable SNMPv2: no +* Enable SNMPv3: no +* Turn off unconfigured ports by default: yes +* Failsafe username/password: no + +When you get to the end of the list, you can see the CLI commands you just +generated and a list of generally useful commands. After that, you'll eventually +get to the EXOS prompt (* EXOS-VM.1): + +Enter these commands one at a time. There will be extra prompts, so do not +copy and paste everything at once. Skip the text in brackets; it is included +only as an explanation. + +* configure account admin password (old password is empty, new one is admin) +* enable ssh +* create account admin vagrant vagrant +* create sshd2 user-key vagrant AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== +* configure sshd2 user-key vagrant add user vagrant +* unconfigure vlan Mgmt ip (remove current IP from management VLAN) +* enable dhcp vlan Mgmt (enable DHCP on management VLAN) +* save configuration + +Disconnect from the console (Ctrl+] usually works). + +For convenience, here is a copy-and-paste version of the commands above, use with caution: + +==================================================== + +configure account admin password + +admin +admin + +enable ssh +y + +create account admin vagrant vagrant +create sshd2 user-key vagrant AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== +configure sshd2 user-key vagrant add user vagrant + +unconfigure vlan Mgmt ip +enable dhcp vlan Mgmt + +save configuration +y + +==================================================== diff --git a/netsim/install/libvirt/exos.xml.j2 b/netsim/install/libvirt/exos.xml.j2 new file mode 100644 index 0000000000..aeb81931ed --- /dev/null +++ b/netsim/install/libvirt/exos.xml.j2 @@ -0,0 +1,52 @@ + + vm_box + 1024 + 1024 + 1 + + /machine + + + hvm + + + + + + + + + + destroy + restart + restart + + + + + + /usr/bin/qemu-system-x86_64 + + + + + +
+ + + + +
+ + + + + + + + + + + + + diff --git a/netsim/templates/provider/libvirt/exos-domain.j2 b/netsim/templates/provider/libvirt/exos-domain.j2 new file mode 100644 index 0000000000..78265724eb --- /dev/null +++ b/netsim/templates/provider/libvirt/exos-domain.j2 @@ -0,0 +1,15 @@ + {{ name }}.vm.synced_folder ".", "/vagrant", disabled: true + {{ name }}.ssh.insert_key = false + {{ name }}.vm.boot_timeout = 180 + {{ name }}.vm.guest = :freebsd + {{ name }}.ssh.username = "admin" + {{ name }}.ssh.password = "admin" + {{ name }}.ssh.shell = "" + + {{ name }}.vm.provider :libvirt do |domain| + domain.nic_adapter_count = 13 + domain.memory = 512 + domain.cpus = 1 + domain.driver = "kvm" + domain.nic_model_type = "rtl8139" + end