mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Add unique constraint on (dns_name, family) #2865
Closed
opened 2025-12-29 18:22:55 +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
No Label
type: feature
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#2865
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 @candlerb on GitHub (Sep 9, 2019).
Environment
Proposed Functionality
On ipam_ipaddress, add a unique constraint on
(dns_name, family)Use Case
As I understand it, the
dns_namefield is intended to be used as the "primary" DNS name for an IP address: the one which the PTR record points to.Each IP address can have only one such primary name, and there will be a matching forward A/AAAA record. You can of course have other A/AAAA records pointing to the same IP address, but they would be managed outside of Netbox.
Having one IPv4 address and one IPv6 share the same primary dns_name is also fine, for a dual-stacked host.
However, Netbox currently allows multiple addresses of the same family to point to the same dns_name. If you do this, the primary forward name will have multiple A or AAAA records. Whilst this is not technically invalid, it's almost certainly not what you want, as you will get an answer selected at random for queries to the primary name.
Therefore, I would like to prevent this. A uniqueness constraint on
(dns_name, family)will achieve this, whilst still allowing one IPv4 and one IPv6 address to point to the same name. Ifdns_nameis null, postgres ignores the uniqueness constraint, which is also what we want.Aside: in those cases where you do want round-robin DNS, it would be done by adding additional A/AAAA records outside of netbox. e.g.
192.0.2.1/24has nameserver1.example.com192.0.2.2/24has nameserver2.example.comwww.example.comhas A records192.0.2.1and192.0.2.2This means that the reverse for each host correctly points to its own name.
Database Changes
As above - new constraint in model / database
External Dependencies
None
@DanSheps commented on GitHub (Sep 12, 2019):
I think the problem is right here, and even more so. It isn't invalid and even there are cases where multiple A/AAAA/etc records are desired for the round-robin DNS load-balancing.
Consider this scenario:
A 2 load balancers (or any device for that matter) (lb1.my.net : 192.0.2.251 [Primary])(lb2.my.net : 192.0.2.252 [Primary]) with 7 additional ips on outside interfaces:
www.my.net:192.0.2.1
www.my.net:192.0.2.2
www.my.net:192.0.2.3
www.my.net:192.0.2.4
www.my.net:192.0.2.5
www.my.net:192.0.2.6
Or perhaps this scenario:
2 servers peering with routers both advertising 192.0.2.23/32 into eBGP/iBGP. You would want to document these prefixes somewhere (Loopback perhaps) and each would have a duplicate IP and a duplicate hostname.
These would be a perfectly valid configuration and you may want to model that in Netbox. I don't think we should be putting constraints in place where there might be a valid use-case for it. Why might you want to do this? I can't personally think of a reason when you already have a load balancer.
@candlerb commented on GitHub (Sep 16, 2019):
Certainly round-robin DNS is something you may want to do. What I'm saying is, you shouldn't use the
dns_nameattribute of theipam.ipaddressobject to configure it.In my opinion, the following would be a bad configuration:
The right way would be:
The latter is better for several reasons. It gives each address a unique name so that when you do a reverse query for (say) 192.0.2.2, you can see which host it belongs to. More importantly, from an operational point of view, you can remove an individual host from the "www" group (e.g. for maintenance) without breaking that host's forward/reverse DNS. You can also have a short TTL for "www" for operational reasons, but longer TTLs for "www1", "www2", "www3".
If you take the second approach in Netbox, then:
As for the second example you give: announcing the same loopback from multiple devices. I think that normally in Netbox you would create a single
ipam.ipaddressobject for 192.0.2.23/32, with role "Loopback" or "VIP" if it is shared between multiple hosts.If you decide to add the same IP separately to multiple devices in Netbox then you have to turn off the IP uniqueness checking; that in turn increases the risk of other inconsistencies being introduced.
@DanSheps commented on GitHub (Sep 23, 2019):
That might be how you would model it, not everyone will model it this way and for that reason I don't think name uniqueness should be a thing we enforce. The right way for you to model something is not the right way for someone else to model something. There are valid cases on both sides and if name uniqueness is something you desire, that is probably better suited in a report that you manually run rather then being backed in.
Constraining the end-user in the database too much is going to result in the product not being usable for them whereas reports are the correct "soft-enforcement" method in this particular instance.
Or you just choose the "HSRP, GLBP, CARP, VRRP, VIP or Anycast" role, which disables the uniqueness checking for that specific address.
I think for now I am going to close this out, I don't see any benefit to doing this and as people have already been using this in production it would be a breaking change.