Nautobot v3.2¶
This document describes all new features and changes in Nautobot 3.2.
Upgrade Actions¶
Administrators¶
Migrate Job Execution and Scheduled Jobs¶
This release introduces a behavioral change to job execution APIs. The job_kwargs parameter is now required for the following functions: create_schedule, enqueue_job, execute_job and run_job_for_testing.
Previously, job arguments could be omitted or passed implicitly. This behavior is deprecated and will be removed in a future release. A temporary backward-compatible fallback remains in place but will emit warnings when used.
Action Required:
- Update all job invocations to explicitly pass
job_kwargs(e.gjob_kwargs={}) - Recreate all Scheduled jobs which has
kwargs=None, because now may fail at runtime due to stricter validation.
Tip
Treat any warnings "Using deprecated **job_kwargs pattern, please instead switch to passing job_kwargs as a single parameter" as indicators that your code should be updated to the new explicit pattern.
App Developers¶
Migrate Cable Termination Queries¶
To support breakout cables, the association between a Cable and its terminations has been re-implemented. The cable ForeignKey that previously existed on each CableTermination subclass (Interface, FrontPort, RearPort, CircuitTermination, PowerPort, etc.) has been removed in favor of a new CableToCableTermination join model, exposed on each termination via the cable_termination reverse one-to-one relationship. App and Job code that queries or traverses cables may need to be updated.
The cable attribute is preserved as a read-only property on each termination instance (e.g. interface.cable), so attribute access continues to work. Assignments to Cable.termination_a / Cable.termination_b (and their *_type / *_id counterparts) on unsaved Cable instances also continue to work and are materialized into CableToCableTermination rows on save.
ORM queries filtering CableTermination subclasses by cable are automatically translated to the new cable_termination__cable[...] paths, emitting a DeprecationWarning for each. The following patterns are translated:
| Deprecated | Translated to |
|---|---|
Interface.objects.filter(cable=...) |
cable_termination__cable=... |
.filter(cable=None) |
cable_termination__isnull=True |
.filter(cable_id=...), .filter(cable__isnull=...), .filter(cable__<lookup>=...) |
cable_termination__cable... equivalents |
.select_related("cable"), .select_related("cable__<field>") |
cable_termination__cable... equivalents |
The following patterns are not translated and will break — rewrite them explicitly:
| Not translated | Use instead |
|---|---|
Q(cable=...) |
Q(cable_termination__cable=...) |
.order_by("cable") |
.order_by("cable_termination__cable") |
.values("cable") / .values_list("cable") |
cable_termination__cable |
Cable paths: the private _path ForeignKey on PathEndpoint has been replaced with a cable_paths GenericRelation (resolving through CablePath.origin). The public path, trace(), and connected_endpoint accessors are unchanged. Rewrite any _path__... query usages as cable_paths__...; because this is now a multi-row reverse relation (one CablePath per breakout lane), distinct() is typically required on filter() / count() / exclude().
Other notes:
- The private
_cable_peer,_cable_peer_type, and_cable_peer_idcache fields have been removed fromCableTermination. The public peer accessors (get_cable_peer(), RESTcable_peer/cable_peer_type, GraphQLcable_peer_*) are unchanged;get_cable_peer()now accepts an optionalpeer_connectorargument for breakout-lane-specific lookups. - New helpers are available for working with multi-termination cables:
Cable.add_termination(termination, cable_end, connector=1), the typed many-to-many reverse accessors onCable(cable.interfaces,cable.front_ports, etc.), the singularcable_terminationreverse accessor on each termination, andPathEndpoint.get_connected_endpoints()(returning the resolved destinations of all cable paths, one per breakout lane).
Release Overview¶
Breaking Changes¶
Cable Data Model Changes¶
To support breakout cables (see below), the way a Cable associates to its terminations has changed. The cable ForeignKey previously present on each CableTermination (Interface, FrontPort, etc.) has been replaced by a new CableToCableTermination join model, allowing a cable to have more than two terminations. Backward-compatibility shims are provided for the most common access patterns, but App and Job authors who interact with cables programmatically will likely need to make updates. See Upgrade Actions for App Developers below for details.
Added¶
Breakout Cables¶
Nautobot now models breakout cables — multi-lane cable assemblies where a single physical cable splits into multiple individual connections (for example a 400G QSFP-DD port broken out into 4×100G SFP lanes). A new CableType model defines the physical structure of a cable (connectors per side, internal lanes, and the connector-to-lane mapping), and a Cable assigned a breakout cable type may have more than two terminations, each recorded as a CableToCableTermination. Breakout cables are fully supported across the UI (cable type and cable forms, connection tables, SVG lane-mapping and trace diagrams), the REST API, and lane-aware cable path tracing. Interface records gain an optional breakout_position field to map a subinterface to a position on its parent interface's breakout trunk connector.
Partially-Connected, Disconnected, and Repurposed Cables¶
A Cable is no longer required to have both of its endpoints defined, and its terminations are no longer fixed at creation time. A cable may now be partially-connected (a termination on only one side, or on a subset of a breakout cable's connectors) or fully-disconnected (no terminations at all), and a cable's terminations may be added, changed, or removed after the cable is created — through the UI, the REST API, or programmatically — without deleting and recreating the cable.
Object Metadata UI¶
ObjectMetadata records can now be created, edited, and deleted directly through the web UI (previously read-only). Metadata is added from the parent object's Metadata tab, which opens a pre-filled create form. The value input adapts to the selected MetadataType data type, and detail/list views render values appropriately for each type — clickable links for URLs, parsed HTML for Markdown, pretty-printed JSON for JSON, etc. The primary intent is still that metadata is managed by integrations (SSoTs, REST API), but users with the appropriate permissions can now manage individual records through the UI.
Changed¶
Cable Termination REST API¶
The Cable REST API serializer adds a single terminations field keyed by side (a/b) and then by 1-indexed connector number, mirroring the physical structure of the cable. This field is writable on POST and PATCH, and uncabled connectors on breakout cables are surfaced as explicit null slots. The legacy termination_a / termination_b (and *_type / *_id) fields remain for backward compatibility and refer to connector 1 on each side. The nested terminations field is omitted from CSV exports; use the CableToCableTermination endpoint for per-connector CSV detail.
Dependencies¶
TODO