Modified project information and members but unable to modify project quotas when modifying volume quota in horizon admin identity view

Bug #1671911 reported by Andreas Karis
18
This bug affects 4 people
Affects Status Importance Assigned to Milestone
OpenStack Dashboard (Horizon)
Fix Released
High
Radomir Dopieralski

Bug Description

Description of problem:
Modified project information and members but unable to modify project quotas when modifying volume quota in horizon admin identity view

Go to Identity -> Identity -> Projects, modify the quotas of a project and set volumes to another value.

Spot check shows that:
- vCPUs and instances **do** update, but the error message still shows
- volumes do **not** update

Version-Release number of selected component (if applicable):
[root@overcloud-controller-0 ~]# rpm -qf /usr/share/openstack-dashboard/openstack_dashboard/dashboards/identity/projects/workflows.py
openstack-dashboard-10.0.1-5.el7ost.noarch

Actual results:
volumes quotas do not update, error message shows

Expected results:
update volume quotas, no error message

Additional info:

The problem in the code with integer / string conversion:
~~~
==> /var/log/cinder/api.log <==
2017-03-09 17:55:41.871 103796 DEBUG eventlet.wsgi.server [-] (103796) accepted ('172.16.2.4', 45808) server /usr/lib/python2.7/site-packages/eventlet/wsgi.py:867
2017-03-09 17:55:41.878 103796 INFO cinder.api.openstack.wsgi [req-2e2563df-a8f4-436a-83b5-93f6a483a826 aaafa6c0557b4ed89b2803af8149743a d809ec86f152486981e1782e94fa7b2d - default default] PUT http://10.0.0.4:8776/v2/d809ec86f152486981e1782e94fa7b2d/os-quota-sets/d809ec86f152486981e1782e94fa7b2d
2017-03-09 17:55:41.879 103796 DEBUG cinder.api.openstack.wsgi [req-2e2563df-a8f4-436a-83b5-93f6a483a826 aaafa6c0557b4ed89b2803af8149743a d809ec86f152486981e1782e94fa7b2d - default default] Action: 'update', calling method: <bound method QuotaSetsController.update of <cinder.api.contrib.quotas.QuotaSetsController object at 0x689af50>>, body: {"quota_set": {"gigabytes": null, "tenant_id": "d809ec86f152486981e1782e94fa7b2d", "volumes": 21, "snapshots": null}} _process_stack /usr/lib/python2.7/site-packages/cinder/api/openstack/wsgi.py:868
2017-03-09 17:55:41.977 103796 INFO cinder.api.openstack.wsgi [req-2e2563df-a8f4-436a-83b5-93f6a483a826 aaafa6c0557b4ed89b2803af8149743a d809ec86f152486981e1782e94fa7b2d - default default] HTTP exception thrown: gigabytes must be an integer.
2017-03-09 17:55:41.978 103796 INFO cinder.api.openstack.wsgi [req-2e2563df-a8f4-436a-83b5-93f6a483a826 aaafa6c0557b4ed89b2803af8149743a d809ec86f152486981e1782e94fa7b2d - default default] http://10.0.0.4:8776/v2/d809ec86f152486981e1782e94fa7b2d/os-quota-sets/d809ec86f152486981e1782e94fa7b2d returned with HTTP 400
2017-03-09 17:55:41.980 103796 INFO eventlet.wsgi.server [req-2e2563df-a8f4-436a-83b5-93f6a483a826 aaafa6c0557b4ed89b2803af8149743a d809ec86f152486981e1782e94fa7b2d - default default] 172.16.2.4 "PUT /v2/d809ec86f152486981e1782e94fa7b2d/os-quota-sets/d809ec86f152486981e1782e94fa7b2d HTTP/1.1" status: 400 len: 335 time: 0.1074338
~~~

When saving the quotas from the web interface, the following happens:
~~~
POST /dashboard/identity/53f4466c084145e0b91296f68be517a6/update/ HTTP/1.1
Host: 10.0.0.4
User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://10.0.0.4/dashboard/identity/
Content-Length: 1616
Cookie: login_region="http://172.16.2.10:5000/v2.0"; login_domain=; SERVERID=overcloud-controller-0; csrftoken=8DM2AJOQIfjEN9rHBic3BzZrxoPYvnnP; sessionid=wk7y07jc7938xe6zu0ushg3micrq3aus
Connection: keep-alive

