Changes in Release 25.09

New Functionality

  • Link impairment (implemented with Linux netem queuing discipline) can be defined in lab topology or configured/controlled with the netlab tc command

  • New device: Nokia SR-SIM

  • Specify the lab topology in the netlab create/up command as a filename or URL

  • Configurable IPv6 Router Advertisement parameters

  • The files plugin allows you to store the content of short files directly in the lab topology, making it easier to create portable lab topologies that can be downloaded from the Internet (including straight from GitHub repositories).

  • The functionality of the files plugin allows you to define shared custom configuration templates in the lab topology or inline custom configuration directly within node/group data or validation tests.

New reports

  • isis-nodes (available as text, Markdown, or HTML) reports IS-IS nodes, areas, system IDs, and IS-types

  • ssh_config report creates an SSH configuration file you can use to establish SSH sessions with the lab devices using the netlab server as a proxy host.

Performance and scalability improvement

  • Shared container files (for example, /etc/hosts shared across all Linux and FRR containers) significantly reduce the lab creation time in large topologies.

  • Use Python pickle instead of YAML to create a snapshot file of the transformed topology data

  • Cache Jinja2 environments and templates

  • Allow more than 250 nodes in a lab topology

  • Change management MAC address calculation for large topologies [1]

Graphing improvements

  • isis graph type creates a graph of IS-IS routing, including areas, color-coded circuit types, and stub networks

  • Graph titles can be defined with the graph.title topology parameter

  • BGP graphs can display a subset of address families. They can also display VRF BGP sessions as dashed lines.

  • Add ‘color’, ‘width’, and ‘fill’ attributes to GraphViz and D2 graphs

  • Add localas_ibgp/confed_ebgp session styling to D2/GraphViz graphs

Minor improvements

  • Implement select IGP parameters on the primary loopback interface, allowing you to disable an IGP on the loopback interface, or set the loopback OSPF area or OSPF/IS-IS cost.

  • Enable setting IS-IS circuit type at interface level (implemented on all platforms supporting IS-IS)

  • Add ‘–suffix’ parameter to ‘netlab collect’

  • Add per-node libvirt port forwarding

  • Allow regular expressions to select tests executed by the netlab validate command

  • BGP next-hop-self and rr-client attributes (previously computed in the configuration templates) are calculated in the BGP data transformation code, ensuring consistent multi-vendor deployments and enabling a complete IBGP local-as implementation. The new attributes are used on Arista EOS, Cisco IOS/IOS-XE, and FRR.

  • Add ‘–format’ parameter to ‘netlab graph’ command

  • Graphing software installation script

New Device Features

Arista EOS:

  • Configurable IPv6 RA parameters

  • IS-IS circuit-type and IS-IS BFD support for IPv6

  • Remove lldp commands that trigger an Arista EOS bug from collected configurations

Aruba CX:

  • Support for VLAN-aware EVPN bundles

Cisco IOS:

  • Configurable IPv6 RA parameters

  • Use ‘send-community both’ on IOS/XE longing to be back in the 90s

  • Add configurable ‘debug at startup’ capability

FRR:

  • Configurable IPv6 RA parameters

  • Initial configuration template enables logging to /tmp/logging

  • Add configurable ‘debug at startup’ capability

  • Change default release to 10.4.1

Junos:

  • Support for explicit EVPN VLAN-aware bundle on vJunos-switch

  • Originate BGP default route on VRF EBGP sessions

Linux:

  • Enable IPv6 LLA-only interfaces

SR Linux:

  • Change default release to 25.7.1

VyOS:

  • Use a vbash wrapper to support simpler configuration templates that contain just the set commands (previous configuration templates were always complete vbash scripts)

Fixes in Configuration Templates

Junos

  • Use only relevant filter-lists in Junos policy statements

Linux:

  • Fix DHCPv6 client on Ubuntu/Netplan

Breaking changes

Changes in the snapshot file format:

  • netlab a pickle snapshot file to store the transformed lab topology data. It still generates the netlab.snapshot.yml file in case you want to use it with your own scripts, but no longer reads it when executing netlab commands.

  • The snapshot file (pickle and YAML version) includes the _netlab_version key, which is checked when reading the snapshot data, making it harder to accidentally specify another YAML file as the snapshot file[2].

Warning

Due to the snapshot file format changes, shut down all lab instances before upgrading to release 25.09.

Other potentially-breaking changes:

  • The D2 graph styling is now defined in the defaults.outputs.d2.styles dictionary. The mapping of extra styling attributes is defined in the defaults.outputs.d2.style_map dictionary. netlab automatically migrates previously defined custom styling of node types, IBGP, and EBGP sessions before creating the graph.

  • The D2 interfaces feature is no longer available. We removed the corresponding outputs.d2.node_interfaces system default.

Bug Fixes

  • Use ‘_netlab_version’ attribute to check the validity of the snapshot file (#2662)

  • Recognize provider- and output- global attributes

  • ‘netlab collect’ does not need to load the topology snapshot

  • Display the correct netlab command in the subcommand parser help

  • Bump containerlab version to 0.69.3 (#2651)

  • Add VRF information to BGP neighbor data (#2639)

  • Fix a missing f-string in libvirt.py (#2636)

  • Make “bgp._session_clear” VRF-aware (#2630)

  • Add “ruff check” to GH actions, clean up the imports (#2627)

  • Refactor ‘interface_feature_check’ in link transformation code

  • Add plugin usage statistics (#2595)

  • Recognize absolute/relative paths in ‘netlab config’ (#2587)

  • Include VRF BGP sessions in the BGP graph (#2596)

  • Check ‘next-hop-self force’ on all IBGP sessions in localas-ibgp test

  • Recognize absolute directory paths in collect-configs playbook (#2586)

  • Add the ‘error’ data type to warn users about missing plugins (#2579)

  • Implement “float” and “time” data types (#2620)

  • Remove FRR release pin from the EVPN EBGP integration test

  • Check IPv4 and IPv6 IBGP session in LLA/Locpref test

  • Add netlab environment variables to reporting environment

  • Make the ifname of host-side part of vEth pair unique (#2570)

  • Allow output-specific attributes in group node data (#2566)

  • Use yaml to parse netlab environment variables

  • Device-specific attributes like ios.debug can be global

  • Add split_line attribute to list validation

  • Use shared logic to generate (consistent) D2 and GraphViz graphs

  • Add IS-IS circuit type to capabilities displayed by show module

  • Add unique (text) ID to netlab statistics file

  • Enable device-specific attributes regardless of lab devices

  • Set ‘rr_client’ and ‘next_hop_self’ attributes on BGP neighbor data

  • A router with localas_ibgp session MUST change NH on all IBGP routes

  • Missing f-string in links RA error messages

  • Include environment variables when generating graphs

  • Print defaults set from environment variables in -vv mode

  • Implement str.removeprefix in strings.utils for Python 3.8

Documentation Fixes

  • Clarify the “clab.config_template” example

  • Add testing instructions to the Ubuntu installation document

  • Clean up the generic Linux installation documentation

  • Document the “no lldp transmit/receive” EOS SNAFU (#2584)

  • Expand the list of contributors

  • Google Cloud can enable nested virtualization via CLI/API

  • Document device debugging approaches

  • Change all stale vrnetlab URLs to the actual location

  • Document vJunosEvolved VM gotchas