mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Primary IP attribute of a device persists in cache after deleting an IP address #2704
Closed
opened 2025-12-29 18:21:12 +01:00 by adam
·
25 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#2704
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 @InsaneSplash on GitHub (Jun 28, 2019).
Environment
Steps to Reproduce
Expected Behavior
Refresh showing the update device with the IP address removed.
Observed Behavior
An error occurs when trying to view the device at all times.
@InsaneSplash commented on GitHub (Jun 28, 2019):
An update to this, that after about 15min, the page now loads correctly....
maybe a caching issue?
@DanSheps commented on GitHub (Jun 28, 2019):
I am unable to reproduce this, please provide reproducible steps.
You can use https://master.netbox.dansheps.com to build test-cases if you need.
@InsaneSplash commented on GitHub (Jul 4, 2019):
Sure, Ill do some more testing over the next couple of days and revert.
@InsaneSplash commented on GitHub (Jul 17, 2019):
We had the same issue when deleting an IP Address from an interface on a device. It presets the option to confirm the removal, and then when the page refreshes, the above message is displayed.
@InsaneSplash commented on GitHub (Jul 17, 2019):
@InsaneSplash commented on GitHub (Jul 17, 2019):
@DanSheps commented on GitHub (Jul 17, 2019):
Please provide reproducible steps, starting from creating the device, otherwise we cannot action this as it cannot be reproduced
@InsaneSplash commented on GitHub (Jul 17, 2019):
View a device's interfaces.

Add an IP Address on to an interface (Primary IP not selected in this screenshot, works, if I select the IP as primary it fails)

Delete IP Address

Error is then displayed.

