mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Support Port Type Definitions for Module Bays #11297
Open
opened 2025-12-29 21:43:13 +01:00 by adam
·
3 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#11297
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 @0lini on GitHub (Jun 20, 2025).
NetBox version
v4.3.2
Feature type
Data model extension
Proposed functionality
In modular hardware platforms, module bays serve as receptacles for various types of modules (e.g., transceivers, line cards, PCIe expansion cards, disk interposers). However, not all bays accept the same kind of modules — for example:
A 25G SFP28 cage accepts SFP28 or SFP+ transceivers.
A PCIe slot accepts a specific form factor (x4, x8, x16).
A SAS/SATA backplane port may expect a storage controller module.
Today, module bays in NetBox are generic containers with no way to define or communicate what type of module they support. This limits the ability to:
Validate module compatibility
Inform users about expected hardware
Improve module auto-assignment workflows
Use case
Model a network switch with SFP28 ports and enforce that only SFP-compatible transceivers are added.
Define that a specific slot in a server accepts a PCIe card, not a network transceiver.
Help automation tools or provisioning systems determine correct modules for each bay type.
Database changes
A new field would be needed that includes the predefined port/bay types, like SFP, SFP+ and SFP28. All types of PCIe Interfaces 2x, 4x, OCP and so on.
External dependencies
No response
@sleepinggenius2 commented on GitHub (Jun 23, 2025):
I would suggest that instead of introducing just a field for this, that a new
ModuleBayTypemodel be introduced instead (additionally aDeviceBayTypeor a commonBayTypethat could be used for both would be useful too). With all the manufacturers and bay types out there, I don't think it would be practical to try to create an exhaustive list of choices in the core and even allowing it to be customizable would be cumbersome. That would then also allow for further extension by defining a many-to-many relationship between module types and module bay types, which would allow for defining rudimentary compatibility and limiting the module type selector list when adding a module to a bay. Having that for device types and device bays would be useful as well, but I can see where that could be a separate feature request.Due to the potentially large number of bay types and common names between different manufacturers, as well as standard types not specific to a particular manufacturer, I think the
ModuleBayTypeshould allow for optionally associating it with a manufacturer, which could be used in selectors in a similar way to how platforms are handled today. That would also allow for setting an additional uniqueness constraint on the name to include the manufacturer. In fact, I think it should be modeled exactly likePlatformminus the Config template field.@0lini commented on GitHub (Aug 9, 2025):
Since using module bays for SFP ports is now best practice, this has gained more relevance in my opinion.
@sigprof commented on GitHub (Dec 7, 2025):
I think that the many-to-many relationship between module types and module bay types would be needed from the start to make the feature actually useful (and also a many-to-many relationship between module bays and module bay types). Basically, both the module bay and the module type should be associated with sets of compatible module bay types, and the module type should be considered compatible with the module bay only if those sets have at least one element in common, or (for compatibility) if any of those sets is empty.
E.g., see the situation with lower speed SFP/SFP+ modules — various switches may support the following speed options in various combinations (sometimes with different sets of speeds supported on different slots):
In the SFP case the transceiver itself often supports only a single speed, so the set of compatible module bay types for the module type would probably contain just a single element, but the set of compatible module bay types for the module bay may contain multiple elements. The number of supported options looks manageable in this case.
If we go to higher speed SFP variants, there could also be restrictions on channelization (e.g., 40 Gbps → 4×10 Gbps, 100 Gbps → 2×50 Gbps or 4×25 Gbps; on some devices only some ports may support some particular variants). So just having, e.g., a single “QSFP28 40 Gbps” module bay type would not be enough — a breakout to 4×10 Gbps would need to specify “QSFP28 4x10 Gbps”, and the module bay would need to declare support for that too. Some higher end switches may support lots of possible configurations here, but there does not seem to be any way around specifying all supported variants if we want to have proper compatibility checking.
Another example could be M.2 slots and SSDs. In this case the slot (= module bay) can have only a single key (B or M for slots which could accept SSDs), but the M.2 SSD could have compatibility with only M slots, only B slots (does not really exist in practice), or both B and M slots. In this case, unlike SFP, the set of compatible module bay types for the module type would need to contain multiple elements.
But actually the M.2 compatibility issues are more than that — the slot may support only SATA, only PCIe, or both, and the SSD would support only a single kind of interface (either SATA or PCIe). If we want to support such compatibility restrictions while using the “at least one element in common is enough” logic, we would need to define module bay types like:
But if we want to include the M.2 dimensions (2230, 2242, 2260, 2280, 22110) in the compatibility check too, the list would grow from 4 to 20 possible variations.
For normal PCIe slots the situation could be even more complicated — there are at least 4 mostly independent attributes:
The problem here is that we would get 5×3×2×3 = 90 combinations of parameters, and large compatibility sets for both the module types and module bays, so including all of those parameters would become problematic if we use just the “at least one element in common is enough” logic.
Maybe for now we could ignore the combinatorial explosion issues with complicated cases like PCIe slot variants, and focus on more network-relevant things like SFP modules?