fix the instance quota overlimit message

This addresses two closely related bugs.

Bug: 998199
Fix the "used" and "total" counts
in the returned diagnostic.

Bug: 902218
Itemize instance quota items exceeded,
in the returned diagnostic.

Change-Id: Iff7781a7fb53545d44c2b4ec0ca6d65114723c8d
This commit is contained in:
Pádraig Brady
2012-06-05 14:33:43 +01:00
parent 1334ce8755
commit 84969afb3b
3 changed files with 17 additions and 7 deletions
+13 -4
View File
@@ -172,9 +172,13 @@ class API(base.Base):
# OK, we exceeded quota; let's figure out why...
quotas = exc.kwargs['quotas']
usages = exc.kwargs['usages']
overs = exc.kwargs['overs']
headroom = dict((res, quotas[res] -
(usages[res]['in_use'] + usages[res]['reserved']))
for res in quotas.keys())
# Reduce 'allowed' to the minimum supported
allowed = headroom['instances']
if instance_type['vcpus']:
allowed = min(allowed,
@@ -187,7 +191,7 @@ class API(base.Base):
pid = context.project_id
if allowed <= 0:
msg = _("Cannot run any more instances of this type.")
used = max_count
allowed = 0
elif min_count <= allowed <= max_count:
# We're actually OK, but still need reservations
return self._check_num_instances_quota(context, instance_type,
@@ -195,10 +199,15 @@ class API(base.Base):
else:
msg = (_("Can only run %s more instances of this type.") %
allowed)
used = max_count - allowed
LOG.warn(_("Quota exceeded for %(pid)s,"
used = quotas['instances'] - headroom['instances']
total_allowed = used + allowed
overs = ','.join(overs)
LOG.warn(_("%(overs)s quota exceeded for %(pid)s,"
" tried to run %(min_count)s instances. %(msg)s"), locals())
raise exception.TooManyInstances(used=used, allowed=max_count)
raise exception.TooManyInstances(overs=overs, req=min_count,
used=used, allowed=total_allowed)
return max_count, reservations
+2 -2
View File
@@ -993,8 +993,8 @@ class QuotaError(NovaException):
class TooManyInstances(QuotaError):
message = _("Quota exceeded: already used %(used)d of %(allowed)d"
" instances")
message = _("Quota exceeded for %(overs)s: Requested %(req)s,"
" but already used %(used)d of %(allowed)d instances")
class VolumeSizeTooLarge(QuotaError):
@@ -2348,7 +2348,8 @@ class ServersControllerCreateTest(test.TestCase):
self.fail('expected quota to be exceeded')
except webob.exc.HTTPRequestEntityTooLarge as e:
self.assertEquals(e.explanation,
_('Quota exceeded: already used 1 of 1 instances'))
_('Quota exceeded for instances: Requested 1, but'
' already used 0 of 0 instances'))
class TestServerCreateRequestXMLDeserializer(test.TestCase):