mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Make Device/VM unique name enforcement case insensitive #6418
Closed
opened 2025-12-29 19:40:29 +01:00 by adam
·
8 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#6418
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 @Mizarv on GitHub (Apr 28, 2022).
Originally assigned to: @jeremystretch on GitHub.
NetBox version
v3.2.0
Feature type
Change to existing functionality
Proposed functionality
Presently, Netbox validates device/VM names to ensure they are unique, but the enforcement of this is case sensitive. This allows device1 and DEVICE1 to coexist but not DEVICE2 and DEVICE2
I propose that the existing validation is extended to be case insensitive to prevent duplicate devices/VMs being created. This could be a change to the default behaviour or perhaps a setting in configuration.py
Use case
Extending the existing validation would prevent duplicate devices/VMs being created where the user is unaware that the intended device already exists within Netbox.
I can't think of a use case for the existing behaviour over the proposed behaviour
Database changes
No response
External dependencies
No response
@falz commented on GitHub (Apr 28, 2022):
$.02 from an outsider - i consider hostnames as case INsensitive (as with dns), so enforcing unique vm names (vm1 == VM1) seems most sensible and the least confusing.
Taking this a step further, i am surprised to see that netbox devices have this same potential 'issue' - device1 and DEVICE1 are both allowed to be created at same site and tenant.
Possibly something that crept up after slugs were dropped?
@tyler-8 commented on GitHub (Apr 28, 2022):
Related: https://github.com/netbox-community/netbox/issues/2669
Some people want to be able to duplicate names.
Device name != DNS name
FWIW I made a custom validator that provides this functionality should this FR not make it into NetBox:
https://gist.github.com/tyler-8/0a99763cae01c97e8f80f5aca09db968
@Mizarv commented on GitHub (Apr 28, 2022):
You can have duplicate names at the moment regardless of case, for a device it needs to be in a different site, for a virtual machine it needs to be in a different cluster.
We could keep that functionality but the FR is really to just change the enforcement to case insensitive where currently enforced,
@tyler-8 commented on GitHub (Apr 28, 2022):
Right - this makes sense to me. The uniqueness is already enforced in certain scenarios today in core NetBox, and in those instances, it should be case-insensitive.
The validator I made would be for those who want global uniqueness.
@jeremystretch commented on GitHub (May 4, 2022):
The corollary of this proposal is that there is no supported use case for differentiating among device/VM names by letter case. IMO that's a fair assertion but I'd like to leave this open for a while for the community to review.
@jeremystretch commented on GitHub (Jun 30, 2022):
After digging into this a bit, the ideal solution seems to be converting the relevant
namefields to PostgreSQL-specificCICharFields. This is a special database type (citext) which effectively callsLOWER()on the field value when performing comparisons.However, there's a catch: Enabling this field type in the database requires the
citextextension, which itself requires PostgreSQL superuser permission to install. This may not be tenable for a significant portion of the NetBox user base.Alternatively, PostgreSQL 12+ supports non-deterministic collations that can be used for case-insensitive matching as well as disregarding accents and diacritics (see #9613). (The PostgreSQL documentation specifically recommends the use of non-deterministic collations over
citextwhere available.) This appears to be straightforward to implement using Django'sCreateCollation()andCollate()functions. Of course, this would require us to raise the minimum PostgreSQL version from 10 to 12.While it would theoretically be possible to tackle this in PostgreSQL 10 without using the
citextextension, it would require us to manually invokeLOWER()in several places and to ensure we're also specifically employing case insensitive filters when querying against thenamefield. IMO we should defer this work until we're okay with bumping the minimum PostgreSQL version to 12 (which won't happen in NetBox v3.3, but could be done for the next release).@ZPrimed commented on GitHub (Jun 30, 2022):
I'm all for making names case-insensitive.
Re: #2669 - I do think it is nice ("MAY implement") to be able to have identically named devices (or VMs) at different sites/locations though, even though I don't think that is a good practice. I've seen people who have lots of tiny branch sites (e.g. big restaurant chain) and they just want to call all of the switches "switch" rather than including the site name or ID in the device's name. (Again, I don't think this is wise, but the use case is there.)
I was originally going to say something about bumping minimum PGSQL version potentially being annoying for people who are deployed on a "long-term-stable" OS that doesn't provide PGSQL 12+... But Ubuntu 20.04 (which I think is probably one of the more common "LTS" distributions) includes pgsql12. 😛
This could be minorly annoying to people still on CentOS7 or something, but that is close to EOL (and there are ways to get newer versions of pgsql, just requires some extra effort).
And as someone who isn't good at data modelling and relational DB intricacies, I don't envy the work but certainly appreciate it all. 😄
@jeremystretch commented on GitHub (Sep 15, 2022):
I think this is doable just using conditional UniqueConstraints, wrapping the device/VM name with
Lower()to ignore case. We'll also have to tweak some filters to ignore case when matching these objects by name. That should be sufficient to meet the cited use case, I think.Marking this as blocked by #10361 for now.