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

Error when clicking on the "IP Address" field in the VM list #13619

Closed
peteeckel opened this issue Aug 30, 2023 · 3 comments · Fixed by #13621
Closed

Error when clicking on the "IP Address" field in the VM list #13619

peteeckel opened this issue Aug 30, 2023 · 3 comments · Fixed by #13621
Assignees
Labels
severity: medium Results in substantial degraded or broken functionality for specfic workflows status: accepted This issue has been accepted for implementation type: bug A confirmed report of unexpected behavior in the application

Comments

@peteeckel
Copy link
Contributor

NetBox version

v3.6.0

Python version

3.11

Steps to Reproduce

  • Open the "Virtual Machines" list view
  • Click on an arbitrary IP address of a VM

Expected Behavior

The detail view for the IP address is opened.

Observed Behavior

An exception is raised:

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

During handling of the above exception ('IPAddress' object is not subscriptable), another exception occurred:
 File "/opt/netbox/lib64/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
   response = get_response(request)
              ^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
   response = wrapped_callback(request, *callback_args, **callback_kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/views/generic/base.py", line 104, in view
   return self.dispatch(request, *args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/netbox/netbox/views/generic/base.py", line 26, in dispatch
   return super().dispatch(request, *args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/netbox/utilities/views.py", line 99, in dispatch
   return super().dispatch(request, *args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/views/generic/base.py", line 143, in dispatch
   return handler(request, *args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/netbox/netbox/views/generic/object_views.py", line 70, in get
   return render(request, self.get_template_name(), {

 File "/opt/netbox/lib64/python3.11/site-packages/django/shortcuts.py", line 24, in render
   content = loader.render_to_string(template_name, context, request, using=using)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader.py", line 62, in render_to_string
   return template.render(context, request)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/backends/django.py", line 61, in render
   return self.template.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 175, in render
   return self._render(context)
          ^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/test/utils.py", line 112, in instrumented_test_render
   return self.nodelist.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/test/utils.py", line 112, in instrumented_test_render
   return self.nodelist.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/test/utils.py", line 112, in instrumented_test_render
   return self.nodelist.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/test/utils.py", line 112, in instrumented_test_render
   return self.nodelist.render(context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
          ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/library.py", line 257, in render
   resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/library.py", line 221, in get_resolved_arguments
   resolved_args = [var.resolve(context) for var in self.args]
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/library.py", line 221, in <listcomp>
   resolved_args = [var.resolve(context) for var in self.args]
                    ^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 715, in resolve
   obj = self.var.resolve(context)
         ^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 847, in resolve
   value = self._resolve_lookup(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/lib64/python3.11/site-packages/django/template/base.py", line 890, in _resolve_lookup
   current = getattr(current, bit)
             ^^^^^^^^^^^^^^^^^^^^^
 File "/opt/netbox/netbox/ipam/models/ip.py", line 895, in is_oob_ip
   if parent.oob_ip_id == self.pk:
      ^^^^^^^^^^^^^^^^

Exception Type: AttributeError at /ipam/ip-addresses/10/
Exception Value: 'VirtualMachine' object has no attribute 'oob_ip_id'
Raised during: ipam.views.IPAddressView
@peteeckel peteeckel added the type: bug A confirmed report of unexpected behavior in the application label Aug 30, 2023
@abhi1693 abhi1693 added the status: needs owner This issue is tentatively accepted pending a volunteer committed to its implementation label Aug 30, 2023
@ITJamie
Copy link
Contributor

ITJamie commented Aug 30, 2023

    def is_oob_ip(self):
        if self.assigned_object:
            parent = getattr(self.assigned_object, 'parent_object', None)
            if parent.oob_ip_id == self.pk:
                return True
        return False

additional logic will be needed here to check if the parent is a device before calling parent.oob_ip_id

@ITJamie
Copy link
Contributor

ITJamie commented Aug 30, 2023

I caused this so I've made #13621 to solve it.

@abhi1693 abhi1693 added status: accepted This issue has been accepted for implementation severity: medium Results in substantial degraded or broken functionality for specfic workflows and removed status: needs owner This issue is tentatively accepted pending a volunteer committed to its implementation labels Aug 30, 2023
@bitcollector1
Copy link

all of my end users are loving the OOB IP on the front page, so thanks @ITJamie for the work!

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Nov 30, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
severity: medium Results in substantial degraded or broken functionality for specfic workflows status: accepted This issue has been accepted for implementation type: bug A confirmed report of unexpected behavior in the application
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants