mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Support Primary IP Address Lookup Expression for Device and Virtual Machine #11644
Closed
opened 2025-12-29 21:48:00 +01:00 by adam
·
6 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#11644
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 @jseifeddine on GitHub (Sep 23, 2025).
NetBox version
v4.4.1
Feature type
Change to existing functionality
Proposed functionality
It would be nice to be able to use lookup expressions with primary IP address on device / vm
As documented:
String Lookup ExpressionsI see that some work was done for IP address filtering recently...
https://github.com/netbox-community/netbox/issues/19110
But rather than fixing a fix - I would rather mimic the behavior of lookup expressions for the
namefield, as an IP address is a string also... it makes sense that it should have the same expressions availableAnd just as a side note: the documentation for
String Lookup Expressionsthat I would expect works with any string field, is a hit and miss .... depending on what field it is - and i guess, who implemented the filtersetFRSo there is possibly more in this than just the primary IP address filter
But it would be nice that all fields are consistent in the way that they can be filtered...
I am happy to spend quality time on this and submit a
PR, if the issue is accepted and we can get some solid direction to move forwardMaybe I am missing something? If not, I'm happy to get to work on at least the primary IP address fix - and ultimately - if this is a valid issue across the board, apply this fix to any string filters across the board.
(sorry I can't come up with any other examples right now, but I can track that down and post updates)
Use case
Easily search devices / vms based on IP address starting with, ie.
primary_ip4__isweg.
/dcim/devices/?primary_ip4__isw=100.64.Database changes
Don't think so
External dependencies
None
@jnovinger commented on GitHub (Oct 2, 2025):
The
primary_ip4andprimary_ip6fields are foreign keys toIPAddressobjects, not string fields, so string lookup expressions don't apply. IP addresses are actually numbers under the hood, despite being displayed in dotted notation, therefore we don't support string-based filtering on them.@jseifeddine commented on GitHub (Oct 3, 2025):
This works... its minimal, I don't believe this would be a breaking change and would be really useful.
f25d5db3da@jseifeddine commented on GitHub (Oct 6, 2025):
✅ No breaking functionality
The removal of these parameters:
✅ Does NOT break existing exact match filtering
✅ Produces the same query results for valid inputs
⚠️ Removes early validation (but this just means invalid IPs return empty results instead of potentially raising an error)
✅ The PostgreSQL INET field handles the actual IP validation
In practice: Users passing valid IP addresses will see identical behavior. Users passing invalid IP addresses will still get empty results (no matches), just without early validation.
I think this is acceptable and follows NetBox patterns - other char filters don't validate against the database either; they just filter and return results or no results.
@jeremystretch
@InevitableMarble249 commented on GitHub (Oct 8, 2025):
+1 This would be really useful for us too
@jnovinger commented on GitHub (Oct 9, 2025):
Thank you for the idea and working implementation. The community interest suggests this might be worth exploring further.
However, I have concerns about relying on PostgreSQL's implicit
INET->textcoercion for string pattern matching. Before accepting this approach, we'd need to investigate several technical questions that would be better addressed in a GitHub Discussion with community input.Key Concerns
PostgreSQL Behavior
LIKE/ILIKEonINETfields documented behavior or implementation detail?CAST(address AS TEXT) LIKE '10.%'or nativeINETsupport?)PostgreSQL normalizes IPv6 addresses (
2001:db8::1vs2001:0db8:0000:0000:0000:0000:0000:0001). String matching might bypass this:?primary_ip6__istartswith=2001:0db8match addresses stored as2001:db8::1?__icontainshandle compressed notation?Dependency Stack
Performance
INETindexes?Alternative Approaches?
/dcim/devices/?primary_ip4__isw=100.64.is to find devices with primary IPs contained within the100.64.0.0/16network, could we find an alternative that implements the semantics of "is contained by network 100.64.0.0/16" as opposed to the inferred meaning??primary_ip4__net_contained=100.64.0.0/16or similar? This would work with PostgreSQL'sINETmachinery? The result could be a much more explicit query with very specific semantics rather than trying to infer based on string coercion and intended meaning.__iswor__icontains) be implemented for IP addresses in a way that maintains the specific semantic meaning mentioned above? is this even a good idea?What We'd Need (at a minimum)
LIKE/ILIKEonINETis intended behaviorIf you would like to pursue this further, then I encourage you to open a GitHub Discussion with the goal of addressing the points above. If the community can arrive at something that makes sense and is deemed maintainable by the maintainers, then we could proceed to a new FR. This will help us evaluate whether string lookups are the right solution or if network-based filtering would better serve the community while working with PostgreSQL's type system.
We appreciate the initiative. This discussion will ensure any solution is robust across NetBox's diverse deployment environments and is maintainable in the long-term.
@jseifeddine commented on GitHub (Oct 10, 2025):
Thanks @jnovinger
For most of your concerns - I can do some testing and report back all findings.
In regard to the alternative, I guess you are implying they would be in the NetBox IP prefix etc.
Sure, in the perfect world - but we know that people are messy and don't always rules.
I'll open a discussion too.
Thank you