diff --git a/Authors b/Authors index 304eb266..7742afc4 100644 --- a/Authors +++ b/Authors @@ -48,6 +48,7 @@ Daniel P. Berrange Dave Lapsley Dave Walker David Pravec +David Scannell David Shrewsbury David Subiros Dean Troyer diff --git a/nova/scheduler/multi.py b/nova/scheduler/multi.py index 8361e9e7..c6de3f82 100644 --- a/nova/scheduler/multi.py +++ b/nova/scheduler/multi.py @@ -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): diff --git a/nova/tests/scheduler/test_multi_scheduler.py b/nova/tests/scheduler/test_multi_scheduler.py index 4faf9444..d6a59450 100644 --- a/nova/tests/scheduler/test_multi_scheduler.py +++ b/nova/tests/scheduler/test_multi_scheduler.py @@ -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):