mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Allow modules/device bays to take up more than 1 position #9979
Open
opened 2025-12-29 21:25:11 +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#9979
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 @wycre on GitHub (Jul 12, 2024).
NetBox version
v3.4.2
Feature type
Change to existing functionality
Proposed functionality
This is a duplicate of #9080 but provides more details.
Currently,
dcim.Modulecontains aOneToOneFieldtodcim.ModuleBay. Here are the changes to the database that could make this work:dcim.Module
module_bayfield.dcim.ModuleBay
installed_moduleForeignKeyfield pointed todcim.Moduleinstalled_moduleis empty by defaultWhen a new module is installed, allow the user to select multiple module bays that the module will occupy (similar to cable creation allowing multiple terminations).
This system allows for modules to occupy bays that may be close physically but not logically (i.e. a 3x3 grid can support tall modules that fill slots 1 & 4 or wide modules that fill slots 1 & 2 without needing to implement a system to mark their physical locations)
Use case
The use case has been described very well in #9080, I will copy it here for posterity.
From @cyr0nk0r:
Database changes
dcim.Module
module_bayfield.dcim.ModuleBay
installed_moduleForeignKeyfield pointed todcim.Moduleinstalled_moduleis empty by defaultExternal dependencies
No response
@sleepinggenius2 commented on GitHub (Jul 16, 2024):
I was just thinking about this and looking at a very similar solution! There is the problem of naming and which position to use in the
{module}placeholder. My thought is that you would need some way to designate the "primary" bay to disambiguate that. An alternative would be to reuse the existing UI for adding a module, so you add it to one bay, which is used to populate the placeholder, then you can edit the module to assign it to additional bays.An additional item I was thinking about was a field on the module type to set the number of bays that a module occupies, which could be used to limit the number of selections allowed in the form. That does make an assumption that all bays are created equal though, and might make more sense to implement as part of compatibility, like in #16902, or just as a "maximum" value.
In the example above, if you insert an NCS2K-MF-MPO-16LC module into an NCS2K-MF-1RU bracket, as shown, then it will occupy two slots, either 1 & 3 or 2 & 4, but if you insert it into an NCS2K-MF10-6RU shelf, then it will only occupy one slot, as that shelf has double-wide slots specifically for those modules. This actually brings up another point, which is that we model the first scenario with devices and device bays today, as they show as separate PUNIT entries in the device inventory, with their own port naming, but as modules in the second scenario, as they use their slot position within their parent shelf in their port naming instead. So, if we make this change for modules and module bays, I think it would make sense to do it for devices and device bays as well. Interestingly, device bays are already implemented with an
installed_devicefield, so I believe that would just need to be changed from aOneToOneFieldto aForeignKeyand therelated_nameto_('parent_bays')from a model standpoint.@wycre commented on GitHub (Jul 16, 2024):
That is something I had not thought of, I think your solution would add an extra step to installing the modules on account of the editing. Right now, I am importing a very large network into NetBox and installing modules already takes too many steps in my opinion (no way to bulk create modules in the GUI).
One solution is when creating modules, the user adds the module bays the module will occupy to a list in the form and the module bay object with the lowest
idof the selected module bays would be the 'default' and used for the{module}placeholder.@sleepinggenius2 commented on GitHub (Jul 16, 2024):
You can absolutely bulk create modules in the GUI by using the Module Bulk Import screen. I've loaded tens of thousands of modules from CSV that way, just need to do it in batches. The import form could be updated to add something like an
additional_module_baysfield to associate the additional bays and the existingmodule_bayfield as the "primary" one used for naming.That definitely wouldn't work for us in all scenarios. We have some double-width cards that use the "lower" slot and some that use the "upper" slot for naming, because it depends on where they connect to the backplane. So, a card occupying slots 1 and 2, for example, might say that it is in slot 1 if the backplane connector is on the left (looking from the front), or in slot 2 if the backplane connector is on the right. Having the correct slot number would be critical to naming the interfaces correctly.
@jeffgdotorg commented on GitHub (Jul 19, 2024):
Thanks for your interest in helping improve NetBox, and for building upon the foundation laid by @cyr0nk0r in #9080.
I've moved this issue to
backlogstatus and addedneeds milestonesince the described database changes include the removal of an existing table, something best done at a minor or major version boundary. If there's sufficient interest, the team may assign it to a release milestone.@jjoves73 commented on GitHub (Apr 8, 2025):
I have something similar with Juniper MIC cards where the Module position is only 1 value. However the MIC can have multiple depending on the slot position (module bay) on the device. Here's an example.
Juniper MIC 3D-20GE SFP
this MIC card (module) goes on a another card with 2 Module Bays on it, which then install on a Module bay of a device.
The ports/interface are name as such it is broken in groups.
ge-{module}/{module}/[0-9] -- first 10 ports
ge-{module}/{module}+1/[0-9] -- second 10 ports
However that is only for the 1st 10 ports, the 2nd 10 ports the middle {module} is a different number. I was hoping to do {module} + 1 or whatever value we we add. So we wont have to change the position of the actual module.
@marcusyuri commented on GitHub (May 9, 2025):
We have the same issue here. In some cases we have a specific module that occupies multiples modules bays. Right now the workaround soluction to document the ocuppation of the "other" modules bays is to use a fake module on it, and make a reference to the main module.
It would be a nice addition to NetBox framework!!!!
@rafaelcortesdepaiva commented on GitHub (May 9, 2025):
This feature would be a great improving to Netbox. Currently I did a workaround using two custom fields in the module type, where you can set the number of slots a linecard uses horizontally and vertically. Then, I use then on a custom validator script to block another linecard to be placed in a "empty slot" that another multislot linecard is already placed.
@zeugni15002 commented on GitHub (Sep 12, 2025):
We’re experiencing the same issue in our company and also need this feature. Currently, we’ve renamed the first bay to "Bay 1 & 2" and removed the second one, but this isn’t the perfect solution.
It would be great to see a more effective way to address this in the future.
@dcolomer89 commented on GitHub (Sep 19, 2025):
Yes, the same issue in our company. It would be great to see a way to address this in the future.
@991jo commented on GitHub (Dec 23, 2025):
I would also like to see this feature to model our DWDM system with all the different kinds and sizes of cards.
It might be beneficial to add a field to the module to specify, that this module needs a certain amount of module bays to fit into. E.g. some cards might need 2 bays and you can only save it, if both bays are assigned. This does not touch the whole question regarding which bays are used, but ensures, that at least the right amount is used and that one has to think about the further bays that are needed.
I think the enforcement of the positions e.g. that it uses the bay above/below/left/right is hard to do and might differ between devices in the same series. E.g. we are running Ribbon Apollo 9608 Shelfs for our DWDM. Those have 8 Slots in 2 columns and 4 rows, numbered top to bottom. There are some cards, that use up 2 slots above each other. so the would use e.g. u0 and u2, with u2 being the primary slot that is used for interface numbering on the module. However there is the 9624 shelf which is bigger and has all the slots rotated by 90 degrees and changed the numbering of the ports according to the pictures I have seen (we are not using this shelf). So in this case we would use u0 and u2 again, but this time u0 would be the primary slot used for numbering.