diff --git a/etc/nova/policy.json b/etc/nova/policy.json index 995881eb44..1de8714042 100644 --- a/etc/nova/policy.json +++ b/etc/nova/policy.json @@ -153,6 +153,8 @@ "compute_extension:availability_zone:list": "", "compute_extension:availability_zone:detail": "rule:admin_api", "compute_extension:used_limits_for_admin": "rule:admin_api", + "compute_extension:v3:os-used-limits": "", + "compute_extension:v3:os-used-limits:tenant": "rule:admin_api", "compute_extension:migrations:index": "rule:admin_api", diff --git a/nova/api/openstack/compute/plugins/v3/used_limits.py b/nova/api/openstack/compute/plugins/v3/used_limits.py index a0fab1594e..dd87a20f45 100644 --- a/nova/api/openstack/compute/plugins/v3/used_limits.py +++ b/nova/api/openstack/compute/plugins/v3/used_limits.py @@ -23,11 +23,9 @@ from nova import quota QUOTAS = quota.QUOTAS -XMLNS = "http://docs.openstack.org/compute/ext/used_limits/api/v1.1" +XMLNS = "http://docs.openstack.org/compute/ext/used_limits/api/v3" ALIAS = "os-used-limits" -authorize = extensions.soft_extension_authorizer('compute', 'used_limits') -authorize_for_admin = extensions.extension_authorizer('compute', - 'used_limits_for_admin') +authorize = extensions.extension_authorizer('compute', 'v3:' + ALIAS) class UsedLimitsTemplate(xmlutil.TemplateBuilder): @@ -39,9 +37,6 @@ class UsedLimitsTemplate(xmlutil.TemplateBuilder): class UsedLimitsController(wsgi.Controller): - def __init__(self, ext_mgr): - self.ext_mgr = ext_mgr - @staticmethod def _reserved(req): try: @@ -51,8 +46,9 @@ class UsedLimitsController(wsgi.Controller): @wsgi.extends def index(self, req, resp_obj): - resp_obj.attach(xml=UsedLimitsTemplate()) context = req.environ['nova.context'] + authorize(context) + resp_obj.attach(xml=UsedLimitsTemplate()) project_id = self._project_id(context, req) quotas = QUOTAS.get_project_quotas(context, project_id, usages=True) quota_map = { @@ -72,28 +68,30 @@ class UsedLimitsController(wsgi.Controller): resp_obj.obj['limits']['absolute'].update(used_limits) def _project_id(self, context, req): - if self.ext_mgr.is_loaded('os-used-limits-for-admin'): - if 'tenant_id' in req.GET: - tenant_id = req.GET.get('tenant_id') - target = { - 'project_id': tenant_id, - 'user_id': context.user_id - } - authorize_for_admin(context, target=target) - return tenant_id + if 'tenant_id' in req.GET: + tenant_id = req.GET.get('tenant_id') + target = { + 'project_id': tenant_id, + 'user_id': context.user_id + } + authorize(context, target=target, action='tenant') + return tenant_id return context.project_id -class Used_limits(extensions.ExtensionDescriptor): +class UsedLimits(extensions.V3APIExtensionBase): """Provide data on limited resources that are being used.""" name = "UsedLimits" alias = ALIAS namespace = XMLNS - updated = "2012-07-13T00:00:00+00:00" + version = 1 def get_controller_extensions(self): - controller = UsedLimitsController(self.ext_mgr) + controller = UsedLimitsController() limits_ext = extensions.ControllerExtension(self, 'limits', controller=controller) return [limits_ext] + + def get_resources(self): + return [] diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_used_limits.py b/nova/tests/api/openstack/compute/plugins/v3/test_used_limits.py index 4f50916a74..ece457630f 100644 --- a/nova/tests/api/openstack/compute/plugins/v3/test_used_limits.py +++ b/nova/tests/api/openstack/compute/plugins/v3/test_used_limits.py @@ -15,8 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. -from nova.api.openstack.compute.contrib import used_limits from nova.api.openstack.compute import limits +from nova.api.openstack.compute.plugins.v3 import used_limits from nova.api.openstack import extensions from nova.api.openstack import wsgi import nova.context @@ -36,12 +36,11 @@ class UsedLimitsTestCase(test.TestCase): def setUp(self): """Run before each test.""" super(UsedLimitsTestCase, self).setUp() - self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager) - self.controller = used_limits.UsedLimitsController(self.ext_mgr) + self.controller = used_limits.UsedLimitsController() self.fake_context = nova.context.RequestContext('fake', 'fake') - self.mox.StubOutWithMock(used_limits, 'authorize_for_admin') - self.authorize_for_admin = used_limits.authorize_for_admin + self.mox.StubOutWithMock(used_limits, 'authorize') + self.authorize = used_limits.authorize def _do_test_used_limits(self, reserved): fake_req = FakeRequest(self.fake_context, reserved=reserved) @@ -70,7 +69,7 @@ class UsedLimitsTestCase(test.TestCase): self.stubs.Set(quota.QUOTAS, "get_project_quotas", stub_get_project_quotas) - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(False) + self.authorize(self.fake_context) self.mox.ReplayAll() self.controller.index(fake_req, res) @@ -104,8 +103,8 @@ class UsedLimitsTestCase(test.TestCase): } fake_req = FakeRequest(self.fake_context) fake_req.GET = {'tenant_id': tenant_id} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True) - self.authorize_for_admin(self.fake_context, target=target) + self.authorize(self.fake_context) + self.authorize(self.fake_context, target=target, action='tenant') self.mox.StubOutWithMock(quota.QUOTAS, 'get_project_quotas') quota.QUOTAS.get_project_quotas(self.fake_context, '%s' % tenant_id, usages=True).AndReturn({}) @@ -126,9 +125,9 @@ class UsedLimitsTestCase(test.TestCase): } fake_req = FakeRequest(self.fake_context) fake_req.GET = {} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True) self.mox.StubOutWithMock(extensions, 'extension_authorizer') self.mox.StubOutWithMock(quota.QUOTAS, 'get_project_quotas') + self.authorize(self.fake_context) quota.QUOTAS.get_project_quotas(self.fake_context, '%s' % project_id, usages=True).AndReturn({}) self.mox.ReplayAll() @@ -153,8 +152,8 @@ class UsedLimitsTestCase(test.TestCase): } fake_req = FakeRequest(self.fake_context) fake_req.GET = {'tenant_id': tenant_id} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(True) - self.authorize_for_admin(self.fake_context, target=target). \ + self.authorize(self.fake_context) + self.authorize(self.fake_context, target=target, action='tenant'). \ AndRaise(exception.PolicyNotAuthorized( action="compute_extension:used_limits_for_admin")) self.mox.ReplayAll() @@ -172,8 +171,8 @@ class UsedLimitsTestCase(test.TestCase): }, } fake_req = FakeRequest(self.fake_context) - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(False) self.mox.StubOutWithMock(quota.QUOTAS, 'get_project_quotas') + self.authorize(self.fake_context) quota.QUOTAS.get_project_quotas(self.fake_context, project_id, usages=True).AndReturn({}) self.mox.ReplayAll() @@ -195,9 +194,9 @@ class UsedLimitsTestCase(test.TestCase): def stub_get_project_quotas(context, project_id, usages=True): return {'ram': {'limit': 512, 'in_use': 256}} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(False) self.stubs.Set(quota.QUOTAS, "get_project_quotas", stub_get_project_quotas) + self.authorize(self.fake_context) self.mox.ReplayAll() self.controller.index(fake_req, res) @@ -218,9 +217,9 @@ class UsedLimitsTestCase(test.TestCase): def stub_get_project_quotas(context, project_id, usages=True): return {} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(False) self.stubs.Set(quota.QUOTAS, "get_project_quotas", stub_get_project_quotas) + self.authorize(self.fake_context) self.mox.ReplayAll() self.controller.index(fake_req, res) @@ -241,9 +240,9 @@ class UsedLimitsTestCase(test.TestCase): def stub_get_project_quotas(context, project_id, usages=True): return {} - self.ext_mgr.is_loaded('os-used-limits-for-admin').AndReturn(False) self.stubs.Set(quota.QUOTAS, "get_project_quotas", stub_get_project_quotas) + self.authorize(self.fake_context) self.mox.ReplayAll() self.controller.index(fake_req, res) diff --git a/nova/tests/fake_policy.py b/nova/tests/fake_policy.py index 86f6ddc9a7..48b89891bb 100644 --- a/nova/tests/fake_policy.py +++ b/nova/tests/fake_policy.py @@ -230,6 +230,8 @@ policy_data = """ "compute_extension:availability_zone:list": "", "compute_extension:availability_zone:detail": "is_admin:True", "compute_extension:used_limits_for_admin": "is_admin:True", + "compute_extension:v3:os-used-limits": "", + "compute_extension:v3:os-used-limits:tenant": "is_admin:True", "compute_extension:migrations:index": "is_admin:True", diff --git a/setup.cfg b/setup.cfg index f1eb12e597..89f7e63d41 100644 --- a/setup.cfg +++ b/setup.cfg @@ -91,6 +91,7 @@ nova.api.v3.extensions = server_password = nova.api.openstack.compute.plugins.v3.server_password:ServerPassword servers = nova.api.openstack.compute.plugins.v3.servers:Servers simple_tenant_usage = nova.api.openstack.compute.plugins.v3.simple_tenant_usage:SimpleTenantUsage + used_limits = nova.api.openstack.compute.plugins.v3.used_limits:UsedLimits nova.api.v3.extensions.server.create = config_drive = nova.api.openstack.compute.plugins.v3.config_drive:ConfigDrive