Merge "Adds default fall-through to the multi scheduler. Fixes bug 1009681"
This commit is contained in:
1
Authors
1
Authors
@@ -49,6 +49,7 @@ Daniel P. Berrange <berrange@redhat.com>
|
|||||||
Dave Lapsley <dlapsley@nicira.com>
|
Dave Lapsley <dlapsley@nicira.com>
|
||||||
Dave Walker <Dave.Walker@canonical.com>
|
Dave Walker <Dave.Walker@canonical.com>
|
||||||
David Pravec <David.Pravec@danix.org>
|
David Pravec <David.Pravec@danix.org>
|
||||||
|
David Scannell <dscannell@gridcentric.com>
|
||||||
David Shrewsbury <shrewsbury.dave@gmail.com>
|
David Shrewsbury <shrewsbury.dave@gmail.com>
|
||||||
David Subiros <david.perez5@hp.com>
|
David Subiros <david.perez5@hp.com>
|
||||||
Dean Troyer <dtroyer@gmail.com>
|
Dean Troyer <dtroyer@gmail.com>
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ multi_scheduler_opts = [
|
|||||||
cfg.StrOpt('volume_scheduler_driver',
|
cfg.StrOpt('volume_scheduler_driver',
|
||||||
default='nova.scheduler.chance.ChanceScheduler',
|
default='nova.scheduler.chance.ChanceScheduler',
|
||||||
help='Driver to use for scheduling volume calls'),
|
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
|
FLAGS = flags.FLAGS
|
||||||
@@ -60,9 +63,12 @@ class MultiScheduler(driver.Scheduler):
|
|||||||
FLAGS.compute_scheduler_driver)
|
FLAGS.compute_scheduler_driver)
|
||||||
volume_driver = importutils.import_object(
|
volume_driver = importutils.import_object(
|
||||||
FLAGS.volume_scheduler_driver)
|
FLAGS.volume_scheduler_driver)
|
||||||
|
default_driver = importutils.import_object(
|
||||||
|
FLAGS.default_scheduler_driver)
|
||||||
|
|
||||||
self.drivers = {'compute': compute_driver,
|
self.drivers = {'compute': compute_driver,
|
||||||
'volume': volume_driver}
|
'volume': volume_driver,
|
||||||
|
'default': default_driver}
|
||||||
|
|
||||||
def __getattr__(self, key):
|
def __getattr__(self, key):
|
||||||
if not key.startswith('schedule_'):
|
if not key.startswith('schedule_'):
|
||||||
@@ -73,7 +79,8 @@ class MultiScheduler(driver.Scheduler):
|
|||||||
return getattr(self.drivers[_METHOD_MAP[method]], key)
|
return getattr(self.drivers[_METHOD_MAP[method]], key)
|
||||||
|
|
||||||
def schedule(self, context, topic, method, *_args, **_kwargs):
|
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)
|
method, *_args, **_kwargs)
|
||||||
|
|
||||||
def schedule_run_instance(self, *args, **kwargs):
|
def schedule_run_instance(self, *args, **kwargs):
|
||||||
|
|||||||
@@ -56,6 +56,17 @@ class FakeVolumeScheduler(driver.Scheduler):
|
|||||||
pass
|
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):
|
class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
|
||||||
"""Test case for multi driver"""
|
"""Test case for multi driver"""
|
||||||
|
|
||||||
@@ -66,15 +77,18 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
|
|||||||
base_name = 'nova.tests.scheduler.test_multi_scheduler.%s'
|
base_name = 'nova.tests.scheduler.test_multi_scheduler.%s'
|
||||||
compute_cls_name = base_name % 'FakeComputeScheduler'
|
compute_cls_name = base_name % 'FakeComputeScheduler'
|
||||||
volume_cls_name = base_name % 'FakeVolumeScheduler'
|
volume_cls_name = base_name % 'FakeVolumeScheduler'
|
||||||
|
default_cls_name = base_name % 'FakeDefaultScheduler'
|
||||||
self.flags(compute_scheduler_driver=compute_cls_name,
|
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()
|
self._manager = multi.MultiScheduler()
|
||||||
|
|
||||||
def test_drivers_inited(self):
|
def test_drivers_inited(self):
|
||||||
mgr = self._manager
|
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['compute'].is_fake_compute)
|
||||||
self.assertTrue(mgr.drivers['volume'].is_fake_volume)
|
self.assertTrue(mgr.drivers['volume'].is_fake_volume)
|
||||||
|
self.assertTrue(mgr.drivers['default'].is_fake_default)
|
||||||
|
|
||||||
def test_proxy_calls(self):
|
def test_proxy_calls(self):
|
||||||
mgr = self._manager
|
mgr = self._manager
|
||||||
@@ -96,6 +110,7 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
|
|||||||
|
|
||||||
self.mox.StubOutWithMock(mgr.drivers['compute'], 'schedule')
|
self.mox.StubOutWithMock(mgr.drivers['compute'], 'schedule')
|
||||||
self.mox.StubOutWithMock(mgr.drivers['volume'], 'schedule')
|
self.mox.StubOutWithMock(mgr.drivers['volume'], 'schedule')
|
||||||
|
self.mox.StubOutWithMock(mgr.drivers['default'], 'schedule')
|
||||||
|
|
||||||
ctxt = 'fake_context'
|
ctxt = 'fake_context'
|
||||||
method = 'fake_method'
|
method = 'fake_method'
|
||||||
@@ -107,10 +122,13 @@ class MultiDriverTestCase(test_scheduler.SchedulerTestCase):
|
|||||||
*fake_args, **fake_kwargs)
|
*fake_args, **fake_kwargs)
|
||||||
mgr.drivers['volume'].schedule(ctxt, 'volume', method,
|
mgr.drivers['volume'].schedule(ctxt, 'volume', method,
|
||||||
*fake_args, **fake_kwargs)
|
*fake_args, **fake_kwargs)
|
||||||
|
mgr.drivers['default'].schedule(ctxt, 'random_topic', method,
|
||||||
|
*fake_args, **fake_kwargs)
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
mgr.schedule(ctxt, 'compute', method, *fake_args, **fake_kwargs)
|
mgr.schedule(ctxt, 'compute', method, *fake_args, **fake_kwargs)
|
||||||
mgr.schedule(ctxt, 'volume', 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 test_update_service_capabilities(self):
|
||||||
def fake_update_service_capabilities(self, service, host, caps):
|
def fake_update_service_capabilities(self, service, host, caps):
|
||||||
|
|||||||
Reference in New Issue
Block a user