Changes in Release 25.11

New Functionality

  • The netlab graph command can generate PNG/SVG/JPEG/PDF graphs if you have D2 or Graphviz installed

  • You can generate reports and graphs, or inspect transformed topology data without starting a lab

  • You can use device-based groups (for example, eos or frr groups) to set node attributes (breaking change). Previously, these groups could be used solely to set Ansible group variables.

  • Internal ipaddr/hwaddr Jinja2 filters (see also Breaking changes)

Minor improvements

  • Make netlab documentation available on GitHub Pages

  • When needed, unzip disk images in the netlab libvirt package command

  • Calculate missing OSPF interface timers

  • Warn about Ansible 12.x installation instead of giving up immediately

  • The files plugin refuses to create files outside of the lab directory

  • Use a generic “wait for SSH server” readiness test for all vrnetlab-based containers

  • Use a generic “wait for the first physical interface” readiness test for all Junos-based devices

  • Add clab.network-mode node setting to disconnect a node from the management network (needed in labs with more than ~1000 devices)

  • Generate warnings for EVPN and L3VPN BGP sessions without extended communities

New Device Features

Cisco IOS/XE:

  • SRv6 support on Catalyst 8000v, IOL, and IOLL2

OpenBSD:

  • RIPv2 and RIPng support

  • Redistribution of static/connected routes into OSPFv2/OSPFv3

Minor Device Changes and Configuration Templates Fixes

FRRouting:

  • Change default release to 10.5.0

SR Linux:

  • Change default release to 25.10.1

Junos:

  • Use next_hop_self and rr_client BGP neighbor attributes in BGP configuration template

  • Set next-hop-self in Junos BGP policies only for IPv4/IPv6 AF

Mikrotik RouterOS:

  • Change default release to 7.18.2

New Developer Documentation

  • BGP configuration templates

  • RIPv2/RIPng configuration templates

Breaking changes

Built-in ipaddr/hwaddr Jinja2 Filters

The drastic changes made in Ansible core release 2.19 broke several built-in netlab templates, forcing us to use Ansible 11.x with netlab release 25.09-post1.

netlab used core- and ipaddr Ansible filters in its Jinja2 templates, but even the import of these filters triggered the changes in Jinja2 behavior, making a clean split with Ansible in core netlab code the only viable option. The device configuration templates are not affected as they’re rendered within an Ansible playbook.

netlab release 25.11 implements its own version of ipaddr and hwaddr filters, which provide the small subset of functionality required in built-in Jinja2 templates. This change might break customized provider configuration file templates, custom daemon configuration files, complex validation code using Jinja2 expressions, or custom reports.

Warning

While the built-in Jinja2 templates are used to generate daemon configuration files, the ‌netlab initial –output command still uses an Ansible playbook (and Ansible filters) to generate them.

You can find the correct version of the daemon configuration files in the ‌clab_files/node directory.

We plan to fix this behavior in the next netlab release.

Please open an issue if you need an Ansible filter or ipaddr behavior that we did not implement.

Device-Based Groups

Previous netlab releases allowed you to specify members of a device group (for example, eos or frr group).

Starting with release 25.11, netlab builds the member list of device groups from node device attribute, and reports an error if you define a member list in such a group.

Bug Fixes

  • Remove readiness check for libvirt IOS-XR

  • Ensure that the ‘indent’ filter is not called on an empty string

  • Replace symlinks in VRF config templates with file paths

  • Set bgp.advertise on main loopback to simplify BGP config templates

  • Disable Sphinx “strikethrough only works in HTML” warnings

  • Avoid superfluous EBGP sessions for BGP Confederation members within the same sub-AS

  • Check IPv4/IPv6 session activation in per-AF BGP graphs

  • Handle an edge case of ‘template/base’ configlet (#2738)

  • Add integration test support for Python 3.14 (#2737)

  • Initial configuration fails when intf.ipv4 is undefined (#2769)

  • Fix ‘when’ conditions in Ansible playbooks/task lists (#2764)

  • Selective execution of create/config steps in integration tests

  • Use importlib to test module import in the ‘netlab version’ command

  • Tweak VRF tests to cope with Schroedinger ping

  • Fix SR Linux version detection (#2793)

  • Check variable type of netlab defaults when initializing the list of modules

  • Fix: bgp.originate plugin borked ‘module’ attribute on hosts

  • Mark netsim package as mypy-typed

  • Move CL “is NVUE ready” check into readiness-check task list (#2790)

  • FRR: Use ‘rr_client’ neighbor attribute to configure EVPN RR client (#2783)

  • Fix: Convert IOLL2 VLAN template symlinks into includes (#2781)

  • Simplify BGP per-AF neighbor activation logic (EOS, FRR, IOS) (#2779)

  • ArubaCX: Check for static route nexthop data before using it (#2786)

Documentation Fixes

  • Add information on build netscaler containers

  • Describe how the DHCP module builds DHCP pools

  • Try using Paramiko with Ansible if access to Cisco IOS fails

  • Remove a bogus footnote in updated OSPF documentation

  • Caveat: latest supported RouterOS release is 7.18.2 (#2796)