v4.7 Release Notes¶
This document describes all new features and changes in the release. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Release Overview¶
- The IP Fabric integration gains VRF support — VRFs, Route Targets, and their Device and
Interface assignments — along with Cables from the connectivity matrix, every IP Address on
an Interface rather than one, and a
Strict Objectsmode that checks what IP Fabric reported instead of trusting it. All of it is opt-in per object type on the Job form, so no existing sync changes on upgrade. - IP Fabric syncs are substantially faster on large estates: Devices and VLANs are read in one query rather than one per Location, deletions are batched, and an opt-in Bulk Write Mode writes objects in batches. Twelve correctness defects found during that work are also fixed, several of which previously ended a job outright.
- The LibreNMS integration no longer writes Ansible FQCNs into
Platform.network_driveror creates Manufacturers named after the device OS, and gains a Platform Consolidation job to repair estates affected by both. - Nautobot 3.1.0 is now the minimum supported version, raised from 3.0.0.
- On Python 3.11+ the optional
merakidependency moves to>=3.0.2,<4; Python 3.10 installs stay onmeraki1.x, which is the last line supporting it.
v4.7.0 (09-21-2026)¶
Added¶
- #882 - Added an opt-in Bulk Write Mode to the IP Fabric sync job, writing Locations, Devices, Interfaces, IP Addresses and VLANs in batches. Much faster on a large sync, at the cost of change log entries, signals and per-object validation for the objects written that way.
- #883 - Added per object type controls to the IP Fabric Job form, so a sync can be narrowed to Locations, Manufacturers, Device Types, Roles, Platforms, Interfaces, IP Addresses, Primary IP, VLANs and Cables individually. Deselecting Locations stops them being created, updated or deleted while still syncing the Devices at them, including Devices at Locations that another SSoT App owns. Deselecting Manufacturers, Device Types, Roles or Platforms uses the ones Nautobot already holds without creating any.
- #886 - Added an opt-in "Sync Route Targets" option to the IP Fabric integration that synchronizes Route Targets as an object type of their own, ahead of the VRFs that name them, and records each synced VRF's import and export targets. A Route Target another process already created is adopted and marked as synced rather than duplicated, and only the Route Targets this integration created are considered for deletion.
- #887 - Added an opt-in "Sync VRFs" option to the IP Fabric integration that creates Nautobot VRFs in the Global Namespace from the routing instances IP Fabric reports, each carrying the route distinguisher its devices agree on. Where IP Fabric's devices disagree about a VRF's route distinguisher, none is recorded and the disagreement is written to an "IPFabric VRF Conflict" custom field so that the VRF is not left indistinguishable from one that has none. VRFs are written in batches under Bulk Write Mode.
- #888 - Added an opt-in "Sync Device VRFs" option to the IP Fabric integration that records which Devices carry each VRF, as one assignment per Device per VRF so that a Device picking up a further VRF reports that assignment rather than its whole set. Each assignment inherits its VRF's route distinguisher and name, and only Devices the run covers are assigned.
- #889 - Added an opt-in "Sync Interface VRFs" option to the IP Fabric integration that puts each Interface in the VRF IP Fabric reports for it, read from the VRF interfaces table so that an Interface in a VRF is covered whether or not it carries an address. It requires the Device VRF assignments, since Nautobot refuses an Interface a VRF its Device does not carry.
- #1328 - Added an optional Device Secrets Group field to the LibreNMS to Nautobot job, assigned to Devices it creates so credential-dependent jobs such as nautobot-device-onboarding's Sync Network Data From Network can resolve credentials for them.
- #1331 - Added an opt-in "Sync Cables" option to the IPFabric integration that synchronizes device connections from IP Fabric's connectivity matrix to Nautobot Cables.
- #1335 - Added the
librenms_consolidated_platformssetting to the LibreNMS integration, which names Platforms after the network driver so they are shared with nautobot-app-device-onboarding instead of duplicated. - #1335 - Added the
librenms_network_driver_mapsetting to the LibreNMS integration, to override or suppress the bundled LibreNMS OS to network driver mappings. - #1335 - Added a LibreNMS Platform Consolidation job that repairs network drivers, renames legacy FQCN-named Platforms, merges duplicates, and folds Manufacturers named after the device OS back onto the real vendor, with a dry run that reports the plan as CSV.
- #1335 - Added network driver mappings for around forty more LibreNMS OS values.
- #1344 - Added syncing of every IP Address IP Fabric reports for an Interface, rather than one. Secondary addresses, IPv6 addresses and FHRP virtual addresses now reach Nautobot, so a dual-stack Interface or one carrying an HSRP or VRRP address is modelled and can be rendered from Nautobot data. Each address is its own record, matched on its host within its Interface, so one changing is reported and written on its own and one IP Fabric stops reporting is removed without touching the rest; removal goes through Safe Delete Mode, and only where no other Interface holds the address. A Device's
primary_ip4andprimary_ip6are set by marking an address already synced from the Interface carrying it, reading IP Fabric's separateloginIpv4andloginIpv6columns, so a dual-stack Device carries a primary of each version rather than only whichever was read first. Creating an Interface no longer asks the database what addresses it has, which it could not yet have, and the by-Device Interface lookup no longer prefetches addresses no caller reads, so a first sync of a large estate makes materially fewer queries. An address that stops being logged in on is unmarked, so a primary that moves to another address, or a Device IP Fabric reports no login address for, no longer leaves Nautobot pointing at the old one. - #1346 - Added a
Strict Objectsoption to the IP Fabric job, naming the object types whose reported value is checked rather than taken on trust. It applies on top of the sync scope, to the types a run already covers: for a supporting object the check is that the name IP Fabric reported resolves to something Nautobot already holds, so that a typo is reported instead of minting a near duplicate; for an IP Address it is that a usable subnet was reported for it; for an Interface it is that IP Fabric reported the Interface, so no placeholder is invented to hold a management address reached through NAT. Locations, Manufacturers, Device Types, Roles, Platforms, Statuses, Virtual Chassis, Interfaces and IP Addresses can each be selected, and each default can be set for the whole instance with anipfabric_strict_<type>setting. Only IP Addresses is selected by default; every other type keeps today's behaviour of filling the gap itself.
Changed¶
- #882 - Reduced the work an IP Fabric sync does per object. Devices and VLANs are read in one query each rather than one per Location, creating an Interface, Location or VLAN takes one validated save rather than two, creating or deleting an object records one change log entry rather than one per write, the safe delete tag is resolved once per model rather than once per object, and objects are deleted in batches rather than one at a time.
- #882 - Narrowed how Bulk Write Mode recovers from a batch the database refuses. The batch is halved and retried until the rows at fault are isolated, rather than every row in it being rewritten and revalidated one at a time, so one bad row in a batch of a thousand costs about twenty inserts instead of a thousand validated saves.
- #882 - Added
ipfabric_bulk_write_batch_size, which sets how many rows Bulk Write Mode inserts per statement. It was fixed at a thousand, which is the size of an insert and also how much has to be narrowed through when the database refuses a batch, so an estate carrying rows Nautobot refuses can now lower it. - #883 - Added the
ipfabric_sync_<object type>andipfabric_disabled_sync_objectssettings, which pre-select and administratively disable IP Fabric object types on the Job form. - #1321 - Updated the
merakidependency to>=3.0.2,<4on Python 3.11+, retaining1.xon Python 3.10 asmeraki3.x requires Python 3.11 or later. - #1346 - Changed the IP Fabric job to list Virtual Chassis among its data mappings. Stack members were already synced to one, but nothing in the job said so.
Fixed¶
- #882 - Fixed the IP Fabric adapter queueing objects for deletion on the adapter class rather than the instance, which let a run that failed part way leave objects for a later run in the same worker to delete.
- #882 - Fixed the IP Fabric adapter inserting an Interface before validating it, which left an invalid Interface in Nautobot when validation then failed.
- #882 - Fixed Bulk Write Mode discarding every IP Address whose containing Prefix Nautobot did not already hold, rather than creating the Prefix as a per-object sync does.
- #882 - Fixed the IP Fabric adapter rejecting an IP Address whose only containing Prefix is longer than the mask IP Fabric reports for it, and creating a redundant wider Prefix while doing so.
- #882 - Fixed Bulk Write Mode failing an entire batch of Devices, and ending the job with a
DoesNotExistexception, when a Device carried a primary IP Address that the same run had yet to write. - #882 - Fixed the IP Fabric job reusing the object caches of an earlier run in the same worker when that run failed before clearing them.
- #882 - Fixed Bulk Write Mode failing every Cable in a sync, because a Cable reads back Interfaces that the mode had only queued.
- #882 - Fixed Bulk Write Mode ending a job with a foreign key violation when IP Fabric reported one IP Address on more than one Interface, and writing a row that referenced an object the database had refused.
- #882 - Fixed the IP Fabric sync recording a Cable for only one of the links on an Interface IP Fabric reports several times, such as a cloud subnet's, and choosing a different one on each run so that a re-sync replaced the Cable the previous one had made.
- #882 - Fixed the IP Fabric sync refusing an IP Address that Nautobot already holds under a different mask to the one IP Fabric reports, and creating a redundant wider Prefix while doing so.
- #882 - Fixed the IP Fabric sync leaving an IP Address under the mask Nautobot already held rather than the mask IP Fabric reports for it, in the paths that reuse an existing address.
- #882 - Fixed the IP Fabric sync returning a Location it had not managed to write, after the change that made the tag write a new Location's only save, so that every Device at the site then referenced a Location that did not exist. A Location that was already there is still returned when only the re-stamp fails.
- #882 - Fixed Bulk Write Mode creating the components a Device Type's templates define for a Device whose batch the database refused, where a Device written in a batch gets none, so that the Interfaces IP Fabric reported for it were then refused as duplicates of templated ones. The sync now opts into SSoT's
skip_auto_component_creationfor a bulk run, which needs a Nautobot version carrying the upstream extension point to take effect. - #1321 - Fixed the Meraki integration raising an unhandled
SessionInputErroron job start. - #1323 - Fixed ServiceNow integration to log and report errors for unresolved or ambiguous references, mark affected objects as failed, and resolve device model references by both manufacturer and model name to prevent name collisions.
- #1333 - Fixed Meraki notes sync not being idempotent. A note removed from a Network or Device in Meraki is now deleted from Nautobot instead of being reported as a pending change on every sync.
- #1335 - Fixed the LibreNMS integration writing an Ansible collection FQCN such as
cisco.ios.iosintoPlatform.network_driver, where it resolved to no driver mappings and left Golden Config and Nornir dispatch with nothing. Newly created Platforms now get a valid network driver in both platform-naming modes; existing Platforms are never modified automatically. - #1335 - Fixed the LibreNMS integration creating Manufacturers named after the device OS, such as
panosinstead ofPalo Alto. This affected 210 of the 217 mapped OS values, because the Manufacturer was resolved by round-tripping the Platform name back through the OS mappers and falling back to that name. - #1335 - Fixed a LibreNMS device sync aborting entirely when a single device failed validation, which could happen for a Platform another app created. The device is now skipped with an error logged.
- #1335 - Fixed a LibreNMS device that moved to a different Platform keeping a SoftwareVersion belonging to its old Platform.
- #1335 - Added the
librenms_allow_ip_hostnames,librenms_show_failuresandlibrenms_permitted_valueskeys to the app's default settings, so an install that does not set them no longer raises a KeyError. - #1338 - Fixed the Arista CloudVision integration dropping interface data when CloudVision splits an object's attributes across multiple gRPC notifications.
- #1340 - Fixed the IP Fabric integration writing an Interface address with a
/32when IP Fabric reported no subnet for it, which put the address under the wrong parent Prefix and left nothing to distinguish it from an address genuinely configured as a host route. Such an address is now reported as absent by both adapters, so the mask Nautobot already holds is left alone, and the count is logged as a warning with the addresses themselves at debug level. A NAT management address is unaffected, since it belongs to no subnet and a host mask is the whole of it. - #1340 - Fixed an Interface update falling back to a
/32when the address changed but its mask did not, which took an existing address to a host mask. The mask already recorded for the Interface is used instead. - #1340 - Fixed a subnet IP Fabric reports for an address that does not parse, or that is not IPv4, ending the sync with a
ValueErrorwhile it was still reading addresses. Such a report is now logged and passed over, leaving the address treated as one with no subnet reported for it. - #1353 - Fixed the IP Fabric sync reporting IP Addresses and Cables as deleted while leaving them in the database. With Safe Delete Mode disabled each object is queued for removal under a grouping taken from its class name, and only four of those groupings were ever drained, so addresses and cables were dropped from the sync's own records and never removed. Every queued grouping is now drained, children before whatever they hang off, and a grouping the order does not name is removed last and reported rather than accumulating unread.
- #1355 - Fixed the IP Fabric sync reporting Interface changes on every run without applying them, for Devices not tagged as synced from IP Fabric, which the Nautobot adapter loads whenever Sync Tagged Only is deselected.
- #1356 - Fixed the IP Fabric sync reporting an Interface's subnet mask as changed on every run, with the value alternating, for an IP address IP Fabric reports on more than one Device in a different subnet each time.
- #1360 - Fixed an Interface whose only IP Addresses are IPv6 ending the Nautobot adapter's load with a
ValueError, which took the whole job with it. The mask was reported by converting the prefix length to a dotted netmask, which is undefined above 32; addresses sort by IP version, so a dual-stack Interface put IPv4 first and was unaffected while an IPv6-only one raised. The prefix length is now what the sync records, which serves either version. - #1367 - Fixed
enable_global_search: Falseleaving theSyncmodel included in Nautobot global search; bothSyncandSyncLogEntryare now excluded, as they were before 3.10.0. - #1367 - Fixed the SSoT
searchable_modelsentries using mixed-case model names, which prevented model-scoped global search requests such as?model=nautobot_ssot.syncfrom matching. - #1371 - Fixed Infoblox SSoT sync ignoring
nautobot_deletable_modelsfor VLAN and VLAN Group deletions, and added a safeguard to prevent deleting non-empty VLAN Groups. - #1379 - Fixed the SSoT Sync Details button on the JobResult detail view loading the entire
Syncrow, including thediffJSON, which can be hundreds of megabytes and overflowed the MySQL sort buffer (Out of sort memory) so the page failed to load. The button now fetches only theSyncprimary key, in one query instead of two.
Housekeeping¶
- #1338 - Consolidated the per-function Arista CloudVision split-notification regression tests into one table-driven suite covering every gRPC query helper, with a guard that fails when a new wildcard helper is added without coverage.
- #1350 - Silenced
F601on the duplicated boolean keys of the LibreNMSlibrenms_status_map, which newerruffreleases flag. - #1382 - Fixed the
invoke pylintmigrations check failing on every pull request. A refreshedpylint-djangoenabled itsnew-db-field-with-defaultcheck, which flagged an existing migration that adds a defaulted column to a configuration model holding only a handful of rows. - Rebaked from the cookie
nautobot-app-v3.1.4.