The instance action log for admin doesn't work if ANGULAR_FEATURES.users_panel is True

Bug #1934853 reported by Rikimaru Honjo
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Dashboard (Horizon)
In Progress
Medium
Unassigned

Bug Description

# Problem description

I'm using horizon of openstack wallaby on Ubuntu 20.04. I installed it with devstack.

And I set ANGULAR_FEATURES.users_panel as True in local_settings.py. By the way, the default value of ANGULAR_FEATURES.users_panel is False.

========
ANGULAR_FEATURES = {
    'images_panel': True,
    'key_pairs_panel': True,
    'flavors_panel': False,
    'domains_panel': False,
    'users_panel': True,
    'groups_panel': False,
    'roles_panel': True
}
========

As a result, the loading icon was kept spinning when I saw the following action log panel for admin. I couldn't saw action logs.

Admin -> Compute -> Instances -> Click a instance -> Click "Action Log"

I confirmed that openstack queens cloud-archive of Ubuntu 18.04 has same issue.

# My guess

The action log for admin shows operation performer's user id. I think that it is relevant to users_panel.

# Error message

The following error messages appeared in the horizon log file.
(Ubuntu 20.04 + wallaby environment)

2021-07-07 05:14:59.566074 Traceback (most recent call last):
2021-07-07 05:14:59.566083 File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/exception.py", line 34, in inner
2021-07-07 05:14:59.566094 response = get_response(request)
2021-07-07 05:14:59.566103 File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/base.py", line 115, in _get_response
2021-07-07 05:14:59.566113 response = self.process_exception_by_middleware(e, request)
2021-07-07 05:14:59.566123 File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/base.py", line 113, in _get_response
2021-07-07 05:14:59.566134 response = wrapped_callback(request, *callback_args, **callback_kwargs)
2021-07-07 05:14:59.566144 File "/opt/stack/horizon/horizon/decorators.py", line 52, in dec
2021-07-07 05:14:59.566153 return view_func(request, *args, **kwargs)
2021-07-07 05:14:59.566162 File "/opt/stack/horizon/horizon/decorators.py", line 36, in dec
2021-07-07 05:14:59.566172 return view_func(request, *args, **kwargs)
2021-07-07 05:14:59.566181 File "/opt/stack/horizon/horizon/decorators.py", line 36, in dec
2021-07-07 05:14:59.566190 return view_func(request, *args, **kwargs)
2021-07-07 05:14:59.566199 File "/opt/stack/horizon/horizon/decorators.py", line 112, in dec
2021-07-07 05:14:59.566209 return view_func(request, *args, **kwargs)
2021-07-07 05:14:59.566218 File "/opt/stack/horizon/horizon/decorators.py", line 84, in dec
2021-07-07 05:14:59.566228 return view_func(request, *args, **kwargs)
2021-07-07 05:14:59.566239 File "/usr/local/lib/python3.8/dist-packages/django/views/generic/base.py", line 71, in view
2021-07-07 05:14:59.566253 return self.dispatch(request, *args, **kwargs)
2021-07-07 05:14:59.566265 File "/usr/local/lib/python3.8/dist-packages/django/views/generic/base.py", line 97, in dispatch
2021-07-07 05:14:59.566278 return handler(request, *args, **kwargs)
2021-07-07 05:14:59.566287 File "/opt/stack/horizon/horizon/tabs/views.py", line 71, in get
2021-07-07 05:14:59.566297 return self.handle_tabbed_response(context["tab_group"], context)
2021-07-07 05:14:59.566307 File "/opt/stack/horizon/horizon/tabs/views.py", line 65, in handle_tabbed_response
2021-07-07 05:14:59.566334 return http.HttpResponse(tab_group.selected.render())
2021-07-07 05:14:59.566343 File "/opt/stack/horizon/horizon/tabs/base.py", line 375, in render
2021-07-07 05:14:59.566355 return render_to_string(self.get_template_name(self.request), context)
2021-07-07 05:14:59.566367 File "/usr/local/lib/python3.8/dist-packages/django/template/loader.py", line 62, in render_to_string
2021-07-07 05:14:59.566380 return template.render(context, request)
2021-07-07 05:14:59.566392 File "/usr/local/lib/python3.8/dist-packages/django/template/backends/django.py", line 61, in render
2021-07-07 05:14:59.566405 return self.template.render(context)
2021-07-07 05:14:59.566414 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 171, in render
2021-07-07 05:14:59.566424 return self._render(context)
2021-07-07 05:14:59.566433 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 163, in _render
2021-07-07 05:14:59.566443 return self.nodelist.render(context)
2021-07-07 05:14:59.566452 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566462 bit = node.render_annotated(context)
2021-07-07 05:14:59.566472 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566482 return self.render(context)
2021-07-07 05:14:59.566491 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 987, in render
2021-07-07 05:14:59.566502 output = self.filter_expression.resolve(context)
2021-07-07 05:14:59.566514 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 671, in resolve
2021-07-07 05:14:59.566527 obj = self.var.resolve(context)
2021-07-07 05:14:59.566538 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 796, in resolve
2021-07-07 05:14:59.566551 value = self._resolve_lookup(context)
2021-07-07 05:14:59.566561 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 858, in _resolve_lookup
2021-07-07 05:14:59.566586 current = current()
2021-07-07 05:14:59.566598 File "/opt/stack/horizon/horizon/tables/base.py", line 1419, in render
2021-07-07 05:14:59.566610 return table_template.render(extra_context, self.request)
2021-07-07 05:14:59.566621 File "/usr/local/lib/python3.8/dist-packages/django/template/backends/django.py", line 61, in render
2021-07-07 05:14:59.566632 return self.template.render(context)
2021-07-07 05:14:59.566641 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 171, in render
2021-07-07 05:14:59.566651 return self._render(context)
2021-07-07 05:14:59.566660 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 163, in _render
2021-07-07 05:14:59.566671 return self.nodelist.render(context)
2021-07-07 05:14:59.566680 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566690 bit = node.render_annotated(context)
2021-07-07 05:14:59.566699 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566709 return self.render(context)
2021-07-07 05:14:59.566718 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 513, in render
2021-07-07 05:14:59.566729 return self.nodelist.render(context)
2021-07-07 05:14:59.566738 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566748 bit = node.render_annotated(context)
2021-07-07 05:14:59.566757 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566768 return self.render(context)
2021-07-07 05:14:59.566776 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 513, in render
2021-07-07 05:14:59.566787 return self.nodelist.render(context)
2021-07-07 05:14:59.566816 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566826 bit = node.render_annotated(context)
2021-07-07 05:14:59.566835 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566846 return self.render(context)
2021-07-07 05:14:59.566855 File "/usr/local/lib/python3.8/dist-packages/django/template/loader_tags.py", line 53, in render
2021-07-07 05:14:59.566865 result = self.nodelist.render(context)
2021-07-07 05:14:59.566874 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566884 bit = node.render_annotated(context)
2021-07-07 05:14:59.566893 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566903 return self.render(context)
2021-07-07 05:14:59.566912 File "/usr/local/lib/python3.8/dist-packages/django/template/loader_tags.py", line 53, in render
2021-07-07 05:14:59.566923 result = self.nodelist.render(context)
2021-07-07 05:14:59.566932 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.566942 bit = node.render_annotated(context)
2021-07-07 05:14:59.566951 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.566987 return self.render(context)
2021-07-07 05:14:59.566999 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 209, in render
2021-07-07 05:14:59.567010 nodelist.append(node.render_annotated(context))
2021-07-07 05:14:59.567019 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567029 return self.render(context)
2021-07-07 05:14:59.567038 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 987, in render
2021-07-07 05:14:59.567048 output = self.filter_expression.resolve(context)
2021-07-07 05:14:59.567060 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 671, in resolve
2021-07-07 05:14:59.567075 obj = self.var.resolve(context)
2021-07-07 05:14:59.567086 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 796, in resolve
2021-07-07 05:14:59.567098 value = self._resolve_lookup(context)
2021-07-07 05:14:59.567110 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 858, in _resolve_lookup
2021-07-07 05:14:59.567121 current = current()
2021-07-07 05:14:59.567132 File "/opt/stack/horizon/horizon/tables/base.py", line 668, in render
2021-07-07 05:14:59.567144 return render_to_string("horizon/common/_data_table_row.html",
2021-07-07 05:14:59.567157 File "/usr/local/lib/python3.8/dist-packages/django/template/loader.py", line 62, in render_to_string
2021-07-07 05:14:59.567170 return template.render(context, request)
2021-07-07 05:14:59.567180 File "/usr/local/lib/python3.8/dist-packages/django/template/backends/django.py", line 61, in render
2021-07-07 05:14:59.567191 return self.template.render(context)
2021-07-07 05:14:59.567200 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 171, in render
2021-07-07 05:14:59.567210 return self._render(context)
2021-07-07 05:14:59.567219 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 163, in _render
2021-07-07 05:14:59.567229 return self.nodelist.render(context)
2021-07-07 05:14:59.567238 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.567248 bit = node.render_annotated(context)
2021-07-07 05:14:59.567257 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567268 return self.render(context)
2021-07-07 05:14:59.567276 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 398, in render
2021-07-07 05:14:59.567332 return strip_spaces_between_tags(self.nodelist.render(context).strip())
2021-07-07 05:14:59.567343 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.567354 bit = node.render_annotated(context)
2021-07-07 05:14:59.567363 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567373 return self.render(context)
2021-07-07 05:14:59.567384 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 209, in render
2021-07-07 05:14:59.567397 nodelist.append(node.render_annotated(context))
2021-07-07 05:14:59.567409 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567422 return self.render(context)
2021-07-07 05:14:59.567433 File "/usr/local/lib/python3.8/dist-packages/django/template/loader_tags.py", line 188, in render
2021-07-07 05:14:59.567443 return template.render(context)
2021-07-07 05:14:59.567452 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 173, in render
2021-07-07 05:14:59.567462 return self._render(context)
2021-07-07 05:14:59.567471 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 163, in _render
2021-07-07 05:14:59.567481 return self.nodelist.render(context)
2021-07-07 05:14:59.567491 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.567501 bit = node.render_annotated(context)
2021-07-07 05:14:59.567510 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567520 return self.render(context)
2021-07-07 05:14:59.567531 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 309, in render
2021-07-07 05:14:59.567544 return nodelist.render(context)
2021-07-07 05:14:59.567555 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.567577 bit = node.render_annotated(context)
2021-07-07 05:14:59.567588 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567601 return self.render(context)
2021-07-07 05:14:59.567612 File "/usr/local/lib/python3.8/dist-packages/django/template/defaulttags.py", line 309, in render
2021-07-07 05:14:59.567625 return nodelist.render(context)
2021-07-07 05:14:59.567637 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 937, in render
2021-07-07 05:14:59.567647 bit = node.render_annotated(context)
2021-07-07 05:14:59.567656 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 904, in render_annotated
2021-07-07 05:14:59.567667 return self.render(context)
2021-07-07 05:14:59.567676 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 987, in render
2021-07-07 05:14:59.567686 output = self.filter_expression.resolve(context)
2021-07-07 05:14:59.567695 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 671, in resolve
2021-07-07 05:14:59.567705 obj = self.var.resolve(context)
2021-07-07 05:14:59.567714 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 796, in resolve
2021-07-07 05:14:59.567724 value = self._resolve_lookup(context)
2021-07-07 05:14:59.567734 File "/usr/local/lib/python3.8/dist-packages/django/template/base.py", line 837, in _resolve_lookup
2021-07-07 05:14:59.567744 current = getattr(current, bit)
2021-07-07 05:14:59.567753 File "/opt/stack/horizon/horizon/utils/html.py", line 65, in attr_string
2021-07-07 05:14:59.567762 return flatatt(self.get_final_attrs())
2021-07-07 05:14:59.567771 File "/opt/stack/horizon/horizon/utils/html.py", line 43, in get_final_attrs
2021-07-07 05:14:59.567781 final_attrs['class'] = self.get_final_css()
2021-07-07 05:14:59.567800 File "/opt/stack/horizon/horizon/utils/html.py", line 51, in get_final_css
2021-07-07 05:14:59.567810 default = " ".join(self.get_default_classes())
2021-07-07 05:14:59.567819 File "/opt/stack/horizon/horizon/tables/base.py", line 867, in get_default_classes
2021-07-07 05:14:59.567829 if not self.url:
2021-07-07 05:14:59.567837 File "/opt/stack/horizon/horizon/tables/base.py", line 831, in url
2021-07-07 05:14:59.567847 url = self.column.get_link_url(self.datum)
2021-07-07 05:14:59.567856 File "/opt/stack/horizon/horizon/tables/base.py", line 474, in get_link_url
2021-07-07 05:14:59.567866 return self.link(datum)
2021-07-07 05:14:59.567875 File "/opt/stack/horizon/openstack_dashboard/dashboards/admin/instances/tables.py", line 218, in user_link
2021-07-07 05:14:59.567885 return urls.reverse("horizon:identity:users:detail",
2021-07-07 05:14:59.567895 File "/usr/local/lib/python3.8/dist-packages/django/urls/base.py", line 90, in reverse
2021-07-07 05:14:59.567905 return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
2021-07-07 05:14:59.567915 File "/usr/local/lib/python3.8/dist-packages/django/urls/resolvers.py", line 673, in _reverse_with_prefix
2021-07-07 05:14:59.567933 raise NoReverseMatch(msg)
2021-07-07 05:14:59.567942 django.urls.exceptions.NoReverseMatch: Reverse for 'detail' not found. 'detail' is not a valid view function or pattern name.

Tags: sts
tags: added: sts
Revision history for this message
Seyeong Kim (seyeongkim) wrote :

/releasenotes/notes/bp-ng-users-01212620d644289f.yaml

---
features:
  - |
    [`blueprint ng-users <https://blueprints.launchpad.net/horizon/+spec/ng-users>`_]
    AngularJS-based Users panel is added. The features in the legacy
    panel are almost implemented. The Users panel now may be configured
    to use either the legacy or AngularJS-based codes.
    The ANGULAR_FEATURES setting now allows for a `users_panel`.
    If set to True, then the AngularJS-Based Users panel will be used,
    while the Django version will be used if set to False.
    Default value for users_panel is False, due to lack of extensional
    buttons, i.e. for showing password and adding project, see also
    [`bug/1733271 <https://bugs.launchpad.net/horizon/1744271>`_].
issues:
  - |
    [`bug/1733271 <https://bugs.launchpad.net/horizon/1744271>`_] Users panel
    has Angularized, but buttons showing passwords is not implemented, i.e.
    for Password, Confirm Password and Admin password. Also, button adding
    project for selection of Primary Project is not implemented.

https://bugs.launchpad.net/horizon/+bug/1744271

Revision history for this message
Vishal Manchanda (vishalmanchanda) wrote :

One possible way to fix this issue if we remove user_id href link [1].

[1] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/admin/instances/tables.py#L216

Changed in horizon:
status: New → Confirmed
importance: Undecided → Medium
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to horizon (master)

Fix proposed to branch: master
Review: https://review.opendev.org/c/openstack/horizon/+/804989

Changed in horizon:
status: Confirmed → In Progress
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.