mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Extend the behaviour of the {module} variable in components of module types to account for different module bay layouts #11333
Open
opened 2025-12-29 21:43:46 +01:00 by adam
·
9 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#11333
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 @sol1-matt on GitHub (Jul 1, 2025).
NetBox version
v4.2.8
Feature type
Change to existing functionality
Proposed functionality
This is a FR related to #19414 to fulfil the request by arthanson .
The proposed functionality would allow for the definition of multiple naming conventions using
{module}such that the same module type can be used with devices with in different levels of module bay configurations.The implementation of this could be managed in different ways with the desired outcome to be the creation of values like
Possible Implementations
List all possible combinations
Assume stop once all modules values are consumed
Regex optional repeat
Use case
The current functionality of module bays and module types correctly allows for nested designs
eg: device -> module bays -> module type -> module bays -> module type -> interface
A practical example of this would be a Server with a OCP bay (device -> module bay) which is filled with a dual port SFP nic (module type -> module bays), each port is then filled with a SFP module (module type -> interface).
For this to work in Netbox the SFP module needs to have the interface name set with 2
{module}variableseg:
port-{module}-{module}However the same SFP module can not be used in another device which doesn't have this nested structure.
eg: device -> module bays -> module type -> interface
A practical example of this would be a Switch with SFP ports (module type -> module bays), each port is then filled with a SFP module (module type -> interface).
For this to work in Netbox the SFP module needs to have the interface name set with 1
{module}variableeg:
port-{module}The Server and the Switch require different variables for the SFP Module which currently isn't possible.
The error message seen when trying to add a module type with the incorrect number of
{module}vars for a given device configuration isCannot install module with placeholder values in a module bay tree <x> in tree but <y> placeholders given.Workarounds
Duplicate Module Types
A work around to this would be to have multiple SFP Modules of the same type with different nesting vars for each one.
eg:
SFP Module (nest 1) =
port-{module}SFP Module (nest 2) =
port-{module}-{module}SFP Module (nest 3) =
port-{module}-{module}-{module}This can end up messy as you end up with multiple modules that are identical except for how they are used and requires the user to understand this specific problem/workaround.
Untick Replicate Components
When adding the module to a bay that has unsupported nesting untick the
Replicate Componentsoption and then manually create the interfaces and link them back to the correct bays.This is additional work that isn't required when the
{module}count matches with the potential for human error.Alter the Module Type each time it is used in a different nesting format
Each time you get the error message
Cannot install module with placeholder values in a module bay tree <x> in tree but <y> placeholders given.go to the Module Type and alter the{module}format to suit the current device.This is additional work that isn't required when the
{module}count matches but would need to be done each time the module is used on a device with nesting that is different from the last time it was used.Reproducible test case
Types
Server with a OCP baywith 1 Module Bay namedOCP24 port Switchwith 2 Module Bays namedSFP 1andSFP 2using positions 1 and 2Dual port SFP nicwith 2 Module Bays namedSFP 1andSFP 2using positions 1 and 2SFP modulewith a single interface nameport-{module}Server
Server with a OCP bayDual port SFP nicto the availableOCPModule BaySFP moduleto theSFP 1Module BaySFP 1, you will get error messageCannot install module with placeholder values in a module bay tree <x> in tree but <y> placeholders given.SFP modulewith a single interface name ofport-{module}to have a interface name ofport-{module}-{module}SFP moduleto theSFP 1Module BaySFP 1, it will work and create a interface linked to the module calledport-1-1Switch
24 port SwitchSFP moduleto theSFP 1Module BaySFP 1, you will get error messageCannot install module with placeholder values in a module bay tree <x> in tree but <y> placeholders given.SFP modulewith a single interface name ofport-{module}-{module}to have a interface name ofport-{module}SFP moduleto theSFP 1Module BaySFP 1, it will work and create a interface linked to the module calledport-1Database changes
No response
External dependencies
No response
@smasharov commented on GitHub (Jul 3, 2025):
just checked it on 4.3.1 and it's working, but I want some more functional.
for example I have Juniper FPC MX-MPC2E-3D-P and couple MIC-3D-4XGE-XFP installed in it.
template
xe-{module}/{module}/[0-1]works, but the module MIC-3D-4XGE-XFP have two subnumbers: 0 and 1, and resulting numbers should be like{module}/{module*2}/[0-1]and{module}/{module*2+1}/[0-1]I have tried syntax like
{module+1}but it just not works at all, nothing happens then I try to install this type of module@sol1-matt commented on GitHub (Jul 7, 2025):
I've checked 4.3.3 myself and I get exactly the same functionality as described originally. If the number of
{module}'s vars don't match the module bay nesting in use on a given device the module can't be added.@michaelmcdonald commented on GitHub (Jul 9, 2025):
I have run into the same (frustrating) issue and am not sure of a good way forward. I attempted to utilize a script and tags on module creation that would detect if multiple
{module}variables were needed but not there (or multiple{module}variables present but not needed) and correct accordingly; however that did not pan out.@jeremystretch: is there a defined way to handle when multiple
{module}variables are / are not needed and how we can accommodate that?@jeremystretch commented on GitHub (Jul 9, 2025):
Please stop pinging me for issues on which I have not engaged. I cannot and will not weigh in on every FR.
@michaelmcdonald commented on GitHub (Jul 9, 2025):
Apologize; simply assumed as the lead developer you would have insight on how a situation like this is to be handled.
@TekunoKage commented on GitHub (Jul 11, 2025):
SubModule Bay:
SubModule:

