mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Change interface naturalize function #6486
Closed
opened 2025-12-29 19:41:15 +01:00 by adam
·
29 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#6486
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 @PieterL75 on GitHub (May 16, 2022).
NetBox version
v3.2.2
Feature type
Change to existing functionality
Proposed functionality
The interface name is naturalized to make it sortable in a proper way. (1,2,10,11,20,21; and not 1,10,11,2,20,21)
The current implementation is not covering all use cases to sort interfaces properly.
By making the function more generic, it could cover more use cases:
It splits the interfacename into parts with and without numbers. the numbers are pre-padded with zero's and the chars [dot,colon,slash] are removed from between the numbers.
There might be corner cases with mixed number schema's on one device, but it will keep them grouped.
Unless there was a reason why the slot/subslot/position/.. were prepended to the interfacetype, rather then post ?
Use case
On Arista we have interfaces that are split in lanes, without slot/pos/subpos identifiers.
The current rules sorts them as
because the /1 is prepended to the interfacetype, while with non-slashed interfaces, the prepend is 9999
a2203da1c6/netbox/utilities/ordering.py (L46)Database changes
All _name fields of all interfaces need to be re-calculated.
External dependencies
No response
@mgoetze5 commented on GitHub (May 17, 2022):
While someone is looking at this... on NetApp an "e" is prepended to Ethernet interfaces whereas FC interfaces have nothing prepended. The current sort looks like this:
but I would prefer:
@sleepinggenius2 commented on GitHub (May 18, 2022):
I have the same issue in two places, but would also need to add
'-'to the list of split characters.On Cisco ASR 9K 1/10G linecards you can specify which interfaces are 1G and which are 10G and the router accordingly labels them as GigabitEthernet and TenGigE, but they currently end up sorted with all the 1G interfaces first, then the 10G ones, and not in proper port order, which is really confusing. With modules now, even putting them all on the same module doesn't fix the sort order.
The other example is on a Cisco ONS 15454/NCS 2K you can have a QSFP+ 4x10G breakout optic inserted that will create something like VCFAC-1-1-1 for the optic and VLINE-1-1-1-1-[1-4] for the individual 10G lanes, except it sorts it so that all the facility interfaces come first, then the line interfaces. In that case, they can even be modeled as child interfaces and that doesn't affect the sort order either.
@PieterL75 commented on GitHub (May 19, 2022):
That will be difficult. the order function only knows the interface names, not the underlaying device model.
@DanSheps commented on GitHub (May 19, 2022):
I think there could be some room for improvement, perhaps we have to look at considering how the sort happens when a slot, module, or port are missing.
That said, I think we still need to maintain the sort with the interface type, but perhaps have interface type be sorted just before port (if it isn't already).
Maybe it would make sense for all of these to be individual fields and then have the name be a computed field that is the combination of all fields.
This sort of individual field setup would only work well with most network switches, regular interfaces for the most part, don't have a concept of slot/module.
@PieterL75 commented on GitHub (May 22, 2022):
Dan, why would we need to name the parts of an interface and try to fit ?
I think that is we just make the numbers a zero pretended 5 digit number, that all sorting cases work. (Except the one mgoetze5 mentioned).
@jeremystretch commented on GitHub (May 24, 2022):
@PieterL75 you can find the existing tests for the natural ordering of interfaces here. As it has taken several years for us as a community to settle on the current scheme, we will only entertain modifications that do not alter or violate any of the existing tests. Is this something you want to pursue?
@PieterL75 commented on GitHub (May 24, 2022):
So, as long as the new sorting returns the same order for the test , we should be good?
The 'calculated' values will change of course, the displayed order must remain the same.
@jeremystretch commented on GitHub (May 24, 2022):
Provided the proposed change makes sense, yes. It'll also need a new test for the scenario you described above.
@jeremystretch commented on GitHub (May 24, 2022):
We need to be careful with this. Any changes that would result in recalculating raw names will require that users run
renaturalizeagainst all interfaces when upgrading, which is best avoided.@PieterL75 commented on GitHub (May 24, 2022):
Sounds good. Im good to create a PR for this
@PieterL75 commented on GitHub (May 24, 2022):
I've been thinking that too, but it might be something that is inevitable and needs to be weighted...
Could (if needed) a migration script take care of that?
@DanSheps commented on GitHub (May 24, 2022):
Looking at the code, I think this is because it treats empty slot, subslot, position, subposition as "9999", would it make sense to treat these as "0000" instead? That would likely solve this specific use case.
@PieterL75 commented on GitHub (May 24, 2022):
I see now in that test script why the interface type is placed after the port's..
same for junipers where xe, ge and te interfaces can be mixed in one 'module'
We dont want those TenG before the Gig's
Going to think some more, and check @DanSheps advise
@PieterL75 commented on GitHub (Jun 1, 2022):
@DanSheps @jeremystretch
I have a version of the naturalize_interface ready in my fork.
Shall I create a PR to have it reviewed ? or will you first check it out.
https://github.com/PieterL75/netbox/tree/issue_9368
It does change the rawnames, as it uses a totally different logic.
There is an option to change the logic, based on the name of the interface, and the model properties..
The current implementation passes the
./manage.py test dcim.tests.test_natural_orderingand it also sorts the ones in the comments (netapp, vmac, ....)
@DanSheps commented on GitHub (Jun 1, 2022):
Sure, push up a PR and we will take a look
@PieterL75 commented on GitHub (Jun 7, 2022):
I have to fix the tests so that they match the new naturalization function....
But, what I see that the biggest 'exception' is that causes my biggest headache :
The sorting requirement that 'FastEthernet0' comes after 'GigaEthernet 0/1'.
I don't see a reason to do that, except that the FastEthernet0 is a mgmt only interface that you don't want 'sorted' with the rest.
For that I added a condition that places the mgmt_only interface always at the end of the sorting.
If that adheres the requirements of why Fa0 was after Gi0/1, then I would like to get rid of that hard requirement. (I dont have the history thread on how the current function was born)
@DanSheps commented on GitHub (Jun 10, 2022):
I will take a look at the tests and see if I can figure out why this is. To me, FA should come before GI, especially because "0" is the port. I believe this is because in the naturalize we use 9999 for slot and module when it is non-existant, but to me that is backwards and it should be 0000 for a null value.
@candlerb commented on GitHub (Jun 23, 2022):
I suggested the same sort of general natural ordering algorithm at https://github.com/netbox-community/netbox/issues/6882#issuecomment-898508667 and https://github.com/netbox-community/netbox/issues/2872#issuecomment-491279206 - rejected both times.
Those links include some discussion of how this doesn't agree with the existing test cases.
@PieterL75 commented on GitHub (Jun 25, 2022):
To me, it seems that the decisions made in the past were not the best.
We should start a new discussion to agree on a new sorting algorithm that will work for a lot of cases.
The corner cases that are now taken into account, and mess up other natural sorting, should go away in favor of a 'logical' scheme without exceptions. (ex : placing FastEthernet1 at the end, because on some switch types that is the mgmt interface).
I'll work out a generic sorting algorithm and post a new PR to test. This will ofcourse change the current values of _name. But that can be handled with a migration schema file. Rollback is not possible, but that is simply not possible in an version of netbox. Forward is the only way :-)
@DanSheps commented on GitHub (Jul 2, 2022):
@PieterL75 if you want to post up the new FR we can definitely discuss modifying the ordering.
@PieterL75 commented on GitHub (Jul 4, 2022):
@DanSheps I pushed a new PR https://github.com/netbox-community/netbox/pull/9463
I suspect it will not be approved yet, but I hope I was able to build a logic that is easily extendible.
@PieterL75 commented on GitHub (Jul 5, 2022):
I had a very interesting discussion.. @jeremystretch @DanSheps
Why bother with the naturalize function ?
If we could manually set/change/dragdrop the order on the device/module-type, then that order can be taken for the derived devices.
That sort-order can be retained on a device. if a new interface is added to the device itself, then it could be placed at any place and stored....
the _name field can then simply become 0001, 0002, 0003, ...
@PieterL75 commented on GitHub (Jul 8, 2022):
@jeremystretch @candlerb did you had time to review the pr I submitted?
However, I feel more for solution that interfaces are ordered manually in the template, or on the device... No more debates, each model sorts them by it's design
@DanSheps commented on GitHub (Jul 9, 2022):
I don't think a manual sort is going to be in the cards, it is too difficult to manage. We had it, pulled it out for this.
That said, I think a better method could be devised.
@PieterL75 commented on GitHub (Jul 9, 2022):
Did you had it when templates existed? Because with those, it is just a one time manual sort.
An the option to change it a bit when it became a device...
Modules might make it a challenge though..
@PieterL75 commented on GitHub (Aug 27, 2022):
@jeremystretch
On the PR you mention that you will not allow the current naturalization function to be changed.
As this current one is really not doing what it should for multiple devicetypes, I have some suggestions.
I prefer the manual ordering, as it will cover all possible situations. The initial ordering can be fine by such a function, but manual reordering should be an option.
@PieterL75 commented on GitHub (Sep 26, 2022):
Still wondering on how this can be solved.
'One Solution Fits All' will not work, so we have to be able to provide a way to customize the naturalization.
Either by a plugin that can overrule the default, or by a configuration.py setting that refers to a py function.
Or a manual reorder..
@ZPrimed commented on GitHub (Sep 30, 2022):
Would it be possible to get the GUI do a multi-column sort? I.e. sort by column A first, then sort by column B? I know this is something that exists in some operating systems and programs, but I don't know how feasible it is to implement within Django...
This could potentially be very helpful, as a user could sort by Interface Type first, and then by Name, which would effectively allow you to "force" (or at least influence) the grouping based on the port speed.
Plus, on many devices, the physical port labels are just a consecutive numeric string, so it would open the possibility to simply sort by "Label" and get everything in the "physical port order". (There currently seems to be a bug in the sorting for the "Label" column - 1, 10, and 11 are next to each other... I was searching to see if it had been reported when I turned up this discussion!)
@jeremystretch commented on GitHub (May 2, 2023):
Closing this for inactivity.