Merge "Adds default fall-through to the multi scheduler. Fixes bug 1009681"

This commit is contained in:
Jenkins 2012-06-28 18:41:24 +00:00 committed by Gerrit Code Review
commit 92dff6857d
3 changed files with 30 additions and 4 deletions

View File

@ -49,6 +49,7 @@ Daniel P. Berrange <berrange@redhat.com>
Dave Lapsley <dlapsley@nicira.com>
Dave Walker <Dave.Walker@canonical.com>
David Pravec <David.Pravec@danix.org>
David Scannell <dscannell@gridcentric.com>
David Shrewsbury <shrewsbury.dave@gmail.com>
David Subiros <david.perez5@hp.com>
Dean Troyer <dtroyer@gmail.com>

View File

@ -35,6 +35,9 @@ multi_scheduler_opts = [
cfg.StrOpt('volume_scheduler_driver',
default='nova.scheduler.chance.ChanceScheduler',
help='Driver to use for scheduling volume calls'),
cfg.StrOpt('default_scheduler_driver',
default='nova.scheduler.chance.ChanceScheduler',
help='Default driver to use for scheduling calls'),
]
FLAGS = flags.FLAGS
@ -60,9 +63,12 @@ class MultiScheduler(driver.Scheduler):
FLAGS.compute_scheduler_driver)
volume_driver = importutils.import_object(
FLAGS.volume_scheduler_driver)
default_driver = importutils.import_object(
FLAGS.default_scheduler_driver)
self.drivers = {'compute': compute_driver,
'volume': volume_driver}
'volume': volume_driver,
'default': default_driver}
def __getattr__(self, key):
if not key.startswith('schedule_'):
@ -73,7 +79,8 @@ class MultiScheduler(driver.Scheduler):
return getattr(self.drivers[_METHOD_MAP[method]], key)
def schedule(self, context, topic, method, *_args, **_kwargs):
return self.drivers[topic].schedule(context, topic,
driver = self.drivers.get(topic, self.drivers['default'])
return driver.schedule(context, topic,
method, *_args, **_kwargs)
def schedule_run_instance(self, *args, **kwargs):

View File

@ -56,6 +56,17 @@ class FakeVolumeScheduler(driver.Scheduler):
pass
class FakeDefaultScheduler(driver.Scheduler):
is_fake_default = True
def __init__(self):
super(FakeDefaultScheduler, self).__init__()
self.is_update_caps_called = False
def schedule(self, *args, **kwargs):
pass
class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
"""Test case for multi driver"""
@ -66,15 +77,18 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
base_name = 'nova.tests.scheduler.test_multi_scheduler.%s'
compute_cls_name = base_name % 'FakeComputeScheduler'
volume_cls_name = base_name % 'FakeVolumeScheduler'
default_cls_name = base_name % 'FakeDefaultScheduler'
self.flags(compute_scheduler_driver=compute_cls_name,
volume_scheduler_driver=volume_cls_name)
volume_scheduler_driver=volume_cls_name,
default_scheduler_driver=default_cls_name)
self._manager = multi.MultiScheduler()
def test_drivers_inited(self):
mgr = self._manager
self.assertEqual(len(mgr.drivers), 2)
self.assertEqual(len(mgr.drivers), 3)
self.assertTrue(mgr.drivers['compute'].is_fake_compute)
self.assertTrue(mgr.drivers['volume'].is_fake_volume)
self.assertTrue(mgr.drivers['default'].is_fake_default)
def test_proxy_calls(self):
mgr = self._manager
@ -96,6 +110,7 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
self.mox.StubOutWithMock(mgr.drivers['compute'], 'schedule')
self.mox.StubOutWithMock(mgr.drivers['volume'], 'schedule')
self.mox.StubOutWithMock(mgr.drivers['default'], 'schedule')
ctxt = 'fake_context'
method = 'fake_method'
@ -107,10 +122,13 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
*fake_args, **fake_kwargs)
mgr.drivers['volume'].schedule(ctxt, 'volume', method,
*fake_args, **fake_kwargs)
mgr.drivers['default'].schedule(ctxt, 'random_topic', method,
*fake_args, **fake_kwargs)
self.mox.ReplayAll()
mgr.schedule(ctxt, 'compute', method, *fake_args, **fake_kwargs)
mgr.schedule(ctxt, 'volume', method, *fake_args, **fake_kwargs)
mgr.schedule(ctxt, 'random_topic', method, *fake_args, **fake_kwargs)
def test_update_service_capabilities(self):
def fake_update_service_capabilities(self, service, host, caps):