From 124fbf3990b4595da912f8f3a1e939ae728a106b Mon Sep 17 00:00:00 2001 From: Chris Yeoh Date: Fri, 14 Jun 2013 13:05:56 +0930 Subject: Port cells extension to v3 API Part 2 Ports the cells extensions and the corresponding unittests to the v3 framework. Merges in functionality of the os-cells-capacities extension to be the default behavior. Does not yet address v3 TODO of returning capacity information in the cell detail method Partially implements blueprint nova-v3-api Change-Id: I24df708b9d6504a355fca0eacd0ffaeb6586610d --- etc/nova/policy.json | 1 + nova/api/openstack/compute/plugins/v3/cells.py | 28 +++++++++++----------- .../api/openstack/compute/plugins/v3/test_cells.py | 11 +++------ nova/tests/fake_policy.py | 1 + setup.cfg | 1 + 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/etc/nova/policy.json b/etc/nova/policy.json index 7c563b936..2d1ac7d25 100644 --- a/etc/nova/policy.json +++ b/etc/nova/policy.json @@ -33,6 +33,7 @@ "compute_extension:attach_interfaces": "", "compute_extension:baremetal_nodes": "rule:admin_api", "compute_extension:cells": "rule:admin_api", + "compute_extension:v3:os-cells": "rule:admin_api", "compute_extension:certificates": "", "compute_extension:v3:os-certificates": "", "compute_extension:cloudpipe": "rule:admin_api", diff --git a/nova/api/openstack/compute/plugins/v3/cells.py b/nova/api/openstack/compute/plugins/v3/cells.py index 4e809d70e..e07792018 100644 --- a/nova/api/openstack/compute/plugins/v3/cells.py +++ b/nova/api/openstack/compute/plugins/v3/cells.py @@ -37,7 +37,8 @@ CONF = cfg.CONF CONF.import_opt('name', 'nova.cells.opts', group='cells') CONF.import_opt('capabilities', 'nova.cells.opts', group='cells') -authorize = extensions.extension_authorizer('compute', 'cells') +ALIAS = "os-cells" +authorize = extensions.extension_authorizer('compute', 'v3:' + ALIAS) def make_cell(elem): @@ -145,13 +146,12 @@ def _scrub_cell(cell, detail=False): return cell_info -class Controller(object): +class CellsController(object): """Controller for Cell resources.""" - def __init__(self, ext_mgr): + def __init__(self): self.compute_api = compute.API() self.cells_rpcapi = cells_rpcapi.CellsAPI() - self.ext_mgr = ext_mgr def _get_cells(self, ctxt, req, detail=False): """Return all cells.""" @@ -198,9 +198,6 @@ class Controller(object): """Return capacities for a given cell or all cells.""" # TODO(kaushikc): return capacities as a part of cell info and # cells detail calls in v3, along with capabilities - if not self.ext_mgr.is_loaded('os-cell-capacities'): - raise exc.HTTPNotFound() - context = req.environ['nova.context'] authorize(context) try: @@ -320,15 +317,15 @@ class Controller(object): updated_since=updated_since, deleted=deleted) -class Cells(extensions.ExtensionDescriptor): +class Cells(extensions.V3APIExtensionBase): """Enables cells-related functionality such as adding neighbor cells, listing neighbor cells, and getting the capabilities of the local cell. """ name = "Cells" - alias = "os-cells" - namespace = "http://docs.openstack.org/compute/ext/cells/api/v1.1" - updated = "2013-05-14T00:00:00+00:00" + alias = ALIAS + namespace = "http://docs.openstack.org/compute/ext/cells/api/v3" + version = 1 def get_resources(self): coll_actions = { @@ -341,7 +338,10 @@ class Cells(extensions.ExtensionDescriptor): 'capacities': 'GET', } - res = extensions.ResourceExtension('os-cells', - Controller(self.ext_mgr), collection_actions=coll_actions, - member_actions=memb_actions) + res = extensions.ResourceExtension(ALIAS, CellsController(), + collection_actions=coll_actions, + member_actions=memb_actions) return [res] + + def get_controller_extensions(self): + return [] diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_cells.py b/nova/tests/api/openstack/compute/plugins/v3/test_cells.py index a9e77693e..f369c06e3 100644 --- a/nova/tests/api/openstack/compute/plugins/v3/test_cells.py +++ b/nova/tests/api/openstack/compute/plugins/v3/test_cells.py @@ -18,7 +18,7 @@ import copy from lxml import etree from webob import exc -from nova.api.openstack.compute.contrib import cells as cells_ext +from nova.api.openstack.compute.plugins.v3 import cells as cells_ext from nova.api.openstack import extensions from nova.api.openstack import xmlutil from nova.cells import rpcapi as cells_rpcapi @@ -88,12 +88,11 @@ class CellsTest(test.TestCase): self.stubs.Set(cells_rpcapi.CellsAPI, 'get_cell_info_for_neighbors', fake_cells_api_get_all_cell_info) - self.ext_mgr = self.mox.CreateMock(extensions.ExtensionManager) - self.controller = cells_ext.Controller(self.ext_mgr) + self.controller = cells_ext.CellsController() self.context = context.get_admin_context() def _get_request(self, resource): - return fakes.HTTPRequest.blank('/v2/fake/' + resource) + return fakes.HTTPRequestV3.blank('/' + resource) def test_index(self): req = self._get_request("cells") @@ -284,7 +283,6 @@ class CellsTest(test.TestCase): self.assertEqual(cell_caps['cap2'], 'c;d') def test_show_capacities(self): - self.ext_mgr.is_loaded('os-cell-capacities').AndReturn(True) self.mox.StubOutWithMock(self.controller.cells_rpcapi, 'get_capacities') response = {"ram_free": @@ -305,7 +303,6 @@ class CellsTest(test.TestCase): self.assertEqual(response, res_dict['cell']['capacities']) def test_show_capacity_fails_with_non_admin_context(self): - self.ext_mgr.is_loaded('os-cell-capacities').AndReturn(True) rules = {"compute_extension:cells": "is_admin:true"} self.policy.set_rules(rules) @@ -317,7 +314,6 @@ class CellsTest(test.TestCase): self.controller.capacities, req) def test_show_capacities_for_invalid_cell(self): - self.ext_mgr.is_loaded('os-cell-capacities').AndReturn(True) self.mox.StubOutWithMock(self.controller.cells_rpcapi, 'get_capacities') self.controller.cells_rpcapi. \ @@ -330,7 +326,6 @@ class CellsTest(test.TestCase): self.controller.capacities, req, "invalid_cell") def test_show_capacities_for_cell(self): - self.ext_mgr.is_loaded('os-cell-capacities').AndReturn(True) self.mox.StubOutWithMock(self.controller.cells_rpcapi, 'get_capacities') response = {"ram_free": diff --git a/nova/tests/fake_policy.py b/nova/tests/fake_policy.py index da43115d0..490ef5bc5 100644 --- a/nova/tests/fake_policy.py +++ b/nova/tests/fake_policy.py @@ -111,6 +111,7 @@ policy_data = """ "compute_extension:attach_interfaces": "", "compute_extension:baremetal_nodes": "", "compute_extension:cells": "", + "compute_extension:v3:os-cells": "", "compute_extension:certificates": "", "compute_extension:v3:os-certificates": "", "compute_extension:cloudpipe": "", diff --git a/setup.cfg b/setup.cfg index 3d90a8a44..865f7a5fc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -54,6 +54,7 @@ console_scripts = nova-xvpvncproxy = nova.cmd.xvpvncproxy:main nova.api.v3.extensions = + cells = nova.api.openstack.compute.plugins.v3.cells:Cells certificates = nova.api.openstack.compute.plugins.v3.certificates:Certificates consoles = nova.api.openstack.compute.plugins.v3.consoles:Consoles evacuate = nova.api.openstack.compute.plugins.v3.evacuate:Evacuate -- cgit