NOTE: This only happens when the IP is selected as the primary IP.
@DanSheps commented on GitHub (Jul 17, 2019):
In the future, this is a very relevant piece of information. However, I am still not able to reproduce this.
Could you try reproducing this here:
https://master.netbox.dansheps.com
@InsaneSplash commented on GitHub (Jul 22, 2019):
You are correct, I am unable to reproduce this on the demo website. Could it be related to a corrupt DB schema? If required, I could provide remote screen access.
@r3dsn0w commented on GitHub (Jul 29, 2019):
I just got the same error
steps to reproduce:
The solution/workaround is to check the box to set the ip as the primary ip, then no error is returned
@candlerb commented on GitHub (Aug 28, 2019):
Do you by any chance have any Custom Links defined? I notice from the backtrace:
If so, it's likely that your custom link URL is dependent on the device having a primary IP address, and is raising an exception if it does not.
The workaround is to wrap a condition around your button text (not URL), so that it expands to empty string if the necessary field(s) are not present in the device:
@jeremystretch commented on GitHub (Sep 25, 2019):
I'm not able to replicate this on v2.6.4.
@rkandilarov commented on GitHub (Oct 7, 2019):
@DanSheps , @jeremystretch
I got into the similar error having custom links using {{obj.primary_ip}} even with existence check. I manage to reproduce it several times. Here you may see it at https://master.netbox.dansheps.com/dcim/devices/72/ .
Steps to reproduce:
{% if obj.primary_ip is not defined %}undefined{% elif obj.primary_ip is none%}none{% else %}defined with value{% endif %}I have tested various jinja styles of checking the existence of
obj.primary_ipin the Text field but seems not to work. And please excuse me as I'm not python guy if there is dummy reason for this error.Regards!
@candlerb commented on GitHub (Oct 7, 2019):
What do you actually see when you do this? At that dansheps link I see the button with text "none", which is what I would expect.
The "Text" must evaluate to exactly empty string to suppress the button and hence the expansion of the URL. If the text evaluates to any other string, then you will get a button with that text as that label, and the URL template will be expanded. And that seems to be what's happening here.
So in real life, you'd do something like this:
so that the button is only displayed if
obj.primary_ipis not None.@rkandilarov commented on GitHub (Oct 7, 2019):
@candlerb,
I have prepared new device https://master.netbox.dansheps.com/dcim/devices/73/ you can delete the IP from that view to see the exact error. It is the same error as screenshoted from @InsaneSplash in the very first message in this issue.
Note that in my case the URL is not using jinja, it was just for the test to see the state of the
obj.primary_ipvariable. So in case all is ok, you'll see undefined link to dummy URL not an error page.Anyway you'll see what I mean when press the delete trash button.
@rkandilarov commented on GitHub (Oct 7, 2019):
Hm.. seems that 15 minute reset on netbox.dansheps.com is clearing the error on the device view, but you can still reproduce the bug and see immediately the error following my steps above. Can this be a caching error?
@candlerb commented on GitHub (Oct 7, 2019):
I pressed the red Delete button for the device, and it was happy.
What should I have done - delete the IP address from the interface?
On device 72, I tried adding an IP address to interface "eth", and then deleting it again. All was fine. However I hadn't marked the address as primary.
So then I added address "1.2.3.4/24" and checked Primary, and then I deleted it. Ah, then I got the error:
Refreshing the page https://master.netbox.dansheps.com/dcim/devices/72/ I still see the error. This is about 12:25 UTC.
If it goes after 15 minutes, then clearly it's some caching artefact.
Thanks for making this reproducible!
@candlerb commented on GitHub (Oct 7, 2019):
Exception was still present at 12:33 UTC, gone at 12:39 UTC.
So to be clear, the steps to reproduce are:
dcim > deviceLinkUsingDevicesIP{% if obj.primary_ip is not defined %}undefined{% elif obj.primary_ip is none%}none{% else %}defined with value{% endif %}http://aways-shown-no-jinja.comBut there must be a bit more to it than this. I just tried it on my home instance of Netbox, on a device with two interfaces (eth and wifi) where only wifi had an IP address, which was primary. Deleting that address didn't trigger this problem. So either it's a race condition, or it's sensitive to something else about the device type, or type/number of interfaces.EDIT: I had not created the custom link in my Netbox instance. After creating it, the problem occurs.
@candlerb commented on GitHub (Oct 7, 2019):
It's perfectly repeatable on dansheps.com though (just done it again).
@candlerb commented on GitHub (Oct 7, 2019):
Note: I first created a device (with an eth but no primary IP), and then added the Custom Link. Then browsing to the device I got the exception below, which at a glance seems consistent with the original one.
So the problem appears to be:
device.primary_ip4can sometimes raise an exception instead of returning None.@DanSheps commented on GitHub (Oct 7, 2019):
Thanks @candlerb, appears to be caching related.
Going to re-open this
@jeremystretch commented on GitHub (Mar 23, 2020):
The root issue here is that the custom link template is accessing the device's
primary_ip4/primary_ip6attribute from cache after the IP address has been deleted. The actual database value of this field is null, however the cached value is the primary IP of an IPAddress object which no longer exists, hence the exception.Note: Since #3461 was implemented, a full exception no longer appears on the page: It is contained by disabling the rendered custom link button. (Hovering over the button reveals the exception message as a tooltip.)
@lampwins commented on GitHub (May 15, 2020):
The fix for this is refreshingly simple :)
The root cause has to do with the way cacheops handles
SET_NULLFK relationships, described in cacheops #348.The fix I discovered is to simply add the FK relation to the
prefetch_related()clause on the queryset which allows cacheops to properly link the relation for invalidation.Knowing this, going forward we should probably make the best practice to ensure all FK relationships we intend to use in a given context are added to a prefetch. This also likely means we have other "weird" behavior related to this issue yet to be discovered. For instance, in this case, we had solved the symptom of custom links failing to render in #3461, but the issue still existed within the device view template itself, but it turns out the django templating engine suppresses these errors and simply returns an empty string (this was news to me).
Also note that after fixing this in the course of testing, I uncovered another unrelated but similar caching issue.
@jeremystretch commented on GitHub (May 15, 2020):
This isn't going to be possible under some circumstances, such as when rendering custom export templates. There's no way of knowing ahead of time to what related objects the author will make reference.