diff --git a/docs/caveats.md b/docs/caveats.md index cb28218fa4..8a73ea197a 100644 --- a/docs/caveats.md +++ b/docs/caveats.md @@ -10,18 +10,18 @@ (caveats-eos)= ## Arista EOS -* Routed VLANs cannot be used in EVPN MPLS VLAN bundles -* Arista EOS uses an [invalid value for the suboption 150 of the DHCP option 82](https://blog.ipspace.net/2023/03/netlab-vrf-dhcp-relay.html#vendor-interoperability-is-fun) when doing inter-VRF DHCPv4 relaying. -* The DHCP client on Arista EOS is finicky. When the DHCP state changes on one of the data-plane Ethernet interfaces, the management interface might lose its IPv4 address. -* You can set Arista cEOS serial number and system MAC address with the **eos.serialnumber** and **eos.systemmacaddr** node properties. +### Arista vEOS VM Caveats + * Use **libvirt.uuid** node property to ensure a vEOS VM does not change its serial number every time you start the lab. + +(caveats-ceos)= +### Arista cEOS Container Caveats + +* Arista cEOS containers are configured through an Ansible playbook, using an SSH session with the **arista.eos.eos_config** Ansible modules. To configure them with Linux scripts using FastCLI, set the **defaults.devices.eos.clab.group_vars.netlab_config_mode** [topology default](topo-defaults) to **sh**. You can also set the **netlab_config_mode** node variable to **sh** to experiment with this feature. +* You can set Arista cEOS serial number and system MAC address with the **eos.serialnumber** and **eos.systemmacaddr** node properties. * Anycast gateways and DHCP/DHCPv6 clients do not work on Arista cEOS Ethernet interfaces. -* Arista EOS cannot configure OSPF NSSA type-7 address ranges. -* IPv6 BFD for IS-IS cannot be enabled on individual interfaces. If you set **isis.bfd.ipv6** to *True*, BFD is enabled on all IS-IS interfaces. * cEOS MPLS data plane was introduced in release 4.32.1F. * Arista cEOS disables OSPFv2 on broadcast container stub interfaces (implemented as _dummy_ interfaces). _netlab_ automatically changes the OSPF network type for Arista cEOS dummy interfaces to **point-to-point**. -* Arista EOS virtual machines and containers use [proprietary control-plane messages to indicate the loss of Ethernet line protocol](https://blog.ipspace.net/2025/03/arista-spooky-action-distance/). Set the **netlab_phy_control** node variable to *False* to disable this functionality. -* Reloading device configurations that contain `no lldp transmit` or `no lldp receive` configuration command randomly fails due to an Arista EOS bug ([more details](https://github.com/ipspace/netlab/issues/2577)). Remove these commands from the saved device configurations before restarting the lab. The default name of the management interface is **Management0** on vEOS and **Management1** on cEOS. If you'd like to change the management interface name on cEOS: @@ -45,6 +45,16 @@ nodes: intf_map: /mnt/flash/EosIntfMapping_json ``` +### Other Arista EOS Caveats + +* Routed VLANs cannot be used in EVPN MPLS VLAN bundles +* Arista EOS uses an [invalid value for the suboption 150 of the DHCP option 82](https://blog.ipspace.net/2023/03/netlab-vrf-dhcp-relay.html#vendor-interoperability-is-fun) when doing inter-VRF DHCPv4 relaying. +* The DHCP client on Arista EOS is finicky. When the DHCP state changes on one of the data-plane Ethernet interfaces, the management interface might lose its IPv4 address. +* Arista EOS cannot configure OSPF NSSA type-7 address ranges. +* IPv6 BFD for IS-IS cannot be enabled on individual interfaces. If you set **isis.bfd.ipv6** to *True*, BFD is enabled on all IS-IS interfaces. +* Arista EOS virtual machines and containers use [proprietary control-plane messages to indicate the loss of Ethernet line protocol](https://blog.ipspace.net/2025/03/arista-spooky-action-distance/). Set the **netlab_phy_control** node variable to *False* to disable this functionality. This functionality is automatically disabled if you use FastCli scripts to configure Arista cEOS containers. +* Device configurations that contain `no lldp transmit` or `no lldp receive` configuration command trigger configuration reload failures due to an Arista EOS bug ([more details](https://github.com/ipspace/netlab/issues/2577)). These commands are thus automatically removed from collected device configurations. + (caveats-aruba)= ## Aruba AOS-CX diff --git a/netsim/ansible/templates/lag/eos.j2 b/netsim/ansible/templates/lag/eos.j2 index 47d770a748..20b70a9faa 100644 --- a/netsim/ansible/templates/lag/eos.j2 +++ b/netsim/ansible/templates/lag/eos.j2 @@ -32,10 +32,6 @@ interface {{ ch.ifname }} channel-group {{ intf.lag.mlag.ifindex }} mode active ! {% endfor %} - -{% if 'gateway' in module %} -ip virtual-router mac-address mlag-peer -{% endif %} {% endfor %} {% for intf in interfaces if intf.type == 'lag' %} diff --git a/netsim/ansible/templates/normalize/eos.j2 b/netsim/ansible/templates/normalize/eos.j2 index fdeb6f58e4..dd63e1b82c 100644 --- a/netsim/ansible/templates/normalize/eos.j2 +++ b/netsim/ansible/templates/normalize/eos.j2 @@ -1,6 +1,9 @@ {% for intf in interfaces if intf.virtual_interface is not defined %} ! interface {{ intf.ifname }} +{% if node_provider == 'clab' and netlab_config_mode == 'sh' %} + platform tfa phy control-frame disabled +{% endif %} {# 'no switchport' allocates an internal VLAN in range 1006-, causing issues when overlapping with topology vlans #} shutdown {% if l.mac_address is defined %} diff --git a/netsim/ansible/templates/ospf/eos.ospfv3.j2 b/netsim/ansible/templates/ospf/eos.ospfv3.j2 index f3183532cb..6be22d922b 100644 --- a/netsim/ansible/templates/ospf/eos.ospfv3.j2 +++ b/netsim/ansible/templates/ospf/eos.ospfv3.j2 @@ -34,7 +34,7 @@ interface {{ l.ifname }} ! {% endfor %} ! -{% if ospf_vrf %}} +{% if ospf_vrf %} ipv6 router ospf {{ ospf_pid }} vrf {{ ospf_vrf }} {% else %} ipv6 router ospf {{ ospf_pid }} diff --git a/netsim/ansible/templates/stp/eos.j2 b/netsim/ansible/templates/stp/eos.j2 index 7daf678d08..82606b699a 100644 --- a/netsim/ansible/templates/stp/eos.j2 +++ b/netsim/ansible/templates/stp/eos.j2 @@ -6,11 +6,10 @@ {% endif %} {# options are 'none', rstp, rapid-pvst or mstp (default if not set) #} spanning-tree mode {{ mode }} - {% if 'priority' in stp %} spanning-tree priority {{ stp.priority }} {% endif %} - +! {# Check for per-VLAN enable and priority; implies Rapid-PVST #} {% if vlans is defined %} {% for vname,vdata in vlans.items() %} @@ -23,19 +22,18 @@ spanning-tree vlan-id {{ vdata.id }} priority {{ stp.priority }} {% endif %} {% endfor +%} {% endif %} - +! {% for ifdata in interfaces if 'stp' in ifdata %} {% if ifdata.vlan.trunk_id is defined or ifdata.vlan.access_id is defined %} interface {{ ifdata.ifname }} {% if not ifdata.stp.enable|default(True) %} - ! Disable STP on this interface, i.e. dont receive or send BPDUs +! Disable STP on this interface, i.e. don't receive or send BPDUs spanning-tree bpdufilter enable {% elif 'port_priority' in ifdata.stp %} -# -# Use 16x port_priority to get the correct 4-bit value on the wire -# +! +! Use 16x port_priority to get the correct 4-bit value on the wire +! spanning-tree port-priority {{ ifdata.stp.port_priority * 16 }} -# {% endif %} {% endif %} {% if ifdata.stp.port_type is defined %} diff --git a/netsim/devices/eos.yml b/netsim/devices/eos.yml index 1a8048a409..304336ea4a 100644 --- a/netsim/devices/eos.yml +++ b/netsim/devices/eos.yml @@ -148,6 +148,16 @@ clab: ansible_become: yes ansible_become_method: enable netlab_ready: [ ssh ] + netlab_config_path: /mnt/flash/ # These variables are used when netlab_config_mode == 'sh' + netlab_config_wrapper: | + {% if netlab_config_mode == 'sh' %} + #!/usr/bin/FastCli + configure terminal + {% endif %} + {{ netlab_config_text }} + {% if netlab_config_mode == 'sh' %} + end + {% endif %} libvirt: build: https://netlab.tools/labs/eos/ image: arista/veos diff --git a/netsim/extra/bgp.session/eos.j2 b/netsim/extra/bgp.session/eos.j2 index 4b95018541..ed678309f5 100644 --- a/netsim/extra/bgp.session/eos.j2 +++ b/netsim/extra/bgp.session/eos.j2 @@ -89,4 +89,7 @@ router bgp {{ bgp.as }} {% endfor %} {% endif %} ! +{% if netlab_config_mode|default('') == 'sh' %} +do bash sleep 2 +{% endif %} do clear bgp vrf all diff --git a/tests/topology/expected/vxlan-router-stick.yml b/tests/topology/expected/vxlan-router-stick.yml index 5637f8eaf2..b822b6eef2 100644 --- a/tests/topology/expected/vxlan-router-stick.yml +++ b/tests/topology/expected/vxlan-router-stick.yml @@ -62,11 +62,50 @@ module: name: input nodes: r1: + _node_config: + initial: /mnt/flash/02-initial.sh:sh + normalize: /mnt/flash/01-normalize.sh:sh + ospf: /mnt/flash/04-ospf.sh:sh + vlan: /mnt/flash/03-vlan.sh:sh + vrf: /mnt/flash/05-vrf.sh:sh + vxlan: /mnt/flash/06-vxlan.sh:sh af: ipv4: true vpnv4: true box: none clab: + binds: + - source: node_files/r1/normalize + target: /mnt/flash/01-normalize.sh + - source: node_files/r1/initial + target: /mnt/flash/02-initial.sh + - source: node_files/r1/vlan + target: /mnt/flash/03-vlan.sh + - source: node_files/r1/ospf + target: /mnt/flash/04-ospf.sh + - source: node_files/r1/vrf + target: /mnt/flash/05-vrf.sh + - source: node_files/r1/vxlan + target: /mnt/flash/06-vxlan.sh + config_templates: + - mode: sh + source: normalize + target: /mnt/flash/01-normalize.sh + - mode: sh + source: initial + target: /mnt/flash/02-initial.sh + - mode: sh + source: vlan + target: /mnt/flash/03-vlan.sh + - mode: sh + source: ospf + target: /mnt/flash/04-ospf.sh + - mode: sh + source: vrf + target: /mnt/flash/05-vrf.sh + - mode: sh + source: vxlan + target: /mnt/flash/06-vxlan.sh env: CLAB_MGMT_VRF: management INTFTYPE: et @@ -156,6 +195,13 @@ nodes: - vrf - vxlan name: r1 + netlab_ansible_skip_module: + - normalize + - initial + - vlan + - ospf + - vrf + - vxlan ospf: af: ipv4: true @@ -215,10 +261,31 @@ nodes: vtep_list: - 10.0.0.2 s1: + _node_config: + initial: /mnt/flash/02-initial.sh:sh + normalize: /mnt/flash/01-normalize.sh:sh + vlan: /mnt/flash/03-vlan.sh:sh af: ipv4: true box: none clab: + binds: + - source: node_files/s1/normalize + target: /mnt/flash/01-normalize.sh + - source: node_files/s1/initial + target: /mnt/flash/02-initial.sh + - source: node_files/s1/vlan + target: /mnt/flash/03-vlan.sh + config_templates: + - mode: sh + source: normalize + target: /mnt/flash/01-normalize.sh + - mode: sh + source: initial + target: /mnt/flash/02-initial.sh + - mode: sh + source: vlan + target: /mnt/flash/03-vlan.sh env: CLAB_MGMT_VRF: management INTFTYPE: et @@ -303,6 +370,10 @@ nodes: module: - vlan name: s1 + netlab_ansible_skip_module: + - normalize + - initial + - vlan role: router vlan: max_bridge_group: 2 @@ -325,10 +396,43 @@ nodes: ipv4: 172.16.0.0/24 vni: 101000 s2: + _node_config: + initial: /mnt/flash/02-initial.sh:sh + normalize: /mnt/flash/01-normalize.sh:sh + ospf: /mnt/flash/05-ospf.sh:sh + vlan: /mnt/flash/03-vlan.sh:sh + vxlan: /mnt/flash/04-vxlan.sh:sh af: ipv4: true box: none clab: + binds: + - source: node_files/s2/normalize + target: /mnt/flash/01-normalize.sh + - source: node_files/s2/initial + target: /mnt/flash/02-initial.sh + - source: node_files/s2/vlan + target: /mnt/flash/03-vlan.sh + - source: node_files/s2/vxlan + target: /mnt/flash/04-vxlan.sh + - source: node_files/s2/ospf + target: /mnt/flash/05-ospf.sh + config_templates: + - mode: sh + source: normalize + target: /mnt/flash/01-normalize.sh + - mode: sh + source: initial + target: /mnt/flash/02-initial.sh + - mode: sh + source: vlan + target: /mnt/flash/03-vlan.sh + - mode: sh + source: vxlan + target: /mnt/flash/04-vxlan.sh + - mode: sh + source: ospf + target: /mnt/flash/05-ospf.sh env: CLAB_MGMT_VRF: management INTFTYPE: et @@ -435,6 +539,12 @@ nodes: - vxlan - ospf name: s2 + netlab_ansible_skip_module: + - normalize + - initial + - vlan + - vxlan + - ospf ospf: af: ipv4: true diff --git a/tests/topology/input/vxlan-router-stick.yml b/tests/topology/input/vxlan-router-stick.yml index eb0a640c38..989d3641e8 100644 --- a/tests/topology/input/vxlan-router-stick.yml +++ b/tests/topology/input/vxlan-router-stick.yml @@ -6,7 +6,9 @@ # defaults.device: eos provider: clab -defaults.devices.eos.clab.image: none +defaults.devices.eos.clab: + image: none + group_vars.netlab_config_mode: sh groups: router: