v2.0.12 Release Notes¶
Release Date¶
2026-06-24
Summary¶
v2.0.12 is a correctness and consistency release that aligns the intent resolvers with the documented YAML schema, makes the example corpus the canonical reference, and fixes live device data collection and config rendering on Arista (and other non-Cisco-IOS) devices.
The headline themes:
- Schema alignment — ~25 resolvers now read the typed blocks the example
intents actually use (
dc.*,routing.*,tunnel.*,vni.*,management.<subtype>) instead of only flat top-level fields. - Management intents adopt a canonical wrapped form —
mgmt_*config now lives undermanagement.<subtype>(e.g.management.ssh,management.snmp,management.aaa_device), read with a backward-compatible fallback to the legacy flat form. - Arista / multi-vendor fixes — live routing-table collection, verification,
and config rendering now identify the platform by
network_driverrather than the human-facing platform name. - Schema + example hardening — all 108 example intents validate against the
pykwalify schema; several latent YAML bugs (duplicate keys, multi-document
files, an
onenum parsed as boolean) were fixed.
There are no new database migrations. A few behaviour changes are called out under Behaviour Changes below — review them before upgrading.
What's New¶
Schema-aligned resolvers¶
- L3 routing intents read the nested
routing.*block:ospf(areas/networks + passive/stub/nssa/default-originate tuning),ospfv3,eigrp,isis,bgp_ipv6_af,bgp_evpn_af,route_redistribution(list form), andvrf_basic(multi-VRF list form). - DC/EVPN intents read the
dc.*/fabric.*blocks:dc_underlay,l3vni,vtep,anycast_gateway(per-SVI list),evpn_vxlan_fabric,l2vni. ipsec_s2sreads thetunnel.*block;mpls_l3vpnnow emits a renderable VRF primitive instead of blind-delegating;service_lb_vipresolves devices and renders per-device.
Canonical management.<subtype> form¶
- All 15
mgmt_*resolvers read config viamanagement.<subtype>with fallback to flat-under-managementand legacy top-level fields. - The example management corpus was migrated to the wrapped form.
Device-management AAA (aaa_device)¶
- New structured
aaa_deviceprimitive (TACACS+/RADIUS, server groups, authentication/authorization/accounting, local fallback) with templates for all six platforms (cisco ios-xe / ios-xr / nxos, arista eos, juniper junos, aruba aos-cx), plus removal templates.
Indirect device resolution¶
l2vni/l3vnimay reference a fabric by name (fabric.name) — devices are resolved from the matchingevpn_vxlan_fabricintent's leaves.ipsec_s2swithout an explicitscoperesolves the device that ownstunnel.local_endpointvia Nautobot IPAM.
Full scope contract¶
scopenow supportsall_tenant_devices,devices/device,sites/site,roles/role,tags, andplatform, with the documented resolution order.
Bug Fixes¶
- Arista live collection — routing-table/VRF/BGP collection identified the platform by display name, returning "Unsupported platform" for devices named e.g. "Arista EOS"; and routes/VRFs/BGP silently returned empty when TextFSM produced raw text. Both fixed (network_driver resolution + raw-text fallback).
- Config rendering selected the template directory by platform name and fell
through to cisco/ios-xe for devices named other than the slug — now resolves
via
network_driver. - Controller adapters with no vendor implementation now raise
NotImplementedAdapterError(treated as a hard deployment failure) instead of silently no-op'ing. - OPA policy checks fail closed on resolution when OPA is unreachable
(configurable via
opa_fail_open_on_resolution). - Route-target allocation race condition closed with
select_for_update(). - Multi-document YAML intent files now sync correctly.
- Schema fixes — added the
managementwrapper and missing root-level fields; fixed duplicate-key files, multi-document example files, and anonenum value that YAML parsed as booleanTrue. - Resolver fixes for
prefix_list,static_route,ospf,bgp_ebgp/ibgp,route_policy,fhrp,gre_tunnel,l2vni/l3vni,storm_control,mgmt_ntp/mgmt_global_config, andreachability/servicesub-type validation (from the bug-report pass). - CDP rendering added to the Arista
lldp_cdptemplate. - Reconciliation-schedule setup moved to the
nautobot_database_readysignal, removing a "database access during app initialization" warning.
Behaviour Changes¶
- Empty/unrecognised
scopenow fails fast. Previously an intent with no usable scope silently resolved to all active tenant devices. It now raises a clear error. Add an explicit scope (all_tenant_devices: truefor fleet-wide intents). - Controller-adapter deployments fail hard when no vendor implementation exists, instead of reporting success with no change.
- OPA unreachable blocks resolution by default (set
opa_fail_open_on_resolution: trueto restore fail-open). - Platform is resolved from
network_driverfor live collection, verification, and rendering. Ensure your Nautobot Platforms setnetwork_driver(e.g.arista_eos,cisco_ios).
Quality¶
invoke unittest: 589 passing.invoke pylint: 10.00/10.invoke yamllint: clean.invoke check-migrations: no changes, no warnings.- pykwalify: all 108 example intents valid.
Upgrade¶
No database migrations.
pip install --upgrade nautobot-app-intent-networking==2.0.12
sudo systemctl restart nautobot nautobot-worker nautobot-scheduler
Existing flat-form management and Layer 2 intents continue to work unchanged. Review Behaviour Changes above — in particular, intents that previously relied on an empty scope must now set an explicit scope.
Full changelog: v2.0.11...v2.0.12