mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Bulk-importing pre-existing LAG member interfaces fails if the same LAG interface name is present on multiple devices #8460
Closed
opened 2025-12-29 20:37:01 +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#8460
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 @pv2b on GitHub (Aug 11, 2023).
NetBox version
v3.5.7
Python version
3.10
Steps to Reproduce
Prerequisites: You'll need two devices, In my case, I called them test1 and test2.
Create two LAG interfaces on these two devices with the same name. You can do this using interface bulk import like this:
Then, using bulk import, create an physical interface. Like this:
Take a note of the ID number of the interface that's just been created, because now we want to use bulk import to join this interface into the LAG:
Expected Behavior
The eth0 interface on test1 is set to join the lag1 interface on test1.
Observed Behavior
Actual result is error message: Record 1 lag: "lag1" is not a unique value for this field; multiple objects were found
I believe this happens because the bulk importer is searching for "lag1" across all of Netbox instead for on the interface. It doesn't seem to happen when creating a new interface, only when updating existing ones!
Also see related discussion: https://github.com/netbox-community/netbox/discussions/8267
Seems another user had the same issue but stopped short of providing a repro, so here I am, providing a repro.
@pv2b commented on GitHub (Aug 11, 2023):
This issue looks similar, could be related:
https://github.com/netbox-community/netbox/issues/8546
@pv2b commented on GitHub (Aug 11, 2023):
Sorry, this issue is bogus, ignore it. The repro case is wrong because "lag" is mistakenly set as the LAG interface name instead of lag1. When correcting the interface name to "lag1" in the repro case, it... works.
There's still a bug here somewhere, I'll re-open or post a new bug once I have a proper repro.
@pv2b commented on GitHub (Aug 11, 2023):
OK, I've narrowed it down, it only seems to happen when bulk-importing and editing EXISTING interfaces, not when bulk-importing entirely new ones. I've edited the bug report and repro accordingly. Sorry for any confusion. Reopening.
@pv2b commented on GitHub (Aug 11, 2023):
Related: This API call seems to have a similar problem:
Which gives this response:
@pv2b commented on GitHub (Aug 11, 2023):
Workaround: Specifying a "device" column along with the "id" seems to make the CSV bulk-import work.
@pv2b commented on GitHub (Sep 7, 2023):
OK, I've spent some time with a debugger on this and I think I have an understanding for why this happens, at least for the API call specified above.
For the API call, the issue is with the implementation of WritableNestedSerializer that simply doesn't have the functionality required.
Specifically, if we look at InterfaceSerializer, which is responsible for serializing/deserializing the API requests we'll find that it has a nested serlaizer for the LAG interface:
If we look closer at NestedInterfaceSerializer we'll find this:
Stepping through the app with a debugger has proved that at some point, we reach the to_internal_value method as defined in WritableNestedSerializer like this:
So, it doesn't really seem to be looking at
self, only looking atdata, which in this case is just this:Then, it's somehow trying to pass this params dictionary into
dict_to_filter_paramsand tries to search the database with this insufficient information and... well... it doesn't succeed because there are multiple objects with the same name.And the reason it doesn't work isn't really a bug, it's more a matter of missing functionality. Functionality that you as a human user might guess or expect exists, but in fact does not.
As for the solution, I'm not really sure how to approach it. It would be possible to add more functionality to
to_internal_valueto look at the parent object's device id if it was missing, but this would seem to become fairly messy very quickly. You could just overrideto_internal_valueon the device serializers? Or you might include another field in the Meta class to provide some sort of mapping of what properties to grab from the parent objects? Like, in this case, grab the device ID from the parent serializer if missing. That can be accessed fromto_internal_valueon the nested serializer using something likeself.parent.instance.device.id, but can this be made general somehow?As for the CSV import case which is what this bug originally tracked, I'm not entirely convinced the problem there has anything to do with the API serializers/deserializers. I've not really been able to penetrate that code just yet, since I focused on the API call which I thought would be easier to debug.
Anyway, my conclusion after digging at this at a while is that this isn't really a bug, it's more a case of a (missing) feature.
Right now I'm pretty lost as to what the correct approach to solve this in a general way that doesn't stink would be, and I don't think I'll be able to get unlost without any help on this, so... unless I hear something else I'm just going to leave it here for now.
@github-actions[bot] commented on GitHub (Dec 7, 2023):
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. Do not attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our contributing guide.
@github-actions[bot] commented on GitHub (Jan 7, 2024):
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.