Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Graphql query for device_types fails after upgrade to 1.2.1 #1203

Closed
codeVeiligst opened this issue Dec 23, 2021 · 2 comments · Fixed by #1231
Closed

Graphql query for device_types fails after upgrade to 1.2.1 #1203

codeVeiligst opened this issue Dec 23, 2021 · 2 comments · Fixed by #1231
Assignees
Labels
type: bug Something isn't working as expected

Comments

@codeVeiligst
Copy link

codeVeiligst commented Dec 23, 2021

Environment

  • Python version: 3.8.10
  • Nautobot version: 1.2.1

Steps to Reproduce

  1. In the graphql query browser insert the following query:
query { 
  device_types {
    id
    model
  } 
}
  1. Run the query
  2. With DEBUG enabled the following result is shown.
{
  "errors": [
    {
      "message": "maximum recursion depth exceeded while calling a Python object"
    }
  ],
  "data": {
    "device_types": null
  }
}
  1. With uwsgi and nxing configured ngnix logs the following:

upstream prematurely closed connection while reading response header from upstream

And in the webui a HTTP 502 error is shown.

Expected Behavior

Receive all configured device types as it did before upgrading to version 1.2.1.

Observed Behavior

See point 3 and 4.

@glennmatthews
Copy link
Contributor

Thanks for the report! Here's the stack trace I see:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/graphql/execution/executor.py", line 481, in complete_value_catching_error
    exe_context, return_type, field_asts, info, path, result
  File "/usr/local/lib/python3.6/site-packages/graphql/execution/executor.py", line 557, in complete_value
    exe_context, return_type, field_asts, info, path, result
  File "/usr/local/lib/python3.6/site-packages/graphql/execution/executor.py", line 599, in complete_list_value
    for item in result:
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 287, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 152, in __init__
    self._original_u_height = self.u_height
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query_utils.py", line 149, in __get__
    instance.refresh_from_db(fields=[field_name])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 353, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 155, in __init__
    self._original_front_image = self.front_image
  File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/files.py", line 180, in __get__
    instance.refresh_from_db(fields=[self.field.name])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 353, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 152, in __init__
    self._original_u_height = self.u_height
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query_utils.py", line 149, in __get__
    instance.refresh_from_db(fields=[field_name])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 353, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 155, in __init__
    self._original_front_image = self.front_image
...

where the following seems to be the infinite recursive loop:

  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 353, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 152, in __init__
    self._original_u_height = self.u_height
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query_utils.py", line 149, in __get__
    instance.refresh_from_db(fields=[field_name])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 353, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.6/site-packages/cacheops/query.py", line 283, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/query.py", line 71, in __iter__
    obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in from_db
    new = cls(*values)
  File "/usr/local/lib/python3.6/site-packages/nautobot/dcim/models/devices.py", line 155, in __init__
    self._original_front_image = self.front_image
  File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/files.py", line 180, in __get__
    instance.refresh_from_db(fields=[self.field.name])
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 635, in refresh_from_db
    db_instance = db_instance_qs.get()

Oddly enough I don't think this is code we've touched recently, so I'm not sure yet why this issue is appearing.

@glennmatthews glennmatthews added type: bug Something isn't working as expected status: accepted labels Dec 23, 2021
@glennmatthews glennmatthews changed the title Grapql query for device models fails after upgrade to 1.2.1 Grapqhl query for device_types fails after upgrade to 1.2.1 Dec 23, 2021
@glennmatthews glennmatthews changed the title Grapqhl query for device_types fails after upgrade to 1.2.1 Graphql query for device_types fails after upgrade to 1.2.1 Dec 23, 2021
@codeVeiligst
Copy link
Author

FYI, we upgraded from 1.1.5.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
type: bug Something isn't working as expected
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants