mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Inventory item name uniqueness not enforced with same parent device #8603
Closed
opened 2025-12-29 20:38:44 +01:00 by adam
·
15 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#8603
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 @aaron-iles on GitHub (Sep 12, 2023).
Originally assigned to: @jeremystretch on GitHub.
NetBox version
v3.6.1
Python version
3.8
Steps to Reproduce
Devices.Addand create a new device called "Foo".Devices->Inventory Items.Add.Create.Expected Behavior
The user should be stopped from creating an inventory item under the same parent device with the same name according to the documentation: https://demo.netbox.dev/static/docs/models/dcim/inventoryitem/
Observed Behavior
Two inventory items with the name "Bar" and the parent device "Foo" exist in the database.
@abhi1693 commented on GitHub (Sep 12, 2023):
Thank you for opening a bug report. I was unable to reproduce the reported behavior on NetBox v3.6.1. Please re-confirm the reported behavior on the current stable release and adjust your post above as necessary. Remember to provide detailed steps that someone else can follow using a clean installation of NetBox to reproduce the issue. Remember to include the steps taken to create any initial objects or other data.
@aaron-iles commented on GitHub (Sep 12, 2023):
I'm not sure how else to improve the instructions to make it clearer. I tested this on 3.6.1 several times and can confirm the behavior.
Here is a screenshot from https://demo.netbox.dev/

@abhi1693 commented on GitHub (Sep 12, 2023):
I checked your work on demo and it has no parent assigned to the items. Whereas your bug report was when the same parent is assigned the code still let's you add them. Please let me know when you have a bug report which is reproducible
@josh-d-smith commented on GitHub (Sep 13, 2023):
Chiming in here since I've encountered the same bug. I think there's confusion here as @aaron-iles is referring to the inventory item
devicefield and not theparentfield.The below screenshot shows that an inventory item with the same name can be added multiple times to the same

device. Please note,parentis not the issue here.Steps to Reproduce (Modified/Clarified)
Devices.Addand create a new device calledFoo.Devices->Inventory Items.Add.Barand assign it to the deviceFoo.Create.@jeremystretch commented on GitHub (Sep 15, 2023):
This is happening because PostgreSQL considers NULL values to be unique. We need to add a secondary uniqueness constraint for items which have no parent item assigned.
@PieterL75 commented on GitHub (Sep 20, 2023):
Why is there a requirement to have the name of an Inventory item unique ?
We create an item for each CPU, DISK, MEM, ...
If I have 4 CPU's, I will have 4 times the same name
for swtiches the same.. If I have 4 fans, I will have 4 times the same inventory item
Can this requirement be reconsidered ?
Actually, someone was showing his integration of Nornir with NetBox : https://netdev-community.slack.com/archives/C01PFCBBQ4T/p1695144834403849?thread_ts=1695135414.451869&cid=C01PFCBBQ4T
and he'll have issues too
@abhi1693 commented on GitHub (Sep 20, 2023):
In real world use-case such as yours, CPUs are labelled like CPU 1, CPU 2 etc and the same is for DISK, MEM etc. No component in your device will be unlablled by the manufacturer. Now, whether a user utilizes this information or not is a separate matter IMO.
@kkthxbye-code commented on GitHub (Sep 20, 2023):
The same issue is present for SFP's. We have an explicit component association in netbox for inventory items now (the component field), so having SFP's with duplicate names directly associated with the corresponding interface will not be possible after this change is released. This will necessitate adding unneeded information to the SFP name just to satisfy the uniqueness constraint.
Also this is a breaking change in a patch release, it will cause migrations to fail in a large number of netbox instances. I recommend you reconsider as well or at least push it to a minor release. If the uniqueness constraint is to stay, it would make much more sense to extend it to include the component field as well.
Also of import to note is that this has never worked, and the documentation did not seem to mention the constraint until the docs refactor in v3.3.0.
@jeremystretch commented on GitHub (Sep 20, 2023):
The only change here is enforcing the same uniqueness requirement for items both with and without a parent item. It would make no sense to treat these differently, hence the bug report.
This is a bug fix, which are routinely resolved in patch releases per our release policy.
You are welcome to submit a feature request proposing this.
@kkthxbye-code commented on GitHub (Sep 20, 2023):
@jeremystretch - I'll skip the migration instead. I strongly disagree with the reasoning, but I appreciate the response.
@kkthxbye-code commented on GitHub (Sep 20, 2023):
Sorry missed this, not sure what you mean with only change. That is the change we are flagging?
SFP's without a parent (why would a SFP have a parent?) cannot be named the same now. Maybe it would be helpful to know what the canonical way of naming SFP's stored as inventory items now after the change? Appending an incrementing integer to the name?
@jeremystretch commented on GitHub (Sep 20, 2023):
Maybe a recap would be helpful.
Prior to merging #13786
The following constraint was in place on InventoryItem:
At first glance, one would assume that this enforces a unique combination of (device, parent, name) for each inventory item, and that is partially correct. For example, within one device, you cannot have two items named "Item1" if they are assigned to the same parent item.
The bug reported here affects items that are not assigned to a parent. This is because PostgreSQL evaluates NULL as not equal to NULL. This result is that uniqueness is enforced for items with a parent and not for items without a parent, which is inconsistent and unexpected. This discrepancy must be resolved one way or another.
After merging #13786
The resolution in PR #13786 was to add a second constraint, which ignored null parent assignments when enforcing uniqueness:
This replicates the same approach we've taken elsewhere within the application to ensure consistent uniqueness enforcement. With this change in place, all parentless items assigned to a particular device must have a unique name.
Now, if someone wants to propose removing the uniqueness constraint entirely, that may also be considered as an alternative solution, but it's one which would warrant adequate discussion and consideration as an intentional change versus a correction to intended behavior.
Edit: @kkthxbye-code has opened #13837 to propose considering the component assignment as part of the uniqueness constraint.
@jeremystretch commented on GitHub (Sep 20, 2023):
I've reverted PR #13741 and re-opened this issue pending discussion on #13837.
@github-actions[bot] commented on GitHub (Dec 20, 2023):
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Do not attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our contributing guide.
@jeremystretch commented on GitHub (Dec 26, 2023):
Given the degree of opposition to this "fix" both here and on #13837, I'm going to flip it around. We'll update the documentation to reflect the current behavior, and treat it as correct until explicitly changed under #13837 or some other future FR.