Tenant is a required positional parameter on quota-update but is optional on quota-show. And when --tenant is not specified on quota-show it doesn't return valid limits for the user.
$ nova quota-show --user demo
+-----------------------------+-------+
| Quota | Limit |
+-----------------------------+-------+
| instances | 10 |
...
+-----------------------------+-------+
$ nova quota-update --user demo --instances 9 # tenant is required
usage: nova quota-update [--user <user-id>] [--instances <instances>]
[--cores <cores>] [--ram <ram>]
[--floating-ips <floating-ips>]
[--fixed-ips <fixed-ips>]
[--metadata-items <metadata-items>]
[--injected-files <injected-files>]
[--injected-file-content-bytes <injected-file-content-bytes>]
[--injected-file-path-bytes <injected-file-path-bytes>]
[--key-pairs <key-pairs>]
[--security-groups <security-groups>]
[--security-group-rules <security-group-rules>]
[--force]
<tenant-id>
error: too few arguments
Try 'nova help quota-update' for more information.
$ nova quota-update --user demo --instances 9 demo
$ nova quota-show --user demo # should return instances=9 or should fail because tenant is required
+-----------------------------+-------+
| Quota | Limit |
+-----------------------------+-------+
| instances | 10 |
...
+-----------------------------+-------+
$ nova quota-show --user demo --tenant demo # returns the correct value
+-----------------------------+-------+
| Quota | Limit |
+-----------------------------+-------+
| instances | 9 |
...
+-----------------------------+-------+
The problem is nova quota-update uses value of <tenant-id> to save the quota in the database. If you use "demo" as the tenant-id, nova will use project_id="demo" when setting the project_user_quotas table. If you use a <uuid> as the tenant-id, nova will use project_id=<uuid> when setting the project_user_quotas table. You can see this by logging into MySQL (or whatever DB you are using) and querying the project_user_quotas table (e.g. select project_ id,resource, hard_limit from project_ user_quotas) .
In order to obtain the correct values, you have to pass the correct <tenant-id> in nova quota-show. The solution to this bug is to: translate the tenant name into its <uuid> before saving it into the DB or querying from the database.