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)