csrfmiddlewaretoken=8DM2AJOQIfjEN9rHBic3BzZrxoPYvnnP&domain_id=default&domain_name=Default&name=service&description=Tenant+for+the+openstack+services&enabled=on&available_update_members_filter=&update_members_members_filter=&default_update_members_role=9fe2ff9ee4384b1894a90878d3e92bab&update_members_role_64f3a3e25453466cac4325df17b64694=1de8b8db8a224b4f972853d4787d7a63&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=b5104f5fc1f844979ddd7023d3ed38e2&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=8c6c981aa56f4ae1ad1b999bc94575a7&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=930ff1e6c81a4fedab4e61c5286c6667&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=043ea3a59f9f4f539866e4171f0dced8&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=cc6f8622d68644d8a02d915ecb731fa2&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=7028ebf145a34803826916968e68253a&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=1de8b8db8a224b4f972853d4787d7a63&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=31b239bbb61d421c8636a8a03343f1cc&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=b77fb7185f0b479abd286702e359953c&update_members_role_cd3a65a0a92f4fdc8badb7d1c87395fe=586416a8b2c34a94a88ee73035fb92e8&default_update_group_members_role=9fe2ff9ee4384b1894a90878d3e92bab&snapshots=&gigabytes=&floating_ips=&fixed_ips=&security_groups=&security_group_rules=&shares=&share_networks=&metadata_items=128&cores=20&instances=10&injected_files=5&injected_file_content_bytes=10240&volumes=11&ram=51200&security_group=10&security_group_rule=100&floatingip=50&network=10&port=50&router=10&subnet=10
~~~

Which means that, e.g. 'gigabytes=' which then gets set to NULL.

The answer to this post request is:
~~~
HTTP/1.1 200 OK
Date: Thu, 09 Mar 2017 18:19:26 GMT
Server: Apache
X-Horizon-Location: /dashboard/identity/
Vary: Cookie
Set-Cookie: messages="f07fa50570c8d673536fe69deb63255a5710eb9f$[[\"__json_message\"\0540\05440\054\"Modified project information and members\054 but unable to modify project quotas.\"]\054[\"__json_message\"\0540\05425\054\"Modified project \\\"service\\\".\"]]"; httponly; Path=/
Content-Length: 0
Content-Type: text/html; charset=utf-8
~~~

Which contains the error message from openstack_dashboard/dashboards/identity/projects/workflows.py
~~~
    def _update_project_quota(self, request, data, project_id):
        try:
            super(UpdateProject, self)._update_project_quota(
                request, data, project_id)
            return True
        except Exception:
            exceptions.handle(request, _('Modified project information and '
                                         'members, but unable to modify '
                                         'project quotas.'))
            return False
~~~

The error message comes from openstack_dashboard/dashboards/identity/projects/workflows.py
~~~
    def _update_project_quota(self, request, data, project_id):
        try:
            super(UpdateProject, self)._update_project_quota(
                request, data, project_id)
            return True
        except Exception:
            exceptions.handle(request, _('Modified project information and '
                                         'members, but unable to modify '
                                         'project quotas.'))
            return False
~~~

which calls update_project_quota from this class in the same file:
~~~
class CommonQuotaWorkflow(workflows.Workflow):
    def _update_project_quota(self, request, data, project_id):
        disabled_quotas = quotas.get_disabled_quotas(request)

        # Update the project quotas.
        if api.base.is_service_enabled(request, 'compute'):
            nova_data = {key: data[key] for key in
                         set(quotas.NOVA_QUOTA_FIELDS) - disabled_quotas}
            nova.tenant_quota_update(request, project_id, **nova_data)

        if cinder.is_volume_service_enabled(request):
            cinder_data = dict([(key, data[key]) for key in
                                quotas.CINDER_QUOTA_FIELDS])
            cinder.tenant_quota_update(request,
                                       project_id,
                                       **cinder_data)
