Nautobot v3.0
This document describes all new features and changes in Nautobot 3.0.
Upgrade Actions
Administrators
- Job approval permissions have been updated in the UI and API. Approvers must now be granted the
extras.change_approvalworkflowstageandextras.view_approvalworkflowstagepermissions, replacing the previous requirement forextras.approve_job. This change aligns with updates to the approval workflow implementation and permissions model. - The
approval_requiredfield fromextras.Jobmodel has been removed. This is a breaking change for any custom Jobs or applications that reference this field. This functionality has been replaced by a new approval workflow system. For more information on how the new approach works, see approval workflow documentation- If you're upgrading from Nautobot 2.x, a management command,
nautobot-server check_job_approval_statusis available in 2.x to help identify jobs and scheduled jobs that still haveapproval_required=True. Running this command prior to upgrading can help you detect and address these cases by either clearing scheduled jobs or defining approval workflows for Jobs. - To maintain a similar approval process, see the steps in predefined approval workflow.
- If you're upgrading from Nautobot 2.x, a management command,
- A small number of breaking filter field changes may impact Dynamic Group filter definitions; you are recommended to run
nautobot-server validate_models extras.dynamicgroup(or the newly addedValidate Model Datasystem Job) after the upgrade to identify any impacted Dynamic Groups.
Job Authors & App Developers
- Apps that provide any user interface will likely require updates to account for the Bootstrap upgrade from v3.4 to v5.3 described below.
- The Data Compliance feature set from the Data Validation Engine App has been moved directly into core. Import paths that reference
nautobot_data_validation_engine.custom_validators.DataComplianceRuleornautobot_data_validation_engine.custom_validators.ComplianceErrorshould be updated tonautobot.apps.models.DataComplianceRuleandnautobot.apps.models.ComplianceError, respectively. - Code that calls the GraphQL
execute_query()andexecute_saved_query()functions may need to be updated to account for changes to the response object returned by these APIs. Specifically, theresponse.to_dict()method is no longer supported, but instead the returned data and any errors encountered may now be accessed directly asresponse.dataandresponse.errorsrespectively.
REST API Users
- Filtering data that supports a
typefilter in the REST API now also supports a correspondingtypefilter in GraphQL. (In Nautobot v2.x and earlier, the filter had to be referenced in GraphQL as_typeinstead.) Filtering by_typeis still supported where applicable but should be considered deprecated; please update your GraphQL queries accordingly. - As a part of adding support for associating a Device to multiple Clusters, the Device REST API no longer supports a
clusterfield; the field has been renamed toclustersand is now a list of related Clusters rather than a single record. See below for more details. - The REST API now defaults to excluding many-to-many fields (except for
tags,content_types, andobject_types) by default. Any code that relies on including many-to-many fields in the REST API response must explicitly request them by specifying theexclude_m2m=Falsequery parameter. Pynautobot and Nautobot Ansible users should ensure they are on the latest versions to maintain backwards compatibility. See Many-to-Many Fields in REST API below for more details.
Release Overview
Breaking Changes
Many-to-Many Fields in REST API (#7456)
In order to improve performance at scale, the REST API now defaults to excluding many-to-many fields (except for tags, content_types, and object_types) by default. Any code that relies on including many-to-many fields in the REST API response must explicitly request them by specifying the exclude_m2m=False query parameter. See Filtering Included Fields for more details.
Pynautobot users should ensure they add exclude_m2m=False to an individual request (nb.dcim.devices.all(exclude_m2m=False)) or (in pynautobot v3.0.0+) set the default for all requests (import pynautobot; nb = pynautobot.api(url, token, exclude_m2m=False)) to maintain prior behavior.
Nautobot Ansible users (using v6.0.0+ and pynautobot v3.0.0+) should see no change required when using module or inventory plugins. When using a lookup plugin, however, they will need to use the api_filters parameter to include M2M fields. For example: api_filters='exclude_m2m=False'.
Removed Python Code
Many previously deprecated classes have been fully removed now (see full table below). The most notable removal is the original PluginConfig class, which was replaced by NautobotAppConfig in v1.5.2. If your app still imports and inherits from PluginConfig, you should migrate to using NautobotAppConfig before upgrading to Nautobot 3.0.
To assist with identifying any remaining instances of deprecated code in your codebase, new rules have been added to pylint-nautobot in version v0.4.3+ that will flag any code that still imports and inherits from any of the deprecated classes.
ℹ️ Full table of code removals
Removed HTML Templates
Many legacy HTML templates have been removed. The majority of the removed templates are model specific such as circuits/circuit.html or dcim/device/base.html and have been superseded by generic templates such as generic/object_retrieve.html.
In order to ease the transition from these deprecated templates for app developers, we have included a migration script in Nautobot v2.4.21+ that will recursively parse through a directory's html files and replace any extends directives ({% extends ... %}) that reference a deprecated template with the replacement template. This script does not require Nautobot to be running and it can be run with the command nautobot-migrate-deprecated-templates <path> [--dry-run]. For more details, including a full table of deprecated templates and their replacements, see Deprecated Templates.
Removed Branding Options
Removed support for branding configuration options of header_bullet, nav_bullet, javascript, and css. Bullets are no longer used at all in the 3.0 design.
Added
UI Updates
Nautobot 3.0 introduces a refreshed user interface, building on the migration from Bootstrap 3 to Bootstrap 5 with several major enhancements:
Search
The search experience has been completely reimagined. A single, always-available search bar is now present throughout the application, accessible via Ctrl+K or Command+K. Advanced search syntax, such as in:<model name>, allows you to target specific models directly. The search results page now provides clearer visibility into active search parameters and makes it easy to distinguish between basic and advanced queries.
Saved Views
Saved Views have been improved to display their type more prominently, making it easier to identify when a Saved View is active and to understand the filters or configurations being applied. This streamlines workflows and reduces confusion when working with complex data sets.
Navigation Bar
The Navigation Bar has been redesigned for greater efficiency and usability. It now features support for marking items as favorites, incorporates intuitive icons, and uses a modern flyout design to maximize space and accessibility. Navigation is more consolidated, helping users quickly find and access key areas of Nautobot.
Load Balancer Models
Nautobot 3.0 introduces a Load Balancer data model, enabling you to model Virtual Servers, Pools, Pool Members, Health Checks, and Certificates. This feature provides compatibility for configuration generation (via Golden Configuration) with popular load balancing vendors such as F5, Citrix NetScaler, A10 Networks, VMware Avi Load Balancer, and Fortinet.
Key use cases include:
- Modeling load balancer resources for service, application, and inventory tracking.
- Generating device configurations using Nautobot Golden Configuration templates for supported vendors.
- Mapping Virtual Servers to backend servers and services.
- Managing certificate configuration and associated metadata.
VPN Models
Nautobot 3.0 adds a VPN data model to support modeling Virtual Private Networks (VPNs), including reusable profiles, policies, and tunnel endpoints. These models enable you to define IKE (Phase 1) and IPSec (Phase 2) policy parameters, manage tunnel endpoints, and associate VPNs with roles and secrets. Additionally, VPNs may optionally be associated with tenants so that administrators can indicate ownership of related model instances.
Key Use Cases include:
- Site-to-site IPSec VPN tunnel (transport mode)
- Site-to-site IPSec VPN tunnel (tunnel mode)
- Single hub-and-spoke VPN
- Multiple hub-and-spoke VPNs
Device Uniqueness Flexibility
Device Uniqueness is now less restrictive. Current behavior of Location + Tenant + Name is maintained in migration, but now in addition you can configure to Device name must be globally unique and No enforced uniqueness as well as you can set Device name required (cannot be blank or null).
Approval Workflows
Approval Workflows allows for a multi-stage review and approval of processes before making changes, running or creating specific objects in the system. They are defined in advance and attached to specific models based on certain constraints. Use cases include:
- Preventing accidental deletion of critical data by requiring manager approval before deletion jobs run.
- Requiring security team sign-off before enabling network changes in production.
- Ensuring multiple stakeholders approve large-scale bulk edits.
- Mandating peer review for scheduled jobs that affect multiple systems.
Data Validation Engine
The Nautobot Data Validation Engine functionality previously provided as a separate Nautobot App has been migrated into Nautobot as a core feature.
The data validation engine offers a set of user definable rules which are used to enforce business constraints on the data in Nautobot. These rules are tied to models and each rule is meant to enforce one aspect of a business use case.
Supported rule types include:
- Regular expression
- Min/max value
- Required fields
- Unique values
Additionally Data Compliance allows you to create validations on your data without actually enforcing them and easily convert them to enforcements once all of your data is compliant.
ECharts
ECharts is now included in the base image, with abstractions provided to easily add custom charts using ECharts.
GraphQL
You will notice a fresh new look for the GraphiQL interface, which has been upgraded to version 2.4.7. This update brings a modernized UI, improved usability, and better alignment with Nautobot's theming. Most user workflows remain unchanged, but you may find enhanced features such as improved query editing, autocompletion, and response formatting.
Changed
Bootstrap upgrade from v3.4 to v5.3
Nautobot now uses Bootstrap v5.3 as its underlying theming and layout engine. The base Nautobot UI has been refreshed accordingly. Apps will generally require corresponding updates for their UI to render properly. The impact of this upgrade will be much reduced if the App has already adopted the UI Component Framework introduced previously in Nautobot v2.4. A migration script is included in Nautobot 3.x to automate many of the HTML and CSS updates for App developers.
Device to Multiple Clusters (#7203)
The Device model has replaced its single cluster foreign-key field with a many-to-many clusters field, allowing multiple Clusters to be associatd with a single Device.
To provide a modicum of backwards-compatibility, the Device model and queryset still support a singular cluster property which can be retrieved and (in some cases) set for the case of a single associated Cluster, but App authors, Job Authors, and GraphQL users are encouraged to migrate to using clusters as soon as possible. The cluster property will raise a MultipleObjectsReturned exception if the Device in question has more than one associated Cluster.
Note that due to technical limitations, the Device REST API does not support a cluster field in Nautobot v3, so users of the REST API must migrate to reading the clusters field where applicable. Assignment of Devices to Clusters via the REST API is now managed via a dedicated endpoint /api/dcim/device-cluster-assignments/ similar to other many-to-many fields in Nautobot.
Filter Standardization Improvements (#1889)
To make Nautobot's UI, REST API, and GraphQL filters more self-consistent and standardized, the default filter type for foreign-key and one-to-one model fields has been changed from a single-value filter (ModelChoiceFilter) to a multi-value filter (ModelMultipleChoiceFilter). This change affects a small number of filters in Nautobot core, as most such fields were already explicitly covered by a ModelMultipleChoiceFilter or one of its derivatives, but the following implicit filters are known to have been affected by this change (in addition to any App model filters on one-to-one and foreign-key fields that also were not explicitly defined otherwise):
- Front Port Templates
rear_port_templatefilter - Power Outlets
power_portfilter - Module Bays
parent_modulefilter - Job Log Entries
job_resultfilter - Job Results
userfilter - IP Address to Interface
ip_addressfilter
For users of the UI and REST API, this is purely a feature enhancement to the above filters, as specifying single values in the URL query parameters remains supported, but multiple values are also supported now (for example /api/extras/job-log-entries/?job_result=<uuid1>&job_result=<uuid2>.)
For users of GraphQL, this is also a feature enhancement, as queries using the above filters can now specify either a single value (job_log_entries (job_result: "<uuid>") { message }) as before, or can now be updated to specify a list of values instead (job_log_entries (job_result: ["<uuid1>", "<uuid2>"]) { message }) if desired.
⚠️ Impact to Dynamic Groups
For Dynamic Groups using the above filters, the group filter will need to be updated to replace the single string value with a list of strings, for example changing:
{"rear_port_template": "74aac78c-fabb-468c-a036-26c46c56f27a"}
to
{"rear_port_template": ["74aac78c-fabb-468c-a036-26c46c56f27a"]}
You can identify impacted Dynamic Groups by running the nautobot-server validate_models extras.dynamicgroup management command, or the new Validate Model Data system Job; in the above case, the invalid group filter would be reported as below:
# nautobot-server validate_models extras.dynamicgroup
Validating 1 models.
extras.DynamicGroup
~~~~~ Model: `extras.DynamicGroup` Instance: `Front Port Template Legacy` Error: `{'rear_port_template': ['Enter a list of values.']}`. ~~~~~
Removed
Button on Navbar
Buttons were removed from the NavBar as our research indicated they were infrequently used and caused clutter.
Job Approval Process
The Job Approval process was removed and replaced by Workflow Approvals.
Dependencies
GraphQL and GraphiQL Updates
The underlying GraphQL libraries (graphene, graphene-django, graphene-django-optimizer) used by Nautobot have been updated to new major versions, including a new major version of the GraphiQL UI. For the most part this upgrade will be seamless to end users, but the response object returned by Nautobot's execute_query() and execute_saved_query() Python APIs has changed type -- see Upgrade Actions above for specifics.
Added Python 3.13 Support and Removed Python 3.9 Support
As Python 3.9 has reached end-of-life, Nautobot 3.0 requires a minimum of Python 3.10. Python 3.13 support was added.
Added Echarts
Added the JavaScript Library ECharts version 6.0.0.
Contributors
- @HanlinMiao
- @Kircheneer
- @Sridevi-NTC
- @brandomando
- @bryanculver
- @dsoftait
- @glennmatthews
- @gsnider2195
- @itdependsnetworks
- @joewesch
- @justinbrink
- @lampwins
- @mateusz-lachowski-codilime
- @mzbroch
- @nkallergis
- @norbert-mieczkowski-codilime
- @nrnvgh
- @pszulczewski
- @renovate[bot]
- @sirisha-bode
- @smk4664
Full Changelog: v2.4.22...v3.0.0