Bug 1414997

Summary: modifying any quota in horizon triggers cinder to update gigabytes = null. Results in horizon error.
Product: Red Hat OpenStack Reporter: Jeremy <jmelvin>
Component: python-django-horizonAssignee: Radomir Dopieralski <rdopiera>
Status: CLOSED ERRATA QA Contact: Ido Ovadia <iovadia>
Severity: medium Docs Contact:
Priority: medium    
Version: 10.0 (Newton)CC: akaris, aortega, athomas, chris.brown, cpaquin, cshastri, dbecker, dondavis, eharney, fedoraproject, gkadam, ipetrova, jbiao, lmadsen, mrunge, mschuppe, pgrist, rhosp-bugs-internal, rszmigie, scorcora, srevivo
Target Milestone: z3Keywords: Triaged, ZStream
Target Release: 10.0 (Newton)   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: python-django-horizon-10.0.3-4.el7ost Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of:
: 1437430 1460606 (view as bug list) Environment:
Last Closed: 2017-06-28 15:17:35 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1437430, 1460606    
Attachments:
Description Flags
Screen Shot of Horizon none

Description Jeremy 2017-01-19 22:34:32 UTC
Description of problem: Here we change nova instance quota to 1002. This results in a horizon error. in the horizon.log we see: error: gigabytes must be an integer. Checking cinder we see:


2017-01-19 22:16:32.492 334619 DEBUG cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Action: 'update', calling method: <bound method QuotaSetsController.update of <cinder.api.contrib.quotas.QuotaSetsController object at 0x61fed10>>, body: {"quota_set": {"gigabytes": null, "tenant_id": "42b4a2b968234ebca0e312613bdb1727", "volumes": 1000, "snapshots": null}} _process_stack /usr/lib/python2.7/site-packages/cinder/api/openstack/wsgi.py:868
2017-01-19 22:16:32.505 334619 DEBUG oslo_db.sqlalchemy.engines [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] MySQL server mode set to STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION _check_effective_sql_mode /usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/engines.py:261
2017-01-19 22:16:32.553 334619 INFO cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] HTTP exception thrown: gigabytes must be an integer.


### note the nova quota is actually changed successfully