SubModule Lable Not Take Module Position:

SubModule Interfacce Definition

SubModule Interface Description Not populated
Netbox Version:
Community v4.3.3
On my case, just those few things need to be corrected to get this working properly.
Thanks!!!
@fzs commented on GitHub (Jul 15, 2025):
I just came across the same behaviour. 👍 for this FR. The example of modeling SFPs as modules now is the prime example why this is needed.
In my case I assumed that the
{module}placeholder in the position is filled in with the value from the position in the device. But apparently it isn't. I would think that for a module inserted into a module bay, the name as well as the position for module bays are resolved. Because then this would already work.Here is an example:
A device type with two module bays:
A module type having again two module bays itself:
And finally a SFP module providing one ethernet interface:
Now let's create a device of type " 2-bay device". It will have two module bays with positions A and B.
If we instantiate a module of type "2-bay module" into the device's module bay A, we get a module with two module bays of its own. In sum we now have four module bays. The names of the module bays in the module have been resolved. The positions not.
If the position had been resolved, and if the position of the module's module bay would actually be used in this case, then the interface of the SFP module would have been named A1 when inserted into module bay "Module bay A-1".
But I am not able to insert the "1-interface SFP" module type into either "Module bay A-1" or "Module bay A-2". In both cases I get the aforementioned error message. So apparently the name is resolved from a tree of postions through the module chain which requires the name to have the exact number of
{module}placeholders in there.I question that this makes sense. For SFP modules that can be inserted at any level it certainly makes absolutely no sense. In my mind it would be more consitent and easier to understand if the placeholder would be filled in with the position value at the module bay level that it is inserted to. Which would require to resolve the placeholder for module bay positions, too.
@sol1-matt commented on GitHub (Jul 16, 2025):
I hadn't considered allowing the position to inherit the parent position @fzs
OCPwith a position of1{module}-SFP 1and{module}-SFP 2using positions{module}-1and{module}-2port-{module}port-{module}-{module}port-1-{module}-2which is wrongBut I'm assuming what we want when the Dual port SFP nic is added to the server it has 2 bays named 1-SFP 1 and 1-SFP 2.
And adding a SFP module to a SFP bay would end up with a port name along the lines of
port-1-1orport-1-2.I like this better than the solutions I originally gave. It is neater and allows different naming conventions of based on the bays used if required where as all my suggestions the module interface will always have the same naming convention.
eg1:
port-{module}and we end up with port names of
eg2:
port-{module}and we end up with port names of
@RichardVReyden commented on GitHub (Aug 5, 2025):
I have also come across the same issue with Juniper daughter modules.