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
This commit is contained in:
Senhua Huang
2013-05-23 07:17:38 -07:00
parent f166ac3768
commit 40c6c1a9d2
4 changed files with 78 additions and 6 deletions

View File

@@ -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')

View File

@@ -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)

View File

@@ -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)

View File

@@ -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):