summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorMark Washenberger <mark.washenberger@rackspace.com>2011-05-18 13:54:51 -0400
committerMark Washenberger <mark.washenberger@rackspace.com>2011-05-18 13:54:51 -0400
commit156ebab6599f9500d8b98c7cc1271d2502fa0627 (patch)
treed9a5d73bfb2bde8f25046bf5e17fdf7fbe717b19 /nova
parent6069e6f50b10358c718961ceac9790f56d6692ea (diff)
get real absolute limits in openstack api and verify absolute limit responses
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/limits.py11
-rw-r--r--nova/api/openstack/views/limits.py23
-rw-r--r--nova/db/sqlalchemy/api.py4
-rw-r--r--nova/tests/api/openstack/test_limits.py44
4 files changed, 55 insertions, 27 deletions
diff --git a/nova/api/openstack/limits.py b/nova/api/openstack/limits.py
index 5e3f93f79..1411cec01 100644
--- a/nova/api/openstack/limits.py
+++ b/nova/api/openstack/limits.py
@@ -30,6 +30,7 @@ from collections import defaultdict
from webob.dec import wsgify
+from nova import quota
from nova import wsgi
from nova.api.openstack import common
from nova.api.openstack import faults
@@ -42,9 +43,6 @@ PER_MINUTE = 60
PER_HOUR = 60 * 60
PER_DAY = 60 * 60 * 24
-#TODO remove when mark catches up
-TEST_ABSOLUTE_LIMITS = {}
-
class LimitsController(common.OpenstackController):
"""
@@ -67,11 +65,8 @@ class LimitsController(common.OpenstackController):
"""
Return all global and rate limit information.
"""
- # TODO(alex.meade) make this work
- #project_quota = quota.get_project_quota(...)
- #abs_limits = project_quota.limits
- #TODO remove when mark catches up
- abs_limits = TEST_ABSOLUTE_LIMITS
+ context = req.environ['nova.context']
+ abs_limits = quota.get_quota(context, context.project_id)
rate_limits = req.environ.get("nova.limits", [])
builder = self._get_view_builder(req)
diff --git a/nova/api/openstack/views/limits.py b/nova/api/openstack/views/limits.py
index ef1243f3d..464f91e33 100644
--- a/nova/api/openstack/views/limits.py
+++ b/nova/api/openstack/views/limits.py
@@ -112,19 +112,14 @@ class ViewBuilderV11(ViewBuilder):
For example: {"ram": 512, "gigabytes": 1024}.
"""
+ limit_names = {
+ "ram": "maxTotalRAMSize",
+ "instances": "maxTotalInstances",
+ "cores": "maxTotalCores",
+ "metadata_items": "maxServerMeta",
+ }
limits = {}
- #loops through absolute limits and their values
- for absolute_limit_key, absolute_limit_value \
- in absolute_limits.items():
-
- _abs_limit_map = {
- "ram": "maxTotalRAMSize",
- "instances": "maxTotalInstances",
- "cores": "maxTotalCores",
- }
-
- if not absolute_limit_value is None:
- limits[_abs_limit_map[absolute_limit_key]] \
- = absolute_limit_value
-
+ for name, value in absolute_limits.iteritems():
+ if name in limit_names and value is not None:
+ limits[limit_names[name]] = value
return limits
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 6d34a87ca..59d2c6aec 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1496,7 +1496,7 @@ def auth_token_create(_context, token):
###################
-@require_admin_context
+@require_context
def quota_get(context, project_id, resource, session=None):
if not session:
session = get_session()
@@ -1510,7 +1510,7 @@ def quota_get(context, project_id, resource, session=None):
return result
-@require_admin_context
+@require_context
def quota_get_all_by_project(context, project_id):
session = get_session()
result = {'project_id': project_id}
diff --git a/nova/tests/api/openstack/test_limits.py b/nova/tests/api/openstack/test_limits.py
index c8a7dd7f2..4e411f8fb 100644
--- a/nova/tests/api/openstack/test_limits.py
+++ b/nova/tests/api/openstack/test_limits.py
@@ -27,6 +27,7 @@ import webob
from xml.dom.minidom import parseString
+import nova.context
from nova.api.openstack import limits
@@ -75,6 +76,8 @@ class LimitsControllerV10Test(BaseLimitTestSuite):
"action": "index",
"controller": "",
})
+ context = nova.context.RequestContext('testuser', 'testproject')
+ request.environ["nova.context"] = context
return request
def _populate_limits(self, request):
@@ -179,6 +182,10 @@ class LimitsControllerV11Test(BaseLimitTestSuite):
"""Run before each test."""
BaseLimitTestSuite.setUp(self)
self.controller = limits.LimitsControllerV11()
+ self.absolute_limits = {}
+ def stub_get_quota(context, project_id):
+ return self.absolute_limits
+ self.stubs.Set(nova.quota, "get_quota", stub_get_quota)
def _get_index_request(self, accept_header="application/json"):
"""Helper to set routing arguments."""
@@ -188,6 +195,8 @@ class LimitsControllerV11Test(BaseLimitTestSuite):
"action": "index",
"controller": "",
})
+ context = nova.context.RequestContext('testuser', 'testproject')
+ request.environ["nova.context"] = context
return request
def _populate_limits(self, request):
@@ -199,9 +208,6 @@ class LimitsControllerV11Test(BaseLimitTestSuite):
5, 60).display(),
]
request.environ["nova.limits"] = _limits
- #set absolute limits here
- limits.TEST_ABSOLUTE_LIMITS = {"ram": 512, "instances": 5}
-
return request
def test_empty_index_json(self):
@@ -221,6 +227,11 @@ class LimitsControllerV11Test(BaseLimitTestSuite):
"""Test getting limit details in JSON."""
request = self._get_index_request()
request = self._populate_limits(request)
+ self.absolute_limits = {
+ 'ram': 512,
+ 'instances': 5,
+ 'cores': 21,
+ }
response = request.get_response(self.controller)
expected = {
"limits": {
@@ -263,12 +274,39 @@ class LimitsControllerV11Test(BaseLimitTestSuite):
"absolute": {
"maxTotalRAMSize": 512,
"maxTotalInstances": 5,
+ "maxTotalCores": 21,
},
},
}
body = json.loads(response.body)
self.assertEqual(expected, body)
+ def _test_index_absolute_limits_json(self, expected):
+ request = self._get_index_request()
+ response = request.get_response(self.controller)
+ body = json.loads(response.body)
+ self.assertEqual(expected, body['limits']['absolute'])
+
+ def test_index_ignores_extra_absolute_limits_json(self):
+ self.absolute_limits = {'unknown_limit': 9001}
+ self._test_index_absolute_limits_json({})
+
+ def test_index_absolute_ram_json(self):
+ self.absolute_limits = {'ram': 1024}
+ self._test_index_absolute_limits_json({'maxTotalRAMSize': 1024})
+
+ def test_index_absolute_cores_json(self):
+ self.absolute_limits = {'cores': 17}
+ self._test_index_absolute_limits_json({'maxTotalCores': 17})
+
+ def test_index_absolute_instances_json(self):
+ self.absolute_limits = {'instances': 19}
+ self._test_index_absolute_limits_json({'maxTotalInstances': 19})
+
+ def test_index_absolute_metadata_json(self):
+ self.absolute_limits = {'metadata_items': 23}
+ self._test_index_absolute_limits_json({'maxServerMeta': 23})
+
class LimitMiddlewareTest(BaseLimitTestSuite):
"""