summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSenhua Huang <senhuang@cisco.com>2013-05-23 07:17:38 -0700
committerSenhua Huang <senhuang@cisco.com>2013-05-26 02:13:40 -0700
commit40c6c1a9d29608a04f2062e63dcc395acbb0dffd (patch)
tree4a8c1e35ffca8669371f20da52d2f952e4d4bef0
parentf166ac3768e6b446d69f483d34348c0d070ca4c4 (diff)
Deprecate compute_api_class option in the config
Add a function "get_compute_api_class_name" within nova.compute that returns nova.compute.cells_api.ComputeCellsAPI if cell is enabled and this cell is an API cell, and returns compute.api.API otherwise. Add an option "cell_type" to the config in group "cells". Use the default value of "cell_type" (None) for legacy configuration. Change-Id: I32f5ccf789c657b563c165bfa8244e819b1a79a6 Fixes: bug #1049249
-rw-r--r--nova/cells/opts.py3
-rw-r--r--nova/compute/__init__.py54
-rw-r--r--nova/tests/compute/test_compute.py24
-rw-r--r--nova/tests/compute/test_host_api.py3
4 files changed, 78 insertions, 6 deletions
diff --git a/nova/cells/opts.py b/nova/cells/opts.py
index 203f98687..4e3d75de4 100644
--- a/nova/cells/opts.py
+++ b/nova/cells/opts.py
@@ -43,6 +43,9 @@ cells_opts = [
default=10.0,
help='Percentage of cell capacity to hold in reserve. '
'Affects both memory and disk utilization'),
+ cfg.StrOpt('cell_type',
+ default=None,
+ help='Type of cell: api or compute'),
]
cfg.CONF.register_opts(cells_opts, group='cells')
diff --git a/nova/compute/__init__.py b/nova/compute/__init__.py
index baa957ca8..5d17dcef9 100644
--- a/nova/compute/__init__.py
+++ b/nova/compute/__init__.py
@@ -20,21 +20,65 @@ import oslo.config.cfg
# Importing full names to not pollute the namespace and cause possible
# collisions with use of 'from nova.compute import <foo>' elsewhere.
+import nova.exception
import nova.openstack.common.importutils
+from nova.openstack.common import log as logging
+
+LOG = logging.getLogger(__name__)
_compute_opts = [
oslo.config.cfg.StrOpt('compute_api_class',
default='nova.compute.api.API',
help='The full class name of the '
- 'compute API class to use'),
+ 'compute API class to use (deprecated)'),
]
-
oslo.config.cfg.CONF.register_opts(_compute_opts)
+oslo.config.cfg.CONF.import_opt('enable',
+ 'nova.cells.opts',
+ group='cells')
+
+oslo.config.cfg.CONF.import_opt('cell_type',
+ 'nova.cells.opts',
+ group='cells')
+
+COMPUTE_API = 'nova.compute.api.API'
+COMPUTE_CELL_API = 'nova.compute.cells_api.ComputeCellsAPI'
+
+
+def get_compute_api_class_name():
+ """
+ Returns the name of compute API class.
+ """
+ if not oslo.config.cfg.CONF.cells.enable:
+ return COMPUTE_API
+
+ cell_type = oslo.config.cfg.CONF.cells.cell_type
+ # If cell is enabled and cell_type option is not set (and thus get the
+ # default value None), use the deprecated compute_api_class option.
+ if cell_type is None:
+ compute_api_class_name = oslo.config.cfg.CONF.compute_api_class
+ LOG.deprecated(_("The compute_api_class is now deprecated and "
+ "will be removed in next release. Please set the"
+ " cell_type option to api or compute"))
+ # If cell is enabled and this cell is an API-cell, use cell specific
+ # computeAPI.
+ elif cell_type == 'api':
+ compute_api_class_name = COMPUTE_CELL_API
+ # If cell is enabled and this cell is a COMPUTE-cell, use normal
+ # computeAPI.
+ elif cell_type == 'compute':
+ compute_api_class_name = COMPUTE_API
+ # Otherwise, raise exception for invalid cell_type
+ else:
+ msg = _("cell_type must be configured as 'api' or 'compute'")
+ raise nova.exception.InvalidInput(reason=msg)
+ return compute_api_class_name
+
def API(*args, **kwargs):
importutils = nova.openstack.common.importutils
- class_name = oslo.config.cfg.CONF.compute_api_class
+ class_name = get_compute_api_class_name()
return importutils.import_object(class_name, *args, **kwargs)
@@ -44,7 +88,7 @@ def HostAPI(*args, **kwargs):
api
"""
importutils = nova.openstack.common.importutils
- compute_api_class_name = oslo.config.cfg.CONF.compute_api_class
+ compute_api_class_name = get_compute_api_class_name()
compute_api_class = importutils.import_class(compute_api_class_name)
class_name = compute_api_class.__module__ + ".HostAPI"
return importutils.import_object(class_name, *args, **kwargs)
@@ -56,7 +100,7 @@ def InstanceActionAPI(*args, **kwargs):
configured compute api.
"""
importutils = nova.openstack.common.importutils
- compute_api_class_name = oslo.config.cfg.CONF.compute_api_class
+ compute_api_class_name = get_compute_api_class_name()
compute_api_class = importutils.import_class(compute_api_class_name)
class_name = compute_api_class.__module__ + ".InstanceActionAPI"
return importutils.import_object(class_name, *args, **kwargs)
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 491ecf544..26ddc497a 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -9276,3 +9276,27 @@ class CheckRequestedImageTestCase(test.TestCase):
self.compute_api._check_requested_image(self.context, image['id'],
image, self.instance_type)
+
+
+class ComputeAPIClassNameTestCase(test.TestCase):
+ def setUp(self):
+ super(ComputeAPIClassNameTestCase, self).setUp()
+
+ def test_default_compute_api_class_name(self):
+ result = compute.get_compute_api_class_name()
+ self.assertEqual('nova.compute.api.API', result)
+
+ def test_cell_compute_api_class_name(self):
+ self.flags(enable=True, group='cells')
+ self.flags(cell_type='api', group='cells')
+ result = compute.get_compute_api_class_name()
+ self.assertEqual('nova.compute.cells_api.ComputeCellsAPI', result)
+ self.flags(cell_type='compute', group='cells')
+ result = compute.get_compute_api_class_name()
+ self.assertEqual('nova.compute.api.API', result)
+
+ def test_illegal_cell_compute_api_class_name(self):
+ self.flags(enable=True, group='cells')
+ self.flags(cell_type='fake_cell_type', group='cells')
+ self.assertRaises(exception.InvalidInput,
+ compute.get_compute_api_class_name)
diff --git a/nova/tests/compute/test_host_api.py b/nova/tests/compute/test_host_api.py
index 6a87205ae..f9ef3894d 100644
--- a/nova/tests/compute/test_host_api.py
+++ b/nova/tests/compute/test_host_api.py
@@ -252,7 +252,8 @@ class ComputeHostAPITestCase(test.TestCase):
class ComputeHostAPICellsTestCase(ComputeHostAPITestCase):
def setUp(self):
- self.flags(compute_api_class='nova.compute.cells_api.ComputeCellsAPI')
+ self.flags(enable=True, group='cells')
+ self.flags(cell_type='api', group='cells')
super(ComputeHostAPICellsTestCase, self).setUp()
def _mock_rpc_call(self, expected_message, result=None):