diff --git a/openstack/common/quota.py b/openstack/common/quota.py index 43f8b0109..b3d1341e9 100644 --- a/openstack/common/quota.py +++ b/openstack/common/quota.py @@ -305,6 +305,11 @@ def get_user_quotas(self, context, resources, project_id, user_id, """ user_quotas = self.db.quota_get_all_by_project_and_user( context, project_id, user_id) + # Use the project quota for default user quota. + proj_quotas = self.db.quota_get_all_by_project(context, project_id) + for key, value in proj_quotas.iteritems(): + if key not in user_quotas: + user_quotas[key] = value user_usages = None if usages: user_usages = self.db.quota_usage_get_all_by_project_and_user( diff --git a/tests/unit/test_quota.py b/tests/unit/test_quota.py index 8c26369eb..a94a72d3a 100644 --- a/tests/unit/test_quota.py +++ b/tests/unit/test_quota.py @@ -83,6 +83,7 @@ def setUp(self): dbapi.quota_usage_get_all_by_project = mock.Mock( return_value=dict([('r%d' % i, {'in_use': i, 'reserved': i + 1}) for i in range(3)])) + self.dbapi = dbapi self.driver = quota.DbQuotaDriver(dbapi) self.ctxt = FakeContext() return super(DbQuotaDriverTestCase, self).setUp() @@ -126,6 +127,18 @@ def test_get_user_quotas(self): 'r2': {'in_use': 3, 'limit': 6, 'reserved': 2}} self.assertEqual(actual, expected) + def test_get_default_user_quotas(self): + self.dbapi.quota_get_all_by_project_and_user = mock.Mock( + return_value={'project_id': 'p1', 'user_id': 'u1'}) + self.dbapi.quota_get_all_by_project = mock.Mock( + return_value={'r1': 5, 'r2': 6}) + driver = quota.DbQuotaDriver(self.dbapi) + actual = driver.get_user_quotas( + self.ctxt, self.sample_resources.copy(), 'p1', 'u1') + expected = {'r1': {'in_use': 2, 'limit': 5, 'reserved': 1}, + 'r2': {'in_use': 3, 'limit': 6, 'reserved': 2}} + self.assertEqual(actual, expected) + def test_get_settable_quotas(self): actual = self.driver.get_settable_quotas(self.ctxt, self.sample_resources, 'p1')