Add cells get_cell_type() method

This moves/consolidates some the deprecated config code for cells into
nova/cells/opts.py and creates a new method to determine the cell_type
that we can use in other places where logic needs to differ depending on
'compute' or 'api' cells.

This also may happen to fix bug 1197091.  I'm unable to reproduce that
bug in tests, unfortunately.

We'll need this soon for some object related conversion.

Related to blueprint unified-object-model

Change-Id: Id291759fabb71656be18fb1eb405fcd5983f84ae
This commit is contained in:
Chris Behrens 2013-07-02 23:58:41 +00:00
parent 446def5c39
commit 9f902c7e17
3 changed files with 71 additions and 60 deletions

View File

@ -20,6 +20,10 @@ Global cells config options
from oslo.config import cfg
from nova import exception
from nova.openstack.common import log as logging
cells_opts = [
cfg.BoolOpt('enable',
default=False,
@ -53,4 +57,41 @@ cells_opts = [
'treated as a mute.'),
]
cfg.CONF.register_opts(cells_opts, group='cells')
CONF = cfg.CONF
CONF.register_opts(cells_opts, group='cells')
# NOTE(comstud): Remove 'compute_api_class' after Havana and set a reasonable
# default for 'cell_type'.
_compute_opts = [
cfg.StrOpt('compute_api_class',
default='nova.compute.api.API',
help='The full class name of the '
'compute API class to use (deprecated)'),
]
CONF.register_opts(_compute_opts)
LOG = logging.getLogger(__name__)
def get_cell_type():
"""Return the cell type, 'api', 'compute', or None (if cells is disabled).
This call really exists just to support the deprecated compute_api_class
config option. Otherwise, one could just access CONF.cells.enable and
CONF.cells.cell_type directly.
"""
if not CONF.cells.enable:
return
cell_type = CONF.cells.cell_type
if cell_type:
if cell_type == 'api' or cell_type == 'compute':
return cell_type
msg = _("cell_type must be configured as 'api' or 'compute'")
raise exception.InvalidInput(reason=msg)
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 CONF.compute_api_class == 'nova.compute.cells_api.ComputeCellsAPI':
return 'api'
return 'compute'

View File

@ -16,69 +16,27 @@
# License for the specific language governing permissions and limitations
# under the License.
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.cells.opts
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 (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_TO_CLS_NAME = {'api': 'nova.compute.cells_api.ComputeCellsAPI',
'compute': 'nova.compute.api.API',
None: 'nova.compute.api.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 _get_compute_api_class_name():
"""Returns the name of compute API class."""
cell_type = nova.cells.opts.get_cell_type()
return CELL_TYPE_TO_CLS_NAME[cell_type]
def API(*args, **kwargs):
importutils = nova.openstack.common.importutils
class_name = get_compute_api_class_name()
class_name = _get_compute_api_class_name()
return importutils.import_object(class_name, *args, **kwargs)
@ -88,7 +46,7 @@ def HostAPI(*args, **kwargs):
api
"""
importutils = nova.openstack.common.importutils
compute_api_class_name = get_compute_api_class_name()
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)
@ -100,7 +58,7 @@ def InstanceActionAPI(*args, **kwargs):
configured compute api.
"""
importutils = nova.openstack.common.importutils
compute_api_class_name = get_compute_api_class_name()
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

@ -9118,20 +9118,32 @@ class ComputeAPIClassNameTestCase(test.TestCase):
super(ComputeAPIClassNameTestCase, self).setUp()
def test_default_compute_api_class_name(self):
result = compute.get_compute_api_class_name()
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()
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()
result = compute._get_compute_api_class_name()
self.assertEqual('nova.compute.api.API', result)
def test_cell_compute_api_class_name_deprecated(self):
self.flags(enable=True, group='cells')
self.flags(cell_type='', group='cells')
api_cls_name = 'nova.compute.cells_api.ComputeCellsAPI'
self.flags(compute_api_class=api_cls_name)
result = compute._get_compute_api_class_name()
self.assertEqual('nova.compute.cells_api.ComputeCellsAPI', result)
api_cls_name = 'nova.compute.api.API'
self.flags(compute_api_class=api_cls_name)
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)
compute._get_compute_api_class_name)