mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Filtering on both endpoints of a cable #2943
Closed
opened 2025-12-29 18:23:47 +01:00 by adam
·
5 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#2943
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 (Oct 10, 2019).
Environment
Proposed Functionality
Netbox 2.6.6 added the ability to filter cables by site and rack.
If I filter on rack A, I get all cables where either end is in rack A. This includes cables entirely within rack A, and cables from rack A to elsewhere.
However if I filter on rack A and rack B, I get all cables where either end is in rack A, or either end is in rack B - a larger set of cables. This is not particularly useful.
What would be more useful in that situation is to show cables running between rack A and B: that is, where one end is in rack A and one end is in rack B, when 2 racks are selected.
Technically in that case I suppose it still also ought to show cables from A to A and B to B. I think that would add noise, and make it less useful. (*)
This can be generalised: if I select racks A, B and C, then show all cables where both ends are in the set (A,B,C) - that is, it would show cables from A to B, A to C, B to C. (Arguable about A-A, B-B, C-C).
(*) Maybe that's a separate feature though: show all cables from A to A, and show all cables from A to (not A).
For sites, I think this becomes even more important. "Show me all cables where one end is in site A" is not all that useful. "Show me all cables which run from site A to another site" is more useful, as is "show me all cables entirely within site A". Ditto for racks.
Use Case
Filtering to see backbone / inter-rack cables; finding patch panels linking two racks.
Database Changes
None
External Dependencies
None
@jeremystretch commented on GitHub (Oct 23, 2019):
I'm a little confused. What are you proposing the results would be for each of the following queries?
GET /api/dcim/cables/?site=AGET /api/dcim/cables/?site=A&site=B@candlerb commented on GitHub (Oct 28, 2019):
From the point of the GUI, I think the most useful behaviour would be:
Translating to the API, this becomes:
GET /api/dcim/cables/?site=A: cables where both ends are in site AGET /api/dcim/cables/?site=A&site=B: cables where one end is in site (A or B) and the other end is in site (A or B), but different sites - i.e. A to B onlyGET /api/dcim/cables/?site=A&site=B&site=C: cables where one end is in site (A or B or C) and the other end is in site (A or B or C), but different sites (i.e. A-B, A-C, B-C)Unfortunately this is not backwards-compatible, plus you lose the existing query capability ("cables where one end is in site A and I don't care whether the other end is in site A or not").
However, you can keep the current behaviour if you require the same site to be selected multiple times to get the new behaviour:
GET /api/dcim/cables/?site=A: cables with one end in site A, other end don't care (as today)GET /api/dcim/cables/?site=A&site=A: cables where both ends are in site AThat's awkward to implement as multi-select widget in the GUI - although the GUI doesn't currently allow multi-select for sites anyway. Otherwise it's a relatively minor change.
Other approaches add more complexity, using sentinel values or query options.
Sentinel values might look like this (these can be options in a multi-select widget):
GET /api/dcim/cables/?site=A: cables with one end in site A, other end don't careGET /api/dcim/cables/?site=A&site=<same>: cables where both ends are in site AGET /api/dcim/cables/?site=A&site=<other>: cables where one end is in site A and the other is in a different siteGET /api/dcim/cables/?site=A&site=B&site=<same>: cables where one end is in site (A or B) and the other end is in the same siteGET /api/dcim/cables/?site=A&site=B&site=<other>: cables where one end is in site (A or B) and the other end is in site (A or B), but different sites - i.e. A to B onlyGET /api/dcim/cables/?site=<same>: all cables which are internal to any siteGET /api/dcim/cables/?site=<other>: all cables which are between any two sitesQuery options are similar, but avoid special-case values. They might look like this:
GET /api/dcim/cables/?site=A: cables from A to anywhere (as today)GET /api/dcim/cables/?site=A&same=site: cables from A to A onlyGET /api/dcim/cables/?site=A&different=site: cables from A to a different siteGET /api/dcim/cables/?site=A&site=B&same=site: cables from A to A or B to B onlyGET /api/dcim/cables/?site=A&site=B&different=site: cables from A to B onlyGET /api/dcim/cables/?same=site: all cables which are internal to any siteGET /api/dcim/cables/?different=site: all cables which are between any two sitesQuery options seem cleaner, and this approach is useful even without multi-select widgets for site/rack/device in the GUI.
Discussion:
I note that Netbox treats most repeated params as "or", with the exception of ManyToMany fields like tags, where it treats them as "and". This is because an object can have multiple tags. I would argue that cables also fall into the latter category, because one cable has two terminations, and hence two sites (and two racks, two devices).
Thinking about devices, the following might be useful:
GET /api/dcim/cables/?device_id=123&device_id=456: cables between those two devices (rather than all cables into both devices)But the following is probably not what you want:
GET /api/dcim/cables/?device_id=123: cables from this device to itself??In that case, what you want is "cables from this device to anywhere" - which is how it works today, and is contrary to the initial proposal I made for sites.
That is a stronger argument for keeping the current behaviour when only a single parameter is provided.
Sentinel values would work here though:
GET /api/dcim/cables/?device_id=123&device_id=<same>: cables from this device to itselfGET /api/dcim/cables/?device_id=123&device_id=<other>: cables from this device to another deviceOr query options:
GET /api/dcim/cables/?device_id=123&same=device: cables from this device to itselfGET /api/dcim/cables/?device_id=123&different=device: cables from this device to another deviceGET /api/dcim/cables/?device_id=123&different=rack&same=site: cables from this device to other racks in the same site(Query options probably more useful, since the GUI only allows you to enter a single device name today)
Regarding the limitations of multi-select widgets, where you can't select the same item twice, another approach I considered would be to have two selection widgets, in which case it becomes something completely different:
GET /api/dcim/cables/?site=A&site2=B"site" and "site2" would represent the A and B terminations but either way round.
This gives:
GET /api/dcim/cables/?site=A: cables where where one end is in site A, other can be anyGET /api/dcim/cables/?site=A&site2=A: cables where both ends are in site AGET /api/dcim/cables/?site=A&site2=B: cables between site A and site BGET /api/dcim/cables/?site=A&site=B&site2=C&site2=D: cables between (site A or B) and (site C or D)It is still difficult to do "cables from site A to any other site" without listing all other sites in site2, unless you introduce a sentinel value again:
GET /api/dcim/cables/?site=A&site2=<other>: cables from site A to any other site@candlerb commented on GitHub (Oct 28, 2019):
Let me reformulate into a simple proposal:
If a single value is given for a query parameter, either end of the cable must match.
If multiple values are given for the same query parameter, both ends of the cable must match any of the provided values.
For rule (2), the two ends must also match different values from the set of provided values, unless only one unique query value was provided (e.g.
site=A&site=A)Rule 1:
... WHERE a.x = 'foo' OR b.x = 'foo'Rule 2/3: (single unique value):
... WHERE a.x = 'foo' AND b.x = 'foo'Rule 2/3: (multiple values):
... WHERE a.x IN ('foo', 'bar') AND b.x IN ('foo', 'bar') AND a.x != b.xOptional bonus rule: a blank value matches anything. In that case,
site=A&site=B&site=means that one end must be in site A or B, and the other end must be in any other site (not the same site, because of rule (3))Rule 4:
... WHERE (a.x IN ('foo', 'bar') OR b.x IN ('foo', 'bar')) AND a.x != b.x@stale[bot] commented on GitHub (Sep 7, 2020):
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. Please see our contributing guide.
@stale[bot] commented on GitHub (Sep 23, 2020):
This issue has been automatically closed due to lack of activity. In an effort to reduce noise, please do not comment any further. Note that the core maintainers may elect to reopen this issue at a later date if deemed necessary.