Refactor test_scheduler into unit tests
Also adds a service_is_up test for utils/service_is_up, which used to be in the scheduler. Minor bug spotted when doing tests, also, with live migration. Was checking 'launched_on' host when should be checking current host. Change-Id: I964abb767d619afbd90da549b267d8a9d7c31fc1
This commit is contained in:
		
							
								
								
									
										107
									
								
								nova/tests/scheduler/test_multi_scheduler.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								nova/tests/scheduler/test_multi_scheduler.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| # vim: tabstop=4 shiftwidth=4 softtabstop=4 | ||||
|  | ||||
| # Copyright 2010 United States Government as represented by the | ||||
| # Administrator of the National Aeronautics and Space Administration. | ||||
| # Copyright 2011 OpenStack LLC | ||||
| # All Rights Reserved. | ||||
| # | ||||
| #    Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||
| #    not use this file except in compliance with the License. You may obtain | ||||
| #    a copy of the License at | ||||
| # | ||||
| #         http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #    Unless required by applicable law or agreed to in writing, software | ||||
| #    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
| #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
| """ | ||||
| Tests For Multi Scheduler | ||||
| """ | ||||
|  | ||||
| from nova.scheduler import driver | ||||
| from nova.scheduler import multi | ||||
| from nova.tests.scheduler import test_scheduler | ||||
|  | ||||
|  | ||||
| class FakeComputeScheduler(driver.Scheduler): | ||||
|     is_fake_compute = True | ||||
|  | ||||
|     def schedule_run_instance(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|     def schedule_start_instance(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|     def schedule(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|  | ||||
| class FakeVolumeScheduler(driver.Scheduler): | ||||
|     is_fake_volume = True | ||||
|  | ||||
|     def schedule_create_volume(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|     def schedule_create_volumes(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|     def schedule(self, *args, **kwargs): | ||||
|         pass | ||||
|  | ||||
|  | ||||
| class MultiDriverTestCase(test_scheduler.SchedulerTestCase): | ||||
|     """Test case for multi driver""" | ||||
|  | ||||
|     driver_cls = multi.MultiScheduler | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(MultiDriverTestCase, self).setUp() | ||||
|         base_name = 'nova.tests.scheduler.test_multi_scheduler.%s' | ||||
|         compute_cls_name = base_name % 'FakeComputeScheduler' | ||||
|         volume_cls_name = base_name % 'FakeVolumeScheduler' | ||||
|         self.flags(compute_scheduler_driver=compute_cls_name, | ||||
|                 volume_scheduler_driver=volume_cls_name) | ||||
|         self._manager = multi.MultiScheduler() | ||||
|  | ||||
|     def test_drivers_inited(self): | ||||
|         mgr = self._manager | ||||
|         self.assertEqual(len(mgr.drivers), 2) | ||||
|         self.assertTrue(mgr.drivers['compute'].is_fake_compute) | ||||
|         self.assertTrue(mgr.drivers['volume'].is_fake_volume) | ||||
|  | ||||
|     def test_proxy_calls(self): | ||||
|         mgr = self._manager | ||||
|         compute_driver = mgr.drivers['compute'] | ||||
|         volume_driver = mgr.drivers['volume'] | ||||
|  | ||||
|         test_methods = {compute_driver: ['run_instance', 'start_instance'], | ||||
|                         volume_driver: ['create_volume', 'create_volumes']} | ||||
|  | ||||
|         for driver, methods in test_methods.iteritems(): | ||||
|             for method in methods: | ||||
|                 mgr_func = getattr(mgr, 'schedule_' + method) | ||||
|                 driver_func = getattr(driver, 'schedule_' + method) | ||||
|                 self.assertEqual(mgr_func, driver_func) | ||||
|  | ||||
|     def test_schedule_fallback_proxy(self): | ||||
|         mgr = self._manager | ||||
|  | ||||
|         self.mox.StubOutWithMock(mgr.drivers['compute'], 'schedule') | ||||
|         self.mox.StubOutWithMock(mgr.drivers['volume'], 'schedule') | ||||
|  | ||||
|         ctxt = 'fake_context' | ||||
|         method = 'fake_method' | ||||
|         fake_args = (1, 2, 3) | ||||
|         fake_kwargs = {'fake_kwarg1': 'fake_value1', | ||||
|                        'fake_kwarg2': 'fake_value2'} | ||||
|  | ||||
|         mgr.drivers['compute'].schedule(ctxt, 'compute', method, | ||||
|                 *fake_args, **fake_kwargs) | ||||
|         mgr.drivers['volume'].schedule(ctxt, 'volume', 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) | ||||
| @@ -13,18 +13,18 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| import nova | ||||
|  | ||||
| from nova import context | ||||
| from nova import db | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| from nova import rpc | ||||
| from nova.scheduler import vsa as vsa_sched | ||||
| from nova import test | ||||
| from nova.tests.scheduler import test_scheduler | ||||
| from nova import utils | ||||
| from nova.volume import volume_types | ||||
|  | ||||
| from nova.scheduler import vsa as vsa_sched | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| LOG = logging.getLogger('nova.tests.scheduler.vsa') | ||||
| @@ -50,7 +50,32 @@ class FakeVsaMostAvailCapacityScheduler( | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class VsaSchedulerTestCase(test.TestCase): | ||||
| class VsaSchedulerTestCase(test_scheduler.SchedulerTestCase): | ||||
|  | ||||
|     driver_cls = FakeVsaLeastUsedScheduler | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(VsaSchedulerTestCase, self).setUp() | ||||
|  | ||||
|         self.host_num = 10 | ||||
|         self.drive_type_num = 5 | ||||
|  | ||||
|         self.stubs.Set(rpc, 'cast', fake_rpc_cast) | ||||
|         self.stubs.Set(self.driver, | ||||
|                         '_get_service_states', self._fake_get_service_states) | ||||
|         self.stubs.Set(self.driver, | ||||
|                         '_provision_volume', self._fake_provision_volume) | ||||
|         self.stubs.Set(db, 'vsa_update', self._fake_vsa_update) | ||||
|  | ||||
|         self.stubs.Set(db, 'volume_get', self._fake_volume_get) | ||||
|         self.stubs.Set(db, 'volume_update', self._fake_volume_update) | ||||
|  | ||||
|         self.created_types_lst = [] | ||||
|  | ||||
|     def tearDown(self): | ||||
|         for name in self.created_types_lst: | ||||
|             volume_types.purge(self.context.elevated(), name) | ||||
|         super(VsaSchedulerTestCase, self).tearDown() | ||||
|  | ||||
|     def _get_vol_creation_request(self, num_vols, drive_ix, size=0): | ||||
|         volume_params = [] | ||||
| @@ -58,7 +83,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|  | ||||
|             name = 'name_' + str(i) | ||||
|             try: | ||||
|                 volume_types.create(self.context, name, | ||||
|                 volume_types.create(self.context.elevated(), name, | ||||
|                             extra_specs={'type': 'vsa_drive', | ||||
|                                          'drive_name': name, | ||||
|                                          'drive_type': 'type_' + str(drive_ix), | ||||
| @@ -205,35 +230,6 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|     def _fake_service_is_up_False(self, service): | ||||
|         return False | ||||
|  | ||||
|     def setUp(self, sched_class=None): | ||||
|         super(VsaSchedulerTestCase, self).setUp() | ||||
|         self.context = context.get_admin_context() | ||||
|  | ||||
|         if sched_class is None: | ||||
|             self.sched = FakeVsaLeastUsedScheduler() | ||||
|         else: | ||||
|             self.sched = sched_class | ||||
|  | ||||
|         self.host_num = 10 | ||||
|         self.drive_type_num = 5 | ||||
|  | ||||
|         self.stubs.Set(rpc, 'cast', fake_rpc_cast) | ||||
|         self.stubs.Set(self.sched, | ||||
|                         '_get_service_states', self._fake_get_service_states) | ||||
|         self.stubs.Set(self.sched, | ||||
|                         '_provision_volume', self._fake_provision_volume) | ||||
|         self.stubs.Set(nova.db, 'vsa_update', self._fake_vsa_update) | ||||
|  | ||||
|         self.stubs.Set(nova.db, 'volume_get', self._fake_volume_get) | ||||
|         self.stubs.Set(nova.db, 'volume_update', self._fake_volume_update) | ||||
|  | ||||
|         self.created_types_lst = [] | ||||
|  | ||||
|     def tearDown(self): | ||||
|         for name in self.created_types_lst: | ||||
|             volume_types.purge(self.context, name) | ||||
|         super(VsaSchedulerTestCase, self).tearDown() | ||||
|  | ||||
|     def test_vsa_sched_create_volumes_simple(self): | ||||
|         global scheduled_volumes | ||||
|         scheduled_volumes = [] | ||||
| @@ -245,7 +241,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         prev = self._generate_default_service_states() | ||||
|         request_spec = self._get_vol_creation_request(num_vols=3, drive_ix=2) | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
| @@ -271,7 +267,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|                                  init_num_drives=1) | ||||
|         request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=6) | ||||
|         self.assertRaises(exception.NoValidHost, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                                 request_spec, | ||||
|                                 availability_zone=None) | ||||
| @@ -288,7 +284,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=3, drive_ix=0) | ||||
|  | ||||
|         self.assertRaises(exception.NoValidHost, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                                 request_spec, | ||||
|                                 availability_zone=None) | ||||
| @@ -311,7 +307,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=0) | ||||
|  | ||||
|         self.assertRaises(exception.NoValidHost, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                                 request_spec, | ||||
|                                 availability_zone=None) | ||||
| @@ -326,13 +322,13 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=0) | ||||
|  | ||||
|         self.stubs.UnsetAll() | ||||
|         self.stubs.Set(self.sched, | ||||
|         self.stubs.Set(self.driver, | ||||
|                         '_get_service_states', self._fake_get_service_states) | ||||
|         self.stubs.Set(nova.db, 'volume_create', self._fake_volume_create) | ||||
|         self.stubs.Set(nova.db, 'volume_update', self._fake_volume_update) | ||||
|         self.stubs.Set(db, 'volume_create', self._fake_volume_create) | ||||
|         self.stubs.Set(db, 'volume_update', self._fake_volume_update) | ||||
|         self.stubs.Set(rpc, 'cast', fake_rpc_cast) | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
| @@ -346,7 +342,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|                                  init_num_drives=1) | ||||
|         request_spec = self._get_vol_creation_request(num_vols=1, drive_ix=0) | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
| @@ -356,13 +352,13 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|  | ||||
|         new_request = self._get_vol_creation_request(num_vols=1, drive_ix=0) | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|         self._print_service_states() | ||||
|  | ||||
|         self.assertRaises(exception.NoValidHost, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                                 new_request, | ||||
|                                 availability_zone=None) | ||||
| @@ -379,26 +375,26 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=3, drive_ix=2) | ||||
|  | ||||
|         self.assertRaises(exception.HostBinaryNotFound, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context.elevated(), | ||||
|                                 request_spec, | ||||
|                                 availability_zone="nova:host_5") | ||||
|  | ||||
|         self.stubs.Set(nova.db, | ||||
|         self.stubs.Set(db, | ||||
|                         'service_get_by_args', self._fake_service_get_by_args) | ||||
|         self.stubs.Set(utils, | ||||
|                         'service_is_up', self._fake_service_is_up_False) | ||||
|  | ||||
|         self.assertRaises(exception.WillNotSchedule, | ||||
|                           self.sched.schedule_create_volumes, | ||||
|                                 self.context, | ||||
|                           self.driver.schedule_create_volumes, | ||||
|                                 self.context.elevated(), | ||||
|                                 request_spec, | ||||
|                                 availability_zone="nova:host_5") | ||||
|  | ||||
|         self.stubs.Set(utils, | ||||
|                         'service_is_up', self._fake_service_is_up_True) | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context.elevated(), | ||||
|                                            request_spec, | ||||
|                                            availability_zone="nova:host_5") | ||||
|  | ||||
| @@ -419,7 +415,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=3, | ||||
|                                                       drive_ix=3, | ||||
|                                                       size=50) | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
| @@ -459,13 +455,13 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|             LOG.debug(_("Test: Volume get: id=%(volume_id)s"), locals()) | ||||
|             return {'id': volume_id, 'availability_zone': 'nova:host_3'} | ||||
|  | ||||
|         self.stubs.Set(nova.db, 'volume_get', _fake_volume_get_az) | ||||
|         self.stubs.Set(nova.db, | ||||
|                         'service_get_by_args', self._fake_service_get_by_args) | ||||
|         self.stubs.Set(db, 'volume_get', _fake_volume_get_az) | ||||
|         self.stubs.Set(db, 'service_get_by_args', | ||||
|                 self._fake_service_get_by_args) | ||||
|         self.stubs.Set(utils, | ||||
|                         'service_is_up', self._fake_service_is_up_True) | ||||
|  | ||||
|         self.sched.schedule_create_volume(self.context, | ||||
|         self.driver.schedule_create_volume(self.context.elevated(), | ||||
|                 123, availability_zone=None) | ||||
|  | ||||
|         self.assertEqual(scheduled_volume['id'], 123) | ||||
| @@ -480,10 +476,10 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         global_volume['volume_type_id'] = None | ||||
|  | ||||
|         self.assertRaises(exception.NoValidHost, | ||||
|                           self.sched.schedule_create_volume, | ||||
|                                 self.context, | ||||
|                                 123, | ||||
|                                 availability_zone=None) | ||||
|                 self.driver.schedule_create_volume, | ||||
|                 self.context, | ||||
|                 123, | ||||
|                 availability_zone=None) | ||||
|  | ||||
|     def test_vsa_sched_create_single_volume(self): | ||||
|         global scheduled_volume | ||||
| @@ -500,7 +496,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|  | ||||
|         drive_ix = 2 | ||||
|         name = 'name_' + str(drive_ix) | ||||
|         volume_types.create(self.context, name, | ||||
|         volume_types.create(self.context.elevated(), name, | ||||
|                     extra_specs={'type': 'vsa_drive', | ||||
|                                  'drive_name': name, | ||||
|                                  'drive_type': 'type_' + str(drive_ix), | ||||
| @@ -511,7 +507,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|         global_volume['volume_type_id'] = volume_type['id'] | ||||
|         global_volume['size'] = 0 | ||||
|  | ||||
|         self.sched.schedule_create_volume(self.context, | ||||
|         self.driver.schedule_create_volume(self.context, | ||||
|                 123, availability_zone=None) | ||||
|  | ||||
|         self.assertEqual(scheduled_volume['id'], 123) | ||||
| @@ -520,12 +516,7 @@ class VsaSchedulerTestCase(test.TestCase): | ||||
|  | ||||
| class VsaSchedulerTestCaseMostAvail(VsaSchedulerTestCase): | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(VsaSchedulerTestCaseMostAvail, self).setUp( | ||||
|                     FakeVsaMostAvailCapacityScheduler()) | ||||
|  | ||||
|     def tearDown(self): | ||||
|         super(VsaSchedulerTestCaseMostAvail, self).tearDown() | ||||
|     driver_cls = FakeVsaMostAvailCapacityScheduler | ||||
|  | ||||
|     def test_vsa_sched_create_single_volume(self): | ||||
|         global scheduled_volume | ||||
| @@ -542,7 +533,7 @@ class VsaSchedulerTestCaseMostAvail(VsaSchedulerTestCase): | ||||
|  | ||||
|         drive_ix = 2 | ||||
|         name = 'name_' + str(drive_ix) | ||||
|         volume_types.create(self.context, name, | ||||
|         volume_types.create(self.context.elevated(), name, | ||||
|                     extra_specs={'type': 'vsa_drive', | ||||
|                                  'drive_name': name, | ||||
|                                  'drive_type': 'type_' + str(drive_ix), | ||||
| @@ -553,7 +544,7 @@ class VsaSchedulerTestCaseMostAvail(VsaSchedulerTestCase): | ||||
|         global_volume['volume_type_id'] = volume_type['id'] | ||||
|         global_volume['size'] = 0 | ||||
|  | ||||
|         self.sched.schedule_create_volume(self.context, | ||||
|         self.driver.schedule_create_volume(self.context, | ||||
|                 123, availability_zone=None) | ||||
|  | ||||
|         self.assertEqual(scheduled_volume['id'], 123) | ||||
| @@ -572,7 +563,7 @@ class VsaSchedulerTestCaseMostAvail(VsaSchedulerTestCase): | ||||
|  | ||||
|         self._print_service_states() | ||||
|  | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
| @@ -603,7 +594,7 @@ class VsaSchedulerTestCaseMostAvail(VsaSchedulerTestCase): | ||||
|         request_spec = self._get_vol_creation_request(num_vols=3, | ||||
|                                                       drive_ix=3, | ||||
|                                                       size=50) | ||||
|         self.sched.schedule_create_volumes(self.context, | ||||
|         self.driver.schedule_create_volumes(self.context, | ||||
|                                            request_spec, | ||||
|                                            availability_zone=None) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Chris Behrens
					Chris Behrens