netbox-community / netbox

The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/free-netbox-cloud/
http://netboxlabs.com/oss/netbox/
Apache License 2.0
15.98k stars 2.56k forks source link

'ObjectChange' is not subscriptable on upgrade to 3.1-beta1 #7777

Closed rodvand closed 2 years ago

rodvand commented 2 years ago

NetBox version

v3.1-beta1

Python version

3.8

Steps to Reproduce

Unsure on the full steps to reproduce, but I believe it relates to having a Changelog entry from a cable creation. Upgraded from NetBox 3.0.9 to 3.1-beta1.

Expected Behavior

Front page to load with no issue.

Observed Behavior

I can load pages where Changelogs are not fetched, so it' definitely related to changelog entries.

image

Apologies for providing error message by screenshot... it was just the easiest way here.

jeremystretch commented 2 years ago

I believe it relates to having a Changelog entry from a cable creation.

I suspect you're right, but I haven't been able to reproduce this. It would help to see the full stack trace; are you able to post that? (If you click "Switch to copy-and-paste view" next to the "Traceback" heading it will show a plaintext traceback.)

rodvand commented 2 years ago

This is the error text from the email notification. As I've deleted all the change logs I'm unable to reproduce the issue right now.

Internal Server Error: /

AttributeError at /
'NoneType' object has no attribute '_base_manager'

Request Method: GET
Request URL: https://****/ Django Version: 3.2.9 Python Executable: /opt/netbox-3.1-beta1/venv/bin/python3
Python Version: 3.8.3
Python Path: ['/opt/netbox/netbox', '/opt/netbox-3.1-beta1/netbox', '/opt/netbox-3.1-beta1/venv/bin', '/usr/lib64/python38.zip', '/usr/lib64/python3.8', '/usr/lib64/python3.8/lib-dynload', '/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages', '/opt/netbox-3.1-beta1/venv/lib/python3.8/site-packages']
Server time: Mon, 08 Nov 2021 19:35:54 +0100 Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'corsheaders',
 'debug_toolbar',
 'graphiql_debug_toolbar',
 'django_filters',
 'django_tables2',
 'django_prometheus',
 'graphene_django',
 'mptt',
 'rest_framework',
 'social_django',
 'taggit',
 'timezone_field',
 'circuits',
 'dcim',
 'ipam',
 'extras',
 'tenancy',
 'users',
 'utilities',
 'virtualization',
 'wireless',
 'django_rq',
 'drf_yasg']
Installed Middleware:
['graphiql_debug_toolbar.middleware.DebugToolbarMiddleware',
 'django_prometheus.middleware.PrometheusBeforeMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'netbox.middleware.ExceptionHandlingMiddleware',
 'netbox.middleware.RemoteUserMiddleware',
 'netbox.middleware.LoginRequiredMiddleware',
 'netbox.middleware.DynamicConfigMiddleware',
 'netbox.middleware.APIVersionMiddleware',
 'netbox.middleware.ObjectChangeMiddleware',
 'django_prometheus.middleware.PrometheusAfterMiddleware']

Traceback (most recent call last):
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 829, in _resolve_lookup
    current = current[bit]

During handling of the above exception ('ObjectChange' object is not subscriptable), another exception occurred:
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/opt/netbox/netbox/netbox/views/__init__.py", line 150, in get
    return render(request, self.template_name, {
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/test/utils.py", line 100, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/test/utils.py", line 100, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/test/utils.py", line 100, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/templatetags/django_tables2.py", line 167, in render
    return template.render(context={"table": table}, request=request)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/test/utils.py", line 100, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/defaulttags.py", line 167, in render
    values = list(values)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/rows.py", line 244, in items
    column.current_value = self.get_cell(column.name)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/rows.py", line 197, in get_cell
    return self._get_and_render_with(
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/rows.py", line 173, in _get_and_render_with
    return render_func(bound_column, value)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/rows.py", line 206, in _call_render
    content = call_with_appropriate(bound_column.render, render_kwargs)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/utils.py", line 572, in call_with_appropriate
    return fn(**kwargs)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django_tables2/columns/templatecolumn.py", line 66, in render
    return Template(self.template_code).render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 172, in render
    return self._render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/test/utils.py", line 100, in instrumented_test_render
    return self.nodelist.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/defaulttags.py", line 305, in render
    match = condition.eval(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/defaulttags.py", line 889, in eval
    return self.value.resolve(context, ignore_failures=True)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 671, in resolve
    obj = self.var.resolve(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 796, in resolve
    value = self._resolve_lookup(context)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/template/base.py", line 837, in _resolve_lookup
    current = getattr(current, bit)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/contrib/contenttypes/fields.py", line 241, in __get__
    rel_obj = ct.get_object_for_this_type(pk=pk_val)
  File "/opt/netbox-3.1-beta1/venv/lib64/python3.8/site-packages/django/contrib/contenttypes/models.py", line 175, in get_object_for_this_type
    return self.model_class()._base_manager.using(self._state.db).get(**kwargs)

Exception Type: AttributeError at /
Exception Value: 'NoneType' object has no attribute '_base_manager'
jeremystretch commented 2 years ago

Unfortunately I still haven't been able to reproduce this. I've been populating the changelog under v3.0 with all types of changes that might be relevant and then upgrading to v3.1, but I never encounter an error. @rodvand can you think of anything else to try?

DanSheps commented 2 years ago

@rodvand I know this is a long shot, but... Would you happen to have a pre-upgrade db snapshot?

rodvand commented 2 years ago

I can revert to an older install and try upgrading again. Can you give me some pointers on what would be useful info to collect when I do so? We do have "unlimited" change log retention enabled so there would be stuff there from 2.8 and onward.

jeremystretch commented 2 years ago

I'd love to see if we can narrow it down to the specific change record that's causing the error. Maybe try navigating to the change log with ?per_page=1 and trying clicking through one by one? If the exception is showing on the home page, it should be in the top 15.

DanSheps commented 2 years ago

Good point. I was thinking revert and get an export of the content types so we could see what type ID is up, then get a list of content types from the DB.

jeremystretch commented 2 years ago

@rodvand any luck reproducing this? I still haven't been able to, and I've been jumping between develop and feature pretty frequently.

rodvand commented 2 years ago

I managed to reproduce it with the backup of my database. It was due to change log entries by a plugin (netbox-bgp). I had disabled the plugin for the upgrade, but the change log entries were still lurking behind creating havoc. Apologies for the confusion.

jeremystretch commented 2 years ago

Ahh, that makes sense. Thanks for following up!