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 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user