mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Bulk editing IP addresses throws error " This field cannot be null." #7928
Closed
opened 2025-12-29 20:30:03 +01:00 by adam
·
23 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: bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#7928
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 @morten-starvik on GitHub (Apr 19, 2023).
NetBox version
v3.4.8
Python version
3.10
Steps to Reproduce
Expected Behavior
Selected attributes should be edited on selected IP addresses
Observed Behavior
Netbox throws an error, " This field cannot be null.", and does nothing. Interesting enough, If you only select only one IP address, it edits the attributes without throwing an error
@jeremystretch commented on GitHub (Apr 19, 2023):
I'm not able to reproduce this on v3.4.8. The selected attributes are set as expected without error. Where exactly are you seeing this error message?
@morten-starvik commented on GitHub (Apr 20, 2023):
Simple example:

I select 2 random IP-addresses, click edit, set the field "Status" to Deprecated, and click "Apply"
@kkthxbye-code commented on GitHub (Apr 20, 2023):
@morten-starvik - I cannot replicate this either, works with no issues here.
@jeremystretch commented on GitHub (Apr 21, 2023):
I'm wondering if maybe the existing objects are somehow corrupt. @morten-starvik can you try creating a few new IPs via the UI, and seeing if you can replicate this behavior while editing those?
@kkthxbye-code commented on GitHub (Apr 21, 2023):
@jeremystretch - Managed to replicate it, it's caused by https://github.com/netbox-community/netbox/pull/11550
Replicated it by setting
assigned_object_id= null on an ip address, but leavingassigned_object_type_idas is. I've seen a fair amount of people having these cases, which the PR intends to fix, but if the database is already in that state it will prevent editing the object instead.Not sure what the correct solution is here. Potential solutions:
@morten-starvik commented on GitHub (Apr 21, 2023):
Seems like you're on to something. I created some new IP's, and they could be edited without error. We have quite recently upgraded to v3.4.8, and have not experienced this error before the upgrade. I will check with my colleague who did the upgrade, whether he had any issues during the upgrade
@jeremystretch commented on GitHub (Apr 21, 2023):
I believe @kkthxbye-code has identified the issue above. These IP addresses likely have partial assignment information. You can check this by inspecting their representation in the REST API: Look for IP addresses with only an
assigned_object_typeorassigned_object_idset.@candlerb commented on GitHub (Apr 25, 2023):
This case certainly does happen in real life (unclear how), but seems to be impossible for the user to clear via the UI.
I suggest that if either assigned_object_type_id or assigned_object_id is None, that as part of validation the other is silently set to None as well: see https://github.com/netbox-community/netbox/issues/10221#issuecomment-1450183759.
It might also be possible to add some sort of database row level validation (i.e. both fields are either null or not-null)
As a stop-gap, a Custom Script could be written which looks for these cases:
EDIT: I have created the script and added a PR for it here: https://github.com/netbox-community/customizations/pull/85
But I guess really it ought to walk all objects with generic foreign keys.
@candlerb commented on GitHub (Apr 25, 2023):
Looking at my own system: the IPs I have in this state are all from cases which were previously attached to an VM or device interface which no longer exists.
Somehow it was possible to delete the interface without it deleting the attached IP; and the generic relation set the assigned_object_id to null, without setting the assigned_object_type_id to null.
@morten-starvik commented on GitHub (Apr 26, 2023):
@candlerb, That's the situation in our environment as well; IP addresses in this state have previously been assigned to interfaces
@candlerb commented on GitHub (Apr 26, 2023):
I tried replicating this a couple of ways with 3.4.8 (delete VM, bulk delete VM) but in both cases the IP address attached to the interface was deleted. Either this was triggered some other way, or it is intermittent, or there was a bug which has since been fixed.
@bobbwest commented on GitHub (May 3, 2023):
About half the IP address in my DB have
assigned_object_id = nullandassigned_object_type_id = 5. None of them have ever been assigned to an interface (django_content_type 5).I think these all were created on or before 2020-09-09. I'm not sure what NetBox version we were running at that time.
@DanSheps commented on GitHub (May 3, 2023):
What object type is object_type_id=5?
@candlerb commented on GitHub (May 3, 2023):
He said "interface". But on a freshly-installed system it's different:
@DanSheps commented on GitHub (May 3, 2023):
Yeah, I have never seen a ctype id of 5 for anything netbox related. And I have some old instances.
@bobbwest commented on GitHub (May 4, 2023):
@DanSheps commented on GitHub (May 4, 2023):
Well, that is... Broken.
Is it possible that these were attached at some point in the far past? Perhaps even in the 2.x days?
Honestly, for this type of thing an invalid data scrubber might be a good idea. Not just for here but for any GFK.
@candlerb commented on GitHub (May 4, 2023):
For cases like these, the scrubber at https://github.com/netbox-community/customizations/pull/85/files will do the job. Drop it in
/opt/netbox/netbox/scripts/and then run it via the GUI at Other > Scripts. Or via SQL:Certainly would be nice to have this for all generic foreign keys, but so far almost all the people who have been hit by this (including me) have only seen it on IPAddress and where one field is null and the other is not null.
A proper scrubber would also check for cases where both fields are not null, but the referenced target object does not exist.
@jeremystretch commented on GitHub (May 5, 2023):
I believe the root issue here (the introduction of incomplete GFK assignments) has been addressed by #11454 in v3.4.8. Is there any outstanding work to be done at this time?
@candlerb commented on GitHub (May 6, 2023):
#11550 will raise a ValidationError if one of (ct_field, fk_field) is null, which may prevent this happening in future (although we still don't have a good explanation of how only one of the fields became null in the first place)
The remaining problem I see is if the user is editing an object which is in this state, I don't believe this gives them the ability to fix such objects in the UI.
My suggestion is that in model validation, if one field is null but the other isn't, then quietly set the other to null. Or are model changes not permitted within the validation function?
@bobbwest commented on GitHub (May 6, 2023):
I've managed to reproduce the issue from a fresh install.
Using a fresh install of netbox 2.5.2 / netbox-docker 0.7.0, create just one IP address. The database looks like this:
Upgrade directly to netbox 2.11.12 / netbox-docker 1.2.0 by backing up the original database from 2.5.2, removing the docker database volume, bring up new postgres container and restore from the backup SQL file. Then bring up the other containers so the migrations are run. This results in exactly what my database had:
@bobbwest commented on GitHub (May 6, 2023):
This is the culprit:
9cc4992fad/netbox/ipam/migrations/0037_ipaddress_assignment.py (L9-L10)Given this is caused by past migrations, it would make sense to correct it automatically, either in a migration or as part of the model.
@jeremystretch commented on GitHub (Jun 23, 2023):
@bobbwest the code you reference has been removed since v3.0, when migrations were squashed. While your situation is unfortunate I don't believe there's any change we can make to the current code base that would alleviate it.
I'm going to close this out as there does not appear to be any action needed at this time.