Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/caveats.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
28 changes: 28 additions & 0 deletions docs/labs/exos.md
Original file line number Diff line number Diff line change
@@ -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 <URL>` 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:
```
1 change: 1 addition & 0 deletions docs/labs/exos.txt
2 changes: 2 additions & 0 deletions docs/labs/libvirt.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -304,6 +305,7 @@ providers.libvirt.probe: []
cat8000v.md
csr.md
cumulus_nvue.md
exos.md
fortios.md
frr.md
iosv.md
Expand Down
21 changes: 14 additions & 7 deletions docs/platforms.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down Expand Up @@ -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 | ❌ | ❌ | ✅ |
Expand All @@ -152,25 +154,26 @@ Configuration files for Virtualbox and KVM/libvirt environments specify the numb

| Virtual network device | netlab<br>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 |
Expand All @@ -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 | ✅ | ❌ |
Expand Down Expand Up @@ -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) | ✅ | ✅ |
Expand Down Expand Up @@ -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 | ❌ | ❌ | ✅ | ❌ |
Expand Down Expand Up @@ -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 | ✅ | ✅ | ❌ | ❌ |
Expand Down
4 changes: 4 additions & 0 deletions netsim/ansible/tasks/deploy-config/exos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- name: "exos_config: deploying {{ netsim_action }} from {{ config_template }}"
community.network.exos_config:
src: "{{ config_template }}"
tags: [ print_action, always ]
3 changes: 3 additions & 0 deletions netsim/ansible/tasks/fetch-config/exos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
- community.network.exos_facts:
gather_subset: config
51 changes: 51 additions & 0 deletions netsim/ansible/templates/initial/exos.j2
Original file line number Diff line number Diff line change
@@ -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 %}
38 changes: 38 additions & 0 deletions netsim/devices/exos.yml
Original file line number Diff line number Diff line change
@@ -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
61 changes: 61 additions & 0 deletions netsim/install/libvirt/exos.txt
Original file line number Diff line number Diff line change
@@ -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

====================================================
52 changes: 52 additions & 0 deletions netsim/install/libvirt/exos.xml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<domain type='kvm'>
<name>vm_box</name>
<memory unit='MiB'>1024</memory>
<currentMemory unit='MiB'>1024</currentMemory>
<vcpu placement='static'>1</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu mode='host-model' check='partial'/>
<clock offset='utc' />
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='{{ user.cwd }}/vm.qcow2'/>
<target dev='hda' bus='ide'/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb'/>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='network'>
<source network='vagrant-libvirt'/>
<model type='rtl8139'/>
</interface>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<memballoon model='virtio'/>
</devices>
</domain>
15 changes: 15 additions & 0 deletions netsim/templates/provider/libvirt/exos-domain.j2
Original file line number Diff line number Diff line change
@@ -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
Loading