~~~

I modified the following file:
~~~
[root@overcloud-controller-0 projects]# diff -c /usr/share/openstack-dashboard/openstack_dashboard/dashboards/identity/projects/workflows.py /usr/share/openstack-dashboard/openstack_dashboard/dashboards/identity/projects/workflows.py.patch
*** /usr/share/openstack-dashboard/openstack_dashboard/dashboards/identity/projects/workflows.py 2017-03-09 21:42:05.078987027 +0000
--- /usr/share/openstack-dashboard/openstack_dashboard/dashboards/identity/projects/workflows.py.patch 2017-03-09 21:40:04.016155030 +0000
***************
*** 413,418 ****
--- 413,422 ----
          if cinder.is_volume_service_enabled(request):
              cinder_data = dict([(key, data[key]) for key in
                                  quotas.CINDER_QUOTA_FIELDS])
+ # remove any None / Null elements to avoid conversion errors
+ for key in cinder_data.keys():
+ if cinder_data[key] is None:
+ cinder_data.pop(key, None)
              cinder.tenant_quota_update(request,
                                         project_id,
                                         **cinder_data)
~~~

which fixes the error message and lets you update the quotas. This may very well be the wrong point in the code to fix this, though.

Revision history for this message
Andreas Karis (akaris) wrote :
Revision history for this message
Liyingjun (liyingjun) wrote :

couldn't reproduce with master branch

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to horizon (master)

Fix proposed to branch: master
Review: https://review.openstack.org/451679

Changed in horizon:
assignee: nobody → Radomir Dopieralski (deshipu)
status: New → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to horizon (master)

Reviewed: https://review.openstack.org/451679
Committed: https://git.openstack.org/cgit/openstack/horizon/commit/?id=3055a987632c29175c06d73e77fbad9062fcc2c4
Submitter: Jenkins
Branch: master

commit 3055a987632c29175c06d73e77fbad9062fcc2c4
Author: Radomir Dopieralski <email address hidden>
Date: Thu Mar 30 09:17:35 2017 +0200

    Don't update cinder quotas if disabled

    The quotas for cinder were being updated even if they were disabled,
    resulting in None being sent as the value, and an error being thrown
    by the API.

    This patch cleans up that code to use the same logic in all three cases
    for nova, cinder and neutron.

    Change-Id: I73209122df20689eee33da9dccffa994a04a3ec0
    Closes-bug: #1671911

Changed in horizon:
status: In Progress → Fix Released
Changed in horizon:
importance: Undecided → High
milestone: none → pike-2
Revision history for this message
Nithya Renganathan (narengan) wrote :

Im seeing the same error:
Steps:
Go to Identity -> Projects, modify the Project name.

Expected result:
Project name modified

Actual Result:
Error: Modified project information and members, but unable to modify project quotas.
Error: Unable to modify project "<project-name>".

But it actually changed the project name.

This is when I try to update the project name and not change anything related to quotas in Newton.

will this fix be back ported to Newton and Ocata?

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix included in openstack/horizon 12.0.0.0b2

This issue was fixed in the openstack/horizon 12.0.0.0b2 development milestone.

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to horizon (stable/newton)

Fix proposed to branch: stable/newton
Review: https://review.openstack.org/473367

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Change abandoned on horizon (stable/newton)

Change abandoned by Radomir Dopieralski (<email address hidden>) on branch: stable/newton
Review: https://review.openstack.org/473367
Reason: Wrong version.

Revision history for this message
George (lmihaiescu) wrote :

This bug is not fixed in Newton and we found about it yesterday when we upgraded from Mitaka.

I manually applied the patch https://review.openstack.org/#/c/473367/1/openstack_dashboard/dashboards/identity/projects/workflows.py to my Ubuntu based Newton but it doesn't work as expected.

Do you know when this will be fixed in Newton?

Thank you.

tags: added: newton-backport-potential
Revision history for this message
OpenStack Infra (hudson-openstack) wrote :

Change abandoned by Tony Breeds (<email address hidden>) on branch: stable/newton
Review: https://review.openstack.org/473367
Reason: This branch (stable/newton) is at End Of Life

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.