###nova.log. quota is changed to 1002
 DEBUG nova.api.openstack.wsgi [req-93fce5a1-9de9-4305-9df2-cba05a290823 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Action: 'update', calling method: <function version_select at 0x94cb668>, body: {"quota_set": {"metadata_items": 1280, "injected_file_content_bytes": 10240, "ram": 3407872, "instances": 1002, "injected_files": 5, "cores": 520}} _process_stack /usr/lib/python2.7/site-packages/nova/api/openstack/wsgi.py:633
 229069 DEBUG nova.quota [req-93fce5a1-9de9-4305-9df2-cba05a290823 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Getting all quota usages for project: 42b4a2b968234ebca0e312613bdb1727 get_project_quotas /usr/lib/python2.7/site-packages/nova/quota.py:223

###horizon.log
2017-01-19 22:16:32,559 226882 WARNING horizon.exceptions Recoverable error: gigabytes must be an integer. (HTTP 400) (Request-ID: req-0f2761ec-8ced-4b99-b076-870eb63fa6f3)


###quota actually changes

[stack@osp10-director-mtc ~]$ openstack quota show MTC
+----------------------+----------------------------------+
| Field                | Value                            |
+----------------------+----------------------------------+
| backup_gigabytes     | 1000                             |
| backups              | 1000                             |
| cores                | 520                              |
| fixed-ips            | -1                               |
| floating-ips         | 50                               |
| gigabytes            | 1000                             |
| injected-file-size   | 10240                            |
| injected-files       | 5                                |
| injected-path-size   | 255                              |
| instances            | 1002                             |
| key-pairs            | 100                              |
| networks             | 1000                             |
| per_volume_gigabytes | -1                               |
| ports                | 50000                            |
| project              | 42b4a2b968234ebca0e312613bdb1727 |
| properties           | 1280                             |
| ram                  | 3407872                          |
| rbac-policies        | 10                               |
| routers              | 10                               |
| secgroup-rules       | 10000                            |
| secgroups            | 1000                             |
| server-group-members | 10                               |
| server-groups        | 10                               |
| snapshots            | 1000                             |
| subnetpools          | -1                               |
| subnets              | 100000                           |
| trunk                | -1                               |
| volumes              | 1000                             |
+----------------------+----------------------------------+
[stack@osp10-director-mtc ~]$


[stack@osp10-director-mtc ~]$ ssh heat-admin.12.18 'sudo grep 0f2761ec-8ced-4b99-b076-870eb63fa6f3 /var/log/cinder/api.log'
2017-01-19 22:16:32.260 334619 DEBUG oslo_policy._cache_handler [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Reloading cached file /etc/cinder/policy.json read_cached_file /usr/lib/python2.7/site-packages/oslo_policy/_cache_handler.py:38
2017-01-19 22:16:32.312 334619 DEBUG oslo_policy.policy [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Reloaded policy file: /etc/cinder/policy.json _load_policy_file /usr/lib/python2.7/site-packages/oslo_policy/policy.py:584
2017-01-19 22:16:32.490 334619 INFO cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] PUT http://135.112.207.228:8776/v2/2d53197b91b249f6a84f971d775bc741/os-quota-sets/42b4a2b968234ebca0e312613bdb1727
2017-01-19 22:16:32.492 334619 DEBUG cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] Action: 'update', calling method: <bound method QuotaSetsController.update of <cinder.api.contrib.quotas.QuotaSetsController object at 0x61fed10>>, body: {"quota_set": {"gigabytes": null, "tenant_id": "42b4a2b968234ebca0e312613bdb1727", "volumes": 1000, "snapshots": null}} _process_stack /usr/lib/python2.7/site-packages/cinder/api/openstack/wsgi.py:868
2017-01-19 22:16:32.505 334619 DEBUG oslo_db.sqlalchemy.engines [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] MySQL server mode set to STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION _check_effective_sql_mode /usr/lib/python2.7/site-packages/oslo_db/sqlalchemy/engines.py:261
2017-01-19 22:16:32.553 334619 INFO cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] HTTP exception thrown: gigabytes must be an integer.
2017-01-19 22:16:32.553 334619 INFO cinder.api.openstack.wsgi [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] http://135.112.207.228:8776/v2/2d53197b91b249f6a84f971d775bc741/os-quota-sets/42b4a2b968234ebca0e312613bdb1727 returned with HTTP 400
2017-01-19 22:16:32.555 334619 INFO eventlet.wsgi.server [req-0f2761ec-8ced-4b99-b076-870eb63fa6f3 3a8d46fa926146e38ff6fb424789d1e7 2d53197b91b249f6a84f971d775bc741 - default default] 192.168.12.9 "PUT /v2/2d53197b91b249f6a84f971d775bc741/os-quota-sets/42b4a2b968234ebca0e312613bdb1727 HTTP/1.1" status: 400  len: 335 time: 0.5579700


### possible bug cinder tries to set gigabytes = null when any horizon quota is changed. even changing nova quota causes this.
Version-Release number of selected component (if applicable):



Workarond is to set quotas via the cli.

Comment 1 Jeremy 2017-01-19 22:44:41 UTC
[heat-admin@overcloud-controller-0 ~]$ rpm -qa |grep cinder
python-cinderclient-1.9.0-4.el7ost.noarch
puppet-cinder-9.4.1-2.el7ost.noarch
python-cinder-9.0.0-13.el7ost.noarch
openstack-cinder-9.0.0-13.el7ost.noarch

Comment 3 Donny Davis 2017-02-04 16:34:36 UTC
The gigabytes field is missing from upstream RDO horizon in newton.

Comment 4 Donny Davis 2017-02-04 16:36:07 UTC
Created attachment 1247709 [details]
Screen Shot of Horizon

Here is a screen shot of the horizon dashboard that is missing the field to enter the size of gigabytes. This value is a requirement to update quotas for any service

Comment 5 Andreas Karis 2017-03-13 14:10:35 UTC
*** Bug 1431266 has been marked as a duplicate of this bug. ***

Comment 6 Andreas Karis 2017-03-13 14:11:17 UTC
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.

Comment 7 Andreas Karis 2017-03-13 14:12:40 UTC
The patch I'm suggesting fixes the issue. However, I think that it may treat a symptom only, and at the wrong place. Otherwise, I'd have pushed it upstream ...

Comment 9 Radomir Dopieralski 2017-03-29 11:16:10 UTC
I can't reproduce this issue with a recent build of OSP10. The "Total Size of Volumes and Snapshots (GiB)" field is visible and there is no error when saving this form.

Are there any additional conditions that have to be met to reproduce this?

Comment 10 Radomir Dopieralski 2017-03-29 11:22:08 UTC
The bug reported upstream at https://bugs.launchpad.net/horizon/+bug/1671911 also couldn't be reproduced by the upstream developers.

Comment 11 Leif Madsen 2017-03-29 12:41:05 UTC
Hrmmm, I recently ran into this during a local deployment on my baremetal nodes, which was why I added myself to this BZ. Have you tried adding a project and then making the changes outside of the admin tenant? I'll look again today as I have an environment up and running that I could make changes to.

Comment 12 Leif Madsen 2017-03-29 12:46:34 UTC
(In reply to Leif Madsen from comment #11)
> Hrmmm, I recently ran into this during a local deployment on my baremetal
> nodes, which was why I added myself to this BZ. Have you tried adding a
> project and then making the changes outside of the admin tenant? I'll look
> again today as I have an environment up and running that I could make
> changes to.

I just went back and looked, and it seems my overcloud-full.qcow2 is actually from March 11th, so it's possible this has been fixed in the last couple of weeks.

Comment 13 Radomir Dopieralski 2017-03-29 13:21:30 UTC
I installed an older build with python-django-horizon-10.0.1-5.el7ost.noarch but still can't reproduce this problem.

Comment 14 Radomir Dopieralski 2017-03-29 13:25:47 UTC
(In reply to Leif Madsen from comment #11)
> Hrmmm, I recently ran into this during a local deployment on my baremetal
> nodes, which was why I added myself to this BZ. Have you tried adding a
> project and then making the changes outside of the admin tenant? I'll look
> again today as I have an environment up and running that I could make
> changes to.

I tried on a demo project with the demo user -- it works fine.

Comment 15 Andreas Karis 2017-03-29 13:44:15 UTC
it's with the admin user, and it's super easy to reproduce. let me take a look and get back to you.

Comment 17 Andreas Karis 2017-03-29 14:40:43 UTC
This happens in RHEL OpenStack because opposed to upstream, we have the Gigabytes field by default disabled, and it then causes NULL to be sent.

Comment 18 Radomir Dopieralski 2017-03-30 07:36:31 UTC
I posted a patch upstream that should help with this problem: https://review.openstack.org/451679

However, I still can't figure out how it is possible that the fields don't appear in the tripleo horizon, but the cinder api is being called. The relevant fragments of code are:

In the form display, where the disabled fields are being hidden:

        disabled_quotas = quotas.get_disabled_quotas(request)
        for field in disabled_quotas:
            if field in self.fields:
                self.fields[field].required = False
                self.fields[field].widget = forms.HiddenInput()

That get_disabled_quotas function:

    if not cinder.is_volume_service_enabled(request):
        disabled_quotas.update(CINDER_QUOTA_FIELDS)

And finally the method that does the actual update:

        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)

The way I'm reading the code, the fields should be disabled IFF the cinder service is not available, but then the quota update API call shouldn't be made either.

Comment 21 Chris Paquin 2017-04-04 20:24:14 UTC
I am working with a customer and we are running into the same error message in Horizon.

"Error: Modified project information and members, but unable to modify project quotas."

However we are not attempting to change quotas for a project, rather we are just trying to add/remove users from the project. 

We run into the error when. 

1. When attempting to edit project.
2. When attempting to modify quotas for a project.
3. When attempting to modify groups for a project.

Comment 29 Radomir Dopieralski 2017-04-28 12:46:26 UTC
*** Bug 1445890 has been marked as a duplicate of this bug. ***

Comment 39 Ido Ovadia 2017-06-01 14:34:49 UTC
Verified
========
python-django-horizon-10.0.3-6.el7ost.noarch

Comment 44 errata-xmlrpc 2017-06-28 15:17:35 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2017:1598