mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Introduce a model for device modules/line cards #5667
Closed
opened 2025-12-29 19:30:53 +01:00 by adam
·
10 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#5667
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @jeremystretch on GitHub (Nov 16, 2021).
Originally assigned to: @jeremystretch on GitHub.
NetBox version
v3.0.10
Feature type
New functionality
Proposed functionality
Add two new models for tracking the installation of field-swappable hardware modules/line cards/etc. within devices: Module and ModuleType. These will roughly parallel Device and DeviceType, where the later serves as a "template" for instances of the former. A ModuleType can have device component templates assigned to it. Upon the "installation" of a Module within a Device, these components will be instantiated and assigned to the new Module, just as with DeviceTypes.
It likely also makes sense to introduce ModuleBays, to which (similar to DeviceBays) Modules can be installed. A ModuleBay can be assigned a position identifier, which can be leveraged to automatically rename component templates assigned to a ModuleType.
For example, suppose we have a DeviceType with six ModuleBayTemplates. When creating a new Device from this DeviceType, it would receive six ModuleBays assigned to it. Next we might device a ModuleType with 24 InterfaceTemplates assigned to it. When "installing" a Module into the Device, 24 new Interfaces would be created and assigned to the Module. Ideally, these would be automatically named to correspond to the Module's position. (The exact logic supporting this is TBD but there are a few options.)
When a Module is removed, it and any associated device components would be deleted.
(This concept was originally introduced in #824, but has been updated and fleshed out a bit.)
Use case
This proposal would address the use case of modeling chassis-based devices with removable line cards or similar components. Some examples include the Cisco Nexus 7000 series switch and Juniper MX480 router. Associating individual components with a module provides a layer of relationship that better facilitates the addition and removal of these components as they relate to the parent module.
Database changes
The proposal above requires the addition of four new models:
It will also require changing the
device_typeForeignKey relationship on the device component template models to a GenericForeignKey, so that they can be associated with ModuleTypes as well.External dependencies
No response
@mmfreitas commented on GitHub (Nov 16, 2021):
Hello, would this approach cover multiple levels of line cards?
An example with some Cisco Models:
In the command line when connecting to the router the interfaces of the cards have the following name:
Cisco A9K-MPA-20X1GE (has 20 interfaces):
Cisco A9K-MPA-4X10GE (has 4 interfaces):
Would this level of nesting work as expected?
@jeremystretch commented on GitHub (Nov 16, 2021):
No; this would only model a single level of module, which I'd expect to be sufficient for the vast majority of use cases.
@hiddenman commented on GitHub (Nov 17, 2021):
@jeremystretch Great news! However, i can't figure out from the description whether this will close the SFP modules question?
Will it be possible to add a simple SFP module to the interface somehow? Or it's completely different option?
@jeremystretch commented on GitHub (Nov 17, 2021):
@hiddenman SFPs would be addressed by the solution proposed in #7846.
@martink2 commented on GitHub (Dec 18, 2021):
I just played a bit around with the feature and have a question regarding naming of interfaces in modules.
We have a modular switch having 4 slots: slot1,slot2,slot3,slot4
We have two Linecards:
When I insert Type A into Slot 1 i get the interfaces named as in the module template
When I insert Type A into Slot 2 i get a "duplicate key value violates unique constraint "dcim_interface_device_id_bffc4ec4_uniq"
When i insert Type B into slot 3 i get i also get the interfaces as in the template
In the real world the following happens:
Type A-Slot1: TenGigabitEthernet1 -> TenGigabitEthernet1/1
Type A-Slot2: TenGigabitEthernet1 -> TenGigabitEthernet2/1
Type B-Slot3: GigabitEthernet1 -> GigabitEthernet3/1
I took a quick survey through our inventory and the pattern seems to
pretty much boil down to:
(interface-type-name)(slot-prefix)(relative-id)
for my example:
(TenGigabitEthernet|GigabitEthernet)([1|2|3/])([1-n])
Where interface-type-name, seems to pretty uniformly come from the module/linecard
slot-prefix is always coming from the parent device and the relative-id again geeing
defined by the linecard.
Is there already any idea how this will be done?
Regex in the module-bay definition which will be applied to all module interfaces?
Regex in the module-type expecting a parameter coming from the module-bay on insertion ?
@jeremystretch commented on GitHub (Dec 18, 2021):
Just to ensure expectations are clear, this is still very much a work in progress and not yet ready for evaluation.
I'm still weighing options for the component renaming. My plan right now is to add an integer
positionfield to the ModuleBay model, and extend the component instantiation logic to support string replacement referencing it. So for example, you might define interface templates on a ModuleType namedGi{module}/0/[1-24]. When a new Module is "installed", its interfaces are named according to the position of its module bay. I still need to test this though.If it works out, we might be able to implement something similar for virtual chassis, although that's a but more complicated because devices (and their components) can exist prior to VC assignment.
@martink2 commented on GitHub (Dec 20, 2021):
Totally understood and thanks for quick response, we are currently planning to have
a large number of modular patch pannels moved into netbox and this feature would be
a really big benefit for that effort.
As to the integer "position" field or generally the idea to transport information from
the module bay towards the module, that would be very nice. looking at our devices
we found a few scenarios where pure integer would present a challenge thought.
Devices with where Module bays use alpha-numerical identifiers within the same device:
Device A
ModuleBay a-0
ModuleBay a-1
ModuleBay b-0
ModuleBay b-1
On device name of interface: lc-a-0-0, lc-a-0-1 etc
Devices with internal "paths" to modules, this seems to be common in large modular
devices we have:
Device B
ModuleBay 0/0
ModuleBay 0/1
ModuleBay 0/2
ModuleBay 1/0
ModuleBay 1/1
ModuleBay 1/2
On device name of interface: GigabitEthernet0/1/0, GigabitEthernet1/1/2 etc.
I cross checked and in this case it is not about nested modules, like the comment above,
although most likely technically similar. The example is for a fixed configuration 6 Module
device, where the modules seem to be internally split into two groups by the vendor.
(found this in more then one vendor others use 0-1,0-2 etc notation).
Thanks again for spending time with this feature, we are really looking forward to it
landing in Netbox.
@jeremystretch commented on GitHub (Dec 20, 2021):
That's a fair point; I can just make it a character field to allow for maximum flexibility. My initial thought was to allow modification to it in format strings (e.g.
{module+1}) but that should be unnecessary and may actually be dangerous anyway.@jeremystretch commented on GitHub (Dec 20, 2021):
Here's what I came up with.
@martink2 commented on GitHub (Dec 20, 2021):
Played around with the latest feature branch, it works quite nicely. Thanks a lot for that functionality.