diff options
author | Alexei Kornienko <akornienko@mirantis.com> | 2013-06-26 17:53:57 +0300 |
---|---|---|
committer | Alexei Kornienko <akornienko@mirantis.com> | 2013-06-27 10:06:32 +0300 |
commit | ec66193e0363967d8e608606bcee8cdaff999745 (patch) | |
tree | cd9af4f85c95e77826b99943a0239827d7065c0d /nova | |
parent | 2e69f17e97b515c47b9ec3650897b0793f4e5ef0 (diff) | |
download | nova-ec66193e0363967d8e608606bcee8cdaff999745.tar.gz nova-ec66193e0363967d8e608606bcee8cdaff999745.tar.xz nova-ec66193e0363967d8e608606bcee8cdaff999745.zip |
Port flavor_access extension to v3 API Part 2
Ports the flavor_access extension and the corresponding
unittests to the v3 framework.
Partially implements blueprint nova-v3-api
Change-Id: I671f490bad2daaaae06d48328f4fff10076ab0ed
Diffstat (limited to 'nova')
-rw-r--r-- | nova/api/openstack/compute/plugins/v3/flavor_access.py | 34 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/plugins/v3/test_flavor_access.py | 30 | ||||
-rw-r--r-- | nova/tests/fake_policy.py | 1 |
3 files changed, 31 insertions, 34 deletions
diff --git a/nova/api/openstack/compute/plugins/v3/flavor_access.py b/nova/api/openstack/compute/plugins/v3/flavor_access.py index bea92d883..459a4041b 100644 --- a/nova/api/openstack/compute/plugins/v3/flavor_access.py +++ b/nova/api/openstack/compute/plugins/v3/flavor_access.py @@ -25,13 +25,13 @@ from nova.api.openstack import xmlutil from nova.compute import flavors from nova import exception - -authorize = extensions.soft_extension_authorizer('compute', 'flavor_access') +ALIAS = 'os-flavor-access' +authorize = extensions.soft_extension_authorizer('compute', 'v3:' + ALIAS) def make_flavor(elem): - elem.set('{%s}is_public' % Flavor_access.namespace, - '%s:is_public' % Flavor_access.alias) + elem.set('{%s}is_public' % FlavorAccess.namespace, + '%s:is_public' % FlavorAccess.alias) def make_flavor_access(elem): @@ -43,8 +43,8 @@ class FlavorTemplate(xmlutil.TemplateBuilder): def construct(self): root = xmlutil.TemplateElement('flavor', selector='flavor') make_flavor(root) - alias = Flavor_access.alias - namespace = Flavor_access.namespace + alias = FlavorAccess.alias + namespace = FlavorAccess.namespace return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace}) @@ -53,8 +53,8 @@ class FlavorsTemplate(xmlutil.TemplateBuilder): root = xmlutil.TemplateElement('flavors') elem = xmlutil.SubTemplateElement(root, 'flavor', selector='flavors') make_flavor(elem) - alias = Flavor_access.alias - namespace = Flavor_access.namespace + alias = FlavorAccess.alias + namespace = FlavorAccess.namespace return xmlutil.SlaveTemplate(root, 1, nsmap={alias: namespace}) @@ -126,7 +126,7 @@ class FlavorActionController(wsgi.Controller): return rval def _extend_flavor(self, flavor_rval, flavor_ref): - key = "%s:is_public" % (Flavor_access.alias) + key = "%s:is_public" % (FlavorAccess.alias) flavor_rval[key] = flavor_ref['is_public'] @wsgi.extends @@ -197,25 +197,21 @@ class FlavorActionController(wsgi.Controller): return _marshall_flavor_access(id) -class Flavor_access(extensions.ExtensionDescriptor): +class FlavorAccess(extensions.V3APIExtensionBase): """Flavor access support.""" name = "FlavorAccess" - alias = "os-flavor-access" - namespace = ("http://docs.openstack.org/compute/ext/" - "flavor_access/api/v2") - updated = "2012-08-01T00:00:00+00:00" + alias = ALIAS + namespace = "http://docs.openstack.org/compute/ext/%s/api/v3" % ALIAS + version = 1 def get_resources(self): - resources = [] - res = extensions.ResourceExtension( - 'os-flavor-access', + ALIAS, controller=FlavorAccessController(), parent=dict(member_name='flavor', collection_name='flavors')) - resources.append(res) - return resources + return [res] def get_controller_extensions(self): extension = extensions.ControllerExtension( diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_flavor_access.py b/nova/tests/api/openstack/compute/plugins/v3/test_flavor_access.py index d072e0784..7d9ec93df 100644 --- a/nova/tests/api/openstack/compute/plugins/v3/test_flavor_access.py +++ b/nova/tests/api/openstack/compute/plugins/v3/test_flavor_access.py @@ -18,7 +18,7 @@ import datetime from lxml import etree from webob import exc -from nova.api.openstack.compute.contrib import flavor_access +from nova.api.openstack.compute.plugins.v3 import flavor_access from nova.api.openstack.compute import flavors as flavors_api from nova.compute import flavors from nova import context @@ -136,7 +136,7 @@ class FlavorAccessTest(test.TestCase): def test_list_flavor_access_public(self): # query os-flavor-access on public flavor should return 404 - req = fakes.HTTPRequest.blank('/v2/fake/flavors/os-flavor-access', + req = fakes.HTTPRequest.blank('/v3/fake/flavors/os-flavor-access', use_admin_context=True) self.assertRaises(exc.HTTPNotFound, self.flavor_access_controller.index, @@ -151,7 +151,7 @@ class FlavorAccessTest(test.TestCase): def test_list_flavor_with_admin_default_proj1(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors', + req = fakes.HTTPRequest.blank('/v3/fake/flavors', use_admin_context=True) req.environ['nova.context'].project_id = 'proj1' result = self.flavor_controller.index(req) @@ -159,7 +159,7 @@ class FlavorAccessTest(test.TestCase): def test_list_flavor_with_admin_default_proj2(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}, {'id': '2'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors', + req = fakes.HTTPRequest.blank('/v3/fake/flavors', use_admin_context=True) req.environ['nova.context'].project_id = 'proj2' result = self.flavor_controller.index(req) @@ -167,21 +167,21 @@ class FlavorAccessTest(test.TestCase): def test_list_flavor_with_admin_ispublic_true(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=true', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=true', use_admin_context=True) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_admin_ispublic_false(self): expected = {'flavors': [{'id': '2'}, {'id': '3'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=false', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=false', use_admin_context=True) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_admin_ispublic_false_proj2(self): expected = {'flavors': [{'id': '2'}, {'id': '3'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=false', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=false', use_admin_context=True) req.environ['nova.context'].project_id = 'proj2' result = self.flavor_controller.index(req) @@ -190,35 +190,35 @@ class FlavorAccessTest(test.TestCase): def test_list_flavor_with_admin_ispublic_none(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}, {'id': '2'}, {'id': '3'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=none', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=none', use_admin_context=True) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_no_admin_default(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors', + req = fakes.HTTPRequest.blank('/v3/fake/flavors', use_admin_context=False) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_no_admin_ispublic_true(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=true', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=true', use_admin_context=False) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_no_admin_ispublic_false(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=false', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=false', use_admin_context=False) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) def test_list_flavor_with_no_admin_ispublic_none(self): expected = {'flavors': [{'id': '0'}, {'id': '1'}]} - req = fakes.HTTPRequest.blank('/v2/fake/flavors?is_public=none', + req = fakes.HTTPRequest.blank('/v3/fake/flavors?is_public=none', use_admin_context=False) result = self.flavor_controller.index(req) self._verify_flavor_list(result['flavors'], expected['flavors']) @@ -254,7 +254,7 @@ class FlavorAccessTest(test.TestCase): expected = {'flavor_access': [{'flavor_id': '3', 'tenant_id': 'proj3'}]} body = {'addTenantAccess': {'tenant': 'proj2'}} - req = fakes.HTTPRequest.blank('/v2/fake/flavors/2/action', + req = fakes.HTTPRequest.blank('/v3/fake/flavors/2/action', use_admin_context=True) result = self.flavor_action_controller.\ _addTenantAccess(req, '3', body) @@ -267,7 +267,7 @@ class FlavorAccessTest(test.TestCase): self.stubs.Set(flavors, 'add_flavor_access', stub_add_flavor_access) body = {'addTenantAccess': {'tenant': 'proj2'}} - req = fakes.HTTPRequest.blank('/v2/fake/flavors/2/action', + req = fakes.HTTPRequest.blank('/v3/fake/flavors/2/action', use_admin_context=True) self.assertRaises(exc.HTTPConflict, self.flavor_action_controller._addTenantAccess, @@ -280,7 +280,7 @@ class FlavorAccessTest(test.TestCase): self.stubs.Set(flavors, 'remove_flavor_access', stub_remove_flavor_access) body = {'removeTenantAccess': {'tenant': 'proj2'}} - req = fakes.HTTPRequest.blank('/v2/fake/flavors/2/action', + req = fakes.HTTPRequest.blank('/v3/fake/flavors/2/action', use_admin_context=True) self.assertRaises(exc.HTTPNotFound, self.flavor_action_controller._removeTenantAccess, diff --git a/nova/tests/fake_policy.py b/nova/tests/fake_policy.py index 63589848b..bbde1787a 100644 --- a/nova/tests/fake_policy.py +++ b/nova/tests/fake_policy.py @@ -133,6 +133,7 @@ policy_data = """ "compute_extension:fixed_ips": "", "compute_extension:v3:os-fixed-ips": "", "compute_extension:flavor_access": "", + "compute_extension:v3:os-flavor-access": "", "compute_extension:flavor_disabled": "", "compute_extension:flavor_rxtx": "", "compute_extension:flavor_swap": "", |