summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-09-03 00:03:58 +0000
committerGerrit Code Review <review@openstack.org>2012-09-03 00:03:58 +0000
commit649cb4bf84c20ded563ea9fe5638ac19ac5d67eb (patch)
treedd90275fe822c955cd4b5be808db72a7ce89be1b /nova
parent9ed4e4f096569935146d33687b8b831c85e98aec (diff)
parent22f0e324f3d3172b563aa67e513fe4d9318de2e5 (diff)
downloadnova-649cb4bf84c20ded563ea9fe5638ac19ac5d67eb.tar.gz
nova-649cb4bf84c20ded563ea9fe5638ac19ac5d67eb.tar.xz
nova-649cb4bf84c20ded563ea9fe5638ac19ac5d67eb.zip
Merge "Fix quota reservation expiration"
Diffstat (limited to 'nova')
-rw-r--r--nova/db/sqlalchemy/models.py6
-rw-r--r--nova/tests/api/openstack/compute/test_limits.py1
-rw-r--r--nova/tests/test_quota.py20
3 files changed, 27 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py
index 65d5eb5e0..8b8322276 100644
--- a/nova/db/sqlalchemy/models.py
+++ b/nova/db/sqlalchemy/models.py
@@ -496,6 +496,12 @@ class Reservation(BASE, NovaBase):
delta = Column(Integer)
expire = Column(DateTime, nullable=False)
+ usage = relationship(
+ "QuotaUsage",
+ foreign_keys=usage_id,
+ primaryjoin='and_(Reservation.usage_id == QuotaUsage.id,'
+ 'QuotaUsage.deleted == False)')
+
class Snapshot(BASE, NovaBase):
"""Represents a block storage device that can be attached to a VM."""
diff --git a/nova/tests/api/openstack/compute/test_limits.py b/nova/tests/api/openstack/compute/test_limits.py
index 059deabf7..2a3038267 100644
--- a/nova/tests/api/openstack/compute/test_limits.py
+++ b/nova/tests/api/openstack/compute/test_limits.py
@@ -794,6 +794,7 @@ class WsgiLimiterProxyTest(BaseLimitTestSuite):
def tearDown(self):
# restore original HTTPConnection object
httplib.HTTPConnection = self.oldHTTPConnection
+ super(WsgiLimiterProxyTest, self).tearDown()
class LimitsViewBuilderTest(test.TestCase):
diff --git a/nova/tests/test_quota.py b/nova/tests/test_quota.py
index 794c578d6..8dddef173 100644
--- a/nova/tests/test_quota.py
+++ b/nova/tests/test_quota.py
@@ -228,6 +228,26 @@ class QuotaIntegrationTestCase(test.TestCase):
self.assertRaises(exception.QuotaError,
self._create_with_injected_files, files)
+ def test_reservation_expire(self):
+ timeutils.set_time_override()
+
+ def assertInstancesReserved(reserved):
+ result = quota.QUOTAS.get_project_quotas(self.context,
+ self.context.project_id)
+ self.assertEqual(result['instances']['reserved'], reserved)
+
+ quota.QUOTAS.reserve(self.context,
+ expire=60,
+ instances=2)
+
+ assertInstancesReserved(2)
+
+ timeutils.advance_time_seconds(80)
+
+ result = quota.QUOTAS.expire(self.context)
+
+ assertInstancesReserved(0)
+
class FakeContext(object):
def __init__(self, project_id, quota_class):